diff --git a/.editorconfig b/.editorconfig index cd301498e..cebb2ba58 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,6 +1,6 @@ root = true -[*.{js,ts,.tsx}] +[*.{js,ts,tsx}] charset = utf-8 end_of_line = lf indent_size = 4 diff --git a/.env b/.env deleted file mode 100644 index ff859e622..000000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -NODE_OPTIONS=--max_old_space_size=4096 \ No newline at end of file diff --git a/.github/actions/build-electron/action.yml b/.github/actions/build-electron/action.yml index add8f3156..320fbd763 100644 --- a/.github/actions/build-electron/action.yml +++ b/.github/actions/build-electron/action.yml @@ -74,7 +74,7 @@ runs: - name: Update build info shell: ${{ inputs.shell }} - run: npm run chore:update-build-info + run: pnpm run chore:update-build-info # Critical debugging configuration - name: Run electron-forge build with enhanced logging @@ -86,7 +86,8 @@ runs: APPLE_ID_PASSWORD: ${{ env.APPLE_ID_PASSWORD }} WINDOWS_SIGN_EXECUTABLE: ${{ env.WINDOWS_SIGN_EXECUTABLE }} 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 }} + TARGET_ARCH: ${{ inputs.arch }} + run: pnpm run --filter desktop electron-forge:make --arch=${{ inputs.arch }} --platform=${{ inputs.forge_platform }} # Add DMG signing step - name: Sign DMG diff --git a/.github/actions/build-server/action.yml b/.github/actions/build-server/action.yml index b0ab05212..faa3c0752 100644 --- a/.github/actions/build-server/action.yml +++ b/.github/actions/build-server/action.yml @@ -10,7 +10,7 @@ runs: steps: - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 22 cache: "pnpm" @@ -23,7 +23,7 @@ runs: shell: bash run: | pnpm run chore:update-build-info - pnpm nx --project=server package + pnpm run --filter server package - name: Prepare artifacts shell: bash run: | diff --git a/.github/actions/deploy-to-cloudflare-pages/action.yml b/.github/actions/deploy-to-cloudflare-pages/action.yml new file mode 100644 index 000000000..4f7a4a177 --- /dev/null +++ b/.github/actions/deploy-to-cloudflare-pages/action.yml @@ -0,0 +1,103 @@ +name: "Deploy to Cloudflare Pages" +description: "Deploys to Cloudflare Pages on either a temporary branch with preview comment, or on the production version if on the main branch." +inputs: + project_name: + description: "CloudFlare Pages project name" + comment_body: + description: "The message to display when deployment is ready" + default: "Deployment is ready." + required: false + production_url: + description: "The URL to mention as the production URL." + required: true + deploy_dir: + description: "The directory from which to deploy." + required: true + cloudflare_api_token: + description: "The Cloudflare API token to use for deployment." + required: true + cloudflare_account_id: + description: "The Cloudflare account ID to use for deployment." + required: true + github_token: + description: "The GitHub token to use for posting PR comments." + required: true +runs: + using: composite + steps: + # Install wrangler globally to avoid workspace issues + - name: Install Wrangler + shell: bash + run: npm install -g wrangler + + # Deploy using Wrangler (use pre-installed wrangler) + - name: Deploy to Cloudflare Pages + id: deploy + if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ inputs.cloudflare_api_token }} + accountId: ${{ inputs.cloudflare_account_id }} + command: pages deploy ${{ inputs.deploy_dir }} --project-name=${{ inputs.project_name}} --branch=${{ github.ref_name }} + wranglerVersion: '' # Use pre-installed version + + # Deploy preview for PRs + - name: Deploy Preview to Cloudflare Pages + id: preview-deployment + if: github.event_name == 'pull_request' + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ inputs.cloudflare_api_token }} + accountId: ${{ inputs.cloudflare_account_id }} + command: pages deploy ${{ inputs.deploy_dir }} --project-name=${{ inputs.project_name}} --branch=pr-${{ github.event.pull_request.number }} + wranglerVersion: '' # Use pre-installed version + + # Post deployment URL as PR comment + - name: Comment PR with Preview URL + if: github.event_name == 'pull_request' + uses: actions/github-script@v8 + env: + COMMENT_BODY: ${{ inputs.comment_body }} + PRODUCTION_URL: ${{ inputs.production_url }} + PROJECT_NAME: ${{ inputs.project_name }} + with: + github-token: ${{ inputs.github_token }} + script: | + const prNumber = context.issue.number; + // Construct preview URL based on Cloudflare Pages pattern + const projectName = process.env.PROJECT_NAME; + const previewUrl = `https://pr-${prNumber}.${projectName}.pages.dev`; + + // Check if we already commented + const comments = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber + }); + + const customMessage = process.env.COMMENT_BODY; + const botComment = comments.data.find(comment => + comment.user.type === 'Bot' && + comment.body.includes(customMessage) + ); + + const mainUrl = process.env.PRODUCTION_URL; + const commentBody = `${customMessage}!\n\nšŸ”— Preview URL: ${previewUrl}\nšŸ“– Production URL: ${mainUrl}\n\nāœ… All checks passed\n\n_This preview will be updated automatically with new commits._`; + + if (botComment) { + // Update existing comment + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: botComment.id, + body: commentBody + }); + } else { + // Create new comment + await github.rest.issues.createComment({ + issue_number: prNumber, + owner: context.repo.owner, + repo: context.repo.repo, + body: commentBody + }); + } diff --git a/.github/instructions/nx.instructions.md b/.github/instructions/nx.instructions.md deleted file mode 100644 index d5894c44d..000000000 --- a/.github/instructions/nx.instructions.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -applyTo: '**' ---- - -// This file is automatically generated by Nx Console - -You are in an nx workspace using Nx 21.3.9 and pnpm as the package manager. - -You have access to the Nx MCP server and the tools it provides. Use them. Follow these guidelines in order to best help the user: - -# General Guidelines -- When answering questions, use the nx_workspace tool first to gain an understanding of the workspace architecture -- For questions around nx configuration, best practices or if you're unsure, use the nx_docs tool to get relevant, up-to-date docs!! Always use this instead of assuming things about nx configuration -- If the user needs help with an Nx configuration or project graph error, use the 'nx_workspace' tool to get any errors -- To help answer questions about the workspace structure or simply help with demonstrating how tasks depend on each other, use the 'nx_visualize_graph' tool - -# Generation Guidelines -If the user wants to generate something, use the following flow: - -- learn about the nx workspace and any specifics the user needs by using the 'nx_workspace' tool and the 'nx_project_details' tool if applicable -- get the available generators using the 'nx_generators' tool -- decide which generator to use. If no generators seem relevant, check the 'nx_available_plugins' tool to see if the user could install a plugin to help them -- get generator details using the 'nx_generator_schema' tool -- you may use the 'nx_docs' tool to learn more about a specific generator or technology if you're unsure -- decide which options to provide in order to best complete the user's request. Don't make any assumptions and keep the options minimalistic -- open the generator UI using the 'nx_open_generate_ui' tool -- wait for the user to finish the generator -- read the generator log file using the 'nx_read_generator_log' tool -- use the information provided in the log file to answer the user's question or continue with what they were doing - -# Running Tasks Guidelines -If the user wants help with tasks or commands (which include keywords like "test", "build", "lint", or other similar actions), use the following flow: -- Use the 'nx_current_running_tasks_details' tool to get the list of tasks (this can include tasks that were completed, stopped or failed). -- If there are any tasks, ask the user if they would like help with a specific task then use the 'nx_current_running_task_output' tool to get the terminal output for that task/command -- Use the terminal output from 'nx_current_running_task_output' to see what's wrong and help the user fix their problem. Use the appropriate tools if necessary -- If the user would like to rerun the task or command, always use `nx run ` to rerun in the terminal. This will ensure that the task will run in the nx context and will be run the same way it originally executed -- If the task was marked as "continuous" do not offer to rerun the task. This task is already running and the user can see the output in the terminal. You can use 'nx_current_running_task_output' to get the output of the task to verify the output. - - - diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 876273d64..c523c2f1d 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -67,7 +67,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} @@ -95,6 +95,6 @@ jobs: exit 1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 000000000..62e04d48d --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,129 @@ +# GitHub Actions workflow for deploying MkDocs documentation to Cloudflare Pages +# This workflow builds and deploys your MkDocs site when changes are pushed to main +name: Deploy MkDocs Documentation + +on: + # Trigger on push to main branch + push: + branches: + - main + - master # Also support master branch + # Only run when docs files change + paths: + - 'docs/**' + - 'README.md' # README is synced to docs/index.md + - 'mkdocs.yml' + - 'requirements-docs.txt' + - '.github/workflows/deploy-docs.yml' + - 'scripts/fix-mkdocs-structure.ts' + + # Allow manual triggering from Actions tab + workflow_dispatch: + + # Run on pull requests for preview deployments + pull_request: + branches: + - main + - master + paths: + - 'docs/**' + - 'README.md' # README is synced to docs/index.md + - 'mkdocs.yml' + - 'requirements-docs.txt' + - '.github/workflows/deploy-docs.yml' + - 'scripts/fix-mkdocs-structure.ts' + +jobs: + build-and-deploy: + name: Build and Deploy MkDocs + runs-on: ubuntu-latest + timeout-minutes: 10 + + # Required permissions for deployment + permissions: + contents: read + deployments: write + pull-requests: write # For PR preview comments + id-token: write # For OIDC authentication (if needed) + + steps: + - name: Checkout Repository + uses: actions/checkout@v5 + with: + fetch-depth: 0 # Fetch all history for git info and mkdocs-git-revision-date plugin + + - name: Setup Python + uses: actions/setup-python@v6 + with: + python-version: '3.14' + cache: 'pip' + cache-dependency-path: 'requirements-docs.txt' + + - name: Install MkDocs and Dependencies + run: | + pip install --upgrade pip + pip install -r requirements-docs.txt + env: + PIP_DISABLE_PIP_VERSION_CHECK: 1 + + # Setup pnpm before fixing docs structure + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + # Setup Node.js with pnpm + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: '22' + cache: 'pnpm' + + # Install Node.js dependencies for the TypeScript script + - name: Install Dependencies + run: | + pnpm install --frozen-lockfile + + - name: Fix Documentation Structure + run: | + # Fix duplicate navigation entries by moving overview pages to index.md + pnpm run chore:fix-mkdocs-structure + + - name: Build MkDocs Site + run: | + # Build with strict mode but allow expected warnings + mkdocs build --verbose || { + EXIT_CODE=$? + # Check if the only issue is expected warnings + if mkdocs build 2>&1 | grep -E "WARNING.*(README|not found)" && \ + [ $(mkdocs build 2>&1 | grep -c "ERROR") -eq 0 ]; then + echo "āœ… Build succeeded with expected warnings" + mkdocs build --verbose + else + echo "āŒ Build failed with unexpected errors" + exit $EXIT_CODE + fi + } + + - name: Fix HTML Links + run: | + # Remove .md extensions from links in generated HTML + pnpm tsx ./scripts/fix-html-links.ts site + + - name: Validate Built Site + run: | + # Basic validation that important files exist + test -f site/index.html || (echo "ERROR: site/index.html not found" && exit 1) + test -f site/sitemap.xml || (echo "ERROR: site/sitemap.xml not found" && exit 1) + test -d site/assets || (echo "ERROR: site/assets directory not found" && exit 1) + echo "āœ… Site validation passed" + + - name: Deploy + uses: ./.github/actions/deploy-to-cloudflare-pages + if: github.repository == ${{ vars.REPO_MAIN }} + with: + project_name: "trilium-docs" + comment_body: "šŸ“š Documentation preview is ready" + production_url: "https://docs.triliumnotes.org" + deploy_dir: "site" + cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }} + cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 443f2aa35..ec4aeda0e 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -19,45 +19,24 @@ permissions: pull-requests: write # for PR comments jobs: - check-affected: - name: Check affected jobs (NX) - runs-on: ubuntu-latest - steps: - - name: Checkout the repository - uses: actions/checkout@v5 - with: - fetch-depth: 0 # needed for https://github.com/marketplace/actions/nx-set-shas - - - 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 - - - uses: nrwl/nx-set-shas@v4 - - name: Check affected - run: pnpm nx affected --verbose -t typecheck build rebuild-deps test-build - test_dev: name: Test development runs-on: ubuntu-latest - needs: - - check-affected steps: - name: Checkout the repository uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 22 cache: "pnpm" - run: pnpm install --frozen-lockfile + - name: Typecheck + run: pnpm typecheck + - name: Run the unit tests run: pnpm run test:all @@ -66,7 +45,6 @@ jobs: runs-on: ubuntu-latest needs: - test_dev - - check-affected steps: - uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 @@ -75,7 +53,7 @@ jobs: - name: Update build info run: pnpm run chore:update-build-info - name: Trigger client build - run: pnpm nx run client:build + run: pnpm client:build - name: Send client bundle stats to RelativeCI if: false uses: relative-ci/agent-action@v3 @@ -83,7 +61,7 @@ jobs: webpackStatsFile: ./apps/client/dist/webpack-stats.json key: ${{ secrets.RELATIVE_CI_CLIENT_KEY }} - name: Trigger server build - run: pnpm nx run server:build + run: pnpm run server:build - uses: docker/setup-buildx-action@v3 - uses: docker/build-push-action@v6 with: @@ -95,7 +73,6 @@ jobs: runs-on: ubuntu-latest needs: - build_docker - - check-affected strategy: matrix: include: @@ -112,7 +89,7 @@ jobs: - name: Update build info run: pnpm run chore:update-build-info - name: Trigger build - run: pnpm nx run server:build + run: pnpm server:build - name: Set IMAGE_NAME to lowercase run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml index c4c6ed551..407272a99 100644 --- a/.github/workflows/main-docker.yml +++ b/.github/workflows/main-docker.yml @@ -44,7 +44,7 @@ jobs: - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 22 cache: "pnpm" @@ -82,7 +82,7 @@ jobs: require-healthy: true - name: Run Playwright tests - run: TRILIUM_DOCKER=1 TRILIUM_PORT=8082 pnpm exec nx run server-e2e:e2e + run: TRILIUM_DOCKER=1 TRILIUM_PORT=8082 pnpm --filter=server-e2e e2e - name: Upload Playwright trace if: failure() @@ -144,7 +144,7 @@ jobs: uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' @@ -152,12 +152,12 @@ 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 + - name: Run the TypeScript build + run: pnpm run server:build + - name: Docker meta id: meta uses: docker/metadata-action@v5 @@ -211,7 +211,7 @@ jobs: - name: Upload digest uses: actions/upload-artifact@v4 with: - name: digests-${{ env.PLATFORM_PAIR }} + name: digests-${{ env.PLATFORM_PAIR }}-${{ matrix.dockerfile }} path: /tmp/digests/* if-no-files-found: error retention-days: 1 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index f20c5a2d4..0d0205f32 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -19,7 +19,6 @@ concurrency: cancel-in-progress: true env: - GITHUB_UPLOAD_URL: https://uploads.github.com/repos/TriliumNext/Notes/releases/179589950/assets{?name,label} GITHUB_RELEASE_ID: 179589950 permissions: @@ -51,13 +50,12 @@ jobs: - uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile - - uses: nrwl/nx-set-shas@v4 - name: Update nightly version run: npm run chore:ci-update-nightly-version - name: Run the build @@ -79,7 +77,7 @@ jobs: GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }} - name: Publish release - uses: softprops/action-gh-release@v2.3.2 + uses: softprops/action-gh-release@v2.4.1 if: ${{ github.event_name != 'pull_request' }} with: make_latest: false @@ -120,7 +118,7 @@ jobs: arch: ${{ matrix.arch }} - name: Publish release - uses: softprops/action-gh-release@v2.3.2 + uses: softprops/action-gh-release@v2.4.1 if: ${{ github.event_name != 'pull_request' }} with: make_latest: false diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 25086af64..886b46d61 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -4,6 +4,8 @@ on: push: branches: - main + paths-ignore: + - "apps/website/**" pull_request: permissions: @@ -19,14 +21,8 @@ jobs: filter: tree:0 fetch-depth: 0 - # This enables task distribution via Nx Cloud - # Run this command as early as possible, before dependencies are installed - # Learn more at https://nx.dev/ci/reference/nx-cloud-cli#npx-nxcloud-startcirun - # Connect your workspace by running "nx connect" and uncomment this line to enable task distribution - # - run: npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="e2e-ci" - - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' @@ -34,10 +30,12 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - 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: pnpm exec nx affected -t e2e --exclude desktop-e2e + - run: pnpm --filter server-e2e e2e + + - name: Upload test report + if: failure() + uses: actions/upload-artifact@v4 + with: + name: e2e report + path: apps/server-e2e/test-output diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 20161630f..3ee30040d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,18 +30,30 @@ jobs: image: win-signing shell: cmd forge_platform: win32 + # Exclude ARM64 Linux from default matrix to use native runner + exclude: + - arch: arm64 + os: + name: linux + # Add ARM64 Linux with native ubuntu-24.04-arm runner for better-sqlite3 compatibility + include: + - arch: arm64 + os: + name: linux + image: ubuntu-24.04-arm + shell: bash + forge_platform: linux runs-on: ${{ matrix.os.image }} steps: - uses: actions/checkout@v5 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile - - uses: nrwl/nx-set-shas@v4 - name: Run the build uses: ./.github/actions/build-electron with: @@ -115,7 +127,7 @@ jobs: path: upload - name: Publish stable release - uses: softprops/action-gh-release@v2.3.2 + uses: softprops/action-gh-release@v2.4.1 with: draft: false body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 000000000..fe94c987a --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,51 @@ +name: Deploy website + +on: + push: + branches: + - main + paths: + - "apps/website/**" + + pull_request: + paths: + - "apps/website/**" + + release: + types: [ released ] + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + name: Build & deploy website + + permissions: + contents: read + deployments: write + pull-requests: write # For PR preview comments + + steps: + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + - name: Set up node & dependencies + uses: actions/setup-node@v6 + with: + node-version: 22 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --filter website --frozen-lockfile + + - name: Build the website + run: pnpm website:build + + - name: Deploy + uses: ./.github/actions/deploy-to-cloudflare-pages + with: + project_name: "trilium-homepage" + comment_body: "šŸ“š Website preview is ready" + production_url: "https://triliumnotes.org" + deploy_dir: "apps/website/dist" + cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }} + cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 09749c270..b2c4e3c46 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # See https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files for more about ignoring files. +/.cache # compiled output dist @@ -32,14 +33,11 @@ testem.log .DS_Store Thumbs.db -.nx/cache -.nx/workspace-data - vite.config.*.timestamp* vitest.config.*.timestamp* test-output -apps/*/data +apps/*/data* apps/*/out upload @@ -47,4 +45,7 @@ upload *.tsbuildinfo /result -.svelte-kit \ No newline at end of file +.svelte-kit + +# docs +site/ diff --git a/.nvmrc b/.nvmrc index 89b93fd74..f5b3ef39f 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.18.0 \ No newline at end of file +22.21.0 \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index e64c42352..4db7b7470 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -5,7 +5,6 @@ "lokalise.i18n-ally", "ms-azuretools.vscode-docker", "ms-playwright.playwright", - "nrwl.angular-console", "redhat.vscode-yaml", "tobermory.es6-string-html", "vitest.explorer", diff --git a/.vscode/i18n-ally-custom-framework.yml b/.vscode/i18n-ally-custom-framework.yml index 43c0ddff5..eed692a43 100644 --- a/.vscode/i18n-ally-custom-framework.yml +++ b/.vscode/i18n-ally-custom-framework.yml @@ -14,6 +14,7 @@ usageMatchRegex: # the `{key}` will be placed by a proper keypath matching regex, # you can ignore it and use your own matching rules as well - "[^\\w\\d]t\\(['\"`]({key})['\"`]" + - ]*> # A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys # and works like how the i18next framework identifies the namespace scope from the diff --git a/.vscode/mcp.json b/.vscode/mcp.json deleted file mode 100644 index 28994bb29..000000000 --- a/.vscode/mcp.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "servers": { - "nx-mcp": { - "type": "http", - "url": "http://localhost:9461/mcp" - } - } -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 4ee21bb3c..0c6d55c65 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,8 @@ "i18n-ally.keystyle": "nested", "i18n-ally.localesPaths": [ "apps/server/src/assets/translations", - "apps/client/src/translations" + "apps/client/src/translations", + "apps/website/public/translations" ], "npm.exclude": [ "**/dist", @@ -35,6 +36,5 @@ "docs/**/*.png": true, "apps/server/src/assets/doc_notes/**": true, "apps/edit-docs/demo/**": true - }, - "nxConsole.generateAiAgentRules": true + } } \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md index 942ad06e3..5e7089895 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Overview -Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. It's built as a TypeScript monorepo using NX, with multiple applications and shared packages. +Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. It's built as a TypeScript monorepo using pnpm, with multiple applications and shared packages. ## Development Commands @@ -14,12 +14,9 @@ Trilium Notes is a hierarchical note-taking application with advanced features l ### Running Applications - `pnpm run server:start` - Start development server (http://localhost:8080) -- `pnpm nx run server:serve` - Alternative server start command -- `pnpm nx run desktop:serve` - Run desktop Electron app - `pnpm run server:start-prod` - Run server in production mode ### Building -- `pnpm nx build ` - Build specific project (server, client, desktop, etc.) - `pnpm run client:build` - Build client application - `pnpm run server:build` - Build server application - `pnpm run electron:build` - Build desktop application @@ -28,13 +25,8 @@ Trilium Notes is a hierarchical note-taking application with advanced features l - `pnpm test:all` - Run all tests (parallel + sequential) - `pnpm test:parallel` - Run tests that can run in parallel - `pnpm test:sequential` - Run tests that must run sequentially (server, ckeditor5-mermaid, ckeditor5-math) -- `pnpm nx test ` - Run tests for specific project - `pnpm coverage` - Generate coverage reports -### Linting & Type Checking -- `pnpm nx run :lint` - Lint specific project -- `pnpm nx run :typecheck` - Type check specific project - ## Architecture Overview ### Monorepo Structure @@ -94,7 +86,6 @@ Frontend uses a widget system (`apps/client/src/widgets/`): - `apps/server/src/assets/db/schema.sql` - Core database structure 4. **Configuration**: - - `nx.json` - NX workspace configuration - `package.json` - Project dependencies and scripts ## Note Types and Features @@ -154,7 +145,7 @@ Trilium provides powerful user scripting capabilities: - Update schema in `apps/server/src/assets/db/schema.sql` ## Build System Notes -- Uses NX for monorepo management with build caching +- Uses pnpm for monorepo management - Vite for fast development builds - ESBuild for production optimization - pnpm workspaces for dependency management diff --git a/README.md b/README.md index 0d6626f6e..be62b5370 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ +
+ Special thanks to:
+ + Warp sponsorship
+ Warp, built for coding with multiple AI agents
+
+ Available for macOS, Linux and Windows +
+ +
+ # Trilium Notes ![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) ![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran) @@ -5,7 +16,7 @@ ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total) [![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) [![Translation status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) -[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | [Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md) +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | [Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) | [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | [Spanish](./docs/README-es.md) Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases. @@ -13,6 +24,27 @@ See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for q Trilium Screenshot +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – unstable development version, updated daily with the latest features and fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at [docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation directly in the application +- **GitHub**: Navigate through the [User Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker Setup](./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) +- [Basic Concepts and Features](./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) + ## šŸŽ 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)) @@ -56,19 +88,6 @@ 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/Trilium/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/Trilium have their sync versions incremented which prevents direct migration. -## šŸ“– 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! @@ -142,7 +161,7 @@ Download the repository, install dependencies using `pnpm` and then run the envi git clone https://github.com/TriliumNext/Trilium.git cd Trilium pnpm install -pnpm nx run edit-docs:edit-docs +pnpm edit-docs:edit-docs ``` ### Building the Executable @@ -151,7 +170,7 @@ Download the repository, install dependencies using `pnpm` and then build the de git clone https://github.com/TriliumNext/Trilium.git cd Trilium pnpm install -pnpm nx --project=desktop electron-forge:make -- --arch=x64 --platform=win32 +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 ``` For more details, see the [development docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). @@ -162,16 +181,34 @@ Please view the [documentation guide](https://github.com/TriliumNext/Trilium/blo ## šŸ‘ 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. 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) +* [zadam](https://github.com/zadam) for the original concept and implementation of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. 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) ## šŸ¤ Support -Support for the TriliumNext organization will be possible in the near future. For now, you can: -- Support continued development on TriliumNext by supporting our developers: [eliandoran](https://github.com/sponsors/eliandoran) (See the [repository insights]([developers]([url](https://github.com/TriliumNext/trilium/graphs/contributors))) for a full list) -- Show a token of gratitude to the original Trilium developer ([zadam](https://github.com/sponsors/zadam)) via [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). +Trilium is built and maintained with [hundreds of hours of work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your support keeps it open-source, improves features, and covers costs such as hosting. + +Consider supporting the main developer ([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) ## šŸ”‘ License diff --git a/_regroup/package.json b/_regroup/package.json index 7d20e9fc4..4cec178aa 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -35,22 +35,22 @@ "chore:generate-openapi": "tsx bin/generate-openapi.js" }, "devDependencies": { - "@playwright/test": "1.55.0", - "@stylistic/eslint-plugin": "5.2.3", + "@playwright/test": "1.56.1", + "@stylistic/eslint-plugin": "5.5.0", "@types/express": "5.0.3", - "@types/node": "22.18.0", + "@types/node": "22.18.12", "@types/yargs": "17.0.33", "@vitest/coverage-v8": "3.2.4", - "eslint": "9.34.0", + "eslint": "9.38.0", "eslint-plugin-simple-import-sort": "12.1.1", "esm": "3.2.25", - "jsdoc": "4.0.4", + "jsdoc": "4.0.5", "lorem-ipsum": "2.0.8", "rcedit": "4.0.1", "rimraf": "6.0.1", "tslib": "2.8.1", - "typedoc": "0.28.11", - "typedoc-plugin-missing-exports": "4.1.0" + "typedoc": "0.28.14", + "typedoc-plugin-missing-exports": "4.1.2" }, "optionalDependencies": { "appdmg": "0.6.6" diff --git a/_regroup/spec/support/etapi.ts b/_regroup/spec/support/etapi.ts index 307868d7d..b32ba38e7 100644 --- a/_regroup/spec/support/etapi.ts +++ b/_regroup/spec/support/etapi.ts @@ -1,4 +1,3 @@ -import type child_process from "child_process"; import { describe, beforeAll, afterAll } from "vitest"; let etapiAuthToken: string | undefined; @@ -12,8 +11,6 @@ type SpecDefinitionsFunc = () => void; function describeEtapi(description: string, specDefinitions: SpecDefinitionsFunc): void { describe(description, () => { - let appProcess: ReturnType; - beforeAll(async () => {}); afterAll(() => {}); diff --git a/apps/client/.env b/apps/client/.env index 78b4a229b..18a7bcf95 100644 --- a/apps/client/.env +++ b/apps/client/.env @@ -1,5 +1,4 @@ # The development license key for premium CKEditor features. # Note: This key must only be used for the Trilium Notes project. -# Expires on: 2025-09-13 -VITE_CKEDITOR_KEY=eyJhbGciOiJFUzI1NiJ9.eyJleHAiOjE3NTc3MjE1OTksImp0aSI6ImFiN2E0NjZmLWJlZGMtNDNiYy1iMzU4LTk0NGQ0YWJhY2I3ZiIsImRpc3RyaWJ1dGlvbkNoYW5uZWwiOlsic2giLCJkcnVwYWwiXSwid2hpdGVMYWJlbCI6dHJ1ZSwiZmVhdHVyZXMiOlsiRFJVUCIsIkNNVCIsIkRPIiwiRlAiLCJTQyIsIlRPQyIsIlRQTCIsIlBPRSIsIkNDIiwiTUYiLCJTRUUiLCJFQ0giLCJFSVMiXSwidmMiOiI1MzlkOWY5YyJ9.2rvKPql4hmukyXhEtWPZ8MLxKvzPIwzCdykO653g7IxRRZy2QJpeRszElZx9DakKYZKXekVRAwQKgHxwkgbE_w +VITE_CKEDITOR_KEY=eyJhbGciOiJFUzI1NiJ9.eyJleHAiOjE3ODcyNzA0MDAsImp0aSI6IjkyMWE1MWNlLTliNDMtNGRlMC1iOTQwLTc5ZjM2MDBkYjg1NyIsImRpc3RyaWJ1dGlvbkNoYW5uZWwiOiJ0cmlsaXVtIiwiZmVhdHVyZXMiOlsiVFJJTElVTSJdLCJ2YyI6ImU4YzRhMjBkIn0.hny77p-U4-jTkoqbwPytrEar5ylGCWBN7Ez3SlB8i6_mJCBIeCSTOlVQk_JMiOEq3AGykUMHzWXzjdMFwgniOw VITE_CKEDITOR_ENABLE_INSPECTOR=false \ No newline at end of file diff --git a/apps/client/package.json b/apps/client/package.json index 27811a06e..71957e495 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -1,16 +1,21 @@ { "name": "@triliumnext/client", - "version": "0.98.1", + "version": "0.99.3", "description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)", "private": true, "license": "AGPL-3.0-only", "author": { "name": "Trilium Notes Team", "email": "contact@eliandoran.me", - "url": "https://github.com/TriliumNext/Notes" + "url": "https://github.com/TriliumNext/Trilium" + }, + "scripts": { + "build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 vite build", + "test": "vitest", + "circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular" }, "dependencies": { - "@eslint/js": "9.34.0", + "@eslint/js": "9.38.0", "@excalidraw/excalidraw": "0.18.0", "@fullcalendar/core": "6.1.19", "@fullcalendar/daygrid": "6.1.19", @@ -19,7 +24,7 @@ "@fullcalendar/multimonth": "6.1.19", "@fullcalendar/timegrid": "6.1.19", "@maplibre/maplibre-gl-leaflet": "0.1.3", - "@mermaid-js/layout-elk": "0.1.9", + "@mermaid-js/layout-elk": "0.2.0", "@mind-elixir/node-menu": "5.0.0", "@popperjs/core": "2.11.8", "@triliumnext/ckeditor5": "workspace:*", @@ -27,33 +32,35 @@ "@triliumnext/commons": "workspace:*", "@triliumnext/highlightjs": "workspace:*", "@triliumnext/share-theme": "workspace:*", + "@triliumnext/split.js": "workspace:*", "autocomplete.js": "0.38.1", "bootstrap": "5.3.8", "boxicons": "2.1.4", - "dayjs": "1.11.14", + "color": "5.0.2", + "dayjs": "1.11.18", "dayjs-plugin-utc": "0.1.2", "debounce": "2.2.0", "draggabilly": "3.0.0", - "force-graph": "1.50.1", - "globals": "16.3.0", - "i18next": "25.4.2", + "force-graph": "1.51.0", + "globals": "16.4.0", + "i18next": "25.6.0", "i18next-http-backend": "3.0.2", "jquery": "3.7.1", "jquery.fancytree": "2.38.5", "jsplumb": "2.15.6", - "katex": "0.16.22", + "katex": "0.16.25", "knockout": "3.5.1", "leaflet": "1.9.4", "leaflet-gpx": "2.2.0", "mark.js": "8.11.1", - "marked": "16.2.1", - "mermaid": "11.10.1", - "mind-elixir": "5.0.6", + "marked": "16.4.1", + "mermaid": "11.12.0", + "mind-elixir": "5.3.3", "normalize.css": "8.0.1", "panzoom": "9.4.3", - "preact": "10.27.1", - "react-i18next": "15.7.2", - "split.js": "1.6.5", + "preact": "10.27.2", + "react-i18next": "16.1.2", + "reveal.js": "5.2.1", "svg-pan-zoom": "3.6.2", "tabulator-tables": "6.3.1", "vanilla-js-wheel-zoom": "9.0.4" @@ -63,26 +70,14 @@ "@preact/preset-vite": "2.10.2", "@types/bootstrap": "5.2.10", "@types/jquery": "3.5.33", - "@types/leaflet": "1.9.20", - "@types/leaflet-gpx": "1.3.7", + "@types/leaflet": "1.9.21", + "@types/leaflet-gpx": "1.3.8", "@types/mark.js": "8.11.12", - "@types/tabulator-tables": "6.2.10", + "@types/reveal.js": "5.2.1", + "@types/tabulator-tables": "6.2.11", "copy-webpack-plugin": "13.0.1", - "happy-dom": "18.0.1", + "happy-dom": "20.0.7", "script-loader": "0.7.2", - "vite-plugin-static-copy": "3.1.2" - }, - "nx": { - "name": "client", - "targets": { - "serve": { - "dependsOn": [ - "^build" - ] - }, - "circular-deps": { - "command": "pnpx dpdm -T {projectRoot}/src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular" - } - } + "vite-plugin-static-copy": "3.1.4" } } \ No newline at end of file diff --git a/apps/client/src/assets/manifest.webmanifest b/apps/client/src/assets/manifest.webmanifest index b2cbca184..1f8cb3b69 100644 --- a/apps/client/src/assets/manifest.webmanifest +++ b/apps/client/src/assets/manifest.webmanifest @@ -7,6 +7,9 @@ "display": "standalone", "scope": "/", "start_url": "/", + "display_override": [ + "window-controls-overlay" + ], "icons": [ { "src": "icon.png", diff --git a/apps/client/src/components/app_context.ts b/apps/client/src/components/app_context.ts index ca4f9745f..ce33d1447 100644 --- a/apps/client/src/components/app_context.ts +++ b/apps/client/src/components/app_context.ts @@ -1,6 +1,6 @@ import froca from "../services/froca.js"; import RootCommandExecutor from "./root_command_executor.js"; -import Entrypoints, { type SqlExecuteResults } from "./entrypoints.js"; +import Entrypoints from "./entrypoints.js"; import options from "../services/options.js"; import utils, { hasTouchBar } from "../services/utils.js"; import zoomComponent from "./zoom.js"; @@ -32,6 +32,7 @@ import type { CreateNoteOpts } from "../services/note_create.js"; import { ColumnComponent } from "tabulator-tables"; import { ChooseNoteTypeCallback } from "../widgets/dialogs/note_type_chooser.jsx"; import type RootContainer from "../widgets/containers/root_container.js"; +import { SqlExecuteResults } from "@triliumnext/commons"; interface Layout { getRootWidget: (appContext: AppContext) => RootContainer; @@ -89,6 +90,11 @@ export type CommandMappings = { closeTocCommand: CommandData; closeHlt: CommandData; showLaunchBarSubtree: CommandData; + showHiddenSubtree: CommandData; + showSQLConsoleHistory: CommandData; + logout: CommandData; + switchToMobileVersion: CommandData; + switchToDesktopVersion: CommandData; showRevisions: CommandData & { noteId?: string | null; }; @@ -110,7 +116,7 @@ export type CommandMappings = { openedFileUpdated: CommandData & { entityType: string; entityId: string; - lastModifiedMs: number; + lastModifiedMs?: number; filePath: string; }; focusAndSelectTitle: CommandData & { @@ -134,6 +140,7 @@ export type CommandMappings = { showLeftPane: CommandData; showAttachments: CommandData; showSearchHistory: CommandData; + showShareSubtree: CommandData; hoistNote: CommandData & { noteId: string }; leaveProtectedSession: CommandData; enterProtectedSession: CommandData; @@ -643,7 +650,7 @@ export class AppContext extends Component { } getComponentByEl(el: HTMLElement) { - return $(el).closest(".component").prop("component"); + return $(el).closest("[data-component-id]").prop("component"); } addBeforeUnloadListener(obj: BeforeUploadListener | (() => boolean)) { diff --git a/apps/client/src/components/entrypoints.ts b/apps/client/src/components/entrypoints.ts index 2e55a9b9d..7989960a6 100644 --- a/apps/client/src/components/entrypoints.ts +++ b/apps/client/src/components/entrypoints.ts @@ -10,22 +10,7 @@ import bundleService from "../services/bundle.js"; import froca from "../services/froca.js"; import linkService from "../services/link.js"; import { t } from "../services/i18n.js"; -import type FNote from "../entities/fnote.js"; - -// TODO: Move somewhere else nicer. -export type SqlExecuteResults = string[][][]; - -// TODO: Deduplicate with server. -interface SqlExecuteResponse { - success: boolean; - error?: string; - results: SqlExecuteResults; -} - -// TODO: Deduplicate with server. -interface CreateChildrenResponse { - note: FNote; -} +import { CreateChildrenResponse, SqlExecuteResponse } from "@triliumnext/commons"; export default class Entrypoints extends Component { constructor() { @@ -34,7 +19,7 @@ export default class Entrypoints extends Component { openDevToolsCommand() { if (utils.isElectron()) { - utils.dynamicRequire("@electron/remote").getCurrentWindow().toggleDevTools(); + utils.dynamicRequire("@electron/remote").getCurrentWindow().webContents.toggleDevTools(); } } @@ -124,7 +109,7 @@ export default class Entrypoints extends Component { if (utils.isElectron()) { // standard JS version does not work completely correctly in electron const webContents = utils.dynamicRequire("@electron/remote").getCurrentWebContents(); - const activeIndex = parseInt(webContents.navigationHistory.getActiveIndex()); + const activeIndex = webContents.navigationHistory.getActiveIndex(); webContents.goToIndex(activeIndex - 1); } else { @@ -136,7 +121,7 @@ export default class Entrypoints extends Component { if (utils.isElectron()) { // standard JS version does not work completely correctly in electron const webContents = utils.dynamicRequire("@electron/remote").getCurrentWebContents(); - const activeIndex = parseInt(webContents.navigationHistory.getActiveIndex()); + const activeIndex = webContents.navigationHistory.getActiveIndex(); webContents.goToIndex(activeIndex + 1); } else { diff --git a/apps/client/src/components/note_context.ts b/apps/client/src/components/note_context.ts index 1bc4e5498..d4bcb1fa6 100644 --- a/apps/client/src/components/note_context.ts +++ b/apps/client/src/components/note_context.ts @@ -326,9 +326,11 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded"> } // Collections must always display a note list, even if no children. - const viewType = note.getLabelValue("viewType") ?? "grid"; - if (!["list", "grid"].includes(viewType)) { - return true; + if (note.type === "book") { + const viewType = note.getLabelValue("viewType") ?? "grid"; + if (!["list", "grid"].includes(viewType)) { + return true; + } } if (!note.hasChildren()) { @@ -438,4 +440,22 @@ class NoteContext extends Component implements EventListener<"entitiesReloaded"> } } +export function openInCurrentNoteContext(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent | React.PointerEvent | null, notePath: string, viewScope?: ViewScope) { + const ntxId = $(evt?.target as Element) + .closest("[data-ntx-id]") + .attr("data-ntx-id"); + + const noteContext = ntxId ? appContext.tabManager.getNoteContextById(ntxId) : appContext.tabManager.getActiveContext(); + + if (noteContext) { + noteContext.setNote(notePath, { viewScope }).then(() => { + if (noteContext !== appContext.tabManager.getActiveContext()) { + appContext.tabManager.activateNoteContext(noteContext.ntxId); + } + }); + } else { + appContext.tabManager.openContextWithNote(notePath, { viewScope, activate: true }); + } +} + export default NoteContext; diff --git a/apps/client/src/components/tab_manager.ts b/apps/client/src/components/tab_manager.ts index 0416071c6..03b9d98d6 100644 --- a/apps/client/src/components/tab_manager.ts +++ b/apps/client/src/components/tab_manager.ts @@ -433,6 +433,9 @@ export default class TabManager extends Component { $autocompleteEl.autocomplete("close"); } + // close dangling tooltips + $("body > div.tooltip").remove(); + const noteContextsToRemove = noteContextToRemove.getSubContexts(); const ntxIdsToRemove = noteContextsToRemove.map((nc) => nc.ntxId); @@ -600,18 +603,18 @@ export default class TabManager extends Component { } async moveTabToNewWindowCommand({ ntxId }: { ntxId: string }) { - const { notePath, hoistedNoteId } = this.getNoteContextById(ntxId); + const { notePath, hoistedNoteId, viewScope } = this.getNoteContextById(ntxId); const removed = await this.removeNoteContext(ntxId); if (removed) { - this.triggerCommand("openInWindow", { notePath, hoistedNoteId }); + this.triggerCommand("openInWindow", { notePath, hoistedNoteId, viewScope }); } } async copyTabToNewWindowCommand({ ntxId }: { ntxId: string }) { - const { notePath, hoistedNoteId } = this.getNoteContextById(ntxId); - this.triggerCommand("openInWindow", { notePath, hoistedNoteId }); + const { notePath, hoistedNoteId, viewScope } = this.getNoteContextById(ntxId); + this.triggerCommand("openInWindow", { notePath, hoistedNoteId, viewScope }); } async reopenLastTabCommand() { diff --git a/apps/client/src/components/touch_bar.ts b/apps/client/src/components/touch_bar.ts index 7bf10d7f1..226318a92 100644 --- a/apps/client/src/components/touch_bar.ts +++ b/apps/client/src/components/touch_bar.ts @@ -23,11 +23,11 @@ export default class TouchBarComponent extends Component { this.$widget = $("
"); $(window).on("focusin", async (e) => { - const $target = $(e.target); + const focusedEl = e.target as unknown as HTMLElement; + const $target = $(focusedEl); this.$activeModal = $target.closest(".modal-dialog"); - const parentComponentEl = $target.closest(".component"); - this.lastFocusedComponent = appContext.getComponentByEl(parentComponentEl[0]); + this.lastFocusedComponent = appContext.getComponentByEl(focusedEl); this.#refreshTouchBar(); }); } diff --git a/apps/client/src/desktop.ts b/apps/client/src/desktop.ts index 57ff4084e..cca6c8c0f 100644 --- a/apps/client/src/desktop.ts +++ b/apps/client/src/desktop.ts @@ -10,7 +10,6 @@ import { t } from "./services/i18n.js"; import options from "./services/options.js"; import type ElectronRemote from "@electron/remote"; import type Electron from "electron"; -import "./stylesheets/bootstrap.scss"; import "boxicons/css/boxicons.min.css"; import "autocomplete.js/index_jquery.js"; @@ -45,6 +44,10 @@ if (utils.isElectron()) { electronContextMenu.setupContextMenu(); } +if (utils.isPWA()) { + initPWATopbarColor(); +} + function initOnElectron() { const electron: typeof Electron = utils.dynamicRequire("electron"); electron.ipcRenderer.on("globalShortcut", async (event, actionName) => appContext.triggerCommand(actionName)); @@ -113,3 +116,20 @@ function initDarkOrLightMode(style: CSSStyleDeclaration) { const { nativeTheme } = utils.dynamicRequire("@electron/remote") as typeof ElectronRemote; nativeTheme.themeSource = themeSource; } + +function initPWATopbarColor() { + const tracker = $("#background-color-tracker"); + + if (tracker.length) { + const applyThemeColor = () => { + let meta = $("meta[name='theme-color']"); + if (!meta.length) { + meta = $(``).appendTo($("head")); + } + meta.attr("content", tracker.css("color")); + }; + + tracker.on("transitionend", applyThemeColor); + applyThemeColor(); + } +} diff --git a/apps/client/src/entities/fnote.ts b/apps/client/src/entities/fnote.ts index b80e8e3fb..bcb6c408e 100644 --- a/apps/client/src/entities/fnote.ts +++ b/apps/client/src/entities/fnote.ts @@ -1,6 +1,5 @@ import server from "../services/server.js"; import noteAttributeCache from "../services/note_attribute_cache.js"; -import ws from "../services/ws.js"; import protectedSessionHolder from "../services/protected_session_holder.js"; import cssClassManager from "../services/css_class_manager.js"; import type { Froca } from "../services/froca-interface.js"; @@ -256,18 +255,20 @@ export default class FNote { return this.children; } - async getSubtreeNoteIds() { + async getSubtreeNoteIds(includeArchived = false) { let noteIds: (string | string[])[] = []; for (const child of await this.getChildNotes()) { + if (child.isArchived && !includeArchived) continue; + noteIds.push(child.noteId); - noteIds.push(await child.getSubtreeNoteIds()); + noteIds.push(await child.getSubtreeNoteIds(includeArchived)); } return noteIds.flat(); } async getSubtreeNotes() { const noteIds = await this.getSubtreeNoteIds(); - return this.froca.getNotes(noteIds); + return (await this.froca.getNotes(noteIds)); } async getChildNotes() { @@ -584,7 +585,7 @@ export default class FNote { let childBranches = this.getChildBranches(); if (!childBranches) { - ws.logError(`No children for '${this.noteId}'. This shouldn't happen.`); + console.error(`No children for '${this.noteId}'. This shouldn't happen.`); return []; } @@ -905,8 +906,8 @@ export default class FNote { return this.getBlob(); } - async getBlob() { - return await this.froca.getBlob("notes", this.noteId); + getBlob() { + return this.froca.getBlob("notes", this.noteId); } toString() { diff --git a/apps/client/src/layouts/desktop_layout.tsx b/apps/client/src/layouts/desktop_layout.tsx index f9ad398e1..3f9416584 100644 --- a/apps/client/src/layouts/desktop_layout.tsx +++ b/apps/client/src/layouts/desktop_layout.tsx @@ -1,47 +1,47 @@ import FlexContainer from "../widgets/containers/flex_container.js"; -import GlobalMenuWidget from "../widgets/buttons/global_menu.js"; import TabRowWidget from "../widgets/tab_row.js"; -import TitleBarButtonsWidget from "../widgets/title_bar_buttons.js"; import LeftPaneContainer from "../widgets/containers/left_pane_container.js"; import NoteTreeWidget from "../widgets/note_tree.js"; import NoteTitleWidget from "../widgets/note_title.jsx"; import NoteDetailWidget from "../widgets/note_detail.js"; import PromotedAttributesWidget from "../widgets/promoted_attributes.js"; -import NoteListWidget from "../widgets/note_list.js"; -import SqlResultWidget from "../widgets/sql_result.js"; -import SqlTableSchemasWidget from "../widgets/sql_table_schemas.js"; import NoteIconWidget from "../widgets/note_icon.jsx"; -import SearchResultWidget from "../widgets/search_result.js"; import ScrollingContainer from "../widgets/containers/scrolling_container.js"; import RootContainer from "../widgets/containers/root_container.js"; import WatchedFileUpdateStatusWidget from "../widgets/watched_file_update_status.js"; import SpacerWidget from "../widgets/spacer.js"; import QuickSearchWidget from "../widgets/quick_search.js"; import SplitNoteContainer from "../widgets/containers/split_note_container.js"; -import LeftPaneToggleWidget from "../widgets/buttons/left_pane_toggle.js"; import CreatePaneButton from "../widgets/buttons/create_pane_button.js"; import ClosePaneButton from "../widgets/buttons/close_pane_button.js"; import RightPaneContainer from "../widgets/containers/right_pane_container.js"; import NoteWrapperWidget from "../widgets/note_wrapper.js"; -import SharedInfoWidget from "../widgets/shared_info.js"; import FindWidget from "../widgets/find.js"; import TocWidget from "../widgets/toc.js"; import HighlightsListWidget from "../widgets/highlights_list.js"; import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js"; import LauncherContainer from "../widgets/containers/launcher_container.js"; -import ApiLogWidget from "../widgets/api_log.js"; import MovePaneButton from "../widgets/buttons/move_pane_button.js"; import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js"; -import ScrollPaddingWidget from "../widgets/scroll_padding.js"; +import ScrollPadding from "../widgets/scroll_padding.js"; import options from "../services/options.js"; import utils from "../services/utils.js"; -import CloseZenButton from "../widgets/close_zen_button.js"; import type { AppContext } from "../components/app_context.js"; import type { WidgetsByParent } from "../services/bundle.js"; import { applyModals } from "./layout_commons.js"; import Ribbon from "../widgets/ribbon/Ribbon.jsx"; import FloatingButtons from "../widgets/FloatingButtons.jsx"; import { DESKTOP_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx"; +import SearchResult from "../widgets/search_result.jsx"; +import GlobalMenu from "../widgets/buttons/global_menu.jsx"; +import SqlResults from "../widgets/sql_result.js"; +import SqlTableSchemas from "../widgets/sql_table_schemas.js"; +import TitleBarButtons from "../widgets/title_bar_buttons.jsx"; +import LeftPaneToggle from "../widgets/buttons/left_pane_toggle.js"; +import ApiLog from "../widgets/api_log.jsx"; +import CloseZenModeButton from "../widgets/close_zen_button.jsx"; +import SharedInfo from "../widgets/shared_info.jsx"; +import NoteList from "../widgets/collections/NoteList.jsx"; export default class DesktopLayout { @@ -76,9 +76,9 @@ export default class DesktopLayout { new FlexContainer("row") .class("tab-row-container") .child(new FlexContainer("row").id("tab-row-left-spacer")) - .optChild(launcherPaneIsHorizontal, new LeftPaneToggleWidget(true)) + .optChild(launcherPaneIsHorizontal, ) .child(new TabRowWidget().class("full-width")) - .optChild(customTitleBarButtons, new TitleBarButtonsWidget()) + .optChild(customTitleBarButtons, ) .css("height", "40px") .css("background-color", "var(--launcher-pane-background-color)") .setParent(appContext) @@ -99,7 +99,7 @@ export default class DesktopLayout { new FlexContainer("column") .id("rest-pane") .css("flex-grow", "1") - .optChild(!fullWidthTabBar, new FlexContainer("row").child(new TabRowWidget()).optChild(customTitleBarButtons, new TitleBarButtonsWidget()).css("height", "40px")) + .optChild(!fullWidthTabBar, new FlexContainer("row").child(new TabRowWidget()).optChild(customTitleBarButtons, ).css("height", "40px")) .child( new FlexContainer("row") .filling() @@ -123,27 +123,27 @@ export default class DesktopLayout { .child() .child() .child(new SpacerWidget(0, 1)) - .child(new MovePaneButton(true)) - .child(new MovePaneButton(false)) - .child(new ClosePaneButton()) - .child(new CreatePaneButton()) + .child() + .child() + .child() + .child() ) .child() - .child(new SharedInfoWidget()) + .child() .child(new WatchedFileUpdateStatusWidget()) .child() .child( new ScrollingContainer() .filling() .child(new PromotedAttributesWidget()) - .child(new SqlTableSchemasWidget()) + .child() .child(new NoteDetailWidget()) - .child(new NoteListWidget(false)) - .child(new SearchResultWidget()) - .child(new SqlResultWidget()) - .child(new ScrollPaddingWidget()) + .child() + .child() + .child() + .child() ) - .child(new ApiLogWidget()) + .child() .child(new FindWidget()) .child( ...this.customWidgets.get("node-detail-pane"), // typo, let's keep it for a while as BC @@ -162,7 +162,7 @@ export default class DesktopLayout { ) ) ) - .child(new CloseZenButton()) + .child() // Desktop-specific dialogs. .child() @@ -176,14 +176,18 @@ export default class DesktopLayout { let launcherPane; if (isHorizontal) { - launcherPane = new FlexContainer("row").css("height", "53px").class("horizontal").child(new LauncherContainer(true)).child(new GlobalMenuWidget(true)); + launcherPane = new FlexContainer("row") + .css("height", "53px") + .class("horizontal") + .child(new LauncherContainer(true)) + .child(); } else { launcherPane = new FlexContainer("column") .css("width", "53px") .class("vertical") - .child(new GlobalMenuWidget(false)) + .child() .child(new LauncherContainer(false)) - .child(new LeftPaneToggleWidget(false)); + .child(); } launcherPane.id("launcher-pane"); diff --git a/apps/client/src/layouts/layout_commons.tsx b/apps/client/src/layouts/layout_commons.tsx index 02171db60..26f8ea232 100644 --- a/apps/client/src/layouts/layout_commons.tsx +++ b/apps/client/src/layouts/layout_commons.tsx @@ -27,10 +27,11 @@ import FlexContainer from "../widgets/containers/flex_container.js"; import NoteIconWidget from "../widgets/note_icon"; import PromotedAttributesWidget from "../widgets/promoted_attributes.js"; import NoteDetailWidget from "../widgets/note_detail.js"; -import NoteListWidget from "../widgets/note_list.js"; import CallToActionDialog from "../widgets/dialogs/call_to_action.jsx"; import NoteTitleWidget from "../widgets/note_title.jsx"; -import { PopupEditorFormattingToolbar } from "../widgets/ribbon/FormattingToolbar.js"; +import FormattingToolbar from "../widgets/ribbon/FormattingToolbar.js"; +import NoteList from "../widgets/collections/NoteList.jsx"; +import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx"; export function applyModals(rootContainer: RootContainer) { rootContainer @@ -63,9 +64,9 @@ export function applyModals(rootContainer: RootContainer) { .cssBlock(".title-row > * { margin: 5px; }") .child() .child()) - .child() + .child() .child(new PromotedAttributesWidget()) .child(new NoteDetailWidget()) - .child(new NoteListWidget(true))) + .child()) .child(); } diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 18c3d4a2e..2bae994b6 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -3,11 +3,8 @@ import NoteTitleWidget from "../widgets/note_title.js"; import NoteDetailWidget from "../widgets/note_detail.js"; import QuickSearchWidget from "../widgets/quick_search.js"; import NoteTreeWidget from "../widgets/note_tree.js"; -import ToggleSidebarButtonWidget from "../widgets/mobile_widgets/toggle_sidebar_button.js"; -import MobileDetailMenuWidget from "../widgets/mobile_widgets/mobile_detail_menu.js"; import ScreenContainer from "../widgets/mobile_widgets/screen_container.js"; import ScrollingContainer from "../widgets/containers/scrolling_container.js"; -import NoteListWidget from "../widgets/note_list.js"; import GlobalMenuWidget from "../widgets/buttons/global_menu.js"; import LauncherContainer from "../widgets/containers/launcher_container.js"; import RootContainer from "../widgets/containers/root_container.js"; @@ -18,11 +15,18 @@ import type AppContext from "../components/app_context.js"; import TabRowWidget from "../widgets/tab_row.js"; import MobileEditorToolbar from "../widgets/type_widgets/ckeditor/mobile_editor_toolbar.js"; import { applyModals } from "./layout_commons.js"; -import CloseZenButton from "../widgets/close_zen_button.js"; import FilePropertiesTab from "../widgets/ribbon/FilePropertiesTab.jsx"; import { useNoteContext } from "../widgets/react/hooks.jsx"; import FloatingButtons from "../widgets/FloatingButtons.jsx"; import { MOBILE_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx"; +import ToggleSidebarButton from "../widgets/mobile_widgets/toggle_sidebar_button.jsx"; +import CloseZenModeButton from "../widgets/close_zen_button.js"; +import NoteWrapperWidget from "../widgets/note_wrapper.js"; +import MobileDetailMenu from "../widgets/mobile_widgets/mobile_detail_menu.js"; +import NoteList from "../widgets/collections/NoteList.jsx"; +import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx"; +import SearchDefinitionTab from "../widgets/ribbon/SearchDefinitionTab.jsx"; +import SearchResult from "../widgets/search_result.jsx"; const MOBILE_CSS = ` `); + const adjustedColor = adjustColorLightness(color, lightThemeColorMaxLightness!, + darkThemeColorMinLightness!); + + $("head").append(``); registeredClasses.add(className); } @@ -23,6 +41,41 @@ function createClassForColor(color: string | null) { return className; } +function parseColor(color: string) { + try { + return Color(color); + } catch (ex) { + console.error(ex); + } +} + +/** + * Returns a pair of colors — one optimized for light themes and the other for dark themes, derived + * from the specified color to maintain sufficient contrast with each theme. + * The adjustment is performed by limiting the color’s lightness in the CIELAB color space, + * according to the lightThemeMaxLightness and darkThemeMinLightness parameters. + */ +function adjustColorLightness(color: ColorInstance, lightThemeMaxLightness: number, darkThemeMinLightness: number) { + const labColor = color.lab(); + const lightness = labColor.l(); + + // For the light theme, limit the maximum lightness + const lightThemeColor = labColor.l(Math.min(lightness, lightThemeMaxLightness)).hex(); + + // For the dark theme, limit the minimum lightness + const darkThemeColor = labColor.l(Math.max(lightness, darkThemeMinLightness)).hex(); + + return {lightThemeColor, darkThemeColor}; +} + +/** Returns the hue of the specified color, or undefined if the color is grayscale. */ +function getHue(color: ColorInstance) { + const hslColor = color.hsl(); + if (hslColor.saturationl() > 0) { + return hslColor.hue(); + } +} + export default { createClassForColor }; diff --git a/apps/client/src/services/dialog.ts b/apps/client/src/services/dialog.ts index a1e54f5e8..22efee370 100644 --- a/apps/client/src/services/dialog.ts +++ b/apps/client/src/services/dialog.ts @@ -60,7 +60,7 @@ async function confirmDeleteNoteBoxWithNote(title: string) { return new Promise((res) => appContext.triggerCommand("showConfirmDeleteNoteBoxWithNoteDialog", { title, callback: res })); } -async function prompt(props: PromptDialogOptions) { +export async function prompt(props: PromptDialogOptions) { return new Promise((res) => appContext.triggerCommand("showPromptDialog", { ...props, callback: res })); } diff --git a/apps/client/src/services/doc_renderer.ts b/apps/client/src/services/doc_renderer.ts index 1eca3d7c6..de3cfba6c 100644 --- a/apps/client/src/services/doc_renderer.ts +++ b/apps/client/src/services/doc_renderer.ts @@ -48,6 +48,6 @@ function getUrl(docNameValue: string, language: string) { // Cannot have spaces in the URL due to how JQuery.load works. docNameValue = docNameValue.replaceAll(" ", "%20"); - const basePath = window.glob.isDev ? new URL(window.glob.assetPath).pathname : window.glob.assetPath; + const basePath = window.glob.isDev ? window.glob.assetPath + "/.." : window.glob.assetPath; return `${basePath}/doc_notes/${language}/${docNameValue}.html`; } diff --git a/apps/client/src/services/file_watcher.ts b/apps/client/src/services/file_watcher.ts index cda3c2852..c3df01b0e 100644 --- a/apps/client/src/services/file_watcher.ts +++ b/apps/client/src/services/file_watcher.ts @@ -1,16 +1,8 @@ import ws from "./ws.js"; import appContext from "../components/app_context.js"; +import { OpenedFileUpdateStatus } from "@triliumnext/commons"; -// TODO: Deduplicate -interface Message { - type: string; - entityType: string; - entityId: string; - lastModifiedMs: number; - filePath: string; -} - -const fileModificationStatus: Record> = { +const fileModificationStatus: Record> = { notes: {}, attachments: {} }; @@ -39,7 +31,7 @@ function ignoreModification(entityType: string, entityId: string) { delete fileModificationStatus[entityType][entityId]; } -ws.subscribeToMessages(async (message: Message) => { +ws.subscribeToMessages(async message => { if (message.type !== "openedFileUpdated") { return; } diff --git a/apps/client/src/services/froca.ts b/apps/client/src/services/froca.ts index 6bbc3a50d..a1529db72 100644 --- a/apps/client/src/services/froca.ts +++ b/apps/client/src/services/froca.ts @@ -40,20 +40,23 @@ class FrocaImpl implements Froca { constructor() { this.initializedPromise = this.loadInitialTree(); + this.#clear(); } async loadInitialTree() { const resp = await server.get("tree"); // clear the cache only directly before adding new content which is important for e.g., switching to protected session + this.#clear(); + this.addResp(resp); + } + #clear() { this.notes = {}; this.branches = {}; this.attributes = {}; this.attachments = {}; this.blobPromises = {}; - - this.addResp(resp); } async loadSubTree(subTreeNoteId: string) { diff --git a/apps/client/src/services/froca_updater.ts b/apps/client/src/services/froca_updater.ts index 50826b5a5..6d6ef9213 100644 --- a/apps/client/src/services/froca_updater.ts +++ b/apps/client/src/services/froca_updater.ts @@ -8,6 +8,7 @@ import FAttribute, { type FAttributeRow } from "../entities/fattribute.js"; import FAttachment, { type FAttachmentRow } from "../entities/fattachment.js"; import type { default as FNote, FNoteRow } from "../entities/fnote.js"; import type { EntityChange } from "../server_types.js"; +import type { OptionNames } from "@triliumnext/commons"; async function processEntityChanges(entityChanges: EntityChange[]) { const loadResults = new LoadResults(entityChanges); @@ -30,9 +31,8 @@ async function processEntityChanges(entityChanges: EntityChange[]) { continue; // only noise } - options.set(attributeEntity.name, attributeEntity.value); - - loadResults.addOption(attributeEntity.name); + options.set(attributeEntity.name as OptionNames, attributeEntity.value); + loadResults.addOption(attributeEntity.name as OptionNames); } else if (ec.entityName === "attachments") { processAttachment(loadResults, ec); } else if (ec.entityName === "blobs") { diff --git a/apps/client/src/services/frontend_script_api.ts b/apps/client/src/services/frontend_script_api.ts index 13b407a81..bc1e372e4 100644 --- a/apps/client/src/services/frontend_script_api.ts +++ b/apps/client/src/services/frontend_script_api.ts @@ -21,6 +21,7 @@ import dayjs from "dayjs"; import type NoteContext from "../components/note_context.js"; import type NoteDetailWidget from "../widgets/note_detail.js"; import type Component from "../components/component.js"; +import { formatLogMessage } from "@triliumnext/commons"; /** * A whole number @@ -455,7 +456,7 @@ export interface Api { /** * Log given message to the log pane in UI */ - log(message: string): void; + log(message: string | object): void; } /** @@ -696,7 +697,7 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig this.log = (message) => { const { noteId } = this.startNote; - message = `${utils.now()}: ${message}`; + message = `${utils.now()}: ${formatLogMessage(message)}`; console.log(`Script ${noteId}: ${message}`); diff --git a/apps/client/src/services/i18n.spec.ts b/apps/client/src/services/i18n.spec.ts index e64605949..e40881643 100644 --- a/apps/client/src/services/i18n.spec.ts +++ b/apps/client/src/services/i18n.spec.ts @@ -6,7 +6,7 @@ import { describe, expect, it } from "vitest"; describe("i18n", () => { it("translations are valid JSON", () => { for (const locale of LOCALES) { - if (locale.contentOnly) { + if (locale.contentOnly || locale.id === "en_rtl") { continue; } diff --git a/apps/client/src/services/import.ts b/apps/client/src/services/import.ts index 035bed6a6..2300ca101 100644 --- a/apps/client/src/services/import.ts +++ b/apps/client/src/services/import.ts @@ -4,6 +4,7 @@ import ws from "./ws.js"; import utils from "./utils.js"; import appContext from "../components/app_context.js"; import { t } from "./i18n.js"; +import { WebSocketMessage } from "@triliumnext/commons"; type BooleanLike = boolean | "true" | "false"; @@ -66,7 +67,7 @@ function makeToast(id: string, message: string): ToastOptions { } ws.subscribeToMessages(async (message) => { - if (message.taskType !== "importNotes") { + if (!("taskType" in message) || message.taskType !== "importNotes") { return; } @@ -87,8 +88,8 @@ ws.subscribeToMessages(async (message) => { } }); -ws.subscribeToMessages(async (message) => { - if (message.taskType !== "importAttachments") { +ws.subscribeToMessages(async (message: WebSocketMessage) => { + if (!("taskType" in message) || message.taskType !== "importAttachments") { return; } diff --git a/apps/client/src/services/in_app_help.ts b/apps/client/src/services/in_app_help.ts index 00bc71246..a0b118e5c 100644 --- a/apps/client/src/services/in_app_help.ts +++ b/apps/client/src/services/in_app_help.ts @@ -1,6 +1,6 @@ import { NoteType } from "@triliumnext/commons"; -import { ViewTypeOptions } from "./note_list_renderer"; import FNote from "../entities/fnote"; +import { ViewTypeOptions } from "../widgets/collections/interface"; export const byNoteType: Record, string | null> = { canvas: null, @@ -27,7 +27,8 @@ export const byBookType: Record = { calendar: "xWbu3jpNWapp", table: "2FvYrpmOXm29", geoMap: "81SGnPGMk7Xc", - board: "CtBQqbwXDx1w" + board: "CtBQqbwXDx1w", + presentation: null }; export function getHelpUrlForNote(note: FNote | null | undefined) { diff --git a/apps/client/src/services/keyboard_actions.ts b/apps/client/src/services/keyboard_actions.ts index c72ba29bb..d65b10bb2 100644 --- a/apps/client/src/services/keyboard_actions.ts +++ b/apps/client/src/services/keyboard_actions.ts @@ -62,6 +62,10 @@ async function getAction(actionName: string, silent = false) { return action; } +export function getActionSync(actionName: string) { + return keyboardActionRepo[actionName]; +} + function updateDisplayedShortcuts($container: JQuery) { //@ts-ignore //TODO: each() does not support async callbacks. diff --git a/apps/client/src/services/link.ts b/apps/client/src/services/link.ts index 809eb58ef..b0ab04d07 100644 --- a/apps/client/src/services/link.ts +++ b/apps/client/src/services/link.ts @@ -3,16 +3,8 @@ import linkContextMenuService from "../menus/link_context_menu.js"; import appContext, { type NoteCommandData } from "../components/app_context.js"; import froca from "./froca.js"; import utils from "./utils.js"; - -// Be consistent with `allowedSchemes` in `src\services\html_sanitizer.ts` -// TODO: Deduplicate with server once we can. -export const ALLOWED_PROTOCOLS = [ - 'http', 'https', 'ftp', 'ftps', 'mailto', 'data', 'evernote', 'file', 'facetime', 'gemini', 'git', - 'gopher', 'imap', 'irc', 'irc6', 'jabber', 'jar', 'lastfm', 'ldap', 'ldaps', 'magnet', 'message', - 'mumble', 'nfs', 'onenote', 'pop', 'rmi', 's3', 'sftp', 'skype', 'sms', 'spotify', 'steam', 'svn', 'udp', - 'view-source', 'vlc', 'vnc', 'ws', 'wss', 'xmpp', 'jdbc', 'slack', 'tel', 'smb', 'zotero', 'geo', - 'mid' -]; +import { ALLOWED_PROTOCOLS } from "@triliumnext/commons"; +import { openInCurrentNoteContext } from "../components/note_context.js"; function getNotePathFromUrl(url: string) { const notePathMatch = /#(root[A-Za-z0-9_/]*)$/.exec(url); @@ -35,8 +27,7 @@ async function getLinkIcon(noteId: string, viewMode: ViewMode | undefined) { return icon; } -// TODO: Remove `string` once all the view modes have been mapped. -type ViewMode = "default" | "source" | "attachments" | "contextual-help" | string; +export type ViewMode = "default" | "source" | "attachments" | "contextual-help"; export interface ViewScope { /** @@ -326,21 +317,7 @@ function goToLinkExt(evt: MouseEvent | JQuery.ClickEvent | JQuery.MouseDownEvent viewScope }); } else if (isLeftClick) { - const ntxId = $(evt?.target as any) - .closest("[data-ntx-id]") - .attr("data-ntx-id"); - - const noteContext = ntxId ? appContext.tabManager.getNoteContextById(ntxId) : appContext.tabManager.getActiveContext(); - - if (noteContext) { - noteContext.setNote(notePath, { viewScope }).then(() => { - if (noteContext !== appContext.tabManager.getActiveContext()) { - appContext.tabManager.activateNoteContext(noteContext.ntxId); - } - }); - } else { - appContext.tabManager.openContextWithNote(notePath, { viewScope, activate: true }); - } + openInCurrentNoteContext(evt, notePath, viewScope); } } else if (hrefLink) { const withinEditLink = $link?.hasClass("ck-link-actions__preview"); diff --git a/apps/client/src/services/load_results.ts b/apps/client/src/services/load_results.ts index ef70b76cd..4a4875725 100644 --- a/apps/client/src/services/load_results.ts +++ b/apps/client/src/services/load_results.ts @@ -1,4 +1,4 @@ -import type { AttachmentRow, EtapiTokenRow } from "@triliumnext/commons"; +import type { AttachmentRow, EtapiTokenRow, OptionNames } from "@triliumnext/commons"; import type { AttributeType } from "../entities/fattribute.js"; import type { EntityChange } from "../server_types.js"; @@ -67,7 +67,7 @@ export default class LoadResults { private revisionRows: RevisionRow[]; private noteReorderings: string[]; private contentNoteIdToComponentId: ContentNoteIdToComponentIdRow[]; - private optionNames: string[]; + private optionNames: OptionNames[]; private attachmentRows: AttachmentRow[]; public hasEtapiTokenChanges: boolean = false; @@ -180,11 +180,11 @@ export default class LoadResults { return this.contentNoteIdToComponentId.find((l) => l.noteId === noteId && l.componentId !== componentId); } - addOption(name: string) { + addOption(name: OptionNames) { this.optionNames.push(name); } - isOptionReloaded(name: string) { + isOptionReloaded(name: OptionNames) { return this.optionNames.includes(name); } diff --git a/apps/client/src/services/note_list_renderer.ts b/apps/client/src/services/note_list_renderer.ts deleted file mode 100644 index 50556715a..000000000 --- a/apps/client/src/services/note_list_renderer.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type FNote from "../entities/fnote.js"; -import BoardView from "../widgets/view_widgets/board_view/index.js"; -import CalendarView from "../widgets/view_widgets/calendar_view.js"; -import GeoView from "../widgets/view_widgets/geo_view/index.js"; -import ListOrGridView from "../widgets/view_widgets/list_or_grid_view.js"; -import TableView from "../widgets/view_widgets/table_view/index.js"; -import type { ViewModeArgs } from "../widgets/view_widgets/view_mode.js"; -import type ViewMode from "../widgets/view_widgets/view_mode.js"; - -const allViewTypes = ["list", "grid", "calendar", "table", "geoMap", "board"] as const; -export type ArgsWithoutNoteId = Omit; -export type ViewTypeOptions = typeof allViewTypes[number]; - -export default class NoteListRenderer { - - private viewType: ViewTypeOptions; - private args: ArgsWithoutNoteId; - public viewMode?: ViewMode; - - constructor(args: ArgsWithoutNoteId) { - this.args = args; - this.viewType = this.#getViewType(args.parentNote); - } - - #getViewType(parentNote: FNote): ViewTypeOptions { - const viewType = parentNote.getLabelValue("viewType"); - - if (!(allViewTypes as readonly string[]).includes(viewType || "")) { - // when not explicitly set, decide based on the note type - return parentNote.type === "search" ? "list" : "grid"; - } else { - return viewType as ViewTypeOptions; - } - } - - get isFullHeight() { - switch (this.viewType) { - case "list": - case "grid": - return false; - default: - return true; - } - } - - async renderList() { - const args = this.args; - const viewMode = this.#buildViewMode(args); - this.viewMode = viewMode; - await viewMode.beforeRender(); - return await viewMode.renderList(); - } - - #buildViewMode(args: ViewModeArgs) { - switch (this.viewType) { - case "calendar": - return new CalendarView(args); - case "table": - return new TableView(args); - case "geoMap": - return new GeoView(args); - case "board": - return new BoardView(args); - case "list": - case "grid": - default: - return new ListOrGridView(this.viewType, args); - } - } - -} diff --git a/apps/client/src/services/note_types.ts b/apps/client/src/services/note_types.ts index 64d31ad39..74b6f5665 100644 --- a/apps/client/src/services/note_types.ts +++ b/apps/client/src/services/note_types.ts @@ -1,7 +1,7 @@ import { t } from "./i18n.js"; import froca from "./froca.js"; import server from "./server.js"; -import type { MenuCommandItem, MenuItem, MenuItemBadge } from "../menus/context_menu.js"; +import type { MenuCommandItem, MenuItem, MenuItemBadge, MenuSeparatorItem } from "../menus/context_menu.js"; import type { NoteType } from "../entities/fnote.js"; import type { TreeCommandNames } from "../menus/tree_context_menu.js"; @@ -73,7 +73,7 @@ const BETA_BADGE = { title: t("note_types.beta-feature") }; -const SEPARATOR = { title: "----" }; +const SEPARATOR: MenuSeparatorItem = { kind: "separator" }; const creationDateCache = new Map(); let rootCreationDate: Date | undefined; @@ -81,8 +81,8 @@ let rootCreationDate: Date | undefined; async function getNoteTypeItems(command?: TreeCommandNames) { const items: MenuItem[] = [ ...getBlankNoteTypes(command), - ...await getBuiltInTemplates(t("note_types.collections"), command, true), ...await getBuiltInTemplates(null, command, false), + ...await getBuiltInTemplates(t("note_types.collections"), command, true), ...await getUserTemplates(command) ]; @@ -121,7 +121,10 @@ async function getUserTemplates(command?: TreeCommandNames) { } const items: MenuItem[] = [ - SEPARATOR + { + title: t("note_type_chooser.templates"), + kind: "header" + } ]; for (const templateNote of templateNotes) { @@ -158,15 +161,15 @@ async function getBuiltInTemplates(title: string | null, command: TreeCommandNam if (title) { items.push({ title: title, - enabled: false, - uiIcon: "bx bx-empty" + kind: "header" }); } else { items.push(SEPARATOR); } for (const templateNote of childNotes) { - if (templateNote.hasLabel("collection") !== filterCollections) { + if (templateNote.hasLabel("collection") !== filterCollections || + !templateNote.hasLabel("template")) { continue; } diff --git a/apps/client/src/services/options.ts b/apps/client/src/services/options.ts index 39bbccb23..06b7cde47 100644 --- a/apps/client/src/services/options.ts +++ b/apps/client/src/services/options.ts @@ -20,7 +20,7 @@ class Options { this.arr = arr; } - get(key: string) { + get(key: OptionNames) { return this.arr?.[key] as string; } @@ -40,7 +40,7 @@ class Options { } } - getInt(key: string) { + getInt(key: OptionNames) { const value = this.arr?.[key]; if (typeof value === "number") { return value; @@ -52,7 +52,7 @@ class Options { return null; } - getFloat(key: string) { + getFloat(key: OptionNames) { const value = this.arr?.[key]; if (typeof value !== "string") { return null; @@ -60,15 +60,15 @@ class Options { return parseFloat(value); } - is(key: string) { + is(key: OptionNames) { return this.arr[key] === "true"; } - set(key: string, value: OptionValue) { + set(key: OptionNames, value: OptionValue) { this.arr[key] = value; } - async save(key: string, value: OptionValue) { + async save(key: OptionNames, value: OptionValue) { this.set(key, value); const payload: Record = {}; @@ -85,7 +85,7 @@ class Options { await server.put("options", newValues); } - async toggle(key: string) { + async toggle(key: OptionNames) { await this.save(key, (!this.is(key)).toString()); } } diff --git a/apps/client/src/services/protected_session.ts b/apps/client/src/services/protected_session.ts index fc34a805f..1e1984ae5 100644 --- a/apps/client/src/services/protected_session.ts +++ b/apps/client/src/services/protected_session.ts @@ -107,11 +107,11 @@ function makeToast(message: Message, title: string, text: string): ToastOptions } ws.subscribeToMessages(async (message) => { - if (message.taskType !== "protectNotes") { + if (!("taskType" in message) || message.taskType !== "protectNotes") { return; } - const isProtecting = message.data.protect; + const isProtecting = message.data?.protect; const title = isProtecting ? t("protected_session.protecting-title") : t("protected_session.unprotecting-title"); if (message.type === "taskError") { diff --git a/apps/client/src/services/resizer.ts b/apps/client/src/services/resizer.ts index e0dc40995..93cb5c1b0 100644 --- a/apps/client/src/services/resizer.ts +++ b/apps/client/src/services/resizer.ts @@ -1,5 +1,5 @@ import options from "./options.js"; -import Split from "split.js" +import Split from "@triliumnext/split.js"; export const DEFAULT_GUTTER_SIZE = 5; @@ -10,6 +10,10 @@ let leftInstance: ReturnType | null; let rightPaneWidth: number; let rightInstance: ReturnType | null; +const noteSplitMap = new Map | undefined>(); // key: a group of ntxIds, value: the corresponding Split instance +const noteSplitRafMap = new Map(); +let splitNoteContainer: HTMLElement | undefined; + function setupLeftPaneResizer(leftPaneVisible: boolean) { if (leftInstance) { leftInstance.destroy(); @@ -42,6 +46,7 @@ function setupLeftPaneResizer(leftPaneVisible: boolean) { sizes: [leftPaneWidth, restPaneWidth], gutterSize: DEFAULT_GUTTER_SIZE, minSize: [150, 300], + rtl: glob.isRtl, onDragEnd: (sizes) => { leftPaneWidth = Math.round(sizes[0]); options.save("leftPaneWidth", Math.round(sizes[0])); @@ -75,6 +80,7 @@ function setupRightPaneResizer() { sizes: [100 - rightPaneWidth, rightPaneWidth], gutterSize: DEFAULT_GUTTER_SIZE, minSize: [300, 180], + rtl: glob.isRtl, onDragEnd: (sizes) => { rightPaneWidth = Math.round(sizes[1]); options.save("rightPaneWidth", Math.round(sizes[1])); @@ -83,7 +89,87 @@ function setupRightPaneResizer() { } } +function findKeyByNtxId(ntxId: string): string[] | undefined { + // Find the corresponding key in noteSplitMap based on ntxId + for (const key of noteSplitMap.keys()) { + if (key.includes(ntxId)) return key; + } + return undefined; +} + +function setupNoteSplitResizer(ntxIds: string[]) { + let targetNtxIds: string[] | undefined; + for (const ntxId of ntxIds) { + targetNtxIds = findKeyByNtxId(ntxId); + if (targetNtxIds) break; + } + + if (targetNtxIds) { + noteSplitMap.get(targetNtxIds)?.destroy(); + for (const id of ntxIds) { + if (!targetNtxIds.includes(id)) { + targetNtxIds.push(id) + }; + } + } else { + targetNtxIds = [...ntxIds]; + } + noteSplitMap.set(targetNtxIds, undefined); + createSplitInstance(targetNtxIds); +} + + +function delNoteSplitResizer(ntxIds: string[]) { + let targetNtxIds = findKeyByNtxId(ntxIds[0]); + if (!targetNtxIds) { + return; + } + + noteSplitMap.get(targetNtxIds)?.destroy(); + noteSplitMap.delete(targetNtxIds); + targetNtxIds = targetNtxIds.filter(id => !ntxIds.includes(id)); + + if (targetNtxIds.length >= 2) { + noteSplitMap.set(targetNtxIds, undefined); + createSplitInstance(targetNtxIds); + } +} + +function moveNoteSplitResizer(ntxId: string) { + const targetNtxIds = findKeyByNtxId(ntxId); + if (!targetNtxIds) { + return; + } + noteSplitMap.get(targetNtxIds)?.destroy(); + noteSplitMap.set(targetNtxIds, undefined); + createSplitInstance(targetNtxIds); +} + +function createSplitInstance(targetNtxIds: string[]) { + const prevRafId = noteSplitRafMap.get(targetNtxIds); + if (prevRafId) { + cancelAnimationFrame(prevRafId); + } + + const rafId = requestAnimationFrame(() => { + splitNoteContainer = splitNoteContainer ?? $("#center-pane").find(".split-note-container-widget")[0]; + const splitPanels = [...splitNoteContainer.querySelectorAll(':scope > .note-split')] + .filter(el => targetNtxIds.includes(el.getAttribute('data-ntx-id') ?? "")); + const splitInstance = Split(splitPanels, { + rtl: glob.isRtl, + gutterSize: DEFAULT_GUTTER_SIZE, + minSize: 150, + }); + noteSplitMap.set(targetNtxIds, splitInstance); + noteSplitRafMap.delete(targetNtxIds); + }); + noteSplitRafMap.set(targetNtxIds, rafId); +} + export default { setupLeftPaneResizer, - setupRightPaneResizer + setupRightPaneResizer, + setupNoteSplitResizer, + delNoteSplitResizer, + moveNoteSplitResizer }; diff --git a/apps/client/src/services/server.ts b/apps/client/src/services/server.ts index cb557b19b..b2e6efb9a 100644 --- a/apps/client/src/services/server.ts +++ b/apps/client/src/services/server.ts @@ -218,7 +218,7 @@ function ajax(url: string, method: string, data: unknown, headers: Headers, sile if (utils.isElectron()) { const ipc = utils.dynamicRequire("electron").ipcRenderer; - ipc.on("server-response", async (event: string, arg: Arg) => { + ipc.on("server-response", async (_, arg: Arg) => { if (arg.statusCode >= 200 && arg.statusCode < 300) { handleSuccessfulResponse(arg); } else { diff --git a/apps/client/src/services/shortcuts.spec.ts b/apps/client/src/services/shortcuts.spec.ts index 1a20f9a84..87f8ae489 100644 --- a/apps/client/src/services/shortcuts.spec.ts +++ b/apps/client/src/services/shortcuts.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi, beforeEach, afterEach } from "vitest"; -import shortcuts, { keyMatches, matchesShortcut } from "./shortcuts.js"; +import shortcuts, { keyMatches, matchesShortcut, isIMEComposing } from "./shortcuts.js"; // Mock utils module vi.mock("./utils.js", () => ({ @@ -119,11 +119,6 @@ describe("shortcuts", () => { metaKey: options.metaKey || false } as KeyboardEvent); - it("should match simple key shortcuts", () => { - const event = createKeyboardEvent({ key: "a", code: "KeyA" }); - expect(matchesShortcut(event, "a")).toBe(true); - }); - it("should match shortcuts with modifiers", () => { const event = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true }); expect(matchesShortcut(event, "ctrl+a")).toBe(true); @@ -148,6 +143,28 @@ describe("shortcuts", () => { expect(matchesShortcut(event, "a")).toBe(false); }); + it("should not match when no modifiers are used", () => { + const event = createKeyboardEvent({ key: "a", code: "KeyA" }); + expect(matchesShortcut(event, "a")).toBe(false); + }); + + it("should match some keys even with no modifiers", () => { + // Bare function keys + let event = createKeyboardEvent({ key: "F1", code: "F1" }); + expect(matchesShortcut(event, "F1")).toBeTruthy(); + expect(matchesShortcut(event, "f1")).toBeTruthy(); + + // Function keys with shift + event = createKeyboardEvent({ key: "F1", code: "F1", shiftKey: true }); + expect(matchesShortcut(event, "Shift+F1")).toBeTruthy(); + + // Special keys + for (const keyCode of [ "Delete", "Enter" ]) { + event = createKeyboardEvent({ key: keyCode, code: keyCode }); + expect(matchesShortcut(event, keyCode), `Key ${keyCode}`).toBeTruthy(); + } + }); + it("should handle alternative modifier names", () => { const ctrlEvent = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true }); expect(matchesShortcut(ctrlEvent, "control+a")).toBe(true); @@ -320,4 +337,36 @@ describe("shortcuts", () => { expect(event.preventDefault).not.toHaveBeenCalled(); }); }); + + describe('isIMEComposing', () => { + it('should return true when event.isComposing is true', () => { + const event = { isComposing: true, keyCode: 65 } as KeyboardEvent; + expect(isIMEComposing(event)).toBe(true); + }); + + it('should return true when keyCode is 229', () => { + const event = { isComposing: false, keyCode: 229 } as KeyboardEvent; + expect(isIMEComposing(event)).toBe(true); + }); + + it('should return true when both isComposing is true and keyCode is 229', () => { + const event = { isComposing: true, keyCode: 229 } as KeyboardEvent; + expect(isIMEComposing(event)).toBe(true); + }); + + it('should return false for normal keys', () => { + const event = { isComposing: false, keyCode: 65 } as KeyboardEvent; + expect(isIMEComposing(event)).toBe(false); + }); + + it('should return false when isComposing is undefined and keyCode is not 229', () => { + const event = { keyCode: 13 } as KeyboardEvent; + expect(isIMEComposing(event)).toBe(false); + }); + + it('should handle null/undefined events gracefully', () => { + expect(isIMEComposing(null as any)).toBe(false); + expect(isIMEComposing(undefined as any)).toBe(false); + }); + }); }); diff --git a/apps/client/src/services/shortcuts.ts b/apps/client/src/services/shortcuts.ts index c0e136c6c..94dd8893c 100644 --- a/apps/client/src/services/shortcuts.ts +++ b/apps/client/src/services/shortcuts.ts @@ -36,8 +36,35 @@ const keyMap: { [key: string]: string[] } = { }; // Function keys +const functionKeyCodes: string[] = []; for (let i = 1; i <= 19; i++) { - keyMap[`f${i}`] = [`F${i}`]; + const keyCode = `F${i}`; + functionKeyCodes.push(keyCode); + keyMap[`f${i}`] = [ keyCode ]; +} + +const KEYCODES_WITH_NO_MODIFIER = new Set([ + "Delete", + "Enter", + ...functionKeyCodes +]); + +/** + * Check if IME (Input Method Editor) is composing + * This is used to prevent keyboard shortcuts from firing during IME composition + * @param e - The keyboard event to check + * @returns true if IME is currently composing, false otherwise + */ +export function isIMEComposing(e: KeyboardEvent): boolean { + // Handle null/undefined events gracefully + if (!e) { + return false; + } + + // Standard check for composition state + // e.isComposing is true when IME is actively composing + // e.keyCode === 229 is a fallback for older browsers where 229 indicates IME processing + return e.isComposing || e.keyCode === 229; } function removeGlobalShortcut(namespace: string) { @@ -68,6 +95,13 @@ function bindElShortcut($el: JQuery, keyboardShortcut: st } const e = evt as KeyboardEvent; + + // Skip processing if IME is composing to prevent shortcuts from + // interfering with text input in CJK languages + if (isIMEComposing(e)) { + return; + } + if (matchesShortcut(e, keyboardShortcut)) { e.preventDefault(); e.stopPropagation(); @@ -137,6 +171,12 @@ export function matchesShortcut(e: KeyboardEvent, shortcut: string): boolean { const expectedShift = modifiers.includes('shift'); const expectedMeta = modifiers.includes('meta') || modifiers.includes('cmd') || modifiers.includes('command'); + // Refuse key combinations that don't include modifiers because they interfere with the normal usage of the application. + // Some keys such as function keys are an exception. + if (!(expectedCtrl || expectedAlt || expectedShift || expectedMeta) && !KEYCODES_WITH_NO_MODIFIER.has(e.code)) { + return false; + } + return e.ctrlKey === expectedCtrl && e.altKey === expectedAlt && e.shiftKey === expectedShift && diff --git a/apps/client/src/services/syntax_highlight.ts b/apps/client/src/services/syntax_highlight.ts index 9b5592a6b..89dc7c94e 100644 --- a/apps/client/src/services/syntax_highlight.ts +++ b/apps/client/src/services/syntax_highlight.ts @@ -61,7 +61,11 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery -
- + const $toast = $(options.title + ? `\ + ` + : ` + ` +
+
+
+ +
+
` ); - $toast.find(".toast-title").text(options.title); + $toast.toggleClass("no-title", !options.title); + $toast.find(".toast-title").text(options.title ?? ""); $toast.find(".toast-body").html(options.message); if (options.id) { @@ -70,7 +81,6 @@ function showMessage(message: string, delay = 2000) { console.debug(utils.now(), "message:", message); toast({ - title: "Info", icon: "check", message: message, autohide: true, @@ -82,7 +92,6 @@ export function showError(message: string, delay = 10000) { console.log(utils.now(), "error: ", message); toast({ - title: "Error", icon: "alert", message: message, autohide: true, diff --git a/apps/client/src/services/tree.ts b/apps/client/src/services/tree.ts index c508654f5..fc54c3c75 100644 --- a/apps/client/src/services/tree.ts +++ b/apps/client/src/services/tree.ts @@ -4,9 +4,6 @@ import froca from "./froca.js"; import hoistedNoteService from "./hoisted_note.js"; import appContext from "../components/app_context.js"; -/** - * @returns {string|null} - */ async function resolveNotePath(notePath: string, hoistedNoteId = "root") { const runPath = await resolveNotePathToSegments(notePath, hoistedNoteId); diff --git a/apps/client/src/services/utils.ts b/apps/client/src/services/utils.ts index 93bddede4..0f17bdc79 100644 --- a/apps/client/src/services/utils.ts +++ b/apps/client/src/services/utils.ts @@ -47,27 +47,6 @@ function parseDate(str: string) { } } -// Source: https://stackoverflow.com/a/30465299/4898894 -function getMonthsInDateRange(startDate: string, endDate: string) { - const start = startDate.split("-"); - const end = endDate.split("-"); - const startYear = parseInt(start[0]); - const endYear = parseInt(end[0]); - const dates: string[] = []; - - for (let i = startYear; i <= endYear; i++) { - const endMonth = i != endYear ? 11 : parseInt(end[1]) - 1; - const startMon = i === startYear ? parseInt(start[1]) - 1 : 0; - - for (let j = startMon; j <= endMonth; j = j > 12 ? j % 12 || 11 : j + 1) { - const month = j + 1; - const displayMonth = month < 10 ? "0" + month : month; - dates.push([i, displayMonth].join("-")); - } - } - return dates; -} - function padNum(num: number) { return `${num <= 9 ? "0" : ""}${num}`; } @@ -149,6 +128,18 @@ export function isElectron() { return !!(window && window.process && window.process.type); } +/** + * Returns `true` if the client is running as a PWA, otherwise `false`. + */ +export function isPWA() { + return ( + window.matchMedia('(display-mode: standalone)').matches + || window.matchMedia('(display-mode: window-controls-overlay)').matches + || window.navigator.standalone + || window.navigator.windowControlsOverlay + ); +} + export function isMac() { return navigator.platform.indexOf("Mac") > -1; } @@ -297,6 +288,54 @@ function isHtmlEmpty(html: string) { ); } +function formatHtml(html: string) { + let indent = "\n"; + const tab = "\t"; + let i = 0; + let pre: { indent: string; tag: string }[] = []; + + html = html + .replace(new RegExp("
([\\s\\S]+?)?
"), function (x) { + pre.push({ indent: "", tag: x }); + return "<--TEMPPRE" + i++ + "/-->"; + }) + .replace(new RegExp("<[^<>]+>[^<]?", "g"), function (x) { + let ret; + const tagRegEx = /<\/?([^\s/>]+)/.exec(x); + let tag = tagRegEx ? tagRegEx[1] : ""; + let p = new RegExp("<--TEMPPRE(\\d+)/-->").exec(x); + + if (p) { + const pInd = parseInt(p[1]); + pre[pInd].indent = indent; + } + + if (["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "menuitem", "meta", "param", "source", "track", "wbr"].indexOf(tag) >= 0) { + // self closing tag + ret = indent + x; + } else { + if (x.indexOf("") ret = indent + x.substr(0, x.length - 1) + indent + tab + x.substr(x.length - 1, x.length); + else ret = indent + x; + !p && (indent += tab); + } else { + //close tag + indent = indent.substr(0, indent.length - 1); + if (x.charAt(x.length - 1) !== ">") ret = indent + x.substr(0, x.length - 1) + indent + x.substr(x.length - 1, x.length); + else ret = indent + x; + } + } + return ret; + }); + + for (i = pre.length; i--;) { + html = html.replace("<--TEMPPRE" + i + "/-->", pre[i].tag.replace("
", "
\n").replace("
", pre[i].indent + "
")); + } + + return html.charAt(0) === "\n" ? html.substr(1, html.length - 1) : html; +} + export async function clearBrowserCache() { if (isElectron()) { const win = dynamicRequire("@electron/remote").getCurrentWindow(); @@ -311,7 +350,13 @@ function copySelectionToClipboard() { } } -export function dynamicRequire(moduleName: string) { +type dynamicRequireMappings = { + "@electron/remote": typeof import("@electron/remote"), + "electron": typeof import("electron"), + "child_process": typeof import("child_process") +}; + +export function dynamicRequire(moduleName: T): Awaited{ if (typeof __non_webpack_require__ !== "undefined") { return __non_webpack_require__(moduleName); } else { @@ -442,7 +487,7 @@ function sleep(time_ms: number) { }); } -function escapeRegExp(str: string) { +export function escapeRegExp(str: string) { return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); } @@ -824,12 +869,23 @@ export function getErrorMessage(e: unknown) { } } +/** + * Handles left or right placement of e.g. tooltips in case of right-to-left languages. If the current language is a RTL one, then left and right are swapped. Other directions are unaffected. + * @param placement a string optionally containing a "left" or "right" value. + * @returns a left/right value swapped if needed, or the same as input otherwise. + */ +export function handleRightToLeftPlacement(placement: T) { + if (!glob.isRtl) return placement; + if (placement === "left") return "right"; + if (placement === "right") return "left"; + return placement; +} + export default { reloadFrontendApp, restartDesktopApp, reloadTray, parseDate, - getMonthsInDateRange, formatDateISO, formatDateTime, formatTimeInterval, @@ -837,6 +893,7 @@ export default { localNowDateTime, now, isElectron, + isPWA, isMac, isCtrlKey, assertArguments, @@ -849,6 +906,7 @@ export default { getNoteTypeClass, getMimeTypeClass, isHtmlEmpty, + formatHtml, clearBrowserCache, copySelectionToClipboard, dynamicRequire, diff --git a/apps/client/src/services/ws.ts b/apps/client/src/services/ws.ts index dcd63e577..488000ba1 100644 --- a/apps/client/src/services/ws.ts +++ b/apps/client/src/services/ws.ts @@ -6,9 +6,11 @@ import frocaUpdater from "./froca_updater.js"; import appContext from "../components/app_context.js"; import { t } from "./i18n.js"; import type { EntityChange } from "../server_types.js"; +import { WebSocketMessage } from "@triliumnext/commons"; +import toast from "./toast.js"; -type MessageHandler = (message: any) => void; -const messageHandlers: MessageHandler[] = []; +type MessageHandler = (message: WebSocketMessage) => void; +let messageHandlers: MessageHandler[] = []; let ws: WebSocket; let lastAcceptedEntityChangeId = window.glob.maxEntityChangeIdAtLoad; @@ -47,10 +49,14 @@ function logInfo(message: string) { window.logError = logError; window.logInfo = logInfo; -function subscribeToMessages(messageHandler: MessageHandler) { +export function subscribeToMessages(messageHandler: MessageHandler) { messageHandlers.push(messageHandler); } +export function unsubscribeToMessage(messageHandler: MessageHandler) { + messageHandlers = messageHandlers.filter(handler => handler !== messageHandler); +} + // used to serialize frontend update operations let consumeQueuePromise: Promise | null = null; @@ -273,13 +279,17 @@ function connectWebSocket() { async function sendPing() { if (Date.now() - lastPingTs > 30000) { - console.log( - utils.now(), - "Lost websocket connection to the backend. If you keep having this issue repeatedly, you might want to check your reverse proxy (nginx, apache) configuration and allow/unblock WebSocket." - ); + console.warn(utils.now(), "Lost websocket connection to the backend"); + toast.showPersistent({ + id: "lost-websocket-connection", + title: t("ws.lost-websocket-connection-title"), + message: t("ws.lost-websocket-connection-message"), + icon: "no-signal" + }); } if (ws.readyState === ws.OPEN) { + toast.closePersistent("lost-websocket-connection"); ws.send( JSON.stringify({ type: "ping", @@ -294,6 +304,8 @@ async function sendPing() { } setTimeout(() => { + if (glob.device === "print") return; + ws = connectWebSocket(); lastPingTs = Date.now(); diff --git a/apps/client/src/set_password.ts b/apps/client/src/set_password.ts index 67dfee187..13be761ec 100644 --- a/apps/client/src/set_password.ts +++ b/apps/client/src/set_password.ts @@ -1,4 +1,3 @@ -import "./stylesheets/bootstrap.scss"; import "./stylesheets/auth.css"; // @TriliumNextTODO: is this even needed anymore? diff --git a/apps/client/src/setup.ts b/apps/client/src/setup.ts index ba117aaf7..29fbd15c0 100644 --- a/apps/client/src/setup.ts +++ b/apps/client/src/setup.ts @@ -1,7 +1,6 @@ import "jquery"; import utils from "./services/utils.js"; import ko from "knockout"; -import "./stylesheets/bootstrap.scss"; // TriliumNextTODO: properly make use of below types // type SetupModelSetupType = "new-document" | "sync-from-desktop" | "sync-from-server" | ""; diff --git a/apps/client/src/share.ts b/apps/client/src/share.ts index c97f18c49..b438f0c0c 100644 --- a/apps/client/src/share.ts +++ b/apps/client/src/share.ts @@ -1,6 +1,6 @@ import "normalize.css"; import "boxicons/css/boxicons.min.css"; -import "@triliumnext/ckeditor5/content.css"; +import "@triliumnext/ckeditor5/src/theme/ck-content.css"; import "@triliumnext/share-theme/styles/index.css"; import "@triliumnext/share-theme/scripts/index.js"; diff --git a/apps/client/src/stylesheets/bootstrap.scss b/apps/client/src/stylesheets/bootstrap.scss deleted file mode 100644 index b30b929fe..000000000 --- a/apps/client/src/stylesheets/bootstrap.scss +++ /dev/null @@ -1,2 +0,0 @@ -/* Import all of Bootstrap's CSS */ -@use "bootstrap/scss/bootstrap"; diff --git a/apps/client/src/stylesheets/calendar.css b/apps/client/src/stylesheets/calendar.css index a3ad89c34..48f01a9b8 100644 --- a/apps/client/src/stylesheets/calendar.css +++ b/apps/client/src/stylesheets/calendar.css @@ -60,7 +60,7 @@ appearance: none; text-align: center; border: 0; - border-left: unset; + border-inline-start: unset; background-color: var(--menu-background-color); font-weight: bold; outline: 0; @@ -102,7 +102,7 @@ content: ''; position: absolute; top: 0; - right: 0; + inset-inline-end: 0; bottom: 0; width: 1px; background-color: var(--main-border-color); diff --git a/apps/client/src/stylesheets/llm_chat.css b/apps/client/src/stylesheets/llm_chat.css index 9199d44c7..5bb4ecd1b 100644 --- a/apps/client/src/stylesheets/llm_chat.css +++ b/apps/client/src/stylesheets/llm_chat.css @@ -299,7 +299,7 @@ content: ''; position: absolute; top: 0; - left: -100%; + inset-inline-start: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, var(--hover-item-background-color, rgba(0, 0, 0, 0.03)), transparent); @@ -406,10 +406,10 @@ @keyframes shimmer { 0% { - left: -100%; + inset-inline-start: -100%; } 100% { - left: 100%; + inset-inline-start: 100%; } } diff --git a/apps/client/src/stylesheets/print.css b/apps/client/src/stylesheets/print.css deleted file mode 100644 index f537911e5..000000000 --- a/apps/client/src/stylesheets/print.css +++ /dev/null @@ -1,322 +0,0 @@ -:root { - --main-background-color: white; - --root-background: var(--main-background-color); - --launcher-pane-background-color: var(--main-background-color); - --main-text-color: black; - --input-text-color: var(--main-text-color); - - --print-font-size: 11pt; -} - -@page { - margin: 2cm; -} - -.ck-content { - font-size: var(--print-font-size); - text-align: justify; -} - -.note-detail-readonly-text { - padding: 0 !important; -} - -.no-print, -.no-print *, -.tab-row-container, -.tab-row-widget, -.title-bar-buttons, -#launcher-pane, -#left-pane, -#center-pane > *:not(.split-note-container-widget), -#right-pane, -.title-row .note-icon-widget, -.title-row .button-widget, -.ribbon-container, -.promoted-attributes-widget, -.scroll-padding-widget, -.note-list-widget, -.spacer { - display: none !important; -} - -body.mobile #mobile-sidebar-wrapper, -body.mobile .classic-toolbar-widget, -body.mobile .action-button { - display: none !important; -} - -body.mobile #detail-container { - max-height: unset; -} - -body.mobile .note-title-widget { - padding: 0 !important; -} - -body, -#root-widget, -#rest-pane > div.component:first-child, -.note-detail-printable, -.note-detail-editable-text-editor { - height: unset !important; - overflow: auto; -} - -.ck.ck-editor__editable_inline { - overflow: hidden !important; -} - -.note-title-widget input, -.note-detail-editable-text, -.note-detail-editable-text-editor { - padding: 0 !important; -} - -html, -body { - width: unset !important; - height: unset !important; - overflow: visible; - position: unset; - /* https://github.com/zadam/trilium/issues/3202 */ - color: black; -} - -#root-widget, -#horizontal-main-container, -#rest-pane, -#vertical-main-container, -#center-pane, -.split-note-container-widget, -.note-split:not(.hidden-ext), -body.mobile #mobile-rest-container { - display: block !important; - overflow: auto; - border-radius: 0 !important; -} - -#center-pane, -#rest-pane, -.note-split, -body.mobile #detail-container { - width: unset !important; - max-width: unset !important; -} - -.component { - contain: none !important; -} - -/* Respect page breaks */ -.page-break { - page-break-after: always; - break-after: always; -} - -.page-break > * { - display: none !important; -} - -.relation-map-wrapper { - height: 100vh !important; -} - -.table thead th, -.table td, -.table th { - /* Fix center vertical alignment of table cells */ - vertical-align: middle; -} - -pre { - box-shadow: unset !important; - border: 0.75pt solid gray !important; - border-radius: 2pt !important; -} - -th, -span[style] { - print-color-adjust: exact; - -webkit-print-color-adjust: exact; -} - -/* - * Text note specific fixes - */ -.ck-widget { - outline: none !important; -} - -.ck-placeholder, -.ck-widget__type-around, -.ck-widget__selection-handle { - display: none !important; -} - -.ck-widget.table td.ck-editor__nested-editable.ck-editor__nested-editable_focused, -.ck-widget.table td.ck-editor__nested-editable:focus, -.ck-widget.table th.ck-editor__nested-editable.ck-editor__nested-editable_focused, -.ck-widget.table th.ck-editor__nested-editable:focus { - background: unset !important; - outline: unset !important; -} - -.include-note .include-note-content { - max-height: unset !important; - overflow: unset !important; -} - -/* TODO: This will break once we translate the language */ -.ck-content pre[data-language="Auto-detected"]:after { - display: none !important; -} - -/* - * Code note specific fixes. - */ -.note-detail-code pre { - border: unset !important; - border-radius: unset !important; -} - -/* - * Links - */ - -.note-detail-printable a { - text-decoration: none; -} - -.note-detail-printable a:not([href^="#root/"]) { - text-decoration: underline; - color: #374a75; -} - -.note-detail-printable a::after { - /* Hide the external link trailing arrow */ - display: none !important; -} - -/* - * TODO list check boxes - */ - -.note-detail-printable .todo-list__label * { - -webkit-print-color-adjust: exact; - print-color-adjust: exact; -} - -@supports selector(.todo-list__label__description:has(*)) and (height: 1lh) { - .note-detail-printable .todo-list__label__description { - /* The percentage of the line height that the check box occupies */ - --box-ratio: 0.75; - /* The size of the gap between the check box and the caption */ - --box-text-gap: 0.25em; - - --box-size: calc(1lh * var(--box-ratio)); - --box-vert-offset: calc((1lh - var(--box-size)) / 2); - - display: inline-block; - padding-left: calc(var(--box-size) + var(--box-text-gap)); - /* Source: https://pictogrammers.com/library/mdi/icon/checkbox-blank-outline/ */ - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3e%3cpath d='M19%2c3H5C3.89%2c3 3%2c3.89 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5C21%2c3.89 20.1%2c3 19%2c3M19%2c5V19H5V5H19Z' /%3e%3c/svg%3e"); - background-position: 0 var(--box-vert-offset); - background-size: var(--box-size); - background-repeat: no-repeat; - } - - .note-detail-printable .todo-list__label:has(input[type="checkbox"]:checked) .todo-list__label__description { - /* Source: https://pictogrammers.com/library/mdi/icon/checkbox-outline/ */ - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3e%3cpath d='M19%2c3H5A2%2c2 0 0%2c0 3%2c5V19A2%2c2 0 0%2c0 5%2c21H19A2%2c2 0 0%2c0 21%2c19V5A2%2c2 0 0%2c0 19%2c3M19%2c5V19H5V5H19M10%2c17L6%2c13L7.41%2c11.58L10%2c14.17L16.59%2c7.58L18%2c9' /%3e%3c/svg%3e"); - } - - .note-detail-printable .todo-list__label input[type="checkbox"] { - display: none !important; - } -} - -/* - * Blockquotes - */ - -.note-detail-printable blockquote { - box-shadow: unset; -} - -/* - * Figures - */ - -.note-detail-printable figcaption { - --accented-background-color: transparent; - - font-style: italic; -} - -/* - * Footnotes - */ - -.note-detail-printable .footnote-reference a, -.footnote-back-link a { - text-decoration: none; -} - -/* Make the "^" link cover the whole area of the footnote item */ - -.footnote-section { - clear: both; -} - -.note-detail-printable li.footnote-item { - position: relative; - width: fit-content; -} - -.note-detail-printable .footnote-back-link, -.note-detail-printable .footnote-back-link *, -.note-detail-printable .footnote-back-link a { - display: block; - position: absolute; - - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -.note-detail-printable .footnote-back-link a { - color: transparent; -} - -.note-detail-printable .footnote-content { - display: inline-block; - width: unset; -} - -/* - * Widows and orphans - */ -p, -blockquote { - widows: 4; - orphans: 4; -} - -pre > code { - widows: 6; - orphans: 6; - overflow: auto; - white-space: pre-wrap !important; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - page-break-after: avoid; - break-after: avoid; -} diff --git a/apps/client/src/stylesheets/relation_map.css b/apps/client/src/stylesheets/relation_map.css index 7213da78f..67444e5aa 100644 --- a/apps/client/src/stylesheets/relation_map.css +++ b/apps/client/src/stylesheets/relation_map.css @@ -62,7 +62,7 @@ .note-detail-relation-map .endpoint { position: absolute; bottom: 37%; - right: 5px; + inset-inline-end: 5px; width: 1em; height: 1em; background-color: #333; diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index a8a130341..7f67e4827 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -161,7 +161,8 @@ textarea, color: var(--muted-text-color); } -.form-group.disabled { +.form-group.disabled, +.form-checkbox.disabled { opacity: 0.5; pointer-events: none; } @@ -173,12 +174,12 @@ textarea, /* Add a gap between consecutive radios / check boxes */ label.tn-radio + label.tn-radio, label.tn-checkbox + label.tn-checkbox { - margin-left: 12px; + margin-inline-start: 12px; } label.tn-radio input[type="radio"], label.tn-checkbox input[type="checkbox"] { - margin-right: .5em; + margin-inline-end: .5em; } #left-pane input, @@ -225,7 +226,7 @@ samp { .badge { --bs-badge-color: var(--muted-text-color); - margin-left: 8px; + margin-inline-start: 8px; background: var(--accented-background-color); } @@ -251,10 +252,6 @@ button.close:hover { color: var(--main-text-color) !important; } -.note-title[readonly] { - background: inherit; -} - .tdialog { display: none; } @@ -293,6 +290,11 @@ button.close:hover { pointer-events: none; } +.icon-action.btn { + padding: 0 8px; + min-width: unset !important; +} + .ui-widget-content a:not(.ui-tabs-anchor) { color: #337ab7 !important; } @@ -336,8 +338,8 @@ button kbd { } .ui-menu kbd { - margin-left: 30px; - float: right; + margin-inline-start: 30px; + float: inline-end; } .suppressed { @@ -358,24 +360,23 @@ button kbd { } .dropdown-menu, -.tabulator-popup-container { +.tabulator-popup-container, +:root .excalidraw .popover { color: var(--menu-text-color) !important; font-size: inherit; - background-color: var(--menu-background-color) !important; + background: var(--menu-background-color) !important; user-select: none; -webkit-user-select: none; --bs-dropdown-zindex: 999; --bs-dropdown-link-active-bg: var(--active-item-background-color) !important; } -.dropdown-menu .dropdown-divider { - break-before: avoid; - break-after: avoid; -} - body.desktop .dropdown-menu, -body.desktop .tabulator-popup-container { +body.desktop .tabulator-popup-container, +:root .excalidraw .dropdown-menu .dropdown-menu-container, +:root .excalidraw .popover { border: 1px solid var(--dropdown-border-color); + column-rule: 1px solid var(--dropdown-border-color); box-shadow: 0px 10px 20px rgba(0, 0, 0, var(--dropdown-shadow-opacity)); animation: dropdown-menu-opening 100ms ease-in; } @@ -394,7 +395,7 @@ body.desktop .tabulator-popup-container { } .dropend .dropdown-toggle::after { - margin-left: 0.5em; + margin-inline-start: 0.5em; color: var(--muted-text-color); } @@ -405,7 +406,7 @@ body.desktop .tabulator-popup-container { .dropdown-menu .disabled .disabled-tooltip { pointer-events: all; - margin-left: 8px; + margin-inline-start: 8px; font-size: 0.5em; color: var(--disabled-tooltip-icon-color); cursor: help; @@ -417,17 +418,18 @@ body.desktop .tabulator-popup-container { } .dropdown-menu a:hover:not(.disabled), -.dropdown-item:hover:not(.disabled, .dropdown-item-container), -.tabulator-menu-item:hover { +.dropdown-item:hover:not(.disabled, .dropdown-container-item), +.tabulator-menu-item:hover, +:root .excalidraw .context-menu .context-menu-item:hover { color: var(--hover-item-text-color) !important; background-color: var(--hover-item-background-color) !important; border-color: var(--hover-item-border-color) !important; cursor: pointer; } -.dropdown-item-container, -.dropdown-item-container:hover, -.dropdown-item-container:active { +.dropdown-container-item, +.dropdown-item.dropdown-container-item:hover, +.dropdown-container-item:active { background: transparent; cursor: default; } @@ -442,22 +444,35 @@ body #context-menu-container .dropdown-item > span { align-items: center; } -.dropdown-menu kbd { +.dropdown-item span.keyboard-shortcut, +.dropdown-item *:not(.keyboard-shortcut) > kbd { flex-grow: 1; - text-align: right; + text-align: end; + padding-inline-start: 12px; +} + +.dropdown-menu kbd { color: var(--muted-text-color); border: none; background-color: transparent; box-shadow: none; padding-bottom: 0; + padding: 0; } .dropdown-item, -.dropdown-header { +.dropdown-header, +:root .excalidraw .context-menu .context-menu-item:hover { color: var(--menu-text-color) !important; border: 1px solid transparent !important; } +/* This is a workaround for Firefox not supporting break-before / break-after: avoid on columns. + * It usually wraps a menu item followed by a separator / header and another menu item. */ +.dropdown-no-break { + break-inside: avoid; +} + .dropdown-item.disabled, .dropdown-item.disabled kbd { color: #aaa !important; @@ -465,9 +480,9 @@ body #context-menu-container .dropdown-item > span { .dropdown-item.active, .dropdown-item:focus { - color: var(--active-item-text-color) !important; - background-color: var(--active-item-background-color) !important; - border-color: var(--active-item-border-color) !important; + color: var(--active-item-text-color); + background-color: var(--active-item-background-color); + border-color: var(--active-item-border-color); outline: none; } @@ -494,7 +509,7 @@ body #context-menu-container .dropdown-item > span { body .cm-editor .cm-gutters { background-color: inherit !important; - border-right: none; + border-inline-end: none; } body .cm-editor .cm-placeholder { @@ -576,6 +591,10 @@ button.btn-sm { z-index: 1000; } +body[dir=rtl] .ck.ck-block-toolbar-button { + transform: translateX(-7px); +} + pre:not(.hljs) { color: var(--main-text-color) !important; white-space: pre-wrap; @@ -594,11 +613,11 @@ pre:not(.hljs) { pre > button.copy-button { position: absolute; top: var(--copy-button-margin-size); - right: var(--copy-button-margin-size); + inset-inline-end: var(--copy-button-margin-size); } :root pre:has(> button.copy-button) { - padding-right: calc(var(--copy-button-width) + (var(--copy-button-margin-size) * 2)); + padding-inline-end: calc(var(--copy-button-width) + (var(--copy-button-margin-size) * 2)); } pre > button.copy-button:hover { @@ -624,31 +643,31 @@ pre > button.copy-button:active { .full-text-search-button { cursor: pointer; font-size: 1.3em; - padding-left: 5px; - padding-right: 5px; + padding-inline-start: 5px; + padding-inline-end: 5px; } .input-clearer-button { cursor: pointer; font-size: 1.3em; background: inherit !important; - padding-left: 5px; - padding-right: 5px; + padding-inline-start: 5px; + padding-inline-end: 5px; } .open-external-link-button { cursor: pointer; font-size: 1.3em; - padding-left: 5px; - padding-right: 5px; + padding-inline-start: 5px; + padding-inline-end: 5px; padding-top: 8px; } .go-to-selected-note-button { cursor: pointer; font-size: 1.3em; - padding-left: 4px; - padding-right: 3px; + padding-inline-start: 4px; + padding-inline-end: 3px; } .go-to-selected-note-button.disabled, @@ -661,7 +680,7 @@ pre > button.copy-button:active { .note-autocomplete-input { /* this is for seamless integration of "input clearer" button */ - border-right: 0; + border-inline-end: 0; } table.promoted-attributes-in-tooltip { @@ -694,10 +713,10 @@ table.promoted-attributes-in-tooltip th { border-top-color: var(--main-border-color) !important; } .bs-tooltip-left .tooltip-arrow::before { - border-left-color: var(--main-border-color) !important; + border-inline-start-color: var(--main-border-color) !important; } .bs-tooltip-right .tooltip-arrow::before { - border-right-color: var(--main-border-color) !important; + border-inline-end-color: var(--main-border-color) !important; } .bs-tooltip-bottom .tooltip-arrow::after { @@ -707,17 +726,17 @@ table.promoted-attributes-in-tooltip th { border-top-color: var(--tooltip-background-color) !important; } .bs-tooltip-left .tooltip-arrow::after { - border-left-color: var(--tooltip-background-color) !important; + border-inline-start-color: var(--tooltip-background-color) !important; } .bs-tooltip-right .tooltip-arrow::after { - border-right-color: var(--tooltip-background-color) !important; + border-inline-end-color: var(--tooltip-background-color) !important; } .bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before, .bs-tooltip-left .tooltip-arrow::before { - left: -1px; + inset-inline-start: -1px; border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: var(--main-border-color) !important; + border-inline-start-color: var(--main-border-color) !important; } .bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before, @@ -729,9 +748,9 @@ table.promoted-attributes-in-tooltip th { .bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before, .bs-tooltip-right .tooltip-arrow::before { - right: -1px; + inset-inline-end: -1px; border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: var(--main-border-color) !important; + border-inline-end-color: var(--main-border-color) !important; } .bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before, @@ -743,9 +762,9 @@ table.promoted-attributes-in-tooltip th { .bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::after, .bs-tooltip-left .tooltip-arrow::after { - left: -1px; + inset-inline-start: -1px; border-width: 0.4rem 0 0.4rem 0.4rem; - border-left-color: var(--tooltip-background-color) !important; + border-inline-start-color: var(--tooltip-background-color) !important; } .bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::after, @@ -757,9 +776,9 @@ table.promoted-attributes-in-tooltip th { .bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::after, .bs-tooltip-right .tooltip-arrow::after { - right: -1px; + inset-inline-end: -1px; border-width: 0.4rem 0.4rem 0.4rem 0; - border-right-color: var(--tooltip-background-color) !important; + border-inline-end-color: var(--tooltip-background-color) !important; } .bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::after, @@ -778,7 +797,7 @@ table.promoted-attributes-in-tooltip th { background-color: var(--tooltip-background-color) !important; border: 1px solid var(--main-border-color); border-radius: 5px; - text-align: left; + text-align: start; color: var(--main-text-color) !important; max-width: 500px; box-shadow: 10px 10px 93px -25px #aaaaaa; @@ -811,7 +830,7 @@ table.promoted-attributes-in-tooltip th { .note-tooltip-content .open-popup-button { position: absolute; - right: 15px; + inset-inline-end: 15px; bottom: 8px; font-size: 1.2em; color: inherit; @@ -831,7 +850,7 @@ table.promoted-attributes-in-tooltip th { } .tooltip-inner figure.image-style-side { - float: right; + float: inline-end; } .tooltip.show { @@ -880,7 +899,7 @@ table.promoted-attributes-in-tooltip th { .aa-dropdown-menu .aa-suggestion .text { display: inline-block; width: calc(100% - 20px); - padding-left: 4px; + padding-inline-start: 4px; } .aa-dropdown-menu .aa-suggestion .search-result-title { @@ -906,7 +925,7 @@ table.promoted-attributes-in-tooltip th { } .help-button { - float: right; + float: inline-end; background: none; font-weight: 900; color: orange; @@ -982,6 +1001,11 @@ div[data-notify="container"] { font-family: var(--monospace-font-family); } +svg.ck-icon .note-icon { + color: var(--main-text-color); + font-size: 20px; +} + .ck-content { --ck-content-font-family: var(--detail-font-family); --ck-content-font-size: 1.1em; @@ -989,7 +1013,7 @@ div[data-notify="container"] { --ck-content-line-height: var(--bs-body-line-height); } -.ck-content .table table th { +:root .ck-content .table table:not(.layout-table) th { background-color: var(--accented-background-color); } @@ -1018,7 +1042,7 @@ div[data-notify="container"] { counter-increment: footnote-counter; display: flex; list-style: none; - margin-left: 0.5em; + margin-inline-start: 0.5em; } .ck-content .footnote-item > * { @@ -1026,13 +1050,13 @@ div[data-notify="container"] { } .ck-content .footnote-back-link { - margin-right: 0.1em; + margin-inline-end: 0.1em; position: relative; top: -0.2em; } .ck-content .footnotes .footnote-back-link > sup { - margin-right: 0; + margin-inline-end: 0; } .ck-content .footnote-item:before { @@ -1040,8 +1064,8 @@ div[data-notify="container"] { display: inline-block; min-width: fit-content; position: relative; - right: 0.2em; - text-align: right; + inset-inline-end: 0.2em; + text-align: end; } .ck-content .footnote-content { @@ -1057,11 +1081,11 @@ div[data-notify="container"] { } #options-dialog input[type="number"] { - text-align: right; + text-align: end; } .help-cards ul { - padding-left: 20px; + padding-inline-start: 20px; } .help-cards kbd { @@ -1123,6 +1147,27 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href .toast-body { white-space: preserve-breaks; + overflow: hidden; +} + +.toast.no-title { + display: flex; + flex-direction: row; +} + +.toast.no-title .toast-icon { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); +} + +.toast.no-title .toast-body { + padding-inline-start: 0; + padding-inline-end: 0; +} + +.toast.no-title .toast-header { + background-color: unset !important; } .ck-mentions .ck-button { @@ -1231,11 +1276,15 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href cursor: row-resize; } +.hidden-ext.note-split + .gutter { + display: none; +} + #context-menu-cover.show { position: fixed; top: 0; - left: 0; - right: 0; + inset-inline-start: 0; + inset-inline-end: 0; bottom: 0; z-index: 1000; background: rgba(0, 0, 0, 0.1); @@ -1248,8 +1297,8 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href body.mobile #context-menu-container.mobile-bottom-menu { position: fixed !important; - left: 0 !important; - right: 0 !important; + inset-inline-start: 0 !important; + inset-inline-end: 0 !important; bottom: 0 !important; top: unset !important; max-height: 70vh; @@ -1299,7 +1348,7 @@ body.desktop li.dropdown-submenu:hover > ul.dropdown-menu { .dropdown-submenu > .dropdown-menu { top: 0; - left: calc(100% - 2px); /* -2px, otherwise there's a small gap between menu and submenu where the hover can disappear */ + inset-inline-start: calc(100% - 2px); /* -2px, otherwise there's a small gap between menu and submenu where the hover can disappear */ margin-top: -10px; min-width: 15rem; /* to make submenu scrollable https://github.com/zadam/trilium/issues/3136 */ @@ -1308,7 +1357,7 @@ body.desktop li.dropdown-submenu:hover > ul.dropdown-menu { } body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { - left: calc(-100% + 10px); + inset-inline-start: calc(-100% + 10px); } .right-dropdown-widget { @@ -1374,7 +1423,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { .ck.ck-slash-command-button__text-part, .ck.ck-template-form__text-part { - margin-left: 0.5em; + margin-inline-start: 0.5em; line-height: 1.2em !important; } @@ -1405,8 +1454,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { } .area-expander-text { - padding-left: 20px; - padding-right: 20px; + padding-inline-start: 20px; + padding-inline-end: 20px; white-space: nowrap; } @@ -1452,7 +1501,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { cursor: pointer; border: none; color: var(--launcher-pane-text-color); - background-color: var(--launcher-pane-background-color); + background-color: transparent; flex-shrink: 0; } @@ -1493,16 +1542,16 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { position: fixed !important; bottom: calc(var(--mobile-bottom-offset) + var(--launcher-pane-size)) !important; top: unset !important; - left: 0 !important; - right: 0 !important; + inset-inline-start: 0 !important; + inset-inline-end: 0 !important; transform: unset !important; } #mobile-sidebar-container { position: fixed; top: 0; - left: 0; - right: 0; + inset-inline-start: 0; + inset-inline-end: 0; bottom: 0; z-index: 1000; transition: background-color 250ms ease-in-out; @@ -1517,7 +1566,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { #mobile-sidebar-wrapper { position: absolute; top: 0; - left: 0; + inset-inline-start: 0; bottom: 0; width: 85vw; padding-top: env(safe-area-inset-top); @@ -1549,8 +1598,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { body.mobile .modal-dialog { position: fixed; bottom: 0; - left: 0; - right: 0; + inset-inline-start: 0; + inset-inline-end: 0; margin: 0 !important; max-height: 85vh; display: flex; @@ -1708,8 +1757,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { display: flex; flex-shrink: 0; flex-direction: column; - margin-left: 10px; - margin-right: 5px; + margin-inline-start: 10px; + margin-inline-end: 5px; } #right-pane .card-header { @@ -1749,7 +1798,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { } #right-pane .card-body ul { - padding-left: 25px; + padding-inline-start: 25px; margin-bottom: 5px; } @@ -1760,9 +1809,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { } .note-split { - flex-basis: 0; /* so that each split has same width */ - margin-left: auto; - margin-right: auto; + margin-inline-start: auto; + margin-inline-end: auto; } .note-split.full-content-width { @@ -1781,7 +1829,7 @@ button.close:hover { .reference-link .bx { position: relative; top: 1px; - margin-right: 3px; + margin-inline-end: 3px; } .options-section:first-of-type h4 { @@ -1819,7 +1867,7 @@ textarea { .attachment-help-button { display: inline-block; - margin-left: 10px; + margin-inline-start: 10px; vertical-align: middle; font-size: 1em; } @@ -1857,11 +1905,6 @@ textarea { width: 100%; } -.jump-to-note-results .aa-dropdown-menu .aa-suggestion:hover, -.jump-to-note-results .aa-dropdown-menu .aa-cursor { - background-color: var(--hover-item-background-color, #f8f9fa); -} - /* Command palette styling */ .jump-to-note-dialog .command-suggestion { display: flex; @@ -1932,7 +1975,7 @@ textarea { } body.electron.platform-darwin:not(.native-titlebar) .tab-row-container { - padding-left: 1em; + padding-inline-start: 1em; } #tab-row-left-spacer { @@ -1940,8 +1983,12 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container { -webkit-app-region: drag; } +body.electron.platform-darwin:not(.native-titlebar) #tab-row-left-spacer { + width: 80px; +} + .tab-row-widget { - padding-right: calc(100vw - env(titlebar-area-width, 100vw)); + padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw)); } .tab-row-container .toggle-button { @@ -1991,16 +2038,20 @@ body.zen .ribbon-container:not(:has(.classic-toolbar-widget.visible)), body.zen .ribbon-container:has(.classic-toolbar-widget.visible) .ribbon-top-row, body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget.visible)), body.zen .note-icon-widget, -body.zen .title-row .button-widget, +body.zen .title-row .icon-action, body.zen .floating-buttons-children > *:not(.bx-edit-alt), body.zen .action-button { display: none !important; } +body.zen .split-note-container-widget > .gutter { + display: unset !important; +} + body.zen #launcher-pane { position: absolute !important; top: 0 !important; - right: 0 !important; + inset-inline-end: 0 !important; width: 64px !important; height: 64px !important; background: transparent !important; @@ -2011,8 +2062,8 @@ body.zen .title-row { display: block !important; height: unset !important; -webkit-app-region: drag; - padding-left: env(titlebar-area-x); - padding-right: calc(100vw - env(titlebar-area-width, 100vw) + 2.5em); + padding-inline-start: env(titlebar-area-x); + padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw) + 2.5em); } body.zen .floating-buttons { @@ -2020,7 +2071,7 @@ body.zen .floating-buttons { } body.zen .floating-buttons-children { - right: 0; + inset-inline-end: 0; } body.zen .floating-buttons-children .button-widget { @@ -2179,7 +2230,7 @@ footer.webview-footer button { .chat-input { width: 100%; resize: none; - padding-right: 40px; + padding-inline-end: 40px; } .chat-buttons { @@ -2235,14 +2286,13 @@ footer.webview-footer button { .admonition { --accent-color: var(--card-border-color); + background: color-mix(in srgb, var(--accent-color) 15%, transparent); 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; - padding-left: 2.5em; + padding-inline-start: 2.5em; overflow: hidden; } @@ -2255,7 +2305,7 @@ footer.webview-footer button { font-family: boxicons !important; position: absolute; top: 1em; - left: 1em; + inset-inline-start: 1em; } .admonition.note { --accent-color: var(--admonition-note-accent-color); } @@ -2281,18 +2331,18 @@ footer.webview-footer button { display: flex; align-items: center; font-size: 0.9em; - margin-right: 15px; + margin-inline-end: 15px; cursor: pointer; } .chat-option input[type="checkbox"] { - margin-right: 5px; + margin-inline-end: 5px; } /* Style for thinking process in chat responses */ .thinking-process { background-color: rgba(0, 0, 0, 0.05); - border-left: 3px solid var(--main-text-color); + border-inline-start: 3px solid var(--main-text-color); padding: 10px; margin: 10px 0; border-radius: 4px; @@ -2300,23 +2350,23 @@ footer.webview-footer button { .thinking-step { margin-bottom: 8px; - padding-left: 10px; + padding-inline-start: 10px; } .thinking-step.observation { - border-left: 2px solid #69c7ff; + border-inline-start: 2px solid #69c7ff; } .thinking-step.hypothesis { - border-left: 2px solid #9839f7; + border-inline-start: 2px solid #9839f7; } .thinking-step.evidence { - border-left: 2px solid #40c025; + border-inline-start: 2px solid #40c025; } .thinking-step.conclusion { - border-left: 2px solid #e2aa03; + border-inline-start: 2px solid #e2aa03; font-weight: bold; } @@ -2331,17 +2381,17 @@ footer.webview-footer button { .content-floating-buttons.top-left { top: 10px; - left: 10px; + inset-inline-start: 10px; } .content-floating-buttons.bottom-left { bottom: 10px; - left: 10px; + inset-inline-start: 10px; } .content-floating-buttons.bottom-right { bottom: 10px; - right: 10px; + inset-inline-end: 10px; } .content-floating-buttons button.bx { @@ -2355,3 +2405,35 @@ footer.webview-footer button { content: "\ec24"; transform: rotate(180deg); } + +/* CK Edito */ + +/* Insert text snippet: limit the width of the listed items to avoid overly long names */ +:root body.desktop div.ck-template-form li.ck-list__item .ck-template-form__text-part > span { + max-width: 25vw; + overflow: hidden; + text-overflow: ellipsis; +} + +.revision-diff-added { + background: rgba(100, 200, 100, 0.5); +} + +.revision-diff-removed { + background: rgba(255, 100, 100, 0.5); + text-decoration: line-through; +} + +iframe.print-iframe { + position: absolute; + top: 0; + left: -600px; + right: -600px; + bottom: 0; + width: 0; + height: 0; +} + +.excalidraw.theme--dark canvas { + --theme-filter: invert(100%) hue-rotate(180deg); +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/table.css b/apps/client/src/stylesheets/table.css index 211f5d7c6..11e401fcb 100644 --- a/apps/client/src/stylesheets/table.css +++ b/apps/client/src/stylesheets/table.css @@ -67,13 +67,13 @@ } .tabulator div.tabulator-header .tabulator-frozen.tabulator-frozen-left { - margin-left: var(--cell-editing-border-width); + margin-inline-start: var(--cell-editing-border-width); } .tabulator div.tabulator-header .tabulator-col, .tabulator div.tabulator-header .tabulator-frozen.tabulator-frozen-left { background: var(--col-header-background-color); - border-right: var(--col-header-separator-border); + border-inline-end: var(--col-header-separator-border); } /* Table body */ @@ -90,8 +90,8 @@ } .tabulator-row .tabulator-cell input { - padding-left: var(--cell-horiz-padding-size) !important; - padding-right: var(--cell-horiz-padding-size) !important; + padding-inline-start: var(--cell-horiz-padding-size) !important; + padding-inline-end: var(--cell-horiz-padding-size) !important; } .tabulator-row { @@ -117,12 +117,12 @@ /* Cell */ .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left { - margin-right: var(--cell-editing-border-width); + margin-inline-end: var(--cell-editing-border-width); } .tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left, .tabulator-row .tabulator-cell { - border-right-color: transparent; + border-inline-end-color: transparent; } .tabulator-row .tabulator-cell:not(.tabulator-editable) { @@ -156,14 +156,14 @@ /* Align items without children/expander to the ones with. */ .tabulator-cell[tabulator-field="title"] > span:first-child, /* 1st level */ .tabulator-cell[tabulator-field="title"] > div:first-child + span { /* sub-level */ - padding-left: 21px; + padding-inline-start: 21px; } /* Checkbox cells */ .tabulator .tabulator-cell:has(svg), .tabulator .tabulator-cell:has(input[type="checkbox"]) { - padding-left: 8px; + padding-inline-start: 8px; display: inline-flex; flex-direction: column; justify-content: center; diff --git a/apps/client/src/stylesheets/theme-dark.css b/apps/client/src/stylesheets/theme-dark.css index a6aab3118..a356d32fd 100644 --- a/apps/client/src/stylesheets/theme-dark.css +++ b/apps/client/src/stylesheets/theme-dark.css @@ -1,16 +1,16 @@ :root { --theme-style: dark; - --main-font-family: Montserrat; + --main-font-family: Montserrat, sans-serif; --main-font-size: normal; - --tree-font-family: Montserrat; + --tree-font-family: Montserrat, sans-serif; --tree-font-size: normal; - --detail-font-family: Montserrat; + --detail-font-family: Montserrat, sans-serif; --detail-font-size: normal; - --monospace-font-family: JetBrainsLight; + --monospace-font-family: JetBrainsLight, monospace; --monospace-font-size: normal; --main-background-color: #333; @@ -82,6 +82,17 @@ body ::-webkit-calendar-picker-indicator { filter: invert(1); } +#left-pane .fancytree-node.tinted { + --custom-color: var(--dark-theme-custom-color); +} + +:root .reference-link, +:root .reference-link:hover, +.ck-content a.reference-link > span, +.board-note { + color: var(--dark-theme-custom-color, inherit); +} + .excalidraw.theme--dark { --theme-filter: invert(80%) hue-rotate(180deg) !important; } @@ -97,3 +108,4 @@ body .todo-list input[type="checkbox"]:not(:checked):before { .ck-content pre { box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.6) !important; } + diff --git a/apps/client/src/stylesheets/theme-light.css b/apps/client/src/stylesheets/theme-light.css index b485e8a27..872e7431f 100644 --- a/apps/client/src/stylesheets/theme-light.css +++ b/apps/client/src/stylesheets/theme-light.css @@ -5,16 +5,16 @@ html { /* either light or dark, colored theme with darker tones are also dark, used e.g. for note map node colors */ --theme-style: light; - --main-font-family: Montserrat; + --main-font-family: Montserrat, sans-serif; --main-font-size: normal; - --tree-font-family: Montserrat; + --tree-font-family: Montserrat, sans-serif; --tree-font-size: normal; - --detail-font-family: Montserrat; + --detail-font-family: Montserrat, sans-serif; --detail-font-size: normal; - --monospace-font-family: JetBrainsLight; + --monospace-font-family: JetBrainsLight, monospace; --monospace-font-size: normal; --main-background-color: white; @@ -81,3 +81,14 @@ html { --mermaid-theme: default; --native-titlebar-background: #ffffff00; } + +#left-pane .fancytree-node.tinted { + --custom-color: var(--light-theme-custom-color); +} + +:root .reference-link, +:root .reference-link:hover, +.ck-content a.reference-link > span, +.board-note { + color: var(--light-theme-custom-color, inherit); +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next-dark.css b/apps/client/src/stylesheets/theme-next-dark.css index 69753b0db..98fe11a4b 100644 --- a/apps/client/src/stylesheets/theme-next-dark.css +++ b/apps/client/src/stylesheets/theme-next-dark.css @@ -13,12 +13,13 @@ --theme-style: dark; --native-titlebar-background: #00000000; + --window-background-color-bgfx: transparent; /* When background effects enabled */ --main-background-color: #272727; --main-text-color: #ccc; --main-border-color: #454545; --subtle-border-color: #313131; - --dropdown-border-color: #292929; + --dropdown-border-color: #404040; --dropdown-shadow-opacity: 0.6; --dropdown-item-icon-destructive-color: #de6e5b; --disabled-tooltip-icon-color: #7fd2ef; @@ -147,14 +148,20 @@ --launcher-pane-vert-button-hover-background: #ffffff1c; --launcher-pane-vert-button-hover-shadow: 4px 4px 4px rgba(0, 0, 0, 0.2); --launcher-pane-vert-button-focus-outline-color: var(--input-focus-outline-color); + --launcher-pane-vert-background-color-bgfx: #00000026; /* When background effects enabled */ --launcher-pane-horiz-border-color: rgb(22, 22, 22); --launcher-pane-horiz-background-color: #282828; - --launcher-pane-horiz-text-color: #909090; + --launcher-pane-horiz-text-color: #b8b8b8; --launcher-pane-horiz-button-hover-color: #ffffff; --launcher-pane-horiz-button-hover-background: #ffffff1c; --launcher-pane-horiz-button-hover-shadow: unset; --launcher-pane-horiz-button-focus-outline-color: var(--input-focus-outline-color); + --launcher-pane-horiz-background-color-bgfx: #ffffff17; /* When background effects enabled */ + --launcher-pane-horiz-border-color-bgfx: #00000080; /* When background effects enabled */ + + --global-menu-update-available-badge-background-color: #7dbe61; + --global-menu-update-available-badge-color: black; --protected-session-active-icon-color: #8edd8e; --sync-status-error-pulse-color: #f47871; @@ -168,9 +175,10 @@ --tab-close-button-hover-background: #a45353; --tab-close-button-hover-color: white; - + --active-tab-background-color: #ffffff1c; --active-tab-hover-background-color: var(--active-tab-background-color); + --active-tab-icon-color: #a9a9a9; --active-tab-text-color: #ffffffcd; --active-tab-shadow: 3px 3px 6px rgba(0, 0, 0, 0.2), -1px -1px 3px rgba(0, 0, 0, 0.4); --active-tab-dragging-shadow: var(--active-tab-shadow), 0 0 20px rgba(0, 0, 0, 0.4); @@ -260,6 +268,22 @@ * Dark color scheme tweaks */ +#left-pane .fancytree-node.tinted { + --custom-color: var(--dark-theme-custom-color); + + /* The background color of the active item in the note tree. + * The --custom-color-hue variable contains the hue of the user-selected note color. + * This value is unset for gray tones. */ + --custom-bg-color: hsl(var(--custom-color-hue), 20%, 33%, 0.4); +} + +:root .reference-link, +:root .reference-link:hover, +.ck-content a.reference-link > span, +.board-note { + color: var(--dark-theme-custom-color, inherit); +} + body ::-webkit-calendar-picker-indicator { filter: invert(1); } @@ -270,4 +294,4 @@ body ::-webkit-calendar-picker-indicator { body .todo-list input[type="checkbox"]:not(:checked):before { border-color: var(--muted-text-color) !important; -} +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next-light.css b/apps/client/src/stylesheets/theme-next-light.css index cf6e7c6eb..30f4e1c3a 100644 --- a/apps/client/src/stylesheets/theme-next-light.css +++ b/apps/client/src/stylesheets/theme-next-light.css @@ -13,6 +13,7 @@ --theme-style: light; --native-titlebar-background: #ffffff00; + --window-background-color-bgfx: transparent; /* When background effects enabled */ --main-background-color: white; --main-text-color: black; @@ -115,18 +116,18 @@ --quick-search-focus-border: #00000029; --quick-search-focus-background: #ffffff80; --quick-search-focus-color: #000; - --quick-search-result-content-background: #00000017; + --quick-search-result-content-background: #0000000f; --quick-search-result-highlight-color: #c65050; --left-pane-collapsed-border-color: #0000000d; --left-pane-background-color: #f2f2f2; --left-pane-text-color: #383838; - --left-pane-item-hover-background: #eaeaea; + --left-pane-item-hover-background: rgba(0, 0, 0, 0.032); --left-pane-item-selected-background: white; --left-pane-item-selected-color: black; --left-pane-item-selected-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2); - --left-pane-item-action-button-background: #d7d7d7; - --left-pane-item-action-button-color: inherit; + --left-pane-item-action-button-background: rgba(0, 0, 0, 0.11); + --left-pane-item-action-button-color: var(--left-pane-text-color); --left-pane-item-action-button-hover-background: white; --left-pane-item-action-button-hover-shadow: 2px 2px 3px rgba(0, 0, 0, 0.15); --left-pane-item-selected-action-button-hover-shadow: 2px 2px 10px rgba(0, 0, 0, 0.25); @@ -141,6 +142,7 @@ --launcher-pane-vert-button-hover-background: white; --launcher-pane-vert-button-hover-shadow: 4px 4px 4px rgba(0, 0, 0, 0.075); --launcher-pane-vert-button-focus-outline-color: var(--input-focus-outline-color); + --launcher-pane-vert-background-color-bgfx: #00000009; /* When background effects enabled */ --launcher-pane-horiz-border-color: rgba(0, 0, 0, 0.1); --launcher-pane-horiz-background-color: #fafafa; @@ -148,6 +150,11 @@ --launcher-pane-horiz-button-hover-background: var(--icon-button-hover-background); --launcher-pane-horiz-button-hover-shadow: unset; --launcher-pane-horiz-button-focus-outline-color: var(--input-focus-outline-color); + --launcher-pane-horiz-background-color-bgfx: #ffffffb3; /* When background effects enabled */ + --launcher-pane-horiz-border-color-bgfx: #00000026; /* When background effects enabled */ + + --global-menu-update-available-badge-background-color: #4fa450; + --global-menu-update-available-badge-color: white; --protected-session-active-icon-color: #16b516; --sync-status-error-pulse-color: #ff5528; @@ -161,9 +168,10 @@ --tab-close-button-hover-background: #c95a5a; --tab-close-button-hover-color: white; - + --active-tab-background-color: white; --active-tab-hover-background-color: var(--active-tab-background-color); + --active-tab-icon-color: gray; --active-tab-text-color: black; --active-tab-shadow: 3px 3px 6px rgba(0, 0, 0, 0.1), -1px -1px 3px rgba(0, 0, 0, 0.05); --active-tab-dragging-shadow: var(--active-tab-shadow), 0 0 20px rgba(0, 0, 0, 0.1); @@ -253,5 +261,13 @@ --ck-editor-toolbar-button-on-color: black; --ck-editor-toolbar-button-on-shadow: none; --ck-editor-toolbar-dropdown-button-open-background: #0000000f; - } + +#left-pane .fancytree-node.tinted { + --custom-color: var(--light-theme-custom-color); + + /* The background color of the active item in the note tree. + * The --custom-color-hue variable contains the hue of the user-selected note color. + * This value is unset for gray tones. */ + --custom-bg-color: hsl(var(--custom-color-hue), 37%, 89%, 1); +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next/base.css b/apps/client/src/stylesheets/theme-next/base.css index bee48c023..a33da2bc5 100644 --- a/apps/client/src/stylesheets/theme-next/base.css +++ b/apps/client/src/stylesheets/theme-next/base.css @@ -4,6 +4,7 @@ @import url(./pages.css); @import url(./ribbon.css); @import url(./notes/text.css); +@import url(./notes/canvas.css); @import url(./notes/collections/table.css); @font-face { @@ -26,7 +27,7 @@ --detail-font-family: var(--main-font-family); --detail-font-size: normal; - --monospace-font-family: JetBrainsLight; + --monospace-font-family: JetBrainsLight, monospace; --monospace-font-size: normal; --left-pane-item-selected-shadow-size: 2px; @@ -81,6 +82,20 @@ /* Theme capabilities */ --tab-note-icons: true; + + /* To ensure that a tree item's custom color remains sufficiently contrasted and readable, + * the color is adjusted based on the current color scheme (light or dark). The lightness + * component of the color represented in the CIELAB color space, will be + * constrained to a certain percentage defined below. + * + * Note: the tree background may vary when background effects are enabled, so it is recommended + * to maintain a higher contrast margin than on the usual note tree solid background. */ + + /* The maximum perceptual lightness for the custom color in the light theme (%): */ + --tree-item-light-theme-max-color-lightness: 60; + + /* The minimum perceptual lightness for the custom color in the dark theme (%): */ + --tree-item-dark-theme-min-color-lightness: 65; } body.backdrop-effects-disabled { @@ -96,16 +111,13 @@ body.backdrop-effects-disabled { * supported when this class is used. */ - .dropdown-menu:not(.static) { + .dropdown-menu:not(.static), + :root .excalidraw .popover { border-radius: var(--dropdown-border-radius); - padding: var(--menu-padding-size) !important; + padding: var(--padding, var(--menu-padding-size)) !important; font-size: 0.9rem !important; } -.dropdown-menu { - --scrollbar-background-color: var(--menu-background-color); -} - body.mobile .dropdown-menu { backdrop-filter: var(--dropdown-backdrop-filter); border-radius: var(--dropdown-border-radius); @@ -118,14 +130,15 @@ body.mobile .dropdown-menu .dropdown-menu { } body.desktop .dropdown-menu::before, -:root .ck.ck-dropdown__panel::before { +:root .ck.ck-dropdown__panel::before, +:root .excalidraw .popover::before { content: ""; backdrop-filter: var(--dropdown-backdrop-filter); border-radius: var(--dropdown-border-radius); position: absolute; top: 0; - left: 0; - right: 0; + inset-inline-start: 0; + inset-inline-end: 0; bottom: 0; z-index: -1; } @@ -152,14 +165,32 @@ body.desktop .dropdown-submenu .dropdown-menu { } .dropdown-item, -body.mobile .dropdown-submenu .dropdown-toggle { - padding: 2px 2px 2px 8px !important; - padding-inline-end: 16px !important; +body.mobile .dropdown-submenu .dropdown-toggle, +.excalidraw .context-menu .context-menu-item { + --menu-item-start-padding: 8px; + --menu-item-end-padding: 22px; + --menu-item-vertical-padding: 2px; + + padding-top: var(--menu-item-vertical-padding) !important; + padding-bottom: var(--menu-item-vertical-padding) !important; + padding-inline-start: var(--menu-item-start-padding) !important; + padding-inline-end: var(--menu-item-end-padding) !important; + /* Note: the right padding should also accommodate the submenu arrow. */ border-radius: 6px; cursor: default !important; } +:root .dropdown-item:focus-visible { + outline: 2px solid var(--input-focus-outline-color) !important; + background-color: transparent; + color: unset; +} + +:root .dropdown-item:active { + background: unset; +} + body.mobile .dropdown-submenu { padding: 0 !important; } @@ -196,26 +227,33 @@ html body .dropdown-item[disabled] { } /* Menu item keyboard shortcut */ -.dropdown-item kbd { - margin-left: 16px; +.dropdown-item kbd, +.excalidraw .context-menu-item__shortcut { font-family: unset !important; font-size: unset !important; color: var(--menu-item-keyboard-shortcut-color) !important; padding-top: 0; } -.dropdown-divider { +.dropdown-item span.keyboard-shortcut { + color: var(--menu-item-keyboard-shortcut-color) !important; + margin-inline-start: 16px; +} + +.dropdown-divider, +.excalidraw .context-menu hr { position: relative; border-color: transparent !important; overflow: visible; } -.dropdown-divider::after { +.dropdown-divider::after, +.excalidraw .context-menu hr::before { position: absolute; content: ""; top: -1px; - left: calc(0px - var(--menu-padding-size)); - right: calc(0px - var(--menu-padding-size)); + inset-inline-start: calc(0px - var(--menu-padding-size)); + inset-inline-end: calc(0px - var(--menu-padding-size)); border-top: 1px solid var(--menu-item-delimiter-color); } @@ -227,7 +265,7 @@ html body .dropdown-item[disabled] { align-items: center; justify-content: center; top: 0; - right: 0; + inset-inline-end: 0; margin: unset !important; border: unset !important; padding: 0 4px; @@ -236,10 +274,16 @@ html body .dropdown-item[disabled] { color: var(--menu-item-arrow-color) !important; } +body[dir=rtl] .dropdown-menu:not([data-popper-placement="bottom-start"]) .dropdown-toggle::after { + content: "\ea4d" !important; +} + /* Menu item group heading */ /* The heading body */ -.dropdown-menu h6 { +.dropdown-menu h6, +.excalidraw .dropdown-menu-container .dropdown-menu-group-title, +.excalidraw .dropdown-menu-container div[data-testid="canvas-background-label"] { position: relative; background: transparent; padding: 1em 8px 14px 8px; @@ -250,12 +294,14 @@ html body .dropdown-item[disabled] { } /* The delimiter line */ -.dropdown-menu h6::before { +.dropdown-menu h6::before, +.excalidraw .dropdown-menu-container .dropdown-menu-group-title::before, +.excalidraw .dropdown-menu-container div[data-testid="canvas-background-label"]::before { content: ""; position: absolute; bottom: 8px; - left: calc(0px - var(--menu-padding-size)); - right: calc(0px - var(--menu-padding-size)); + inset-inline-start: calc(0px - var(--menu-padding-size)); + inset-inline-end: calc(0px - var(--menu-padding-size)); border-top: 1px solid var(--menu-item-delimiter-color); } @@ -285,6 +331,20 @@ body.mobile .dropdown-menu .dropdown-item.submenu-open .dropdown-toggle::after { transform: rotate(270deg); } +/* Dropdown item button (used in zoom buttons in global menu) */ + +li.dropdown-item a.dropdown-item-button { + border: unset; +} + +li.dropdown-item a.dropdown-item-button.bx { + color: var(--menu-text-color) !important; +} + +li.dropdown-item a.dropdown-item-button:focus-visible { + outline: 2px solid var(--input-focus-outline-color) !important; +} + /* * TOASTS */ @@ -303,28 +363,49 @@ body.mobile .dropdown-menu .dropdown-item.submenu-open .dropdown-toggle::after { --modal-control-button-color: var(--bs-toast-color); display: flex; - flex-direction: row-reverse; + flex-direction: column; backdrop-filter: blur(6px); } #toast-container .toast .toast-header { - padding: 0 !important; background: transparent !important; border-bottom: none; + color: var(--toast-text-color) !important; } -#toast-container .toast .toast-header strong { - /* The title of the toast is no longer displayed */ - display: none; +#toast-container .toast .toast-header strong > * { + vertical-align: middle; } #toast-container .toast .toast-header .btn-close { - margin: 0 var(--bs-toast-padding-x) 0 12px; + margin: 0 0 0 12px; +} +#toast-container .toast.no-title { + flex-direction: row; } #toast-container .toast .toast-body { flex-grow: 1; + overflow: hidden; + text-overflow: ellipsis; + padding-top: 0; +} + +#toast-container .toast:not(.no-title) .bx { + margin-inline-end: 0.5em; + font-size: 1.1em; + opacity: 0.85; +} + +#toast-container .toast.no-title .bx { + margin-inline-end: 0; + font-size: 1.3em; +} + +#toast-container .toast.no-title .toast-body { + padding-top: var(--bs-toast-padding-x); + color: var(--toast-text-color); } /* diff --git a/apps/client/src/stylesheets/theme-next/dialogs.css b/apps/client/src/stylesheets/theme-next/dialogs.css index 357a541ff..ed617991c 100644 --- a/apps/client/src/stylesheets/theme-next/dialogs.css +++ b/apps/client/src/stylesheets/theme-next/dialogs.css @@ -29,7 +29,7 @@ display: flex; justify-content: center; align-items: center; - margin-left: 8px; + margin-inline-start: 8px; border: 0; border-radius: 50%; padding: 0; @@ -56,7 +56,7 @@ } .modal .modal-header .help-button { - margin-right: 0; + margin-inline-end: 0; font-size: calc(var(--modal-control-button-size) * .75); font-family: unset; font-weight: bold; @@ -141,7 +141,7 @@ div.tn-tool-dialog { /* Search box wrapper */ .jump-to-note-dialog .input-group { - margin-right: 16px; + margin-inline-end: 16px; } .jump-to-note-dialog .input-group:hover { @@ -197,8 +197,8 @@ div.tn-tool-dialog { border: unset; padding-top: var(--timeline-item-top-padding); padding-bottom: var(--timeline-item-bottom-padding); - padding-left: calc(var(--timeline-left-gap) + var(--timeline-right-gap)); - padding-right: var(--timeline-left-gap); + padding-inline-start: calc(var(--timeline-left-gap) + var(--timeline-right-gap)); + padding-inline-end: var(--timeline-left-gap); color: var(--active-item-text-color); } @@ -259,7 +259,7 @@ div.tn-tool-dialog { position: absolute; content: ""; top: var(--connector-top, 0); - left: calc(var(--timeline-left-gap) + ((var(--timeline-bullet-size) - var(--timeline-connector-size)) / 2)); + inset-inline-start: calc(var(--timeline-left-gap) + ((var(--timeline-bullet-size) - var(--timeline-connector-size)) / 2)); bottom: var(--connector-bottom, 0); width: var(--timeline-connector-size); border-radius: var(--connector-radius, 0) var(--connector-radius, 0) 0 0; @@ -291,7 +291,7 @@ div.tn-tool-dialog { position: absolute; content: ""; top: calc(var(--timeline-item-top-padding) + var(--timeline-bullet-vertical-pos)); - left: var(--timeline-left-gap); + inset-inline-start: var(--timeline-left-gap); width: var(--timeline-bullet-size); height: var(--timeline-bullet-size); border-radius: 50%; @@ -374,7 +374,7 @@ div.tn-tool-dialog { } .help-dialog .help-cards kbd:first-child { - margin-left: 0; + margin-inline-start: 0; } /* Inline code - used for Markdown samples */ @@ -392,7 +392,8 @@ div.tn-tool-dialog { } .delete-notes-list .note-path { - padding-left: 8px; + padding-inline-start: 8px; + color: var(--muted-text-color) } /* @@ -401,7 +402,7 @@ div.tn-tool-dialog { /* Labels */ .attr-edit-table th { - padding-right: 12px; + padding-inline-end: 12px; font-weight: normal; white-space: nowrap; } @@ -419,5 +420,5 @@ div.tn-tool-dialog { } .note-type-chooser-dialog div.note-type-dropdown .dropdown-item span.bx { - margin-right: .25em; + margin-inline-end: .25em; } \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next/forms.css b/apps/client/src/stylesheets/theme-next/forms.css index f4465f905..31144eaa2 100644 --- a/apps/client/src/stylesheets/theme-next/forms.css +++ b/apps/client/src/stylesheets/theme-next/forms.css @@ -5,7 +5,8 @@ button.btn.btn-primary, button.btn.btn-secondary, button.btn.btn-sm:not(.select-button), -button.btn.btn-success { +button.btn.btn-success, +button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text { display: inline-flex; align-items: center; justify-content: center; @@ -21,7 +22,8 @@ button.btn.btn-success { button.btn.btn-primary:hover, button.btn.btn-secondary:hover, button.btn.btn-sm:not(.select-button):hover, -button.btn.btn-success:hover { +button.btn.btn-success:hover, +button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text:not(.ck-disabled):hover { background: var(--cmd-button-hover-background-color); color: var(--cmd-button-hover-text-color); } @@ -29,7 +31,8 @@ button.btn.btn-success:hover { button.btn.btn-primary:active, button.btn.btn-secondary:active, button.btn.btn-sm:not(.select-button):active, -button.btn.btn-success:active { +button.btn.btn-success:active, +button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text:not(.ck-disabled):active { opacity: 0.85; box-shadow: unset; background: var(--cmd-button-background-color) !important; @@ -40,14 +43,16 @@ button.btn.btn-success:active { button.btn.btn-primary:disabled, button.btn.btn-secondary:disabled, button.btn.btn-sm:not(.select-button):disabled, -button.btn.btn-success:disabled { +button.btn.btn-success:disabled, +button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text.ck-disabled { opacity: var(--cmd-button-disabled-opacity); } button.btn.btn-primary:focus-visible, button.btn.btn-secondary:focus-visible, button.btn.btn-sm:not(.select-button):focus-visible, -button.btn.btn-success:focus-visible { +button.btn.btn-success:focus-visible, +button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel, .ck-button-replaceall, .ck-button-replace).ck-button_with-text:not(.ck-disabled):focus-visible { outline: 2px solid var(--input-focus-outline-color); } @@ -57,7 +62,7 @@ button.btn.btn-secondary span.bx, button.btn.btn-sm span.bx, button.btn.btn-success span.bx { color: var(--cmd-button-icon-color); - padding-right: 0.35em; + padding-inline-end: 0.35em; font-size: 1.2em; } @@ -66,7 +71,7 @@ button.btn.btn-primary kbd, button.btn.btn-secondary kbd, button.btn.btn-sm kbd, button.btn.btn-success kbd { - margin-left: 0.5em; + margin-inline-start: 0.5em; background: var(--cmd-button-keyboard-shortcut-background); color: var(--cmd-button-keyboard-shortcut-color); font-size: 0.6em; @@ -79,7 +84,7 @@ button.btn.btn-success kbd { */ :root .icon-action:not(.global-menu-button), -:root .btn.tn-tool-button, +:root .tn-tool-button, :root .btn-group .tn-tool-button:not(:last-child), :root .btn-group .tn-tool-button:last-child { width: var(--icon-button-size); @@ -91,8 +96,13 @@ button.btn.btn-success kbd { color: var(--icon-button-color); } +:root .btn-group .icon-action:last-child { + border-top-left-radius: unset !important; + border-bottom-left-radius: unset !important; +} + .btn-group .tn-tool-button + .tn-tool-button { - margin-left: 4px !important; + margin-inline-start: 4px !important; } /* The "x" icon button */ @@ -149,8 +159,11 @@ input[type="password"], input[type="date"], input[type="time"], input[type="datetime-local"], +:root input.ck.ck-input-text, +:root input.ck.ck-input-number, textarea.form-control, textarea, +:root textarea.ck.ck-textarea, .tn-input-field { outline: 3px solid transparent; outline-offset: 6px; @@ -167,8 +180,11 @@ input[type="password"]:hover, input[type="date"]:hover, input[type="time"]:hover, input[type="datetime-local"]:hover, +:root input.ck.ck-input-text:not([readonly="true"]):hover, +:root input.ck.ck-input-number:not([readonly="true"]):hover, textarea.form-control:hover, textarea:hover, +:root textarea.ck.ck-textarea:hover, .tn-input-field:hover { background: var(--input-hover-background); color: var(--input-hover-color); @@ -181,8 +197,11 @@ input[type="password"]:focus, input[type="date"]:focus, input[type="time"]:focus, input[type="datetime-local"]:focus, +:root input.ck.ck-input-text:not([readonly="true"]):focus, +:root input.ck.ck-input-number:not([readonly="true"]):focus, textarea.form-control:focus, textarea:focus, +:root textarea.ck.ck-textarea:focus, .tn-input-field:focus, .tn-input-field:focus-within { box-shadow: unset; @@ -218,7 +237,7 @@ input::selection, outline-offset: 6px; background: var(--input-background-color); border-radius: 6px; - padding-right: 8px; + padding-inline-end: 8px; color: var(--quick-search-color); flex-wrap: nowrap; } @@ -338,13 +357,20 @@ select.form-control, outline: 3px solid transparent; outline-offset: 6px; - padding-right: calc(15px + 1.5rem); - background: var(--input-background-color) var(--dropdown-arrow); + padding-inline-end: calc(15px + 1.5rem); + background: var(--input-background-color) var(--dropdown-arrow);; color: var(--input-text-color); border: unset; border-radius: 0.375rem; } +body[dir=rtl] select, +body[dir=rtl] select.form-select, +body[dir=rtl] select.form-control, +body[dir=rtl] .select-button.dropdown-toggle.btn { + background-position: left 0.75rem center; +} + select:hover, select.form-select:hover, select.form-control:hover, @@ -425,7 +451,7 @@ optgroup { content: "\eae1"; width: 2em; height: 100%; - right: 0; + inset-inline-end: 0; top: 0; font-size: 1.2em; font-family: boxicons; @@ -443,7 +469,7 @@ optgroup { --box-label-gap: 0.5em; position: relative; - padding-left: calc(var(--box-size) + var(--box-label-gap)) !important; + padding-inline-start: calc(var(--box-size) + var(--box-label-gap)) !important; user-select: none; } @@ -452,7 +478,7 @@ optgroup { label.tn-checkbox > input[type="checkbox"] { position: absolute; top: 0; - left: 0; + inset-inline-start: 0; width: var(--box-size); height: 100%; margin: unset; @@ -466,7 +492,7 @@ optgroup { content: ""; position: absolute; top: 50%; - left: 0; + inset-inline-start: 0; translate: 0 -50%; width: var(--box-size); height: var(--box-size); diff --git a/apps/client/src/stylesheets/theme-next/llm-chat.css b/apps/client/src/stylesheets/theme-next/llm-chat.css index dc3342485..da5b47895 100644 --- a/apps/client/src/stylesheets/theme-next/llm-chat.css +++ b/apps/client/src/stylesheets/theme-next/llm-chat.css @@ -19,11 +19,11 @@ } .chat-message.user-message { - margin-left: auto; + margin-inline-start: auto; } .chat-message.assistant-message { - margin-right: auto; + margin-inline-end: auto; } .message-avatar { @@ -33,7 +33,7 @@ display: flex; align-items: center; justify-content: center; - margin-right: 8px; + margin-inline-end: 8px; } .user-message .message-avatar { diff --git a/apps/client/src/stylesheets/theme-next/notes/canvas.css b/apps/client/src/stylesheets/theme-next/notes/canvas.css new file mode 100644 index 000000000..28603d7db --- /dev/null +++ b/apps/client/src/stylesheets/theme-next/notes/canvas.css @@ -0,0 +1,261 @@ +:root .excalidraw { + --ui-font: var(--main-font-family); + + + /* Button hover background color */ + --button-hover-bg: var(--hover-item-background-color); + --color-surface-high: var(--hover-item-background-color); + + + --button-active-border: transparent; + --color-brand-active: transparent; + + --color-surface-mid: transparent; + --color-surface-low: transparent; + + /* Slider colors */ + --color-slider-track: var(--menu-item-delimiter-color); + --color-slider-thumb: var(--muted-text-color); + + /* Selected button icon fill color */ + --color-on-primary-container: var(--ck-editor-toolbar-button-on-color); + --color-primary: var(--ck-editor-toolbar-button-on-color); + + /* Selected button icon background color */ + --color-surface-primary-container: var(--ck-editor-toolbar-button-on-background); + --color-primary-light: var(--ck-editor-toolbar-button-on-background); + + --island-bg-color: var(--floating-button-background-color); + +} + +/* Dark theme tweaks */ + +:root body .excalidraw.theme--dark { + --color-surface-high: transparent; + --color-brand-hover: transparent; +} + +:root .excalidraw.theme--dark.excalidraw .App-mobile-menu, +:root .excalidraw.theme--dark.excalidraw .App-menu__left { + --button-hover-bg: var(--hover-item-background-color); +} + +:root .excalidraw.theme--dark.excalidraw .dropdown-menu-button:hover { + --background: var(--hover-item-background-color); +} + +/* Backdrop blur pseudo-element */ +.Island:not(.App-menu__left)::before, +.excalidraw .picker::before, +:root .App-menu__left > .panelColumn > fieldset::before, +:root .App-menu__left > .panelColumn > label::before, +:root .App-menu__left > .panelColumn > div:has(> *)::before { + display: block; + position: absolute; + content: ""; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: inherit; + backdrop-filter: blur(10px) saturate(6); + z-index: -1; +} + +/* Note's root */ + +:root .type-canvas { + --floating-buttons-vert-offset: 20px; +} + + +/* Context menus */ + +/* Context menu - outer wrapper */ +:root .excalidraw .popover { + --padding: 0; + + max-width: unset; + overflow: hidden; + font-family: var(--main-font-family); +} + +/* Context menu - inner wrapper */ +:root .excalidraw .popover > .context-menu { + margin: 0; + padding: 8px !important; + overflow-y: auto; + overflow-x: hidden; + height: 100%; + border: none; + padding: 0; + box-shadow: none; + background: transparent; +} + +/* Context menu item */ +:root .excalidraw .context-menu .context-menu-item { + --menu-item-start-padding: 22px; + + border: 1px solid transparent; +} + +/* Context menu item icon */ +:root .excalidraw .dropdown-menu-item__icon { + color: var(--menu-item-icon-color); +} + +/* Context menu item label */ +:root .excalidraw .context-menu-item__label, +:root .excalidraw .context-menu-item.dangerous .context-menu-item__label { + color: var(--menu-text-color); +} + +:root .excalidraw .context-menu-item:hover .context-menu-item__label { + color: var(--hover-item-text-color); +} + +/* Context menu item keyboard shortcut */ +:root .excalidraw .context-menu-item__shortcut { + padding: 0; + opacity: 1; +} + +/* Context menu separator */ +.excalidraw .context-menu .context-menu-item-separator { + margin: 8px 0; + opacity: 1; +} + +/* Main menu */ + +/* Hide separators - no longer needed as the menu group headers feature a delimiter line */ +.excalidraw .Island.dropdown-menu-container>div:not(:has(>*)) { + display: none; +} + +/* Menu group header */ +.excalidraw .dropdown-menu-container .dropdown-menu-group-title, +.excalidraw .Island.dropdown-menu-container div[data-testid="canvas-background-label"] { + margin: 0 !important; +} + +/* Header */ + +.excalidraw .App-menu.App-menu_top { + align-items: center; +} + +.excalidraw .App-menu.App-menu_top .App-menu_top__left { + /* Fixes a layout glitch with the header when the options panel is visbile */ + --gap: 0 !important; +} + +/* The parent element of the "Library" button */ +.excalidraw .App-menu.App-menu_top > div:nth-child(3) { + flex-direction: row-reverse; +} + +/* Panels */ + +.excalidraw .zoom-actions, +.undo-redo-buttons { + box-shadow: 1px 1px 1px var(--floating-button-shadow-color); + backdrop-filter: blur(10px) saturate(6); +} + +:root .excalidraw .main-menu-trigger, +:root .excalidraw .sidebar-trigger, +:root .excalidraw .help-icon { + box-shadow: none; +} + +/* Selected color outline */ +:root .excalidraw .color-picker__button.active .color-picker__button-outline { + box-shadow: 0 0 0 2px var(--input-focus-outline-color); +} + +:root .excalidraw .buttonList label.active { + border-color: transparent; +} + +/* Options panel */ + +.excalidraw .Island.App-menu__left { + box-shadow: none; + background: transparent; + backdrop-filter: none; + width: 13.2em; +} + +body[dir=ltr] .excalidraw .Island.App-menu__left { + right: 0; +} + +body[dir=rtl] .excalidraw .Island.App-menu__left { + left: 0; +} + +:root .App-menu__left > .panelColumn { + row-gap: 5px; +} + +/* Options panel card */ +:root .App-menu__left > .panelColumn > fieldset, +:root .App-menu__left > .panelColumn > label, +:root .App-menu__left > .panelColumn > div:has(> *) { + position: relative; + margin: 0; + border-radius: 4px; + box-shadow: 1px 1px 1px var(--floating-button-shadow-color); + background: var(--floating-button-background-color); + padding: 8px 12px; + + /* backdrop: blur() creates a new stacking context that prevents some popovers like the + * arrowheads picker from being positioned correctly. To workaround this, the backdrop blur + * effect is applyed using a pseudo-element instead. */ +} + +/* Options panel card title */ +:root .App-menu__left fieldset > legend, +:root .App-menu__left div > h3, +:root .App-menu__left > .panelColumn > label { + text-transform: uppercase; + font-size: .65rem; + letter-spacing: 1pt; + color: var(--muted-text-color); +} + +/* Options panel button bar */ +:root .excalidraw .App-menu__left .buttonList { + padding: 0; +} + +/* Picker */ +body[dir=ltr] .excalidraw .App-menu__left .buttonList .picker { + translate: -80% 0; +} + +/* Properties panel */ + +body[dir=ltr] .excalidraw .exc-stats { + left: 0; +} + +body[dir=rtl] .excalidraw .exc-stats { + right: 0; +} + +/* Sidebar */ + +.split-note-container-widget > .component.type-canvas:has(.excalidraw-container > .Island.default-sidebar) > .floating-buttons { + /* Hide the floating buttons when the sidebar is open */ + display: none; +} + +/* Pickers */ + +.excalidraw .picker { + position: relative; +} \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index 404a47fec..70517ef2e 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -4,6 +4,7 @@ :root { --ck-font-face: var(--main-font-family); + --ck-input-label-height: 1.5em; } /* @@ -116,9 +117,9 @@ content: ""; position: absolute; top: var(--negative-padding); - right: var(--negative-padding); + inset-inline-end: var(--negative-padding); bottom: var(--negative-padding); - left: var(--negative-padding); + inset-inline-start: var(--negative-padding); border-radius: var(--dropdown-border-radius); backdrop-filter: var(--dropdown-backdrop-filter); z-index: -1; @@ -209,7 +210,7 @@ /* Separator */ :root .ck .ck-list__separator { margin: .5em 0; - margin-left: calc(0px - var(--ck-editor-popup-padding)); + margin-inline-start: calc(0px - var(--ck-editor-popup-padding)); width: calc(100% + (var(--ck-editor-popup-padding) * 2)); background: var(--menu-item-delimiter-color); } @@ -232,8 +233,8 @@ position: absolute; top: 0; bottom: var(--negative-padding); - left: var(--negative-padding); - right: var(--negative-padding); + inset-inline-start: var(--negative-padding); + inset-inline-end: var(--negative-padding); border-top: 1px solid var(--ck-editor-popup-border-color); background: var(--menu-section-background-color); } @@ -254,7 +255,7 @@ :root .ck.ck-toolbar .ck.ck-toolbar__separator { background: transparent; - border-left: 1px solid var(--ck-color-toolbar-border); + border-inline-start: 1px solid var(--ck-color-toolbar-border); } /* The last separator of the toolbar */ @@ -307,6 +308,11 @@ fill: black !important; } +/* Hex color input box prefix */ +:root .ck.ck-color-selector .ck-color-picker__hash-view { + margin-top: var(--ck-input-label-height); +} + /* Numbered list */ :root .ck.ck-list-properties_with-numbered-properties .ck.ck-list-styles-list { @@ -348,7 +354,8 @@ align-items: center; width: 100%; margin: 4px; - padding-right: 2em; + background: color-mix(in srgb, var(--accent) 15%, var(--main-background-color)); + padding-inline-end: 2em; border: 1px solid var(--accent); border-radius: 6px; } @@ -363,19 +370,86 @@ color: var(--accent); } -/* Action buttons */ +/* Text snippet dropdown */ -:root .ck-link-actions button.ck-button, -:root .ck-link-form button.ck-button { - --ck-border-radius: 6px; - - background: transparent; - box-shadow: unset; +div.ck-template-form { + padding: 8px; } -:root .ck-link-actions button.ck-button:hover, -:root .ck-link-form button.ck-button:hover { - background: var(--hover-item-background-color); +div.ck-template-form .ck-labeled-field-view { + margin-bottom: 8px; +} + +/* Template item */ + +:root div.ck-template-form li.ck-list__item button.ck-template-button { + padding: 4px 8px; +} + +/* Template icon */ +:root .ck-template-form .ck-button__icon { + --ck-spacing-medium: 2px; +} + +:root div.ck-template-form .note-icon { + color: var(--menu-item-icon-color); +} + +/* Template name */ +div.ck-template-form .ck-template-form__text-part { + color: var(--hover-item-text-color); + font-size: .9rem; +} + +div.ck-template-form .ck-template-form__text-part mark { + background: unset; + color: var(--quick-search-result-highlight-color); + font-weight: bold; +} + +/* Template description */ +:root div.ck-template-form .ck-template-form__description { + opacity: .5; + font-size: .9em; +} + +/* Messages */ +div.ck-template-form .ck-search__info > span { + line-height: initial; + color: var(--muted-text-color); +} + +div.ck-template-form .ck-search__info span:nth-child(2) { + display: block; + opacity: .5; + margin-top: 8px; + font-size: .9em; +} + +/* Link dropdown */ + +:root .ck.ck-form.ck-link-form ul.ck-link-form__providers-list { + border-top: none; +} + +/* Math popup */ + +.ck-math-form .ck-labeled-field-view { + --ck-input-label-height: 0; + + margin-inline-end: 8px; +} + +/* Emoji dropdown */ + +.ck-emoji-picker-form .ck-emoji__search .ck-button_with-text:not(.ck-list-item-button) { + margin-top: var(--ck-input-label-height); +} + +/* Find and replace dialog */ + +.ck-find-and-replace-form .ck-find-and-replace-form__inputs button { + margin-top: var(--ck-input-label-height); } /* Mention list (the autocompletion list for emojis, labels and relations) */ @@ -392,6 +466,58 @@ background: transparent; } +/* + * FORMS + */ + +/* + * Buttons + */ + +button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel).ck-button_with-text { + --ck-color-text: var(--cmd-button-text-color); + + min-width: 60px; + font-weight: 500; +} + +/* + * Text boxes + */ + +.ck.ck-labeled-field-view { + padding-top: var(--ck-input-label-height) !important; /* Create space for the label */ +} + +.ck.ck-labeled-field-view > .ck.ck-labeled-field-view__input-wrapper > label.ck.ck-label { + /* Move the label above the text box regardless of the text box state */ + transform: translate(0, calc(-.2em - var(--ck-input-label-height))) !important; + + padding-inline-start: 0 !important; + background: transparent; + font-size: .85em; + font-weight: 600; +} + +:root input.ck.ck-input-text[readonly="true"] { + cursor: not-allowed; + background: var(--input-background-color); +} + +/* Forms */ + +:root .ck.ck-form__row.ck-form__row_with-submit > :not(:first-child) { + margin-inline-start: 16px; +} + +.ck.ck-form__row_with-submit button { + margin-top: var(--ck-input-label-height); +} + +.ck.ck-form__header { + border-bottom: none; +} + /* * EDITOR'S CONTENT */ @@ -431,7 +557,7 @@ pre button.copy-button.icon-action { } :root pre:has(> button.copy-button) { - padding-right: calc(var(--icon-button-size) + (var(--copy-button-margin-size) * 2)); + padding-inline-end: calc(var(--icon-button-size) + (var(--copy-button-margin-size) * 2)); } html .note-detail-editable-text :not(figure, .include-note, hr):first-child { @@ -490,12 +616,12 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child { .ck-content blockquote:before { content: "ā€œ"; - left: 0.2em; + inset-inline-start: 0.2em; } .ck-content blockquote:after { content: "ā€"; - right: 0.35em; + inset-inline-end: 0.35em; } .ck-content h2, @@ -540,4 +666,17 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child { .ck-content .table > figcaption { background: var(--accented-background-color); color: var(--main-text-color); +} + +/* Reference link */ + +.ck-content a.reference-link, +.ck-content a.reference-link:hover { + /* Apply underline only to the span inside the link so it can follow the + * target note's user defined color */ + text-decoration: none; +} + +.ck-content a.reference-link > span { + text-decoration: underline; } \ No newline at end of file diff --git a/apps/client/src/stylesheets/theme-next/pages.css b/apps/client/src/stylesheets/theme-next/pages.css index 93cc30589..8b5a9ed9a 100644 --- a/apps/client/src/stylesheets/theme-next/pages.css +++ b/apps/client/src/stylesheets/theme-next/pages.css @@ -52,7 +52,7 @@ background-color: #f5f5f5; } .google-login-btn img { - margin-right: 10px; + margin-inline-end: 10px; width: 18px; height: 18px; } @@ -63,7 +63,7 @@ /* Button bar */ .search-definition-widget .search-setting-table tbody:last-child div { - justify-content: flex-end !important; + justify-content: flex-end; gap: 8px; } @@ -96,7 +96,6 @@ background: var(--background) !important; color: var(--color) !important; line-height: unset; - cursor: help; } .sql-table-schemas-widget .sql-table-schemas button:hover, @@ -106,22 +105,15 @@ --color: var(--main-text-color); } -/* Tooltip */ - -.tooltip .table-schema { - font-family: var(--monospace-font-family); - font-size: .85em; -} - -/* Data type */ -.tooltip .table-schema td:nth-child(2) { - color: var(--muted-text-color); -} - /* * NOTE MAP */ +.note-detail-note-map .fixnodes-type-switcher .tn-tool-button, +.note-map-widget .fixnodes-type-switcher .tn-tool-button { + padding: unset; +} + .note-detail-note-map .fixnodes-type-switcher .tn-tool-button.toggled { color: var(--tab-close-button-hover-background); } @@ -207,7 +199,7 @@ body.desktop .option-section:not(.tn-no-card) { color: var(--launcher-pane-text-color); margin-top: calc(-1 * var(--options-card-padding) - var(--options-title-font-size) - var(--options-title-offset)) !important; margin-bottom: calc(var(--options-title-offset) + var(--options-card-padding)) !important; - margin-left: calc(-1 * var(--options-card-padding)); + margin-inline-start: calc(-1 * var(--options-card-padding)); } .options-section:not(.tn-no-card) h5 { @@ -224,8 +216,8 @@ body.desktop .option-section:not(.tn-no-card) { .options-section hr { --bs-border-width: 2px; - margin-left: calc(var(--options-card-padding) * -1); - margin-right: calc(var(--options-card-padding) * -1); + margin-inline-start: calc(var(--options-card-padding) * -1); + margin-inline-end: calc(var(--options-card-padding) * -1); opacity: 1; color: var(--root-background); } diff --git a/apps/client/src/stylesheets/theme-next/ribbon.css b/apps/client/src/stylesheets/theme-next/ribbon.css index efc1952fe..192cfa6f4 100644 --- a/apps/client/src/stylesheets/theme-next/ribbon.css +++ b/apps/client/src/stylesheets/theme-next/ribbon.css @@ -94,19 +94,18 @@ div.promoted-attributes-container { /* Note type dropdown */ -div.note-type-dropdown .check { - margin-right: 6px; +ul.note-type-dropdown .check { + margin-inline-end: 6px; +} + +ul.note-type-dropdown li.dropdown-item { + --menu-item-icon-vert-offset: 0; } /* Editability dropdown */ -div.editability-dropdown a.dropdown-item { - padding: 4px 16px 4px 0; - align-items: start !important; -} - -.editability-dropdown .dropdown-item .check { - margin-left: 4px; +ul.editability-dropdown li.dropdown-item > div { + margin-inline-start: 4px; } .editability-dropdown .dropdown-item .description { @@ -143,12 +142,12 @@ div.editability-dropdown a.dropdown-item { } .attribute-list .save-attributes-button { - right: 30px; + inset-inline-end: 30px; } /* Note path in attribute detail dialog */ .attr-detail .note-path { - margin-left: 8px; + margin-inline-start: 8px; } /* diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index a6e31de5d..b6bd38789 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -18,7 +18,7 @@ body { --native-titlebar-darwin-x-offset: 10; - --native-titlebar-darwin-y-offset: 17 !important; + --native-titlebar-darwin-y-offset: 12 !important; } body.layout-horizontal { @@ -36,32 +36,23 @@ body.mobile { /* #region Mica */ body.background-effects.platform-win32 { - --launcher-pane-horiz-border-color: rgba(0, 0, 0, 0.15); - --launcher-pane-horiz-background-color: rgba(255, 255, 255, 0.7); - --launcher-pane-vert-background-color: rgba(255, 255, 255, 0.055); - --tab-background-color: transparent; - --new-tab-button-background: transparent; - --active-tab-background-color: var(--launcher-pane-horiz-background-color); --background-material: tabbed; -} - -@media (prefers-color-scheme: dark) { - body.background-effects.platform-win32 { - --launcher-pane-horiz-border-color: rgba(0, 0, 0, 0.5); - --launcher-pane-horiz-background-color: rgba(255, 255, 255, 0.09); - } + --launcher-pane-horiz-border-color: var(--launcher-pane-horiz-border-color-bgfx); + --launcher-pane-horiz-background-color: var(--launcher-pane-horiz-background-color-bgfx); + --launcher-pane-vert-background-color: var(--launcher-pane-vert-background-color-bgfx); + --tab-background-color: var(--window-background-color-bgfx); + --new-tab-button-background: var(--window-background-color-bgfx); + --active-tab-background-color: var(--launcher-pane-horiz-background-color); } body.background-effects.platform-win32.layout-vertical { - --left-pane-background-color: transparent; - --left-pane-item-hover-background: rgba(127, 127, 127, 0.05); + --left-pane-background-color: var(--window-background-color-bgfx); --background-material: mica; } body.background-effects.platform-win32, -body.background-effects.platform-win32 #root-widget, -body.background-effects.platform-win32 #launcher-pane .launcher-button { - background: transparent !important; +body.background-effects.platform-win32 #root-widget { + background: var(--window-background-color-bgfx) !important; } body.background-effects.platform-win32.layout-horizontal #horizontal-main-container, @@ -78,7 +69,7 @@ body.background-effects.platform-win32.layout-vertical #vertical-main-container /* Add a border to the vertical launch bar if collapsed. */ body.layout-vertical #horizontal-main-container.left-pane-hidden #launcher-pane.vertical { - border-right: 2px solid var(--left-pane-collapsed-border-color); + border-inline-end: 2px solid var(--left-pane-collapsed-border-color); } body.background-effects.zen #root-widget { @@ -90,7 +81,7 @@ body.background-effects.zen #root-widget { * Gutter */ - .gutter { +.gutter { background: var(--gutter-color) !important; transition: background 150ms ease-out; } @@ -109,7 +100,7 @@ body.layout-horizontal > .horizontal { align-items: center; } -#launcher-container { +body[dir=ltr] #launcher-container { scrollbar-gutter: stable both-edges; } @@ -232,7 +223,7 @@ body.layout-horizontal > .horizontal { } #launcher-pane .launcher-button:focus, -#launcher-pane .global-menu button:focus { +#launcher-pane .global-menu :focus { outline: none; } @@ -288,14 +279,11 @@ body.layout-horizontal > .horizontal { animation: sync-status-pulse 1s ease-in-out alternate-reverse infinite; } -#launcher-pane .global-menu-button { - --hover-item-background-color: transparent; -} +#launcher-pane button.global-menu-button { + --update-badge-x-offset: 3%; + --update-badge-y-offset: -12%; -#launcher-pane.horizontal .global-menu-button .global-menu-button-update-available { - right: -23px; - bottom: -22px; - transform: scale(0.85); + --hover-item-background-color: transparent; } .tooltip .tooltip-arrow { @@ -313,18 +301,6 @@ body.layout-horizontal > .horizontal { color: var(--tooltip-foreground-color) !important; } -/* - * Global menu - */ - - .global-menu div.zoom-buttons a { - border: unset; -} - -.global-menu div.zoom-buttons a.bx { - color: var(--menu-text-color) !important; -} - /* * Calendar */ @@ -357,6 +333,21 @@ body.layout-horizontal > .horizontal { --select-arrow-svg: initial; /* Disable the dropdown arrow */ } +/* Week number column */ +.calendar-dropdown-widget .calendar-week-number { + transform: rotate(270deg); + justify-content: center; + padding: 0; + opacity: 0.5; + font-size: 1em; + font-weight: 700; + letter-spacing: .5pt; +} + +.calendar-dropdown-widget .calendar-week-number::after { + display: none; +} + @media (max-width: 992px) { .calendar-dropdown-widget .calendar-header button { margin: 0 !important; @@ -406,9 +397,9 @@ body.layout-horizontal > .horizontal { content: ""; position: absolute; top: var(--vertical-margin); - right: var(--horiz-margin); + inset-inline-end: var(--horiz-margin); bottom: var(--vertical-margin); - left: var(--horiz-margin); + inset-inline-start: var(--horiz-margin); border-radius: 6px; background: var(--calendar-day-highlight-background); z-index: -1; @@ -456,7 +447,7 @@ div.bookmark-folder-widget .note-link:hover { } div.bookmark-folder-widget .note-link a { - padding-left: 8px; + padding-inline-start: 8px; color: var(--menu-text-color); cursor: default; } @@ -477,8 +468,8 @@ div.bookmark-folder-widget .note-link .bx { div.quick-search { --padding-top: 8px; - --padding-left: 8px; - --padding-right: 8px; + --padding-inline-start: 8px; + --padding-inline-end: 8px; --padding-bottom: 8px; position: relative; @@ -486,7 +477,7 @@ div.quick-search { align-items: center; height: unset; contain: unset; - padding: var(--padding-top) var(--padding-right) var(--padding-bottom) var(--padding-left); + padding: var(--padding-top) var(--padding-inline-end) var(--padding-bottom) var(--padding-inline-start); } div.quick-search, @@ -502,9 +493,9 @@ div.quick-search::before { position: absolute; content: ""; top: var(--padding-top); - left: var(--padding-left); + inset-inline-start: var(--padding-inline-start); bottom: var(--padding-bottom); - right: var(--padding-right); + inset-inline-end: var(--padding-inline-end); z-index: 0; border: 2px solid transparent; border-radius: 6px; @@ -526,7 +517,7 @@ div.quick-search:focus-within:before { } div.quick-search input { - padding-left: 15px !important; + padding-inline-start: 15px !important; box-shadow: unset !important; background: transparent !important; } @@ -545,7 +536,7 @@ div.quick-search .search-button { justify-content: center; width: 25px; height: 25px; - margin-right: 8px; + margin-inline-end: 8px; border-radius: 50%; padding: 0; color: var(--quick-search-color) !important; @@ -571,35 +562,30 @@ div.quick-search .search-button.show { transition: background-color 100ms ease-out !important; } +div.quick-search .dropdown-menu { + --quick-search-item-delimiter-color: transparent; + --menu-item-icon-vert-offset: -.065em; +} + /* - * Quick search results + * TO FIX: The quick search results dropdown has a backdrop issue with the tree panel + * when background effects are enabled in Electron. + * As a temporary workaround, the backdrop and transparency are disabled for the + * vertical layout. */ +body.layout-vertical.background-effects div.quick-search .dropdown-menu { + --menu-background-color: var(--menu-background-color-no-backdrop) !important; +} /* Item */ .quick-search .dropdown-menu *.dropdown-item { padding: 8px 12px !important; } -/* Note icon */ -.quick-search .dropdown-menu .dropdown-item > .bx { - position: relative; - top: 1px; -} - .quick-search .quick-search-item-icon { vertical-align: text-bottom; } -/* Note title */ -.quick-search .dropdown-menu .dropdown-item > a { - color: var(--menu-text-color); -} - -.quick-search .dropdown-menu .dropdown-item > a:hover { - --hover-item-background-color: transparent; - text-decoration: underline; -} - /* Note path */ .quick-search .dropdown-menu small { display: block; @@ -622,9 +608,8 @@ div.quick-search .search-button.show { font-weight: 600; } -/* Divider line */ -.quick-search .dropdown-item::after { - display: none; +.quick-search div.dropdown-divider { + margin: 8px 0; } /* @@ -643,18 +628,18 @@ div.quick-search .search-button.show { } #left-pane .ui-fancytree ul { - padding-left: 10px; + padding-inline-start: 10px; } /* The root element of the tree */ #left-pane .fancytree-container > li:first-child > span { - padding-left: 12px; + padding-inline-start: 12px; } #left-pane span.fancytree-node.fancytree-active { position: relative; background: transparent !important; - color: var(--left-pane-item-selected-color) !important; + color: var(--custom-color, var(--left-pane-item-selected-color)); } @keyframes left-pane-item-select { @@ -670,10 +655,10 @@ div.quick-search .search-button.show { position: absolute; content: ""; top: var(--left-pane-item-selected-shadow-size); - left: var(--left-pane-item-selected-shadow-size); + inset-inline-start: var(--left-pane-item-selected-shadow-size); bottom: var(--left-pane-item-selected-shadow-size); - right: var(--left-pane-item-selected-shadow-size); - background: var(--left-pane-item-selected-background) !important; + inset-inline-end: var(--left-pane-item-selected-shadow-size); + background: var(--custom-bg-color, var(--left-pane-item-selected-background)) !important; box-shadow: var(--left-pane-item-selected-shadow); border-radius: 6px; animation: left-pane-item-select 200ms ease-out; @@ -688,7 +673,7 @@ div.quick-search .search-button.show { #left-pane span.fancytree-node.protected > span.fancytree-custom-icon:after { position: absolute; bottom: 0; - right: 0; + inset-inline-end: 0; font-size: 14px; content: "\eb4a"; font-family: "boxicons"; @@ -697,6 +682,10 @@ div.quick-search .search-button.show { border-radius: 50%; } +body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-icon:after { + transform: translateX(-25%); +} + body.mobile .fancytree-expander::before, body.mobile .fancytree-title, body.mobile .fancytree-node > span { @@ -711,7 +700,7 @@ body.mobile .fancytree-node > span { body.mobile:not(.force-fixed-tree) #mobile-sidebar-wrapper { border-top-right-radius: 12px; border-bottom-right-radius: 12px; - border-right: 1px solid var(--subtle-border-color); + border-inline-end: 1px solid var(--subtle-border-color); } } @@ -729,9 +718,6 @@ body.mobile .fancytree-node > span { margin-top: 0; /* Use this to align the icon with the tree view item's caption */ } -#left-pane span .fancytree-title { - margin-top: -5px; -} #left-pane span.fancytree-active .fancytree-title { font-weight: normal; @@ -746,7 +732,7 @@ body.mobile .fancytree-node > span { } #left-pane .tree-item-button { - margin-right: 6px; + margin-inline-end: 6px; border: unset; border-radius: 50%; background: var(--left-pane-item-action-button-background); @@ -780,12 +766,12 @@ body.mobile .fancytree-node > span { /* Toolbar container (collapsed state) */ #left-pane .tree-actions { max-width: var(--tree-actions-toolbar-collapsed-width); - right: var(--tree-actions-toolbar-horizontal-margin); + inset-inline-end: var(--tree-actions-toolbar-horizontal-margin); bottom: var(--tree-actions-toolbar-vertical-margin); overflow: hidden; border: 1px solid transparent; padding: var(--tree-actions-toolbar-padding-size); - padding-right: var(--tree-actions-toolbar-collapsed-width); + padding-inline-end: var(--tree-actions-toolbar-collapsed-width); background: transparent; transition: max-width 400ms ease-out, @@ -829,7 +815,7 @@ body.mobile .fancytree-node > span { justify-content: center; align-items: center; top: 50%; - right: calc((var(--tree-actions-toolbar-collapsed-width) - var(--tree-actions-toolbar-expand-button-size)) / 2); + inset-inline-end: calc((var(--tree-actions-toolbar-collapsed-width) - var(--tree-actions-toolbar-expand-button-size)) / 2); width: var(--tree-actions-toolbar-expand-button-size); height: var(--tree-actions-toolbar-expand-button-size); box-shadow: 2px 2px 6px var(--left-pane-background-color); @@ -887,7 +873,10 @@ body.mobile .fancytree-node > span { } .tab-row-container .toggle-button { - margin: 6px 10px !important; + --icon-button-size: 30px; + --icon-button-icon-ratio: .6; + + margin: 3px 6px auto 8px !important; } .tab-row-container { @@ -899,6 +888,80 @@ body.layout-horizontal .tab-row-container { border-bottom: 1px solid var(--launcher-pane-horiz-border-color); } +body.electron.background-effects.layout-horizontal .tab-row-container { + border-bottom: unset !important; +} + +body.electron.background-effects.layout-horizontal .note-tab-wrapper { + top: 1px; +} + +body.electron.background-effects.layout-horizontal .tab-row-container .toggle-button { + position: relative; +} + +body.electron.background-effects.layout-horizontal .tab-row-container .toggle-button:after { + content: ""; + position: absolute; + bottom: 0; + inset-inline-start: -10px; + inset-inline-end: -10px; + top: 32px; + height: 1px; + border-bottom: 1px solid var(--launcher-pane-horiz-border-color); +} + +body.electron.background-effects.layout-horizontal .tab-row-container .tab-scroll-button-left, +body.electron.background-effects.layout-horizontal .tab-row-container .tab-scroll-button-right { + position: relative; +} + +body.electron.background-effects.layout-horizontal .tab-row-container .tab-scroll-button-inset-inline-start:after, +body.electron.background-effects.layout-horizontal .tab-row-container .tab-scroll-button-inset-inline-end:after { + content: ""; + position: absolute; + bottom: 0; + inset-inline-start: 0px; + inset-inline-end: 0px; + height: 1px; + border-bottom: 1px solid var(--launcher-pane-horiz-border-color); +} + +body.electron.background-effects.layout-horizontal .tab-row-container .note-tab[active]:before { + content: ""; + position: absolute; + bottom: 0; + inset-inline-start: -32768px; + top: var(--tab-height); + inset-inline-end: calc(100% - 1px); + height: 1px; + border-bottom: 1px solid var(--launcher-pane-horiz-border-color); +} + +body.electron.background-effects.layout-horizontal .tab-row-container .note-tab[active]:after { + content: ""; + position: absolute; + bottom: 0; + inset-inline-start: 100%; + top: var(--tab-height); + inset-inline-end: 0; + width: 100vw; + height: 1px; + border-bottom: 1px solid var(--launcher-pane-horiz-border-color); +} + +body.electron.background-effects.layout-horizontal .tab-row-container .note-new-tab:before { + content: ""; + position: absolute; + bottom: 0; + inset-inline-start: -4px; + top: calc(var(--tab-height), -1); + inset-inline-end: 0; + width: 100vw; + height: 1px; + border-bottom: 1px solid var(--launcher-pane-horiz-border-color); +} + body.layout-vertical.electron.platform-darwin .tab-row-container { border-bottom: 1px solid var(--subtle-border-color); } @@ -980,16 +1043,24 @@ body.layout-horizontal .tab-row-widget .note-tab .note-tab-wrapper { content: ""; position: absolute; top: 0; - left: 0; - right: 0; + inset-inline-start: 0; + inset-inline-end: 0; height: 3px; background-color: var(--workspace-tab-background-color); } -.tab-row-widget .note-tab:nth-child(1) { +body:not([dir=rtl]) .tab-row-widget .note-tab:nth-child(1) { transform: translate3d(var(--tab-first-item-horiz-offset), 0, 0); } +:root .tab-row-widget .note-tab .note-tab-icon { + padding-inline-end: 5px; /* The gap between the icon and the title */ +} + +.tab-row-widget .note-tab[active] .note-tab-icon { + color: var(--active-tab-icon-color); +} + .tab-row-widget .note-tab .note-tab-title { text-overflow: ellipsis; } @@ -1028,7 +1099,7 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging . .tab-row-widget .note-new-tab { position: relative; - margin-left: 3px; + margin-inline-start: 3px; color: transparent; /* Prevent the original "+" from being displayed */ } @@ -1041,7 +1112,7 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging . position: absolute; content: ""; top: calc((var(--tab-height) - var(--new-tab-button-size)) / 2); - left: calc((var(--tab-height) - var(--new-tab-button-size)) / 2); + inset-inline-start: calc((var(--tab-height) - var(--new-tab-button-size)) / 2); width: var(--new-tab-button-size); height: var(--new-tab-button-size); background: var(--new-tab-button-background); @@ -1066,7 +1137,7 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging . display: flex; position: absolute; content: "\ebc0"; - left: 0; + inset-inline-start: 0; top: 0; width: 100%; height: 100%; @@ -1114,6 +1185,11 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging . /* will-change: opacity; -- causes some weird artifacts to the note menu in split view */ } +.split-note-container-widget > .gutter { + background: var(--root-background) !important; + transition: background 150ms ease-out; +} + /* * Ribbon & note header */ @@ -1122,10 +1198,6 @@ body.layout-vertical .tab-row-widget-is-sorting .note-tab.note-tab-is-dragging . margin-bottom: 0 !important; } -.note-split:not(.hidden-ext) + .note-split:not(.hidden-ext) { - border-left: 4px solid var(--root-background); -} - @keyframes note-entrance { from { opacity: 0; @@ -1147,23 +1219,23 @@ body.mobile .note-title { } .title-row > *:first-child { - margin-right: 0; + margin-inline-end: 0; } .title-row > *:nth-child(2) { - margin-left: 0; + margin-inline-start: 0; } .title-row { /* Aligns the "Create new split" button with the note menu button (the three dots button) */ - padding-right: 3px; + padding-inline-end: 3px; } .note-title-widget input { --input-background-color: transparent; border-radius: 8px; - padding-left: 12px; + padding-inline-start: 12px; } /* The "Change note icon" button */ @@ -1238,7 +1310,7 @@ body.mobile .note-title { /* The promoted attributes section */ div.promoted-attributes-container { display: flex; - margin-right: 10%; + margin-inline-end: 10%; padding: 6px 0; gap: 8px; align-items: stretch; @@ -1252,8 +1324,8 @@ div.promoted-attributes-container input { /* A promoted attribute card */ div.promoted-attribute-cell { - --pa-card-padding-left: 16px; - --pa-card-padding-right: 2px; + --pa-card-padding-inline-start: 16px; + --pa-card-padding-inline-end: 2px; --input-background-color: transparent; box-shadow: 1px 1px 2px var(--promoted-attribute-card-shadow-color); @@ -1261,7 +1333,7 @@ div.promoted-attribute-cell { display: inline-flex; margin: 0; border-radius: 8px; - padding: 2px var(--pa-card-padding-right) 2px var(--pa-card-padding-left); + padding: 2px var(--pa-card-padding-inline-end) 2px var(--pa-card-padding-inline-start); background: var(--promoted-attribute-card-background-color); overflow-y: visible; } @@ -1276,7 +1348,7 @@ div.promoted-attribute-cell { /* A promoted attribute card (boolean attribute) */ div.promoted-attribute-cell:has(input[type="checkbox"]):not(:has(.multiplicity > span)) { /* Checbox attribute, without multiplicity */ - padding-right: var(--pa-card-padding-left); + padding-inline-end: var(--pa-card-padding-inline-start); } div.promoted-attribute-cell > * { @@ -1326,16 +1398,23 @@ div.promoted-attribute-cell .tn-checkbox { /* Relocate the checkbox before the label */ div.promoted-attribute-cell.promoted-attribute-label-boolean > div:first-of-type { order: -1; - margin-right: 1.5em; + margin-inline-end: 1.5em; } /* The element containing the "new attribute" and "remove this attribute button" */ div.promoted-attribute-cell .multiplicity:has(span) { --icon-button-size: 24px; - margin-left: 8px; - margin-right: calc(var(--pa-card-padding-left) - var(--pa-card-padding-right)); + margin-inline-start: 8px; + margin-inline-end: calc(var(--pa-card-padding-inline-start) - var(--pa-card-padding-inline-end)); font-size: 0; /* Prevent whitespaces creating a gap between buttons */ + display: flex; +} + +div.promoted-attribute-cell .multiplicity:has(span) span { + display: flex; + align-items: center; + justify-content: center; } /* @@ -1355,6 +1434,10 @@ div#center-pane .floating-buttons-children { opacity 250ms ease-out; } +body[dir=rtl] div#center-pane .floating-buttons-children { + transform-origin: left; +} + /* Floating buttons container (collapsed) */ div#center-pane .floating-buttons-children.temporarily-hidden { display: flex !important; @@ -1466,7 +1549,7 @@ div.floating-buttons-children .close-floating-buttons { } div.floating-buttons-children .close-floating-buttons { - margin-left: 0 !important; + margin-inline-start: 0 !important; background: var(--floating-button-hide-button-background); color: var(--floating-button-hide-button-color); } @@ -1556,12 +1639,12 @@ div.find-replace-widget div.find-widget-found-wrapper > span { } .find-replace-widget .form-check { - padding-left: 0; + padding-inline-start: 0; white-space: nowrap; } .find-replace-widget .form-check .form-check-input { - margin-left: 0; + margin-inline-start: 0; } /* Narrow version */ @@ -1581,13 +1664,13 @@ div.find-replace-widget div.find-widget-found-wrapper > span { .find-widget-box, .replace-widget-box { - padding-right: 3em !important; + padding-inline-end: 3em !important; } .find-widget-close-button { position: absolute; top: .85em; - right: .5em; + inset-inline-end: .5em; } .find-widget-box > * { @@ -1619,7 +1702,7 @@ div.find-replace-widget div.find-widget-found-wrapper > span { } .replace-widget-box > * { - margin-right: unset !important; + margin-inline-end: unset !important; } div.replace-widget-box button.btn.btn-sm { @@ -1662,7 +1745,7 @@ div.find-replace-widget div.find-widget-found-wrapper > span { #right-pane .toc li, #right-pane .highlights-list li { padding-top: 2px; - padding-right: 8px; + padding-inline-end: 8px; padding-bottom: 2px; border-radius: 4px; text-align: unset; @@ -1701,10 +1784,6 @@ div.find-replace-widget div.find-widget-found-wrapper > span { --border-radius-lg: 6px; } -.excalidraw .Island { - backdrop-filter: var(--dropdown-backdrop-filter); -} - .excalidraw .Island.App-toolbar { --island-bg-color: var(--floating-button-background-color); --shadow-island: 1px 1px 1px var(--floating-button-shadow-color); @@ -1725,8 +1804,8 @@ div.find-replace-widget div.find-widget-found-wrapper > span { } .excalidraw .dropdown-menu .dropdown-menu-container > div:not([class]):not(:last-child) { - margin-left: calc(var(--padding) * var(--space-factor) * -1) !important; - margin-right: calc(var(--padding) * var(--space-factor) * -1) !important; + margin-inline-start: calc(var(--padding) * var(--space-factor) * -1) !important; + margin-inline-end: calc(var(--padding) * var(--space-factor) * -1) !important; } .excalidraw .dropdown-menu:before { diff --git a/apps/client/src/stylesheets/tree.css b/apps/client/src/stylesheets/tree.css index 385e596dd..9a718310e 100644 --- a/apps/client/src/stylesheets/tree.css +++ b/apps/client/src/stylesheets/tree.css @@ -1,5 +1,5 @@ ul.fancytree-container { - padding-left: 0; + padding-inline-start: 0; } ul.fancytree-container li { @@ -15,10 +15,8 @@ span.fancytree-node.fancytree-hide { flex-shrink: 1; flex-grow: 1; overflow: hidden; - margin-left: 7px; + margin-inline-start: 7px; outline: none; - position: relative; - top: 2px; } .fancytree-expander { @@ -42,6 +40,7 @@ span.fancytree-node.fancytree-hide { text-overflow: ellipsis; user-select: none !important; -webkit-user-select: none !important; + color: var(--custom-color, inherit); } .fancytree-node:not(.fancytree-loading) .fancytree-expander { @@ -59,7 +58,11 @@ span.fancytree-node.fancytree-hide { line-height: 1; position: relative; top: 2px; - margin-right: 5px; + margin-inline-end: 5px; +} + +body[dir=rtl] .fancytree-node:not(.fancytree-loading):not(.fancytree-expanded) .fancytree-expander:before { + content: "\ea4d"; /* bx bx-chevron-left */ } .fancytree-loading span.fancytree-expander { @@ -80,7 +83,7 @@ span.fancytree-node.fancytree-hide { width: 12px; height: 12px; margin-top: 2px; - margin-left: 1px; + margin-inline-start: 1px; border-width: 1px; border-style: solid; } @@ -169,15 +172,15 @@ span.fancytree-node.fancytree-active-clone:not(.fancytree-active) .fancytree-tit /* first nesting level has lower left padding to avoid extra left padding. Other levels are not affected */ .ui-fancytree > li > ul { - padding-left: 5px; + padding-inline-start: 5px; } .ui-fancytree ul { - padding-left: 20px; + padding-inline-start: 20px; } span.fancytree-active { - color: var(--active-item-text-color) !important; + color: var(--active-item-text-color); background-color: var(--active-item-background-color) !important; border-color: transparent; /* invisible border */ border-radius: 5px; @@ -229,14 +232,14 @@ span.fancytree-node.archived { display: none; font-size: 120%; cursor: pointer; - margin-left: 8px; + margin-inline-start: 8px; padding: 1px; border: 1px solid transparent; border-radius: 5px; } .unhoist-button.bx.tree-item-button { - margin-left: 0; /* unhoist button is on the left and doesn't need more margin */ + margin-inline-start: 0; /* unhoist button is on the left and doesn't need more margin */ display: block; /* keep always visible */ } diff --git a/apps/client/src/test/easy-froca.ts b/apps/client/src/test/easy-froca.ts index 045819ab5..e6a9aeaff 100644 --- a/apps/client/src/test/easy-froca.ts +++ b/apps/client/src/test/easy-froca.ts @@ -3,6 +3,8 @@ import FNote from "../entities/fnote.js"; import froca from "../services/froca.js"; import FAttribute from "../entities/fattribute.js"; import noteAttributeCache from "../services/note_attribute_cache.js"; +import FBranch from "../entities/fbranch.js"; +import FBlob from "../entities/fblob.js"; type AttributeDefinitions = { [key in `#${string}`]: string; }; type RelationDefinitions = { [key in `~${string}`]: string; }; @@ -10,6 +12,8 @@ type RelationDefinitions = { [key in `~${string}`]: string; }; interface NoteDefinition extends AttributeDefinitions, RelationDefinitions { id?: string | undefined; title: string; + children?: NoteDefinition[]; + content?: string; } /** @@ -47,6 +51,38 @@ export function buildNote(noteDef: NoteDefinition) { blobId: "" }); froca.notes[note.noteId] = note; + let childNotePosition = 0; + + // Manage content. + const content = noteDef.content ?? ""; + note.getContent = async () => content; + + const blob = new FBlob({ + blobId: utils.randomString(10), + content, + contentLength: content.length, + dateModified: new Date().toISOString(), + utcDateModified: new Date().toISOString() + }); + note.getBlob = async () => blob; + + // Manage children. + if (noteDef.children) { + for (const childDef of noteDef.children) { + const childNote = buildNote(childDef); + const branchId = `${note.noteId}_${childNote.noteId}`; + const branch = new FBranch(froca, { + branchId, + noteId: childNote.noteId, + parentNoteId: note.noteId, + notePosition: childNotePosition, + fromSearchNote: false + }); + froca.branches[branchId] = branch; + note.addChild(childNote.noteId, branchId, false); + childNotePosition += 10; + } + } let position = 0; for (const [ key, value ] of Object.entries(noteDef)) { diff --git a/apps/client/src/translations/ar/translation.json b/apps/client/src/translations/ar/translation.json new file mode 100644 index 000000000..2e11116fb --- /dev/null +++ b/apps/client/src/translations/ar/translation.json @@ -0,0 +1,1438 @@ +{ + "about": { + "title": "Ų­ŁˆŁ„ ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ… للملاحظات", + "homepage": "الصفحة Ų§Ł„Ų±Ų¦ŁŠŲ³ŁŠŲ©:", + "app_version": "Ų§ŲµŲÆŲ§Ų± Ų§Ł„ŲŖŲ·ŲØŁŠŁ‚:", + "sync_version": "Ų§ŲµŲÆŲ§Ų± المزامنه:", + "build_date": "تاريخ الانؓاؔ:", + "build_revision": "Ł…Ų±Ų§Ų¬Ų¹Ų© الاصدار:", + "data_directory": "مجلد Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ:", + "db_version": "Ų§ŲµŲÆŲ§Ų± قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ:" + }, + "toast": { + "critical-error": { + "title": "Ų®Ų·Ų£ فادح" + } + }, + "add_link": { + "add_link": "أضافة Ų±Ų§ŲØŲ·", + "note": "ملاحظة", + "search_note": "البحث عن الملاحظة بالاسم", + "link_title": "Ų¹Ł†ŁˆŲ§Ł† الرابط", + "button_add_link": "اضافة Ų±Ų§ŲØŲ·", + "help_on_links": "Ł…Ų³Ų§Ų¹ŲÆŲ© Ų­ŁˆŁ„ الارتباطات Ų§Ł„ŲŖŲ“Ų¹ŲØŁŠŲ©" + }, + "branch_prefix": { + "edit_branch_prefix": "ŲŖŲ¹ŲÆŁŠŁ„ ŲØŲ§ŲÆŲ¦Ų© الفرع", + "prefix": "البادئة: ", + "save": "حفظ", + "help_on_tree_prefix": "Ł…Ų³Ų§Ų¹ŲÆŲ© Ų­ŁˆŁ„ ŲØŲ§ŲÆŲ¦Ų© الؓجرة" + }, + "bulk_actions": { + "bulk_actions": "Ų§Ų¬Ų±Ų§Ų”Ų§ŲŖ Ų¬Ł…Ų§Ų¹ŁŠŲ©", + "available_actions": "الاجراؔات المتاحة", + "chosen_actions": "الأجراؔات المختارة", + "execute_bulk_actions": "ŲŖŁ†ŁŁŠŲ° الأجراؔات Ų§Ł„Ų¬Ł…Ų§Ų¹ŁŠŲ©", + "bulk_actions_executed": "ŲŖŁ… ŲŖŁ†ŁŁŠŲ° الاجراؔات Ų§Ł„Ų¬Ł…Ų§Ų¹ŁŠŲ© ŲØŁ†Ų¬Ų§Ų­ŲŒ", + "none_yet": "Ł„Ų§ŁŠŁˆŲ¬ŲÆ Ų£Ų¬Ų±Ų§Ų” ŲØŲ¹ŲÆ... اضف Ų§Ų¬Ų±Ų§Ų” بالنقر على Ų§Ų­ŲÆ الأجراؔات المتاحة اعلاه.", + "relations": "العلاقات", + "notes": "الملاحظات", + "other": "أخرى", + "affected_notes": "الملاحظات المتأثرة", + "labels": "Ų§Ł„ŲŖŲ³Ł…ŁŠŲ§ŲŖ" + }, + "upload_attachments": { + "options": "خيارات", + "upload": "ŲŖŲ­Ł…ŁŠŁ„", + "choose_files": "Ų§Ų®ŲŖŲ± الملفات", + "shrink_images": "تصغير Ų§Ł„ŲµŁˆŲ±", + "upload_attachments_to_note": "ŲŖŲ­Ł…ŁŠŁ„ المرفقات الى الملاحظة" + }, + "attribute_detail": { + "name": "الاسم", + "value": "Ł‚ŁŠŁ…Ų©", + "promoted": "ŲŖŁ…ŲŖ ŲŖŲ±Ł‚ŁŠŲŖŁ‡", + "promoted_alias": "اسم Ł…Ų³ŲŖŲ¹Ų§Ų±", + "label_type": "Ł†ŁˆŲ¹", + "text": "نص", + "date": "تاريخ", + "time": "ŁˆŁ‚ŲŖ", + "precision": "دفة", + "digits": "رقم", + "delete": "حذف", + "color_type": "Ł„ŁˆŁ†", + "multiplicity": "تعددية", + "number": "Ų¹ŲÆŲÆ", + "boolean": "Ł…Ł†Ų·Ł‚ŁŠ", + "url": "Ų¹Ł†ŁˆŲ§Ł† Ų§Ł„ŁˆŁŠŲØ", + "inheritable": "قابل Ł„Ł„ŁˆŲ±Ų§Ų«Ų©", + "target_note": "الملاحظة الهدف", + "single_value": "Ł‚ŁŠŁ…Ų© واحدة", + "multi_value": "Ł‚ŁŠŁ… Ł…ŲŖŲ¹ŲÆŲÆŲ©", + "inverse_relation": "العلاقة Ų§Ł„Ų¹ŁƒŲ³ŁŠŲ©", + "more_notes": "Ł…Ų²ŁŠŲÆ من الملاحظات", + "label": "ŲŖŁŲ§ŲµŁŠŁ„ Ų§Ł„ŲŖŲ³Ł…ŁŠŲ©", + "relation": "ŲŖŁŲ§ŲµŁŠŁ„ العلاقة", + "date_time": "Ų§Ł„ŲŖŲ§Ų±ŁŠŲ® ŁˆŲ§Ł„ŁˆŁ‚ŲŖ", + "label_definition": "ŲŖŁŲ§ŲµŁŠŁ„ تعريف Ų§Ł„ŲŖŲµŁ†ŁŠŁ", + "relation_definition": "ŲŖŁŲ§ŲµŁŠŁ„ تعريف العلاقة", + "attr_detail_title": "Ų¹Ł†ŁˆŲ§Ł† ŲŖŁŲ§ŲµŁŠŁ„ السمة", + "close_button_title": "الغاؔ Ų§Ł„ŲŖŲŗŁŠŁŠŲ±Ų§ŲŖ و اغلاق", + "attr_is_owned_by": "السمة Ł…Ł…Ł„ŁˆŁƒŲ© Ł„", + "save_and_close": "حفظ ŁˆŁ†Ų³Ų® Ctrl+Enter", + "workspace_calendar_root": "ā€ŽŲŖŲ­ŲÆŁŠŲÆ Ų¬Ų°Ų± Ų§Ł„ŲŖŁ‚ŁˆŁŠŁ… Ł„ŁƒŁ„ Ł…Ų³Ų§Ų­Ų© عمل", + "hide_highlight_widget": "اخفاؔ عنصر ŁˆŲ§Ų¬Ł‡Ų© قائمة Ų§Ł„ŲŖŁ…ŁŠŁŠŲ²Ų§ŲŖ", + "is_owned_by_note": "ŲŖŲ®Ųµ الملاحظة", + "and_more": "... و {{count}}Ł…Ų±Ų§ŲŖ اكثر." + }, + "rename_label": { + "to": "الى", + "old_name_placeholder": "الاسم Ų§Ł„Ł‚ŲÆŁŠŁ…", + "new_name_placeholder": "الاسم Ų§Ł„Ų¬ŲÆŁŠŲÆ", + "rename_label": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© Ų§Ł„ŲŖŲ³Ł…ŁŠŲ©", + "rename_label_from": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© Ų§Ł„ŲŖŲ³Ł…ŁŠŲ© من" + }, + "move_note": { + "to": "الى", + "move_note": "نقل الملاحظة", + "target_parent_note": "ملاحظة الاصل الهدف", + "on_all_matched_notes": "على ŁƒŁ„ الملاحظات المطابقة" + }, + "add_relation": { + "to": "الى", + "add_relation": "اضافة علاقة", + "relation_name": "اسم العلاقة", + "target_note": "الملاحظة الهدف" + }, + "rename_relation": { + "to": "الى", + "rename_relation": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© العلاقة", + "old_name": "الاسم Ų§Ł„Ł‚ŲÆŁŠŁ…", + "new_name": "الاسم Ų§Ł„Ų¬ŲÆŁŠŲÆ", + "rename_relation_from": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© العلاقة من" + }, + "update_relation_target": { + "to": "الى", + "update_relation": "تحديث العلاقة", + "relation_name": "اسم العلاقة", + "target_note": "الملاحظة الهدف", + "update_relation_target": "ŲŖŲ­ŲÆŲ« علاقة الهدف", + "on_all_matched_notes": "على ŁƒŁ„ الملاحظات المطابقة" + }, + "attachments_actions": { + "download": "ŲŖŁ†Ų²ŁŠŁ„", + "open_externally": "فتح خارجي", + "open_custom": "فتح Ł…Ų®ŲµŲµ", + "rename_attachment": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© المرفق", + "delete_attachment": "حذف المرفق", + "upload_new_revision": "رفع Ł…Ų±Ų§Ų¬Ų¹Ų© جديدة", + "copy_link_to_clipboard": "نسخ الرابط الى الحافظة", + "convert_attachment_into_note": "ŲŖŲ­ŁˆŁŠŁ„ المرفق الى ملاحظة" + }, + "calendar": { + "week": "أسبوع", + "month": "ؓهر", + "year": "سنة", + "list": "قائمة", + "today": "Ų§Ł„ŁŠŁˆŁ…", + "mon": "Ų§Ł„Ų§Ų«Ł†ŁŠŁ†", + "tue": "الثلاثاؔ", + "wed": "الأربعاؔ", + "thu": "Ų§Ł„Ų®Ł…ŁŠŲ³", + "fri": "الجمعة", + "sat": "السبت", + "sun": "الاحد", + "january": "ŁŠŁ†Ų§ŁŠŲ±", + "march": "Ł…Ų§Ų±Ų³", + "april": "Ų§ŲØŲ±ŁŠŁ„", + "may": "Ł…Ų§ŁŠŁˆ", + "june": "ŁŠŁˆŁ†ŁŠŁˆ", + "july": "ŁŠŁˆŁ„ŁŠŁˆ", + "august": "Ų£ŲŗŲ³Ų·Ų³", + "september": "Ų³ŲØŲŖŁ…ŲØŲ±", + "october": "اكتوبر", + "november": "Ł†ŁˆŁŁ…ŲØŲ±", + "december": "ŲÆŁŠŲ³Ł…ŲØŲ±", + "february": "فبراير", + "week_previous": "Ų§Ł„Ų§Ų³ŲØŁˆŲ¹ السابق", + "week_next": "Ų§Ł„Ų§Ų³ŲØŁˆŲ¹ Ų§Ł„ŲŖŲ§Ł„ŁŠ", + "month_previous": "الؓهر السابق", + "month_next": "الؓهر Ų§Ł„ŲŖŲ§Ł„ŁŠ", + "year_previous": "السنة السابقة", + "year_next": "السنة Ų§Ł„ŲŖŲ§Ł„ŁŠŲ©", + "cannot_find_day_note": "لا ŁŠŁ…ŁƒŁ† ايجاد ملاحظة Ų§Ł„ŁŠŁˆŁ…", + "cannot_find_week_note": "Ł„Ų§ŁŠŁ…ŁƒŁ† ايجاد ملاحظة Ų§Ł„Ų§Ų³ŲØŁˆŲ¹" + }, + "global_menu": { + "menu": "القائمة", + "options": "خيارات", + "advanced": "متقدمة", + "logout": "ŲŖŲ³Ų¬ŁŠŁ„ خروج", + "zoom": "تكبير/تصغير", + "toggle_fullscreen": "ŲŖŲ“ŲŗŁŠŁ„/Ų§ŁŠŁ‚Ų§Ł ملؔ الؓاؓة", + "zoom_out": "تصغير", + "zoom_in": "تكبير", + "configure_launchbar": "Ų§Ų¹ŲÆŲ§ŲÆ ؓريط الاطلاق", + "reload_frontend": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ­Ł…ŁŠŁ„ Ų§Ł„ŁˆŲ§Ų¬Ł‡Ų©", + "show_help": "Ų¹Ų±Ų¶ المساعدة", + "show-cheatsheet": "Ų¹Ų±Ų¶ ŲÆŁ„ŁŠŁ„ الاختصارات", + "toggle-zen-mode": "وضع Ų§Ł„ŲŖŲ±ŁƒŁŠŲ²", + "open_new_window": "فتح نافذة جديدة", + "reset_zoom_level": "Ų§Ų¹Ų§ŲÆŲ© Ų¶ŲØŲ· Ł…Ų³ŲŖŁˆŁ‰ Ų§Ł„ŲŖŁƒŲØŁŠŲ±", + "open_sql_console": "فتح Ł„ŁˆŲ­Ų© ŲŖŲ­ŁƒŁ… SQL", + "open_search_history": "فتح سجل البحث", + "show_hidden_subtree": "اظهار الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ© Ų§Ł„Ł…Ų®ŁŁŠŲ©", + "about": "Ų­ŁˆŁ„ ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ… للملاحظات", + "open_dev_tools": "فتح ادوات Ų§Ł„Ł…Ų·ŁˆŲ±", + "show_backend_log": "اظهار سجل Ų§Ł„Ų®Ł„ŁŁŠŲ©", + "new-version-available": "Ł…ŲŖŁˆŁŲ± تحديث جديد", + "download-update": "احصل على الاصدار{{latestVersion}}", + "switch_to_mobile_version": "Ų§Ł„ŲŖŲØŲÆŁŠŁ„ الى Ų§ŲµŲÆŲ§Ų± الهاتف Ų§Ł„Ł…Ų­Ł…ŁˆŁ„", + "switch_to_desktop_version": "Ų§Ł„ŲŖŲØŲÆŁŠŁ„ الى Ų§ŲµŲÆŲ§Ų± Ų³Ų·Ų­ Ų§Ł„Ł…ŁƒŲŖŲØ", + "show_shared_notes_subtree": "Ų¹Ų±Ų¶ Ų“Ų¬Ų±Ų© الملاحظات Ų§Ł„Ł…Ų“ŲŖŲ±ŁƒŲ©", + "open_sql_console_history": "فتح سجل Ł„ŁˆŲ­Ų© ŲŖŲ­ŁƒŁ… SQL" + }, + "zpetne_odkazy": { + "relation": "العلاقة", + "backlink": "{{count}} Ų±Ų§ŲØŲ· Ų±Ų§Ų¬Ų¹", + "backlinks": "{{count}} روابط Ų±Ų§Ų¬Ų¹Ų©" + }, + "note_icon": { + "category": "الفئة:", + "search": "ŲØŲ­Ų«:", + "change_note_icon": "تغيير Ų§ŁŠŁ‚ŁˆŁ†Ų© الملاحظة", + "reset-default": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ¹ŁŠŁŠŁ† الى Ų§Ł„Ų§ŁŠŁ‚ŁˆŁ†Ų© Ų§Ł„Ų§ŁŲŖŲ±Ų§Ų¶ŁŠŲ©" + }, + "basic_properties": { + "language": "اللغة", + "editable": "قابل Ł„Ł„ŲŖŲ¹ŲÆŁŠŁ„", + "note_type": "Ł†ŁˆŲ¹ الملاحظة", + "basic_properties": "الخصائص Ų§Ł„Ų§Ų³Ų§Ų³ŁŠŲ©", + "configure_code_notes": "Ų§Ų¹ŲÆŲ§ŲÆ ملاحظات Ų§Ł„ŁƒŁˆŲÆ..." + }, + "book_properties": { + "list": "قائمة", + "expand": "توسيع", + "calendar": "Ų§Ł„ŲŖŁ‚ŁˆŁŠŁ…", + "table": "Ų¬ŲÆŁˆŁ„", + "board": "Ł„ŁˆŲ­Ų©", + "grid": "خطوط ؓبكة", + "collapse": "طي", + "view_type": "Ł†ŁˆŲ¹ العرض", + "book_properties": "Ų®ŲµŲ§Ų¦Ųµ Ų§Ł„Ł…Ų¬Ł…ŁˆŲ¹Ų©", + "geo-map": "Ų§Ł„Ų®Ų±ŁŠŲ·Ų© Ų§Ł„Ų¬ŲŗŲ±Ų§ŁŁŠŲ©", + "collapse_all_notes": "طي ŁƒŁ„ الملاحظات", + "include_archived_notes": "Ų¹Ų±Ų¶ الملاحظات المؤرؓفة", + "expand_all_children": "توسيع Ų¬Ł…ŁŠŲ¹ العناصر Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "presentation": "Ų¹Ų±Ų¶ ŲŖŁ‚ŲÆŁŠŁ…ŁŠ", + "invalid_view_type": "Ł†ŁˆŲ¹ العرض {{type}} غير صالح" + }, + "file_properties": { + "download": "ŲŖŁ†Ų²ŁŠŁ„", + "open": "فتح", + "title": "ملف", + "note_id": "معرف الملاحظة", + "file_type": "Ł†ŁˆŲ¹ الملف", + "file_size": "حجم الملف", + "original_file_name": "اسم الملف Ų§Ł„Ų§ŲµŁ„ŁŠ", + "upload_new_revision": "رفع Ł…Ų±Ų§Ų¬Ų¹Ų© جديدة" + }, + "image_properties": { + "download": "ŲŖŁ†Ų²ŁŠŁ„", + "open": "فتح", + "title": "صورة", + "file_type": "Ł†ŁˆŲ¹ الملف", + "file_size": "حجم الملف", + "original_file_name": "اسم الملف Ų§Ł„Ų§ŲµŁ„ŁŠ", + "upload_new_revision": "رفع Ł…Ų±Ų§Ų¬Ų¹Ų© جديدة", + "copy_reference_to_clipboard": "نسخ المرجع الى الحافظة" + }, + "note_info_widget": { + "created": "انؓاؔ", + "type": "Ł†ŁˆŲ¹", + "modified": "Ł…Ų¹ŲÆŁ„", + "calculate": "Ų­Ų³Ų§ŲØ", + "note_id": "معرف الملاحظة", + "note_size": "حجم الملاحظة", + "title": "Ł…Ų¹Ł„ŁˆŁ…Ų§ŲŖ الملاحظة" + }, + "note_paths": { + "search": "ŲØŲ­Ų«", + "archived": "مؤرؓف", + "title": "Ł…Ų³Ų§Ų±Ų§ŲŖ الملاحظة" + }, + "script_executor": { + "query": "استعلام", + "script": "برنامج Ł†ŲµŁŠ", + "execute_query": "ŲŖŁ†ŁŁŠŲ° الاستعلام", + "execute_script": "ŲŖŁ†ŁŁŠŲ° Ų§Ł„Ų³ŁƒŲ±ŲØŲŖ" + }, + "search_definition": { + "ancestor": "السلف", + "limit": "الحد الاقصى", + "action": "Ų£Ų¬Ų±Ų§Ų”", + "search_button": "ŲØŲ­Ų«", + "debug": "تصحيح الاخطاؔ", + "search_string": "سلسة البحث", + "search_script": "نص البحث", + "fast_search": "ŲØŲ­Ų« سريع", + "include_archived": "ŲŖŲ¶Ł…ŁŠŁ† العناصر المؤرؓفة", + "order_by": "ترتيب Ų­Ų³ŲØ", + "search_parameters": "Ł…Ų¹Ų§ŁŠŁŠŲ± البحث", + "add_search_option": "اضافة خيار البحث:", + "save_to_note": "حفظ في تلملاحظة", + "limit_description": "تحديد Ų¹ŲÆŲÆ النتائج", + "search_execute": "البحث ŁˆŲŖŁ†ŁŁŠŲ° الأجراؔات", + "unknown_search_option": "خيار ŲØŲ­Ų« غير Ł…Ų¹Ų±ŁˆŁ {{searchOptionName}}", + "actions_executed": "Ų§Ų¬Ų±Ų§Ų”Ų§ŲŖ ŲŖŁ… ŲŖŁ†ŁŁŠŲ°Ł‡Ų§." + }, + "ancestor": { + "label": "السلف", + "depth_label": "العمق", + "depth_doesnt_matter": "Ł„Ų§ŁŠŁ‡Ł…", + "direct_children": "العقد Ų§Ł„ŁŲ±Ų¹ŁŠŲ© المباؓرة", + "depth_eq": "يساوي ŲŖŁ…Ų§Ł…Ų§ {{count}}", + "depth_gt": "Ł‡Łˆ اكبر من {{count}}", + "depth_lt": "Ł‡Łˆ Ų§ŲµŲŗŲ± من {{count}}" + }, + "limit": { + "limit": "الحد الاقصى" + }, + "debug": { + "debug": "تصحيح الاخطاؔ" + }, + "order_by": { + "title": "Ų¹Ł†ŁˆŲ§Ł†", + "desc": "ŲŖŁ†Ų§Ų²Ł„ŁŠ", + "order_by": "ترتيب Ų­Ų³ŲØ", + "relevancy": "Ų§Ł„Ų§Ł‡Ł…ŁŠŲ© (افتراضيا)", + "date_created": "تاريخ الانؓاؔ", + "random": "ترتيب عؓوائي", + "asc": "تصاعدي (افتراضيا)", + "content_size": "حجم Ł…Ų­ŲŖŁˆŁ‰ الملاحظة", + "revision_count": "Ų¹ŲÆŲÆ المراجعات", + "parent_count": "Ų¹ŲÆŲÆ النسخ", + "owned_label_count": "Ų¹ŲÆŲÆ Ų§Ł„ŲŖŲ³Ł…ŁŠŲ§ŲŖ", + "owned_relation_count": "Ų¹ŲÆŲÆ العلاقات", + "date_modified": "تاريخ Ų§Ų®Ų± ŲŖŲ¹ŲÆŁŠŁ„", + "children_count": "Ų¹ŲÆŲÆ الملاحظات Ų§Ł„ŁŲ±Ų¹ŁŠŲ©" + }, + "search_string": { + "search_prefix": "ŲØŲ­Ų«:", + "title_column": "سلسلة البحث:", + "search_syntax": "صياغة البحث", + "also_see": "انظر ايضا", + "error": "Ų®Ų·Ų£ في البحث: {{error}}" + }, + "sync": { + "title": "مزامنة", + "force_full_sync_button": "فرض مزامنة ŁƒŲ§Ł…Ł„Ų©", + "finished-successfully": "ŲŖŁ… انتهاؔ المزامنة بنجاح.", + "full_sync_triggered": "ŲŖŁ… ŲŖŲ“ŲŗŁŠŁ„ المزامنة Ų§Ł„ŁƒŲ§Ł…Ł„Ų©", + "failed": "فؓل في المزامنة: {{message}}", + "fill_entity_changes_button": "ملؔ سجلات تغييرات Ų§Ł„ŁƒŁŠŲ§Ł†Ų§ŲŖ", + "filling_entity_changes": "Ų¬Ų§Ų± ملؔ صفوف تغييرات Ų§Ł„ŁƒŁŠŲ§Ł†Ų§ŲŖ", + "sync_rows_filled_successfully": "ŲŖŁ…Ų© ŲŖŲ¹ŲØŲ¦Ų© ŲØŁŠŲ§Ł†Ų§ŲŖ المزامنة بنجاح" + }, + "fonts": { + "fonts": "خطوط", + "size": "حجم", + "serif": "Ų®Ų· ŁˆŁ…Ų²Ų®Ų±Ł", + "monospace": "Ų®Ų· ŲØŲ¹Ų±Ų¶ Ų«Ų§ŲØŲŖ", + "theme_defined": "النسق المحدد", + "main_font": "الخط Ų§Ł„Ų±Ų¦ŁŠŲ³ŁŠ", + "font_family": "عائلة Ų§Ł„Ų®Ų·ŁˆŲ·", + "reload_frontend": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ­Ł…ŁŠŁ„ Ų§Ł„ŁˆŲ§Ų¬Ł‡Ų©", + "generic-fonts": "Ų§Ł„Ų®Ų·ŁˆŲ· العامة", + "sans-serif": "خطوط ŲØŲÆŁˆŁ† زوائد", + "system-default": "الاعداد Ų§Ł„Ų§ŁŲŖŲ±Ų§Ų¶ŁŠ للنظام", + "note_detail_font": "Ų®Ų· ŲŖŁŲ§ŲµŁŠŁ„ الملاحظة", + "note_tree_font": "Ų®Ų· Ų“Ų¬Ų±Ų© الملاحظات", + "monospace_font": "Ų®Ų· احادي المسافة (Ł„Ł„ŁƒŁˆŲÆ)", + "serif-system-fonts": "خطوط النظام المزخرفة", + "sans-serif-system-fonts": "خطوط النظام ŲØŲÆŁˆŁ† زخرفة", + "monospace-system-fonts": "خطوط النظام احادية المسافة", + "handwriting-system-fonts": "خطوط النظام ŲØŲ§Ų³Ł„ŁˆŲØ Ų§Ł„ŁƒŲŖŲ§ŲØŲ© Ų§Ł„ŁŠŲÆŁˆŁŠŲ©" + }, + "confirm": { + "confirmation": "تأكيد", + "cancel": "الغاؔ", + "ok": "نعم", + "also_delete_note": "ŁƒŲ°Ł„Łƒ احذف الملاحظة" + }, + "delete_notes": { + "close": "غلق", + "cancel": "الغاؔ", + "ok": "نعم", + "delete_notes_preview": "حذف Ł…Ų¹Ų§ŁŠŁ†Ų© الملاحظات" + }, + "export": { + "close": "غلق", + "export": "تصدير", + "export_note_title": "تصدير الملاحظة", + "export_status": "حالة Ų§Ł„ŲŖŲµŲÆŁŠŲ±", + "export_finished_successfully": "Ų§ŁƒŲŖŁ…Ł„ Ų§Ł„ŲŖŲµŲÆŁŠŲ± بنجاح.", + "export_in_progress": "Ų¬Ų§Ų± Ų§Ł„ŲŖŲµŲÆŁŠŲ±: {{progressCount}}" + }, + "help": { + "troubleshooting": "أستكؓاف الاخطاؔ ŁˆŲ§ŲµŁ„Ų§Ų­Ł‡Ų§", + "other": "أخرى", + "title": "ŁˆŲ±Ł‚Ų© المراجعة Ų§Ł„Ų³Ų±ŁŠŲ¹Ų©", + "noteNavigation": "التنقل ŲØŁŠŁ† الملاحظات", + "collapseExpand": "طي/توسيع العقدة", + "notSet": "غير Ł…Ų­ŲÆŲÆ", + "collapseSubTree": "طي الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "tabShortcuts": "Ų£Ų®ŲŖŲµŲ§Ų±Ų§ŲŖ Ų§Ł„ŲŖŲØŁˆŁŠŲØ", + "creatingNotes": "انؓاؔ الملاحظات", + "selectNote": "تحديد الملاحظة", + "editingNotes": "تحرير الملاحظات", + "inPageSearch": "البحث داخل الصفحة", + "markdownAutoformat": "Ų§Ł„ŲŖŁ†Ų³ŁŠŁ‚ Ų§Ł„ŲŖŁ„Ł‚Ų§Ų¦ŁŠ ŲØŲ§Ų³Ł„ŁˆŲØ Markdown", + "openEmptyTab": "فتح علامة تبويب فارغة", + "closeActiveTab": "اغلاق علامة تبويب نؓطة", + "activateNextTab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ Ų§Ł„ŲŖŲ§Ł„ŁŠ", + "activatePreviousTab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ السابق", + "multiSelectNote": "تحديد Ł…ŲŖŲ¹ŲÆŲÆ للملاحظة اعلاه/اسفل", + "createInternalLink": "انؓاؔ Ų±Ų§ŲØŲ· ŲÆŲ§Ų®Ł„ŁŠ", + "reloadFrontend": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ­Ł…ŁŠŁ„ Ų§Ł„ŁˆŲ§Ų¬Ł‡Ų© Ų§Ł„Ł„Ł…Ų§Ł…ŁŠŲ© Ł„ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ…", + "showDevTools": "Ų¹Ų±Ų¶ ادوات Ų§Ł„Ł…Ų·ŁˆŲ±", + "showSQLConsole": "Ų¹Ų±Ų¶ ŁˆŲ­ŲÆŁ‡ ŲŖŲ­ŁƒŁ… SQL", + "scrollToActiveNote": "Ł…ŲÆŲŖŁ…Ų±ŁŠŲ± الى الملاحظة النؓطة", + "jumpToParentNote": "الانتقال الى الملاحظة الاصل", + "movingCloningNotes": "نقل/ استنساخ الملاحظات", + "deleteNotes": "حذف الملاحظة/ الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "collapseWholeTree": "طي Ų“Ų¬Ų±Ų© الملاحظة ŲØŲ§ŁƒŁ…Ł„Ł‡Ų§", + "followLink": "Ų§ŲŖŲØŲ¹ تلرابط ŲŖŲ­ŲŖ المؤؓر" + }, + "import": { + "options": "خيارات", + "import": "استيراد", + "safeImport": "أستيراد آمن", + "shrinkImages": "ŲŖŁ‚Ł„ŁŠŁ„ حجم Ų§Ł„ŲµŁˆŲ±", + "import-status": "حالة الاستبراد", + "importIntoNote": "استيراد الى الملاحظة", + "chooseImportFile": "Ų§Ų®ŲŖŲ± ملف Ų§Ł„Ų§Ų³ŲŖŁŠŲ±Ų§ŲÆ", + "failed": "فؓل Ų§Ł„Ų§Ų³ŲŖŁŠŲ±Ų§ŲÆ: {{messege}}.", + "html_import_tags": { + "title": "علامات استيراد HTML", + "reset_button": "Ų§Ų¹Ų§ŲÆŲ© Ų§Ł„ŲŖŲ¹ŁŠŁŠŁ† الى القائمة Ų§Ł„Ų§ŁŲŖŲ±Ų§Ų¶ŁŠŲ©" + }, + "successful": "Ų§ŁƒŲŖŁ…Ł„ Ų§Ł„Ų§Ų³ŲŖŁŠŲ±Ų§ŲÆ بنجاح.", + "in-progress": "Ų¬Ų§Ų± Ų§Ł„Ų§Ų³ŲŖŁŠŲ±Ų§ŲÆ: {{progress}}" + }, + "include_note": { + "label_note": "ملاحظة", + "dialog_title": "ŲŖŲ¶Ł…ŁŠŁ† ملاحظة", + "button_include": "ŲŖŲ¶Ł…ŁŠŁ† ملاحظة", + "box_size_small": "صغير (10 سطور ŲŖŁ‚Ų±ŁŠŲØŲ§)", + "box_size_medium": "Ł…ŲŖŁˆŲ³Ų· ( 30 Ų³Ų·Ų± ŲŖŁ‚Ų±ŁŠŲØŲ§)" + }, + "info": { + "closeButton": "أغلاق", + "okButton": "نعم", + "modalTitle": "رسالة Ł…Ų¹Ł„ŁˆŁ…Ų§ŲŖ" + }, + "markdown_import": { + "import_button": "أستيراد", + "dialog_title": "استيراد Markdown" + }, + "note_type_chooser": { + "templates": "Ł‚ŁˆŲ§Ł„ŲØ", + "builtin_templates": "Ų§Ł„Ł‚ŁˆŲ§Ł„ŲØ المدمجة", + "modal_title": "Ų§Ų®ŲŖŲ± Ł†ŁˆŲ¹ الملاحظة" + }, + "prompt": { + "title": "ŲŖŲ±Ł‚ŁŠŲ©", + "ok": "نعم", + "defaultTitle": "ŲŖŲ±Ł‚ŁŠŲ©" + }, + "protected_session_password": { + "close_label": "أغلاق", + "modal_title": "جلسة Ł…Ų­Ł…ŁŠŲ©", + "start_button": "ŲØŲÆŲ” جلسة Ł…Ų­Ł…ŁŠŲ©", + "help_title": "Ł…Ų³Ų§Ų¹ŲÆŲ© Ų­ŁˆŁ„ الملاحظات Ų§Ł„Ł…Ų­Ł…ŁŠŲ©" + }, + "revisions": { + "delete_button": "حذف", + "download_button": "ŲŖŁ†Ų²ŁŠŁ„", + "restore_button": "Ų£Ų³ŲŖŲ¹Ų§ŲÆŲ©", + "preview": "Ł…Ų¹Ų§ŁŠŁ†Ų©:", + "note_revisions": "Ł…Ų±Ų§Ų¬Ų¹Ų§ŲŖ الملاحظة", + "diff_on": "Ų¹Ų±Ų¶ Ų§Ł„ŁŲ±ŁˆŁ‚Ų§ŲŖ", + "diff_off": "Ų¹Ų±Ų¶ Ų§Ł„Ł…Ų­ŲŖŁˆŁ‰", + "file_size": "حجم الملف:", + "mime": "MIME: ", + "delete_all_button": "حذف ŁƒŁ„ المراجعات", + "settings": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ Ł…Ų±Ų§Ų¬Ų¹Ų© الملاحظة", + "diff_not_available": "المقارنة غير Ł…ŲŖŁˆŁŲ±Ų©.", + "help_title": "Ł…Ų³Ų§Ų¹ŲÆŲ© Ų­ŁˆŁ„ Ł…Ų±Ų§Ų¬Ų¹Ų§ŲŖ الملاحظة" + }, + "sort_child_notes": { + "title": "Ų¹Ł†ŁˆŲ§Ł†", + "ascending": "تصاعدي", + "descending": "ŲŖŁ†Ų§Ų²Ł„ŁŠ", + "folders": "مجلدات", + "sort": "ترتيب", + "sorting_criteria": "Ł…Ų¹Ų§ŁŠŁŠŲ± Ų§Ł„ŲŖŲ±ŲŖŁŠŲØ", + "date_created": "تاريخ الانؓاؔ", + "date_modified": "تاريخ Ų§Ł„ŲŖŲ¹ŲÆŁŠŁ„", + "sorting_direction": "اتجاه Ų§Ł„ŲŖŲ±ŲŖŁŠŲØ", + "natural_sort": "Ų§Ł„ŲŖŲ±ŲŖŁŠŲØ Ų§Ł„Ų·ŲØŁŠŲ¹ŁŠ", + "natural_sort_language": "لغات Ų§Ł„ŲŖŲ±ŲŖŁŠŲØ Ų§Ł„Ų·ŲØŁŠŲ¹ŁŠ", + "sort_children_by": "ترتيب العناصر Ų§Ł„ŁŲ±Ų¹ŁŠŲ© Ų­Ų³ŲØ..." + }, + "recent_changes": { + "undelete_link": "الغاؔ الحذف", + "title": "Ų§Ł„ŲŖŲŗŁŠŲ±Ų§ŲŖ Ų§Ł„Ų§Ų®ŁŠŲ±Ų©", + "no_changes_message": "Ł„Ų§ŁŠŁˆŲ¬ŲÆ تغيير لحد الان...", + "erase_notes_button": "Ł…Ų³Ų­ الملاحظات Ų§Ł„Ł…Ų­Ų°ŁˆŁŲ© الان" + }, + "edited_notes": { + "deleted": "(حذف)", + "title": "الملاحظات المعدلة" + }, + "note_properties": { + "info": "Ł…Ų¹Ł„ŁˆŁ…Ų§ŲŖ" + }, + "backend_log": { + "refresh": "تحديث" + }, + "max_content_width": { + "max_width_unit": "ŲØŁƒŲ³Ł„", + "title": "Ų¹Ų±Ų¶ Ų§Ł„Ł…Ų­ŲŖŁˆŁ‰", + "reload_button": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ­Ł…ŁŠŁ„ Ų§Ł„ŁˆŲ§Ų¬Ł‡Ų©", + "max_width_label": "اقصى Ų¹Ų±Ų¶ Ł„Ł„Ł…Ų­ŲŖŁˆŁ‰", + "reload_description": "تغييرات من خيارات المظهر" + }, + "native_title_bar": { + "enabled": "مفعل", + "disabled": "Ł…Ų¹Ų·Ł„" + }, + "theme": { + "theme_label": "السمة", + "layout": "تخطيط", + "layout-vertical-title": "Ų¹Ł…ŁˆŲÆŁŠ", + "layout-horizontal-title": "Ų£ŁŁ‚ŁŠ", + "title": "نسق Ų§Ł„ŲŖŲ·ŲØŁŠŁ‚", + "light_theme": "النسق Ų§Ł„Ł‚ŲÆŁŠŁ… (فاتح)", + "dark_theme": "النسق Ų§Ł„Ł‚ŲÆŁŠŁ… (ŲÆŲ§ŁƒŁ†)", + "triliumnext-light": "ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ… (فاتح)", + "triliumnext-dark": "ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ… ( ŲÆŲ§ŁƒŁ†)", + "override_theme_fonts_label": "تجاوز خطوط النسق" + }, + "ui-performance": { + "title": "Ų£ŲÆŲ§Ų”", + "enable-shadows": "ŲŖŁŲ¹ŁŠŁ„ الضلال", + "enable-smooth-scroll": "ŲŖŁ…ŁƒŁŠŁ† Ų§Ł„ŲŖŁ…Ų±ŁŠŲ± السلس", + "enable-motion": "ŲŖŁ…ŁƒŁŠŁ† الانتقالات ŁˆŲ§Ł„Ų±Ų³ŁˆŁ… Ų§Ł„Ł…ŲŖŲ­Ų±ŁƒŲ©" + }, + "ai_llm": { + "progress": "تقدم", + "openai_tab": "OpenAI", + "actions": "Ų£Ų¬Ų±Ų§Ų”Ų§ŲŖ", + "retry": "Ų£Ų¹ŲÆ Ų§Ł„Ł…Ų­Ų§ŁˆŁ„Ų©", + "reprocessing_index": "Ų¬Ų§Ų± Ų§Ų¹Ų§ŲÆŲ© البناؔ...", + "never": "ابدٱ", + "agent": { + "processing": "Ų¬Ų§Ų± المعالجة...", + "thinking": "Ų¬Ų§Ų± Ų§Ł„ŲŖŁŁƒŁŠŲ±...", + "loading": "Ų¬Ų§Ų± Ų§Ł„ŲŖŲ­Ł…ŁŠŁ„...", + "generating": "Ų¬Ų§Ų± الانؓاؔ..." + }, + "name": "Ų§Ł„Ų°ŁƒŲ§Ų” Ų§Ł„Ų£ŲµŲ·Ł†Ų§Ų¹ŁŠ", + "openai": "OpenAI", + "sources": "Ł…ŲµŲ§ŲÆŲ±", + "temperature": "ŲÆŲ±Ų¬Ų© الحرارة", + "model": "Ł†Ł…ŁˆŲ°Ų¬", + "refreshing_models": "Ų¬Ų§Ų± Ų§Ł„ŲŖŲ­ŲÆŁŠŲ«...", + "error": "Ų®Ų·Ų£", + "refreshing": "Ų¬Ų§Ų± Ų§Ł„ŲŖŲ­ŲÆŁŠŲ«...", + "ollama_tab": "Ollama", + "anthropic_tab": "Ų§Ł†ŲŖŲ±ŁˆŲØŁŠŁƒ", + "not_started": "لم يبدأ ŲØŲ¹ŲÆ", + "title": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ AI", + "processed_notes": "الملاحظات المعالجة", + "total_notes": "الملاحظات Ų§Ł„ŁƒŁ„ŁŠŲ©", + "queued_notes": "الملاحظات في قائمة الانتظار", + "failed_notes": "الملاحظات الفاؓلة", + "last_processed": "Ų§Ų®Ų± معالجة", + "refresh_stats": "تحديث Ų§Ł„Ų§Ų­ŲµŲ§Ų¦ŁŠŲ§ŲŖ", + "voyage_tab": "استكؓاف AI", + "provider_precedence": "Ų§ŁˆŁ„ŁˆŁŠŲ© Ų§Ł„Ł…Ų²ŁˆŲÆ", + "system_prompt": "Ł…ŁˆŲ¬Ł‡ النظام", + "openai_configuration": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ OpenAI", + "openai_settings": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ OpenAI", + "api_key": "مفتاح ŁˆŲ§Ų¬Ł‡Ų© برمجة Ų§Ł„ŲŖŲ·ŲØŁŠŁ‚Ų§ŲŖ", + "url": "Ų¹Ł†ŁˆŲ§Ł† URL Ų§Ł„Ų§Ų³Ų§Ų³ŁŠ", + "default_model": "Ų§Ł„Ł†Ł…ŁˆŲ°Ų¬ Ų§Ł„Ų§ŁŲŖŲ±Ų§Ų¶ŁŠ", + "base_url": "Ų¹Ł†ŁˆŲ§Ł† URL Ų§Ł„Ų£Ų³Ų§Ų³ŁŠ", + "openai_url_description": "افتراضيا: https://api.openai.com/v1", + "anthropic_settings": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ Ų§Ł†ŲŖŲ±ŁˆŲØŁŠŁƒ", + "ollama_settings": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ Ollama", + "anthropic_configuration": "ŲŖŁ‡ŁŠŲ¦Ų© Ų§Ł†ŲŖŲ±ŁˆŲØŁŠŁƒ", + "voyage_url_description": "افتراضيا: https://api.voyageai.com/v1", + "ollama_configuration": "ŲŖŁ‡ŁŠŲ¦Ų© Ollama", + "enable_ollama": "ŲŖŁ…ŁƒŁŠŁ† Ollama", + "last_attempt": "Ų§Ų®Ų± Ł…Ų­Ų§ŁˆŁ„Ų©", + "active_providers": "Ų§Ł„Ł…Ų²ŁˆŲÆŁˆŁ† Ų§Ł„Ł†Ų“Ų·ŁˆŁ†", + "disabled_providers": "Ų§Ł„Ł…Ų²ŁˆŲÆŁˆŁ† Ų§Ł„Ł…Ų¹Ų·Ł„ŁˆŁ†", + "similarity_threshold": "Ų¹ŲŖŲØŲ© التؓابه", + "complete": "Ų§ŁƒŲŖŁ…Ł„ (100%)", + "ai_settings": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ AI", + "show_thinking": "Ų¹Ų±Ų¶ Ų§Ł„ŲŖŁŁƒŁŠŲ±", + "index_status": "حالة الفهرس", + "indexed_notes": "الملاحظات المفهرسة", + "indexing_stopped": "ŲŖŁ… Ų§ŁŠŁ‚Ų§Ł الفهرسة", + "last_indexed": "Ų§Ų®Ų± فهرسة", + "note_chat": "ŲÆŲ±ŲÆŲ“Ų© الملاحظة", + "start_indexing": "ŲØŲÆŲ” الفهرسة", + "chat": { + "root_note_title": "ŲÆŲ±ŲÆŲ“Ų§ŲŖ AI", + "new_chat_title": "ŲÆŲ±ŲÆŲ“Ų© جديدة", + "create_new_ai_chat": "انؓاؔ ŲÆŲ±ŲÆŲ“Ų© AI جديدة" + }, + "selected_provider": "Ų§Ł„Ł…Ų²ŁˆŲÆ المحدد", + "select_model": "Ų§Ų®ŲŖŲ± Ų§Ł„Ł†Ł…ŁˆŲ°Ų¬...", + "select_provider": "Ų§Ų®ŲŖŲ± Ų§Ł„Ł…Ų²ŁˆŲÆ...", + "ollama_model": "Ł†Ł…ŁˆŲ°Ų¬ Ollama", + "refresh_models": "تحديث النماذج", + "rebuild_index": "Ų§Ų¹Ų§ŲÆŲ© بناؔ الفهرس", + "note_title": "Ų¹Ł†ŁˆŲ§Ł† الملاحظة", + "processing": "جاري المعالجة ({{percentage}}%)", + "incomplete": "غير Ł…ŁƒŲŖŁ…Ł„ ({{percentage}}%)", + "ollama_url": "Ų¹Ł†ŁˆŲ§Ł† URL الخاص ŲØ Ollama", + "provider_configuration": "ŲŖŁƒŁˆŁŠŁ† Ł…ŁˆŁŲ± AI", + "voyage_settings": "استكؓاف Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ AI", + "enable_automatic_indexing": "ŲŖŁ…ŁƒŁŠŁ† الفهرسة Ų§Ł„ŲŖŁ„Ł‚Ų§Ų¦ŁŠŲ©", + "index_rebuild_progress": "تقدم Ų§Ų¹Ų§ŲÆŲ© انؓاؔ الفهرس", + "index_rebuild_complete": "Ų§ŁƒŲŖŁ…Ł„ŲŖ Ų¹Ł…Ł„ŁŠŲ© ŲŖŲ­Ų³ŁŠŁ† الفهرس", + "use_enhanced_context": "Ų§Ų³ŲŖŲ®ŲÆŲ§Ł… Ų§Ł„Ų³ŁŠŲ§Ł‚ المحسن", + "enter_message": "ادخل Ų±Ų³Ų§Ł„ŲŖŁƒ...", + "index_all_notes": "فهرسة Ų¬Ł…ŁŠŲ¹ الملاحظات", + "indexing_in_progress": "Ų¬Ų§Ų± فهرسة الملاحظات...", + "use_advanced_context": "Ų§Ų³ŲŖŲ®ŲÆŁ… Ų§Ł„Ų³ŁŠŲ§Ł‚ المتقدم", + "ai_enabled": "ŲŖŁ…ŁƒŁŠŁ† Ł…Ł…ŁŠŲ²Ų§ŲŖ AI", + "ai_disabled": "الغاؔ ŲŖŁ…ŁƒŁŠŁ† Ł…Ł…ŁŠŲ²Ų§ŲŖ AI", + "enable_ai_features": "ŲŖŁ…ŁƒŁŠŁ† Ų®ŲµŲ§Ų¦Ųµ AI/LLM", + "enable_ai": "ŲŖŁ…ŁƒŁŠŁ† Ų®ŲµŲ§Ų¦Ųµ AI/LLM", + "reprocess_index": "Ų§Ų¹Ų§ŲÆŲ© بناؔ فهرس البحث", + "index_rebuilding": "Ų¬Ų§Ų± ŲŖŲ­Ų³ŁŠŁ† الفهرس {{percentage}}", + "voyage_configuration": "Ų§Ų¹ŲÆŲ§ŲÆŲŖ Voyage AI", + "openai_model_description": "الامثلة: gpt-4o, gpt-4-turbo, gpt-3.5-turbo", + "partial": "{{ percentage }} % Ł…ŁƒŲŖŁ…Ł„", + "retry_queued": "ŲŖŁ… Ų¬ŲÆŁˆŁ„Ų© الملاحظة لاعادة Ų§Ł„Ł…Ų­Ų§ŁˆŁ„Ų©", + "max_notes_per_llm_query": "اكبر Ų¹ŲÆŲÆ للملاحظات Ł„ŁƒŁ„ استعلام", + "remove_provider": "احذف Ų§Ł„Ł…Ų²ŁˆŲÆ من البحث", + "restore_provider": "Ų§Ų³ŲŖŲ¹Ų§ŲÆŲ© Ų§Ł„Ł…Ų²ŁˆŲÆ الى البحث", + "reprocess_index_error": "Ų­ŲÆŲ« Ų®Ų·Ų£ اثناؔ Ų§Ų¹Ų§ŲÆŲ© بناؔ فهرس البحث", + "auto_refresh_notice": "تحديث ŲŖŁ„Ł‚Ų§Ų¦ŁŠ ŁƒŁ„ {{seconds}} Ų«Ų§Ł†ŁŠŲ©", + "note_queued_for_retry": "الملاحظة جاهزة لاعادة Ų§Ł„Ł…Ų­Ų§ŁˆŁ„Ų© لاحقا", + "failed_to_retry_note": "ā€ŽŁŲ“Ł„ في Ų§Ų¹Ų§ŲÆŲ© Ł…Ų­Ų§ŁˆŁ„Ų© معالجة Ų§Ł„Ł…Ų­Ų§ŁˆŁ„Ų©", + "failed_to_retry_all": "فؓل في Ų§Ų¹Ų§ŲÆŲ© Ł…Ų­Ų§ŁˆŁ„Ų© معالجة الملاحظة", + "error_generating_response": "ā€ŒŁŲ“Ł„ في ŲŖŁˆŁ„ŁŠŲÆ Ų§Ų³ŲŖŲ¬Ų§ŲØŲ© من Ų§Ł„ AI", + "create_new_ai_chat": "انؓاؔ ŲÆŲ±ŲÆŲ“Ų© AI جديدة", + "error_fetching": "فؓل في Ų§Ų³ŲŖŲ±Ų¬Ų§Ų¹ النماذج: {{error}}" + }, + "code_auto_read_only_size": { + "unit": "حروف", + "title": "الحجم Ų§Ł„ŲŖŁ„Ł‚Ų§Ų¦ŁŠ للقراؔه فقط" + }, + "code-editor-options": { + "title": "Ł…Ų­Ų±Ų±" + }, + "images": { + "images_section_title": "صور", + "max_image_dimensions_unit": "ŲØŁƒŲ³Ł„", + "enable_image_compression": "ŲŖŁ…ŁƒŁŠŁ† Ų¶ŲŗŲ· Ų§Ł„ŲµŁˆŲ±Ų©" + }, + "revisions_snapshot_limit": { + "snapshot_number_limit_unit": "لقطات", + "note_revisions_snapshot_limit_title": "الحد الاقصى لنسخ الملاحظات Ų§Ł„Ų§Ų­ŲŖŁŠŲ§Ų·ŁŠŲ©" + }, + "search_engine": { + "bing": "Bing", + "duckduckgo": "DuckDuckGo", + "google": "Ų¬ŁˆŲ¬Ł„", + "save_button": "حفظ", + "baidu": "Baidu", + "title": "Ł…Ų­Ų±Łƒ البحث", + "predefined_templates_label": "Ł‚ŁˆŲ§Ł„ŲØ Ł…Ų­Ų±Łƒ البحث المعرفة مسبقا", + "custom_name_label": "اسم Ł…Ų­Ų±Łƒ البحث المخصص", + "custom_name_placeholder": "اسم Ł…Ų­Ų±Łƒ البحث المخصص", + "custom_url_placeholder": "تخصيص Ų¹Ł†ŁˆŲ§Ł† URL Ł„Ł…Ų­Ų±Łƒ البحث" + }, + "heading_style": { + "plain": "بسيط", + "underline": "تسطير", + "markdown": "نمط-Markdown", + "title": "نمط Ų§Ł„Ų¹Ł†ŁˆŲ§Ł†" + }, + "text_auto_read_only_size": { + "unit": "حروف", + "title": "الحجم Ų§Ł„ŲŖŁ„Ł‚Ų§Ų¦ŁŠ للقراؔة فقط" + }, + "i18n": { + "language": "لغة", + "sunday": "الاحد", + "monday": "Ų§Ł„Ų§Ų«Ł†ŁŠŁ†", + "title": "تعريب", + "tuesday": "الثلاثاؔ", + "wednesday": "الاربعاؔ", + "thursday": "Ų§Ł„Ų®Ł…ŁŠŲ³", + "friday": "الجمعة", + "saturday": "السبت", + "formatting-locale": "ŲŖŁ†Ų³ŁŠŁ‚ Ų§Ł„ŲŖŲ§Ų±ŁŠŲ® ŁˆŲ§Ł„Ų§Ų±Ł‚Ų§Ł…" + }, + "backup": { + "path": "Ł…Ų³Ų§Ų±", + "automatic_backup": "النسخ Ų§Ł„Ų§Ų­ŲŖŁŠŲ§Ų·ŁŠ Ų§Ł„ŲŖŁ„Ł‚Ų§Ų¦ŁŠ", + "backup_now": "نسخ احتياطي الان", + "existing_backups": "النسخ Ų§Ł„Ų§Ų­ŲŖŁŠŲ§Ų·ŁŠŲ© Ų§Ł„Ł…ŁˆŲ¬ŁˆŲÆŲ©", + "enable_weekly_backup": "ŲŖŁ…ŁƒŁŠŁ† النسخ Ų§Ł„Ų§Ų®ŲŖŁŠŲ§Ų·ŁŠ Ų§Ł„Ų§Ų³ŲØŁˆŲ¹ŁŠ", + "enable_monthly_backup": "ŲŖŁ…ŁƒŁŠŁ† النسخ Ų§Ł„Ų§Ų­ŲŖŁŠŲ§Ų·ŁŠ Ų§Ł„Ų“Ł‡Ų±ŁŠ", + "date-and-time": "Ų§Ł„ŲŖŲ§Ų±ŁŠŲ® ŁˆŲ§Ł„ŁˆŁ‚ŲŖ", + "no_backup_yet": "Ł„Ų§ŁŠŁˆŲ¬ŲÆ نسخة احتياطية لحد الان", + "enable_daily_backup": "ŲŖŁ…ŁƒŁŠŁ† النسخ Ų§Ł„Ų§Ų­ŲŖŁŠŲ§Ų·ŁŠ Ų§Ł„ŁŠŁˆŁ…ŁŠ", + "backup_database_now": "نسخ اختياطي لقاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ الان" + }, + "etapi": { + "wiki": "ويكي", + "created": "ŲŖŁ… الأنؓاؔ", + "actions": "Ų£Ų¬Ų±Ų§Ų”Ų§ŲŖ", + "title": "ETAPI", + "existing_tokens": "Ų§Ł„Ų±Ł…ŁˆŲ² Ų§Ł„Ł…ŁˆŲ¬ŁˆŲÆŲ©", + "token_name": "اسم الرمز", + "default_token_name": "رمز جديد", + "rename_token_title": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© الرمز", + "rename_token": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© هذا الرمز", + "create_token": "انؓاؔ رمز PEAPI جديد" + }, + "password": { + "heading": "ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "wiki": "ويكي", + "old_password": "ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ± Ų§Ł„Ł‚ŲÆŁŠŁ…Ų©", + "new_password": "ŁƒŁ„Ł…Ų© Ł…Ų±ŁˆŲ± جديدة", + "change_password": "تغيير ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "change_password_heading": "تغيير ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "set_password_heading": "ŲŖŲ¹ŁŠŁŠŁ† ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "set_password": "ŲŖŲ¹ŁŠŁŠŁ† ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "for_more_info": "Ł„Ł…Ų²ŁŠŲÆ من Ų§Ł„Ł…Ų¹Ł„ŁˆŁ…Ų§ŲŖ.", + "protected_session_timeout_label": "انتهت Ł…ŲÆŲ© الجلسة Ų§Ł„Ł…Ų­Ł…ŁŠŲ©:", + "protected_session_timeout": "انتهاؔ مهلة الجلسة Ų§Ł„Ł…Ų­Ł…ŁŠŲ©", + "new_password_confirmation": "تاكيد ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ± Ų§Ł„Ų¬ŲÆŁŠŲÆŲ©" + }, + "shortcuts": { + "shortcuts": "Ų£Ų®ŲŖŲµŲ§Ų±Ų§ŲŖ", + "description": "Ų§Ł„ŁˆŲµŁ", + "keyboard_shortcuts": "Ų§Ų®ŲŖŲµŲ§Ų±Ų§ŲŖ Ł„ŁˆŲ­Ų© Ų§Ł„Ł…ŁŲ§ŲŖŁŠŲ­", + "action_name": "اسم الاجراؔ", + "default_shortcuts": "Ų§Ų®ŲŖŲµŲ§Ų±Ų§ŲŖ افتراضية" + }, + "sync_2": { + "timeout_unit": "Ł…ŁŠŁ„ŁŠ Ų«Ų§Ł†ŁŠŲ©", + "note": "ملاحظة", + "save": "حفظ", + "help": "المساعدة", + "config_title": "ŲŖŁ‡ŁŠŲ¦Ų© المزامنة", + "timeout": "انتهاؔ مهلة المزامنة", + "test_title": "Ų§Ų®ŲŖŲØŲ§Ų± المزامنة", + "test_button": "Ų§Ų®ŲŖŲØŲ§Ų± المزامنة", + "server_address": "Ų¹Ł†ŁˆŲ§Ł† نسخة الخادم", + "proxy_label": "Ų®Ų§ŲÆŁ… ŁˆŁƒŁŠŁ„ المزامنة (اخياري)" + }, + "api_log": { + "close": "أغلاق" + }, + "bookmark_switch": { + "bookmark": "علامة Ł…Ų±Ų¬Ų¹ŁŠŲ©", + "remove_bookmark": "ازالة الاؓارة Ų§Ł„Ł…Ų±Ų¬Ų¹ŁŠŲ©" + }, + "editability_select": { + "auto": "ŲŖŁ„Ł‚Ų§Ų¦ŁŠ", + "read_only": "قراؔة-فقط", + "always_editable": "قابل Ł„Ł„ŲŖŲ¹ŲÆŁŠŁ„ دائما" + }, + "tab_row": { + "close": "اغلاق", + "close_tab": "اغلاق Ų§Ł„ŲŖŲØŁˆŁŠŲØ", + "new_tab": "تبويب جديد", + "close_all_tabs": "اغلاق ŁƒŁ„ علامات Ų§Ł„ŲŖŲØŁˆŁŠŲØ", + "add_new_tab": "اضافة علامة تبويب جديدة", + "close_other_tabs": "اغلاق علامات Ų§Ł„ŲŖŲØŁˆŁŠŲØ الاخرى", + "reopen_last_tab": "Ų§Ų¹Ų§ŲÆŲ© فتح Ų§Ų®Ų± علامة تبويب مغلقة" + }, + "toc": { + "options": "خيارات", + "table_of_contents": "Ų¬ŲÆŁˆŁ„ Ų§Ł„Ł…Ų­ŲŖŁˆŁŠŲ§ŲŖ" + }, + "tasks": { + "due": { + "yesterday": "أمس", + "today": "Ų§Ł„ŁŠŁˆŁ…", + "tomorrow": "غدٱ" + } + }, + "code_theme": { + "title": "المظهر", + "word_wrapping": "التفاف النص", + "color-scheme": "نظام Ų§Ł„Ų§Ł„ŁˆŲ§Ł†" + }, + "table_view": { + "sort-column-ascending": "تصاعدي", + "sort-column-descending": "ŲŖŁ†Ų§Ų²Ł„ŁŠ", + "new-column-relation": "العلاقة", + "new-column-label": "ŲŖŲ³Ł…ŁŠŲ©", + "new-row": "صف جديد", + "new-column": "Ų¹Ł…ŁˆŲÆ جديد", + "sort-column-clear": "ازالة Ų§Ł„ŲŖŲ±ŲŖŁŠŲØ", + "show-hide-columns": "اظهار/اخفاؔ الاعمدة", + "edit-column": "تحرير Ų§Ł„Ų¹Ł…ŁˆŲÆ", + "delete-column": "حذف Ų§Ł„Ų¹Ł…ŁˆŲÆ", + "row-insert-above": "Ų§ŲÆŲ±Ų§Ų¬ صف للاعلى", + "row-insert-below": "Ų§ŲÆŲ±Ų§Ų¬ صف للاسفل", + "row-insert-child": "Ų§ŲÆŲ±Ų§Ų¬ ملاحظة فرعية", + "sort-column-by": "ترتيب بواسط \" {{title}}\"", + "hide-column": "اخفاؔ Ų§Ł„Ų¹Ł…ŁˆŲÆ \"{{title}}\"" + }, + "modal": { + "close": "اغلاق" + }, + "call_to_action": { + "dismiss": "تجاهل", + "background_effects_button": "ŲŖŁŲ¹ŁŠŁ„ Ł…Ų¤Ų«Ų±Ų§ŲŖ Ų§Ł„Ų®Ł„ŁŁŠŲ©", + "next_theme_button": "Ų¬Ų±ŲØ النسق Ų§Ł„Ų¬ŲÆŁŠŲÆ" + }, + "units": { + "percentage": "%" + }, + "clone_to": { + "prefix_optional": "ŲØŲ§ŲÆŲ¦Ų© (اختياري)", + "clone_notes_to": "استنسخ الملاحظات الى...", + "help_on_links": "Ł…Ų³Ų§Ų¹ŲÆŲ© Ų­ŁˆŁ„ الارتباطات Ų§Ł„ŲŖŲ“Ų¹ŲØŁŠŲ©", + "notes_to_clone": "ملاحظات للنسخ", + "target_parent_note": "الملاحظة Ų§Ł„Ų§ŲµŁ„ŁŠŲ© الهدف", + "clone_to_selected_note": "استنساخ الى الملاحظة المحددة" + }, + "table_of_contents": { + "unit": "Ų¹Ł†Ų§ŁˆŁŠŁ†", + "title": "Ų¬ŲÆŁˆŁ„ Ų§Ł„Ł…Ų­ŲŖŁˆŁŠŲ§ŲŖ" + }, + "tree-context-menu": { + "archive": "أرؓفة", + "unarchive": "الغاؔ الارؓفة", + "delete": "حذف", + "advanced": "متقدمة", + "cut": "قص", + "duplicate": "استنساخ", + "export": "تصدير", + "expand-subtree": "توسيع الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "collapse-subtree": "طي الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "sort-by": "ترتيب بواسطة...", + "protect-subtree": "الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ© Ų§Ł„Ł…Ų­Ł…ŁŠŲ©", + "unprotect-subtree": "الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ© Ų§Ł„ŲŗŁŠŲ± Ł…Ų­Ł…ŁŠŲ©", + "clone-to": "ā€Ų§Ų³ŲŖŁ†Ų³Ų§Ų® الى...", + "move-to": "نقل الى...", + "paste-into": "لصق في", + "paste-after": "لصق ŲØŲ¹ŲÆ", + "open-in-popup": "تحرير سريع", + "hoist-note": "Ų§ŲØŲ±Ų§Ų² الملاحظة", + "unhoist-note": "الغاؔ Ų§ŲØŲ±Ų§Ų² الملاحظة", + "copy-clone": "نسخ / استنساخ", + "import-into-note": "استيراد الى الملاحظة", + "insert-note-after": "Ų§ŲÆŲ±Ų§Ų¬ ملاحظة ŲØŲ¹ŲÆ", + "insert-child-note": "Ų§ŲÆŲ±Ų§Ų¬ ملاحظة فرعية", + "search-in-subtree": "ā€Ų§Ł„ŲØŲ­Ų« في الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "edit-branch-prefix": "ŲŖŲ¹ŲÆŁŠŁ„ ŲØŲ§ŲÆŲ¦Ų© الفرع", + "convert-to-attachment": "Ų§Ł„ŲŖŲ­ŁˆŁŠŁ„ الى مرفق", + "apply-bulk-actions": "ā€ŒŲŖŲ·ŲØŁŠŁ‚ الاجراؔات Ų§Ł„Ų¬Ł…Ų§Ų¹ŁŠŲ©", + "recent-changes-in-subtree": "Ų§Ł„ŲŖŲŗŁŠŁŠŲ±Ų§ŲŖ Ų§Ł„Ų§Ų®ŁŠŲ±Ų© في الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©" + }, + "note_types": { + "text": "نص", + "code": "كود", + "book": "Ł…Ų¬Ł…ŁˆŲ¹Ų©", + "canvas": "Ł…Ų³Ų§Ų­Ų© العمل", + "file": "ملف", + "image": "صورة", + "launcher": "Ł…Ų“ŲŗŁ„", + "doc": "مستند", + "widget": "عنصر ŁˆŲ§Ų¬Ł‡Ų©", + "new-feature": "جديد", + "collections": "Ł…Ų¬Ų§Ł…ŁŠŲ¹", + "beta-feature": "Ų§ŲµŲÆŲ§Ų± تجريبي", + "saved-search": "ŲØŲ­Ų« Ł…Ų­ŁŁˆŲø", + "relation-map": "خريطة العلاقة", + "note-map": "خريطة الملاحظة", + "render-note": "Ų¹Ų±Ų¶ الملاحظة", + "mermaid-diagram": "Ł…Ų®Ų·Ų· Mermaid", + "web-view": "Ų¹Ų±Ų¶ Ų§Ł„ŁˆŁŠŲØ", + "mind-map": "خريطة Ų°Ł‡Ł†ŁŠŲ©", + "geo-map": "خريطة جغرافية", + "ai-chat": "ŲÆŲ±ŲÆŲ“Ų© AI", + "task-list": "قائمة المهام" + }, + "shared_switch": { + "shared": "Ł…Ų“ŲŖŲ±Łƒ", + "toggle-on-title": "Ł…Ų“Ų§Ų±ŁƒŲ© الملاحظة", + "toggle-off-title": "الغاؔ Ł…Ų“Ų§Ų±ŁƒŲ© الملاحظة" + }, + "template_switch": { + "template": "قالب" + }, + "find": { + "replace": "Ų§Ų³ŲŖŲØŲÆŲ§Ł„", + "case_sensitive": "Ų­Ų³Ų§Ų³Ų© لحالة الأحرف", + "match_words": "مطابقة Ų§Ł„ŁƒŁ„Ł…Ų§ŲŖ", + "replace_placeholder": "Ų§Ų³ŲŖŲØŲÆŲ§Ł„ ŲØ...", + "replace_all": "Ų§Ų³ŲŖŲØŲÆŲ§Ł„ Ų§Ł„ŁƒŁ„", + "find_placeholder": "البحث في النص..." + }, + "highlights_list_2": { + "options": "خيارات", + "title": "قائمة Ų§Ł„ŲŖŲ¶Ł„ŁŠŁ„Ų§ŲŖ" + }, + "quick-search": { + "searching": "Ų¬Ų§Ų± البحث...", + "placeholder": "البحث Ų§Ł„Ų³Ų±ŁŠŲ¹", + "no-results": "لم ŁŠŲŖŁ… Ų§Ł„Ų¹Ų«ŁˆŲ± على نتائج", + "show-in-full-search": "Ų¹Ų±Ų¶ في البحث Ų§Ł„ŁƒŲ§Ł…Ł„" + }, + "note_tree": { + "unhoist": "Ų§Ų±Ų¬Ų§Ų¹ الى Ų§Ł„ŲŖŲ±ŲŖŁŠŲØ Ų§Ł„Ų·ŲØŁŠŲ¹ŁŠ", + "tree-settings-title": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ الؓجرة", + "toggle-sidebar": "اظهار/اخفاؔ Ų§Ł„Ų“Ų±ŁŠŲ· Ų§Ł„Ų¬Ų§Ł†ŲØŁŠ", + "collapse-title": "طي Ų“Ų¬Ų±Ų© الملاحظة", + "hide-archived-notes": "اخفاؔ الملاحظات المؤرؓفة", + "automatically-collapse-notes": "طي الملاحظات ŲŖŁ„Ł‚Ų§Ų¦ŁŠŲ§", + "create-child-note": "انؓاؔ ملاحظة فرعية", + "scroll-active-title": "ŲŖŁ…Ų±ŁŠŲ± الى الملاحظة النؓطة", + "save-changes": "حفظ ŁˆŲŖŲ·ŲØŁŠŁ‚ Ų§Ł„ŲŖŲŗŁŠŁŠŲ±Ų§ŲŖ", + "saved-search-note-refreshed": "ŲŖŁ… تحديث ملاحظة البحث Ų§Ł„Ł…Ų­ŁŁˆŲøŲ©.", + "hoist-this-note-workspace": "تثبيت هذه الملاحظة (Ł…Ų³Ų§Ų­Ų© العمل)", + "refresh-saved-search-results": "تحديث نتائج البحث Ų§Ł„Ł…Ų­ŁŁˆŲøŲ©" + }, + "sql_table_schemas": { + "tables": "Ų¬ŲÆŲ§ŁˆŁ„" + }, + "launcher_context_menu": { + "reset": "Ų§Ų¹Ų§ŲÆŲ© Ų¶ŲØŲ·", + "add-spacer": "اضافة فاصل", + "delete": "حذف\n", + "add-note-launcher": "اضافة Ł…Ų“ŲŗŁ„ الملاحظة", + "add-script-launcher": "اضافة Ł…Ų“ŲŗŁ„ Ų§Ł„Ų³ŁƒŲ±ŁŠŲØŲŖ", + "add-custom-widget": "اضافة عنصر ŁˆŲ§Ų¬Ł‡Ų© Ł…Ų®ŲµŲµ", + "move-to-visible-launchers": "نقل الى المؓغلات Ų§Ł„Ł…Ų±Ų¦ŁŠŲ©", + "move-to-available-launchers": "نقل الى المؓغلات Ų§Ł„Ł…ŲŖŁˆŁŲ±Ų©", + "duplicate-launcher": "تكرار المؓغل " + }, + "editable-text": { + "auto-detect-language": "ŲŖŁ… Ų§ŁƒŲŖŲ“Ų§ŁŁ‡ ŲŖŁ„Ł‚Ų§Ų¦ŁŠŲ§" + }, + "classic_editor_toolbar": { + "title": "ŲŖŁ†Ų³ŁŠŁ‚" + }, + "editor": { + "title": "Ł…Ų­Ų±Ų±" + }, + "editing": { + "editor_type": { + "floating": { + "title": "عائم" + }, + "fixed": { + "title": "Ł…Ų«ŲØŲŖ" + }, + "label": "ؓريط ادوات Ų§Ł„ŲŖŁ†Ų³ŁŠŁ‚" + } + }, + "electron_context_menu": { + "cut": "قص", + "copy": "نسخ", + "paste": "لصق", + "copy-link": "نسخ الرابط", + "add-term-to-dictionary": "اضافة \"{{term}}\" الى Ų§Ł„Ł‚Ų§Ł…ŁˆŲ³", + "paste-as-plain-text": "لصق ŁƒŁ†Ųµ عادي" + }, + "promoted_attributes": { + "url_placeholder": "http://website...", + "promoted_attributes": "السمات المعززة", + "unset-field-placeholder": "غير Ł…Ų­ŲÆŲÆ", + "open_external_link": "فتح Ų±Ų§ŲØŲ· خارجي", + "add_new_attribute": "اضافة سمة جديدة", + "remove_this_attribute": "حذف هذه السمة", + "unknown_label_type": "Ł†ŁˆŲ¹ Ų§Ł„ŲŖŲ³Ł…ŁŠŲ© {{type}} غير Ł…Ų¹Ų±ŁˆŁ", + "unknown_attribute_type": "Ł†ŁˆŲ¹ السمة {{type}} غير Ł…Ų¹Ų±ŁˆŁ", + "remove_color": "حذف Ł„ŁˆŁ† Ų§Ł„ŲŖŲ³Ł…ŁŠŲ©" + }, + "duration": { + "seconds": "Ų«ŁˆŲ§Ł†ŁŠ", + "minutes": "دقائق", + "hours": "Ų³Ų§Ų¹Ų§ŲŖ", + "days": "Ų£ŁŠŲ§Ł…" + }, + "editorfeatures": { + "title": "Ł…Ł…ŁŠŲ²Ų§ŲŖ", + "note_completion_enabled": "ŲŖŁ…ŁƒŁŠŁ† Ų§Ł„Ų§ŁƒŁ…Ų§Ł„ Ų§Ł„ŲŖŁ„Ł‚Ų§Ų¦ŁŠ للملاحظة", + "emoji_completion_enabled": "ŲŖŁŲ¹ŁŠŁ„ Ų§Ł„Ų§ŁƒŁ…Ų§Ł„ Ų§Ł„ŲŖŁ„Ł‚Ų§Ų¦ŁŠ Ł„Ł„Ų±Ł…ŁˆŲ² Ų§Ł„ŲŖŲ¹ŲØŁŠŲ±ŁŠŲ©", + "slash_commands_enabled": "ŲŖŁŲ¹ŁŠŁ„ Ų§ŁˆŲ§Ł…Ų± Slash" + }, + "book_properties_config": { + "raster": "Ł†Ł‚Ų·ŁŠ", + "hide-weekends": "اخفاؔ عطلات Ł†Ł‡Ų§ŁŠŲ§ŲŖ Ų§Ł„Ų§Ų³ŲØŁˆŲ¹", + "map-style": "نمط Ų§Ł„Ų®Ų±ŁŠŲ·Ų©:", + "vector_light": "متجه (فاتح)", + "vector_dark": "متجه (ŲÆŲ§ŁƒŁ†)", + "show-scale": "اظهار Ų§Ł„Ł…Ł‚ŁŠŲ§Ų³", + "display-week-numbers": "اظهار ارقام Ų§Ł„Ų§Ų³Ų§ŲØŁŠŲ¹", + "max-nesting-depth": "العمق الاقصى للتداخل:" + }, + "multi_factor_authentication": { + "oauth_title": "OAuth/OpenID", + "title": "المصادقة Ł…ŲŖŲ¹ŲÆŲÆŲ© Ų§Ł„Ų¹ŁˆŲ§Ł…Ł„", + "mfa_method": "Ų·Ų±ŁŠŁ‚Ų© المصادقة Ł…ŲŖŲ¹ŲÆŲÆŲ© Ų§Ł„Ų¹ŁˆŲ§Ł…Ł„", + "oauth_user_account": "Ų­Ų³Ų§ŲØ المستخدم: ", + "oauth_user_email": "Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ للمستخدم: ", + "recovery_keys_used": "Ł…Ų³ŲŖŲ®ŲÆŁ…: {{date}}", + "mfa_enabled": "ŲŖŁ…ŁƒŁŠŁ† المصادقة Ł…ŲŖŲ¹ŲÆŲÆŲ© Ų§Ł„Ų¹ŁˆŲ§Ł…Ł„", + "recovery_keys_generate": "انؓاؔ Ų±Ł…ŁˆŲ² الاسترداد", + "recovery_keys_regenerate": "Ų§Ų¹Ų§ŲÆŲ© انؓاؔ Ų±Ł…ŁˆŲ² الاسترداد", + "oauth_user_not_logged_in": "لم ŁŠŲŖŁ… ŲŖŲ³Ų¬ŁŠŁ„ Ų§Ł„ŲÆŲ®ŁˆŁ„!", + "totp_secret_generate": "ŲŖŁˆŁ„ŁŠŲÆ TOTP Ų§Ł„Ų³Ų±ŁŠ", + "totp_secret_regenerate": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŁˆŁ„ŁŠŲÆ TOTP Ų§Ł„Ų³Ų±ŁŠ", + "totp_secret_generated": "ŲŖŁ… انؓاؔ TOTP Ų§Ł„Ų³Ų±ŁŠ", + "oauth_missing_vars": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ Ł…ŁŁ‚ŁˆŲÆŲ©: {{-variables}}", + "totp_secret_title": "ŲŖŁˆŁ„ŁŠŲÆ TOTP سري", + "totp_title": "ŁƒŁ„Ł…Ų© Ł…Ų±ŁˆŲ± لمرة واحدة Ł…Ų¹ŲŖŁ…ŲÆŲ© على Ų§Ł„ŁˆŁ‚ŲŖ (TOTP)", + "recovery_keys_title": "Ł…ŁŲ§ŲŖŁŠŲ­ Ų§Ų³ŲŖŲ±ŲÆŲ§ŲÆ ŲŖŲ³Ų¬ŁŠŁ„ Ų§Ł„ŲÆŲ®ŁˆŁ„ Ų§Ł„Ų§Ų­Ų§ŲÆŁŠ", + "recovery_keys_error": "Ų­ŲÆŲ« Ų®Ų·Ų£ اثناؔ ŲŖŁˆŁ„ŁŠŲÆ Ų±Ł…ŁˆŲ² الاسترجاع", + "recovery_keys_no_key_set": "Ł„Ų§ŲŖŁˆŲ¬ŲÆ Ų±Ł…ŁˆŲ² Ų§Ų³ŲŖŲ±Ų¬Ų§Ų¹ Ł…Ų¹ŁŠŁ†Ų©" + }, + "execute_script": { + "execute_script": "ŲŖŁ†ŁŁŠŲ° Ų§Ł„Ų³ŁƒŲ±ŁŠŲØŲŖ" + }, + "add_label": { + "add_label": "اضافة ŲŖŲ³Ł…ŁŠŲ©", + "to_value": "الى Ų§Ł„Ł‚ŁŠŁ…Ų©", + "new_value_placeholder": "Ł‚ŁŠŁ…Ų© جديدة", + "label_name_placeholder": "اسم Ų§Ł„ŲŖŲ³Ł…ŁŠŲ©", + "help_text": "عل ŁƒŁ„ الملاحظات المطابقة:" + }, + "delete_label": { + "delete_label": "حذف Ų§Ł„ŲŖŲ³Ł…ŁŠŲ©", + "label_name_placeholder": "اسم Ų§Ł„ŲŖŲ³Ł…ŁŠŲ©" + }, + "update_label_value": { + "to_value": "الى Ų§Ł„Ł‚ŁŠŁ…Ų©", + "new_value_placeholder": "Ł‚ŁŠŁ…Ų© جديدة", + "label_name_placeholder": "اسم Ų§Ł„ŲŖŲ³Ł…ŁŠŲ©", + "update_label_value": "تحديث Ł‚ŁŠŁ…Ų© Ų§Ł„ŲŖŲµŁ†ŁŠŁ" + }, + "delete_note": { + "delete_note": "حذف الملاحظة", + "delete_matched_notes": "حف الملاحظات المطابقة" + }, + "rename_note": { + "rename_note": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© الملاحظة", + "new_note_title": "Ų¹Ł†ŁˆŲ§Ł† ملاحظة جديد", + "rename_note_title_to": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© Ų¹Ł†ŁˆŲ§Ł† الملاحظة الى" + }, + "delete_relation": { + "delete_relation": "حذف العلاقة", + "relation_name": "اسم العلاقة" + }, + "left_pane_toggle": { + "show_panel": "Ų¹Ų±Ų¶ Ų§Ł„Ł„ŁˆŲ­Ų©", + "hide_panel": "اخفاؔ Ų§Ł„Ł„ŁˆŲ­Ų©" + }, + "move_pane_button": { + "move_left": "تحريك الى Ų§Ł„ŁŠŲ³Ų§Ų±", + "move_right": "تحريك الى Ų§Ł„ŁŠŁ…ŁŠŁ†" + }, + "note_actions": { + "re_render_note": "Ų§Ų¹Ų§ŲÆŲ© Ų¹Ų±Ų¶ الملاحظة", + "note_source": "Ł…ŲµŲÆŲ± الملاحظة", + "note_attachments": "مرفقات الملاحظة", + "import_files": "استيراد الملفات", + "export_note": "تصدير الملاحظة", + "delete_note": "حذف الملاحظة", + "print_note": "Ų·ŲØŲ§Ų¹Ų© الملاحظة", + "save_revision": "حفظ المراجعة", + "convert_into_attachment": "ŲŖŲ­ŁˆŁŠŁ„ الى مرفق", + "search_in_note": "ŲØŲ­Ų« في الملاحظة", + "open_note_externally": "فتح الملاحظة خارجيا", + "open_note_custom": "فتح ملاحظة Ł…Ų®ŲµŲµ", + "print_pdf": "تصدير ŁƒŁ…Ł„Ł PDF...", + "convert_into_attachment_failed": "فؓل ŲŖŲ­ŁˆŁŠŁ„ الملاحظة {{title}}." + }, + "update_available": { + "update_available": "تحديث Ł…ŲŖŁˆŁŲ±" + }, + "code_buttons": { + "execute_button_title": "ŲŖŁ†ŁŁŠŲ° Ų§Ł„Ų³ŁƒŲ±ŁŠŲØŲŖ", + "save_to_note_button_title": "حفظ في الملاحظا", + "opening_api_docs_message": "جاري فتح Ł…Ų³ŲŖŲÆŲ§ŲŖ API...", + "trilium_api_docs_button_title": "فتح مستندات API Ł„ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ…" + }, + "hide_floating_buttons_button": { + "button_title": "اخفاؔ الازرار" + }, + "show_floating_buttons_button": { + "button_title": "Ų¹Ų±Ų¶ الازرار" + }, + "relation_map_buttons": { + "zoom_in_title": "تكبير", + "zoom_out_title": "تصغير" + }, + "inherited_attribute_list": { + "title": "السمات Ų§Ł„Ł…ŁˆŲ±ŁˆŲ«Ų©", + "no_inherited_attributes": "Ł„Ų§ŲŖŁˆŲ¬ŲÆ سمات Ł…ŁˆŲ±ŁˆŲ«Ų©." + }, + "note_map": { + "title": "خريطة الملاحظة", + "fix-nodes": "اصلاح العقد", + "link-distance": "مسافة الرابط", + "open_full": "توسيع للعرض Ų§Ł„ŁƒŲ§Ł…Ł„", + "collapse": "طي الى الحجم Ų§Ł„Ų·ŲØŁŠŲ¹ŁŠ" + }, + "owned_attribute_list": { + "owned_attributes": "السمات Ų§Ł„Ł…Ł…Ł„ŁˆŁƒŲ©" + }, + "similar_notes": { + "title": "ملاحظات مؓابهة", + "no_similar_notes_found": "Ł„Ų§ŲŖŁˆŲ¬ŲÆ ملاحظة مؓابهة." + }, + "fast_search": { + "fast_search": "ŲØŲ­Ų« سريع" + }, + "search_script": { + "title": "نص البحث:", + "example_title": "انظر هذا المثال:" + }, + "attachment_detail": { + "owning_note": "الملاحظة Ų§Ł„Ł…Ų§Ł„ŁƒŲ©: ", + "list_of_all_attachments": "قائمة ŲØŁƒŁ„ المرفقات" + }, + "attachment_list": { + "owning_note": "الملاحظة Ų§Ł„Ł…Ų§Ł„ŁƒŲ©: ", + "upload_attachments": "رفع المرفقات" + }, + "protected_session": { + "wrong_password": "ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ± Ų®Ų§Ų·Ų¦Ų©", + "protecting-title": "الحالة Ų§Ł„Ł…Ų­Ł…ŁŠŲ©", + "unprotecting-title": "الحالة Ų§Ł„ŲŗŁŠŲ± Ł…Ų­Ł…ŁŠŲ©", + "protecting-finished-successfully": "ŲŖŁ… Ų§Ł„Ų­Ł…Ų§ŁŠŲ© بنجاح.", + "unprotecting-finished-successfully": "ŲŖŁ… ازالة Ų§Ł„Ų­Ł…Ų§ŁŠŲ© بنجاح.", + "start_session_button": "البدؔ بالجلسة Ų§Ł„Ł…Ų­Ł…ŁŠŲ© enter", + "protecting-in-progress": "Ų¬Ų§Ų± Ų§Ł„Ų­Ł…Ų§ŁŠŲ©: {{count}}", + "unprotecting-in-progress-count": "ā€Ų¬Ų§Ų± الغاؔ Ų§Ł„Ų­Ł…Ų§ŁŠŲ©: {{count}}" + }, + "relation_map": { + "remove_note": "حذف الملاحظة", + "edit_title": "ŲŖŲ¹ŲÆŁŠŁ„ Ų§Ł„Ų¹Ł†ŁˆŲ§Ł†", + "rename_note": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ³Ł…ŁŠŲ© الملاحظة", + "remove_relation": "حذف العلاقة", + "default_new_note_title": "ملاحظة جديدة", + "open_in_new_tab": "فتح في تبويب جديد", + "enter_new_title": "ادخل Ų¹Ł†ŁˆŲ§Ł† ملاحظة جديدة:", + "note_not_found": "الملاحظة {{noteId}} غير Ł…ŁˆŲ¬ŁˆŲÆŲ©!", + "cannot_match_transform": "ŲŖŲ¹Ų°Ų± مطابقة Ų§Ł„ŲŖŲ­ŁˆŁŠŁ„: {{transform}}" + }, + "web_view": { + "web_view": "Ų¹Ų±Ų¶ Ų§Ł„ŁˆŁŠŲØ" + }, + "consistency_checks": { + "title": "فحوصات التناسق" + }, + "database_anonymization": { + "title": "اخفاؔ Ł‡ŁˆŁŠŲ© Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ", + "full_anonymization": "الاخفاؔ Ų§Ł„ŁƒŲ§Ł…Ł„ Ł„Ł„Ł‡ŁˆŁŠŲ©", + "light_anonymization": "الاخفاؔ Ų§Ł„Ų¬Ų²Ų¦ŁŠ Ł„Ł„Ł‡ŁˆŁŠŲ©", + "existing_anonymized_databases": "Ł‚ŁˆŲ§Ų¹ŲÆ Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ Ų§Ł„Ł…Ų¬Ł‡ŁˆŁ„Ų© Ų§Ł„Ų­Ų§Ł„ŁŠŲ©", + "save_fully_anonymized_database": "حفظ قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ ŲØŲ¹ŲÆ اخفاؔ ŁƒŁ„ Ų§Ł„Ł‡ŁˆŁŠŲ§ŲŖ", + "save_lightly_anonymized_database": "حفظ Ł‚Ų§Ų¹ŲÆŲ©Ų©ŲØŁŠŲ§Ł†Ų§ŲŖ Ł…Ų®ŁŁŠŲ© جزئيا", + "creating_fully_anonymized_database": "انؓاؔ قاعدة ŲØŁŠŲ§Ł†Ų§ŲŖ Ł…Ų¬Ł‡ŁˆŁ„Ų© ŲØŲ§Ł„ŁƒŲ§Ł…Ł„", + "creating_lightly_anonymized_database": "انؓاؔ قاعدةة ŲØŁŠŲ§Ł†Ų§ŲŖ Ł…Ų¬Ł‡ŁˆŁ„Ų© جزئيا...", + "no_anonymized_database_yet": "Ł„Ų§ŲŖŁˆŲ¬ŲÆ قاعدة ŲØŁŠŲ§Ł†Ų§ŲŖ Ł…Ų¬Ł‡ŁˆŁ„Ų© ŲØŲ¹ŲÆ." + }, + "vacuum_database": { + "title": "تحرير Ł…Ų³Ų§Ų­Ų© قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ", + "button_text": "تحرير Ł…Ų³Ų§Ų­Ų© قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ", + "vacuuming_database": "Ų¬Ų§Ų± تحرير Ł…Ų³Ų§Ų­Ų© قاعدة Ų§Ł„ŁŠŁŠŲ§Ł†Ų§ŲŖ...", + "database_vacuumed": "ŲŖŁ… ŲŖŁ†ŲøŁŠŁ قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ" + }, + "ribbon": { + "widgets": "ادوات Ų§Ł„Ų“Ų±ŁŠŲ·" + }, + "vim_key_bindings": { + "use_vim_keybindings_in_code_notes": "Ų§Ų®ŲŖŲµŲ§Ų±Ų§ŲŖ Ł„ŁˆŲ­Ų© Ų§Ł„Ł…ŁŲ§ŲŖŁŠŲ­ ŲØŲ§Ų³Ł„ŁˆŲØ Vim" + }, + "network_connections": { + "network_connections_title": "اتصالات Ų§Ł„Ų“ŲØŁƒŲ©", + "check_for_updates": "‪التحقق من وجود تحديثات ŲŖŁ„Ł‚Ų§Ų¦ŁŠŲ©" + }, + "tray": { + "title": "ؓريط النظام" + }, + "highlights_list": { + "title": "قائمة النقاط Ų§Ł„Ł…Ł…ŁŠŲ²Ų©", + "bold": "نص عريض", + "italic": "نص مائل", + "underline": "Ų®Ų· ŲŖŲ­ŲŖ النص", + "color": "نص Ł…Ł„ŁˆŁ†", + "visibility_title": "اظهار قائمة Ų§Ł„ŲŖŲ¶Ł„ŁŠŁ„Ų§ŲŖ", + "bg_color": "نص Ł…Ų¹ Ł„ŁˆŁ† Ų®Ł„ŁŁŠŲ©" + }, + "revisions_button": { + "note_revisions": "Ł…Ų±Ų§Ų¬Ų¹Ų§ŲŖ الملاحظة" + }, + "custom_date_time_format": { + "format_string": "سلسلة Ų§Ł„ŲŖŁ†Ų³ŁŠŁ‚:", + "formatted_time": "Ų§Ł„ŲŖŲ§Ų±ŁŠŲ®/Ų§Ł„ŁˆŁ‚ŲŖ المنسق:", + "title": "ŲŖŁ†Ų³ŁŠŁ‚ تاريخ/ŁˆŁ‚ŲŖ Ł…Ų®ŲµŲµ" + }, + "options_widget": { + "options_status": "حالة Ų§Ł„Ų®ŁŠŲ§Ų±Ų§ŲŖ" + }, + "spellcheck": { + "title": "Ų§Ł„ŲŖŲÆŁ‚ŁŠŁ‚ Ų§Ł„Ų§Ł…Ł„Ų§Ų¦ŁŠ", + "enable": "ŲŖŁŲ¹ŁŠŁ„ Ų§Ł„ŲŖŲÆŁ‚ŁŠŁ‚ Ų§Ł„Ų§Ł…Ł„Ų§Ų¦ŁŠ", + "language_code_label": "رمز اللغة او Ų±Ł…ŁˆŲ² اللغات", + "available_language_codes_label": "Ų±Ł…ŁˆŲ² اللغات المتاحة:", + "language_code_placeholder": "على Ų³ŲØŁŠŁ„ المثال \"en-US\", \"de-AI\"" + }, + "note-map": { + "button-link-map": "خريطة Ų§Ł„Ų±ŁˆŲ§ŲØŲ·", + "button-tree-map": "خريطة الؓجرة" + }, + "spacer": { + "configure_launchbar": "ŲŖŁ‡ŁŠŲ¦Ų© ؓريط الاطلاق" + }, + "entrypoints": { + "note-executed": "ŲŖŁ… ŲŖŁ†ŁŁŠŲ° الملاحظة." + }, + "branches": { + "delete-status": "حالة الحذف", + "delete-finished-successfully": "ŲŖŁ… الحذف بنجاح.", + "cannot-move-notes-here": "Ł„Ų§ŁŠŁ…ŁƒŁ† نقل الملاحظات الى هنا.", + "undeleting-notes-finished-successfully": "ŲŖŁ… Ų§Ų³ŲŖŲ±Ų¬Ų§Ų¹ الملاحظات بنجاح." + }, + "highlighting": { + "title": "ŁƒŲŖŁ„ Ų§Ł„ŁƒŁˆŲÆ", + "color-scheme": "نظام Ų§Ł„Ų§Ł„ŁˆŲ§Ł†" + }, + "code_block": { + "word_wrapping": "التفاف النص", + "theme_group_light": "Ų§Ł„Ų«ŁŠŁ…Ų§ŲŖ الفاتحة", + "theme_group_dark": "Ų§Ł„Ų«ŁŠŁ…Ų§ŲŖ الغامقة", + "copy_title": "نسخ الى الحافظة", + "theme_none": "ŲØŲÆŁˆŁ† ŲŖŁ…ŁŠŁŠŲ² Ų§Ł„ŲµŁŠŲ§ŲŗŲ©" + }, + "link_context_menu": { + "open_note_in_popup": "تحرير سريع" + }, + "electron_integration": { + "desktop-application": "ŲŖŲ·ŲØŁŠŁ‚Ų§ŲŖ Ų³Ų·Ų­ Ų§Ł„Ł…ŁƒŲŖŲØ", + "zoom-factor": "Ų¹Ų§Ł…Ł„ Ų§Ł„ŲŖŁƒŲØŁŠŲ±", + "native-title-bar": "ؓريط Ų§Ł„Ų¹Ł†ŁˆŲ§Ł† Ų§Ł„Ų§ŲµŁ„ŁŠ" + }, + "note_tooltip": { + "quick-edit": "Ų§Ł„ŲŖŲ­Ų±ŁŠŲ± Ų§Ł„Ų³Ų±ŁŠŲ¹", + "note-has-been-deleted": "ŲŖŁ… حذف الملاحظة." + }, + "geo-map-context": { + "open-location": "فتح Ų§Ł„Ł…ŁˆŁ‚Ų¹", + "remove-from-map": "ازالة من Ų§Ł„Ų®Ų±ŁŠŲ·Ų©" + }, + "share": { + "title": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ Ų§Ł„Ł…Ų“Ų§Ų±ŁƒŲ©", + "check_share_root": "التحقق من حالة Ų¬Ų°Ų± Ų§Ł„Ł…Ų“Ų§Ų±ŁƒŲ©" + }, + "note_language": { + "not_set": "غير Ł…Ų­ŲÆŲÆ", + "configure-languages": "لغات Ų§Ł„ŲŖŁ‡ŁŠŲ¦Ų©" + }, + "content_language": { + "title": "لغات Ų§Ł„Ł…Ų­ŲŖŁˆŁ‰" + }, + "toggle_read_only_button": { + "unlock-editing": "الغاؔ قفل Ų§Ł„ŲŖŲ­Ų±ŁŠŲ±", + "lock-editing": "قفل Ų§Ł„ŲŖŲ­Ų±ŁŠŲ±" + }, + "cpu_arch_warning": { + "continue_anyway": "المتابعة على اي Ų­Ų§Ł„", + "download_link": "ŲŖŁ†Ų²ŁŠŁ„ النسخة Ų§Ł„Ų§ŲµŁ„ŁŠŲ©" + }, + "table_context_menu": { + "delete_row": "حذف الصف" + }, + "board_view": { + "delete-note": "حذف الملاحظة...", + "archive-note": "ارؓفة الملاحظة", + "unarchive-note": "الغاؔ ارؓفة الملاحظة", + "move-to": "نقل الى", + "insert-above": "Ų§ŲÆŲ±Ų§Ų¬ اعلاه", + "insert-below": "Ų§ŲÆŲ±Ų§Ų¬ ادناه", + "delete-column": "حذف Ų§Ł„Ų¹Ł…ŁˆŲÆ", + "new-item": "عنصر جديد", + "add-column": "اضافة Ų¹Ł…ŁˆŲÆ", + "new-item-placeholder": "ادخل Ų¹Ł†ŁˆŲ§Ł† الملاحظة...", + "add-column-placeholder": "ادخل اسم Ų§Ł„Ų¹Ł…ŁˆŲÆ...", + "remove-from-board": "ازالة من Ų§Ł„Ł„ŁˆŲ­Ų©" + }, + "command_palette": { + "export_note_title": "تصدير ملاحظة", + "show_attachments_title": "Ų¹Ų±Ų¶ المرفقات", + "search_notes_title": "البحث في الملاحظات", + "tree-action-name": "Ų“Ų¬Ų±Ų©: {{name}}", + "export_note_description": "ŲŖŲµŲÆŲ± الملاحظة Ų§Ł„Ų­Ų§Ł„ŁŠŲ©", + "show_attachments_description": "Ų¹Ų±Ų¶ مرفقات الملاحظة", + "search_notes_description": "فتح البحث المتقدم", + "search_subtree_title": "ŲØŲ­Ų« في الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "search_history_title": "Ų¹Ų±Ųµ سجل البحث", + "search_history_description": "Ų¹Ų±Ų¶ البحث السابق", + "configure_launch_bar_title": "ŲŖŁƒŁˆŁŠŁ† ؓريط الاطلاق", + "search_subtree_description": "البحث ضمن الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ© Ų§Ł„Ų­Ų§Ł„ŁŠŲ©" + }, + "content_renderer": { + "open_externally": "فتح خارجيا" + }, + "settings": { + "related_settings": "Ų§Ų¹ŲÆŲ§ŲÆŲ§ŲŖ متعلقة" + }, + "pagination": { + "total_notes": "{{count}} ملاحظات" + }, + "mobile_detail_menu": { + "note_revisions": "Ł…Ų±Ų§Ų¬Ų¹Ų§ŲŖ الملاحظة", + "insert_child_note": "Ų§ŲÆŲ±Ų§Ų¬ ملاحظة فرعية", + "delete_this_note": "حذف هذه الملاحظة", + "error_unrecognized_command": "Ų§Ł…Ų± غير Ł…Ų¹Ų±ŁˆŁ {{command}}" + }, + "move_to": { + "notes_to_move": "الملاحظات المراد نقلها", + "target_parent_note": "ملاحظة الاصل الهدف", + "dialog_title": "انقل الملاحظات الى...", + "move_button": "نقل الىالملاحظة المحددة" + }, + "delete_revisions": { + "delete_note_revisions": "حذف Ł…Ų±Ų§Ų¬Ų¹Ų§ŲŖ الملاحظة" + }, + "close_pane_button": { + "close_this_pane": "اغلاق هذه Ų§Ł„Ł„ŁˆŲ­Ų©" + }, + "create_pane_button": { + "create_new_split": "انؓاؔ ŲŖŁ‚Ų³ŁŠŁ… جديد" + }, + "edit_button": { + "edit_this_note": "ŲŖŲ¹ŲÆŁŠŁ„ هذه الملاحظة" + }, + "include_archived_notes": { + "include_archived_notes": "ŲŖŲ¶Ł…ŁŠŁ† الملاحظات المؤرؓفة" + }, + "book": { + "drag_locked_title": "مقفلة Ł„Ł„ŲŖŲ¹ŲÆŁŠŁ„" + }, + "database_integrity_check": { + "title": "فحص سلامة قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ", + "check_button": "التحقق من سلامة قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ", + "checking_integrity": "Ų¬Ų§Ų± التحقق من سلامة قاعدة Ų§Ł„ŲØŁŠŲ§Ł†Ų§ŲŖ...", + "integrity_check_failed": "فؓل التحقق من السلامة: {{results}}" + }, + "watched_file_update_status": { + "upload_modified_file": "رفع الملف المعدل", + "ignore_this_change": "اهمل هذا Ų§Ł„ŲŖŲŗŁŠŁŠŲ±" + }, + "clipboard": { + "copy_success": "ŲŖŁ… النسخ للحافظة." + }, + "note_autocomplete": { + "clear-text-field": "Ł…Ų³Ų­ حقل النص", + "show-recent-notes": "Ų¹Ų±Ų¶ الملاحظات Ų§Ł„Ų§Ų®ŁŠŲ±Ų©", + "full-text-search": "البحث بالنص Ų§Ł„ŁƒŲ§Ł…Ł„", + "search-for": "ŲØŲ­Ų« Ł„ \"{{term}}\"" + }, + "protect_note": { + "toggle-off": "ازالة Ų§Ł„Ų­Ł…Ų§ŁŠŲ© عن الملاحظة", + "toggle-on": "Ų­Ł…Ų§ŁŠŲ© الملاحظة" + }, + "open-help-page": "فتح صفحة المساعدة", + "empty": { + "enter_workspace": "ادخل Ł…Ų³Ų§Ų­Ų© العمل {{title}}" + }, + "attribute_editor": { + "save_attributes": "حفظ السمات ", + "add_a_new_attribute": "اضافة سمة جديدة", + "add_new_label_definition": "اضافة تعريف Ł„ŲŖŲ³Ł…ŁŠŲ© جديدة", + "add_new_relation_definition": "اضافة تعريف لعلاقة جديدة" + }, + "zen_mode": { + "button_exit": "Ų§Ł„Ų®Ų±ŁˆŲ¬ من وضع Zen" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "مهلة Ł…Ų³Ų­ المرفقات", + "erase_attachments_after": "حذف المرفقات Ų§Ł„ŲŗŁŠŲ± Ł…Ų³ŲŖŲ®ŲÆŁ…Ų© ŲØŲ¹ŲÆ:" + }, + "note_erasure_timeout": { + "note_erasure_timeout_title": "مهلة Ł…Ų³Ų­ الملاحظة", + "erase_notes_after": "Ł…Ų³Ų­ الملاحظات ŲØŲ¹ŲÆ:", + "erase_deleted_notes_now": "Ł…Ų³Ų­ الملاحظات Ų§Ł„Ł…Ų­Ų°ŁˆŁŲ© الان" + }, + "ws": { + "sync-check-failed": "فؓل التحقق من المزامنة!" + }, + "show_highlights_list_widget_button": { + "show_highlights_list": "Ų¹Ų±Ų¶ قائمة Ų§Ł„ŲŖŲ¶Ł„ŁŠŁ„Ų§ŲŖ" + }, + "presentation_view": { + "start-presentation": "ŲØŲÆŲ” العرض Ų§Ł„ŲŖŁ‚ŲÆŁŠŁ…ŁŠ", + "edit-slide": "ŲŖŲ¹ŲÆŁŠŁ„ هذه Ų§Ł„Ų“Ų±ŁŠŲ­Ų©" + }, + "jump_to_note": { + "search_button": "البحث في النص Ų§Ł„ŁƒŲ§Ł…Ł„" + }, + "password_not_set": { + "title": "لم ŁŠŲŖŁ… ŲŖŲ¹ŁŠŁŠŁ† ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "go_to_password_options": "اذهب الى خيارات ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±" + }, + "abstract_bulk_action": { + "remove_this_search_action": "حذف Ų§Ų¬Ų±Ų§Ų” البحث هذا" + }, + "show_toc_widget_button": { + "show_toc": "Ų¹Ų±Ų¶ Ų¬ŲÆŁˆŁ„ Ų§Ł„Ł…Ų­ŲŖŁˆŁŠŲ§ŲŖ" + }, + "svg_export_button": { + "button_title": "تصدير المخطط ك SVG" + }, + "abstract_search_option": { + "remove_this_search_option": "حذف خيار البحث هذا" + }, + "revisions_snapshot_interval": { + "note_revisions_snapshot_interval_title": "الفاصل Ų§Ł„Ų²Ł…Ł†ŁŠ لنسخ الملاحظات Ų§Ł„Ų§Ų­ŲŖŁŠŲ§Ų·ŁŠŲ©" + }, + "note_detail": { + "printing": "Ų¬Ų§Ų± الطباعة ..." + }, + "attachment_detail_2": { + "role_and_size": "Ų§Ł„ŲÆŁˆŲ±: {{role}}، الحجم: {{size}}", + "unrecognized_role": "دور المرفق '{{role}}'Ų§Ł„ŲŗŁŠŲ± Ł…Ų¹Ų±ŁˆŁ." + }, + "title_bar_buttons": { + "window-on-top": "ابقاؔ النافذة في الاعلى" + }, + "note_title": { + "placeholder": "اكتب Ų¹Ł†ŁˆŲ§Ł† الملاحظة هنا..." + }, + "image_context_menu": { + "copy_reference_to_clipboard": "نسخ المرجع الى الحافظة", + "copy_image_to_clipboard": "نسخ Ų§Ł„ŲµŁˆŲ±Ų© الى الحافظة" + }, + "geo-map": { + "unable-to-load-map": "ŲŖŲ¹Ų°Ų± ŲŖŲ­Ł…ŁŠŁ„ Ų§Ł„Ų®Ų±ŁŠŲ·Ų©." + }, + "content_widget": { + "unknown_widget": "عنصر ŁˆŲ§Ų¬Ł‡Ų© غير Ł…Ų¹Ų±ŁˆŁ للمعرف \"{{id}}\"." + }, + "png_export_button": { + "button_title": "تصدير المخطط ŁƒŁ…Ł„Ł PNG" + } +} diff --git a/apps/client/src/translations/ca/translation.json b/apps/client/src/translations/ca/translation.json index 727d2bf53..d4cdcc1ca 100644 --- a/apps/client/src/translations/ca/translation.json +++ b/apps/client/src/translations/ca/translation.json @@ -121,7 +121,7 @@ "sat": "Ds", "sun": "Dg", "january": "Gener", - "febuary": "Febrer", + "february": "Febrer", "march": "MarƧ", "april": "Abril", "may": "Maig", diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index e9be1e285..c7053e709 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -276,7 +276,12 @@ "mime": "MIME ē±»åž‹ļ¼š ", "file_size": "ę–‡ä»¶å¤§å°ļ¼š", "preview": "é¢„č§ˆļ¼š", - "preview_not_available": "ę— ę³•é¢„č§ˆę­¤ē±»åž‹ēš„ē¬”č®°ć€‚" + "preview_not_available": "ę— ę³•é¢„č§ˆę­¤ē±»åž‹ēš„ē¬”č®°ć€‚", + "diff_on": "ę˜¾ē¤ŗå·®å¼‚", + "diff_off": "ę˜¾ē¤ŗå†…å®¹", + "diff_on_hint": "ē‚¹å‡»ä»„ę˜¾ē¤ŗē¬”č®°ęŗä»£ē å·®å¼‚", + "diff_off_hint": "ē‚¹å‡»ä»„ę˜¾ē¤ŗē¬”č®°å†…å®¹", + "diff_not_available": "å·®å¼‚äøåÆē”Øć€‚" }, "sort_child_notes": { "sort_children_by": "ꌉ...ęŽ’åŗå­ē¬”č®°", @@ -577,7 +582,7 @@ "cannot_find_day_note": "ę— ę³•ę‰¾åˆ°ę—„č®°", "cannot_find_week_note": "ę— ę³•ę‰¾åˆ°å‘Øč®°", "january": "äø€ęœˆ", - "febuary": "二月", + "february": "二月", "march": "äø‰ęœˆ", "april": "å››ęœˆ", "may": "äŗ”ęœˆ", @@ -587,7 +592,18 @@ "september": "ä¹ęœˆ", "october": "åęœˆ", "november": "åäø€ęœˆ", - "december": "åäŗŒęœˆ" + "december": "åäŗŒęœˆ", + "week_previous": "äøŠå‘Ø", + "week_next": "下周", + "month_previous": "上个月", + "month_next": "äø‹äøŖęœˆ", + "year": "幓", + "year_previous": "äøŠäø€å¹“", + "year_next": "ę˜Žå¹“", + "today": "今天", + "week": "周", + "month": "月", + "list": "åˆ—č”Ø" }, "close_pane_button": { "close_this_pane": "å…³é—­ę­¤é¢ęæ" @@ -630,7 +646,9 @@ "about": "å…³äŗŽ TriliumNext 笔记", "logout": "登出", "show-cheatsheet": "ę˜¾ē¤ŗåæ«ę·åø®åŠ©", - "toggle-zen-mode": "ē¦…ęØ”å¼" + "toggle-zen-mode": "ē¦…ęØ”å¼", + "new-version-available": "ę–°ę›“ę–°åÆē”Ø", + "download-update": "å–å¾—ē‰ˆęœ¬ {{latestVersion}}" }, "zen_mode": { "button_exit": "é€€å‡ŗē¦…ęØ”å¼" @@ -720,7 +738,8 @@ "insert_child_note": "ę’å…„å­ē¬”č®°", "delete_this_note": "åˆ é™¤ę­¤ē¬”č®°", "error_cannot_get_branch_id": "ę— ę³•čŽ·å– notePath '{{notePath}}' ēš„ branchId", - "error_unrecognized_command": "ę— ę³•čÆ†åˆ«ēš„å‘½ä»¤ {{command}}" + "error_unrecognized_command": "ę— ę³•čÆ†åˆ«ēš„å‘½ä»¤ {{command}}", + "note_revisions": "ē¬”č®°åŽ†å²ē‰ˆęœ¬" }, "note_icon": { "change_note_icon": "曓改笔记图标", @@ -732,7 +751,8 @@ "note_type": "ē¬”č®°ē±»åž‹", "editable": "åÆē¼–č¾‘", "basic_properties": "åŸŗęœ¬å±žę€§", - "language": "语言" + "language": "语言", + "configure_code_notes": "é…ē½®ä»£ē ē¬”č®°ā€¦" }, "book_properties": { "view_type": "č§†å›¾ē±»åž‹", @@ -747,7 +767,9 @@ "book_properties": "é›†åˆå±žę€§", "table": "蔨格", "geo-map": "åœ°ē†åœ°å›¾", - "board": "ēœ‹ęæ" + "board": "ēœ‹ęæ", + "include_archived_notes": "展示归攣笔记", + "presentation": "演示" }, "edited_notes": { "no_edited_notes_found": "ä»Šå¤©čæ˜ę²”ęœ‰ē¼–č¾‘čæ‡ēš„ē¬”č®°...", @@ -948,7 +970,9 @@ "no_attachments": "ę­¤ē¬”č®°ę²”ęœ‰é™„ä»¶ć€‚" }, "book": { - "no_children_help": "ę­¤ē±»åž‹äøŗä¹¦ē±ēš„ē¬”č®°ę²”ęœ‰ä»»ä½•å­ē¬”č®°ļ¼Œå› ę­¤ę²”ęœ‰å†…å®¹ę˜¾ē¤ŗć€‚čÆ·å‚é˜… wiki äŗ†č§£čÆ¦ęƒ…ć€‚" + "no_children_help": "ę­¤ē±»åž‹äøŗä¹¦ē±ēš„ē¬”č®°ę²”ęœ‰ä»»ä½•å­ē¬”č®°ļ¼Œå› ę­¤ę²”ęœ‰å†…å®¹ę˜¾ē¤ŗć€‚čÆ·å‚é˜… wiki äŗ†č§£čÆ¦ęƒ…ć€‚", + "drag_locked_title": "é”å®šē¼–č¾‘", + "drag_locked_message": "ę— ę³•ę‹–ę‹½ļ¼Œå› äøŗé›†åˆå·²č¢«é”å®šē¼–č¾‘ć€‚" }, "editable_code": { "placeholder": "åœØčæ™é‡Œč¾“å…„ę‚Øēš„ä»£ē ē¬”č®°å†…å®¹..." @@ -1238,7 +1262,13 @@ "min-days-in-first-week": "ē¬¬äø€å‘Øēš„ęœ€å°å¤©ę•°", "first-week-info": "ē¬¬äø€å‘ØåŒ…å«äø€å¹“ēš„ē¬¬äø€äøŖå‘Øå››ļ¼ŒåŸŗäŗŽ ISO 8601 标准。", "first-week-warning": "ę›“ę”¹ē¬¬äø€å‘Øé€‰é”¹åÆčƒ½ä¼šåÆ¼č‡“äøŽēŽ°ęœ‰å‘Øē¬”č®°é‡å¤ļ¼Œå·²åˆ›å»ŗēš„å‘Øē¬”č®°å°†äøä¼šē›øåŗ”ę›“ę–°ć€‚", - "formatting-locale": "ę—„ęœŸå’Œę•°å­—ę ¼å¼" + "formatting-locale": "ę—„ęœŸå’Œę•°å­—ę ¼å¼", + "tuesday": "å‘ØäŗŒ", + "wednesday": "周三", + "thursday": "周四", + "friday": "周五", + "saturday": "周六", + "formatting-locale-auto": "ä¾åŗ”ē”Øēš„čÆ­čØ€č®¾ē½®" }, "backup": { "automatic_backup": "č‡ŖåŠØå¤‡ä»½", @@ -1333,7 +1363,7 @@ "oauth_title": "OAuth/OpenID 认证", "oauth_description": "OpenID ę˜Æäø€ē§ę ‡å‡†åŒ–ę–¹å¼ļ¼Œå…č®øę‚Øä½æē”Øå…¶ä»–ęœåŠ”ļ¼ˆå¦‚ Googleļ¼‰ēš„č“¦å·ē™»å½•ē½‘ē«™ę„éŖŒčÆę‚Øēš„čŗ«ä»½ć€‚é»˜č®¤ēš„čŗ«ä»½ęä¾›č€…ę˜Æ Googleļ¼Œä½†ę‚ØåÆä»„ę›“ę”¹äøŗä»»ä½•å…¶ä»– OpenID ęä¾›č€…ć€‚ē‚¹å‡»čæ™é‡Œäŗ†č§£ę›“å¤šäæ”ęÆć€‚čÆ·å‚é˜…čæ™äŗ› ęŒ‡å— é€ščæ‡ Google 设置 OpenID ęœåŠ”ć€‚", "oauth_description_warning": "要启用 OAuth/OpenIDļ¼Œę‚Øéœ€č¦č®¾ē½® config.ini ę–‡ä»¶äø­ēš„ OAuth/OpenID åŸŗē”€ URLć€å®¢ęˆ·ē«Æ ID å’Œå®¢ęˆ·ē«ÆåÆ†é’„ļ¼Œå¹¶é‡ę–°åÆåŠØåŗ”ē”ØēØ‹åŗć€‚å¦‚ęžœč¦ä»ŽēŽÆå¢ƒå˜é‡č®¾ē½®ļ¼ŒčÆ·č®¾ē½® TRILIUM_OAUTH_BASE_URL态TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET ēŽÆå¢ƒå˜é‡ć€‚", - "oauth_missing_vars": "ē¼ŗå°‘ä»„äø‹č®¾ē½®é”¹ļ¼š{{variables}}", + "oauth_missing_vars": "ē¼ŗå°‘ä»„äø‹č®¾ē½®é”¹ļ¼š{{-variables}}", "oauth_user_account": "ē”Øęˆ·č“¦å·ļ¼š ", "oauth_user_email": "ē”Øęˆ·é‚®ē®±ļ¼š ", "oauth_user_not_logged_in": "ęœŖē™»å½•ļ¼" @@ -1406,7 +1436,7 @@ "button-tree-map": "ę ‘å½¢åœ°å›¾" }, "tree-context-menu": { - "open-in-a-new-tab": "åœØę–°ę ‡ē­¾é”µäø­ę‰“å¼€ Ctrl+Click", + "open-in-a-new-tab": "åœØę–°ę ‡ē­¾é”µäø­ę‰“å¼€", "open-in-a-new-split": "åœØę–°åˆ†ę äø­ę‰“å¼€", "insert-note-after": "åœØåŽé¢ę’å…„ē¬”č®°", "insert-child-note": "ę’å…„å­ē¬”č®°", @@ -1436,12 +1466,14 @@ "converted-to-attachments": "{{count}} äøŖē¬”č®°å·²č¢«č½¬ę¢äøŗé™„ä»¶ć€‚", "convert-to-attachment-confirm": "ē”®å®šč¦å°†é€‰äø­ēš„ē¬”č®°č½¬ę¢äøŗå…¶ēˆ¶ē¬”č®°ēš„é™„ä»¶å—ļ¼Ÿ", "duplicate": "复制", - "open-in-popup": "åæ«é€Ÿē¼–č¾‘" + "open-in-popup": "åæ«é€Ÿē¼–č¾‘", + "archive": "归攣", + "unarchive": "č§£åŽ‹" }, "shared_info": { - "shared_publicly": "ę­¤ē¬”č®°å·²å…¬å¼€åˆ†äŗ«äŗŽ", - "shared_locally": "ę­¤ē¬”č®°å·²åœØęœ¬åœ°åˆ†äŗ«äŗŽ", - "help_link": "访问 wiki čŽ·å–åø®åŠ©ć€‚" + "help_link": "访问 wiki čŽ·å–åø®åŠ©ć€‚", + "shared_publicly": "čÆ„ē¬”č®°å·²åœØ {{- link}} äøŠå…¬å¼€åˆ†äŗ«ć€‚", + "shared_locally": "ę­¤ē¬”č®°åœØęœ¬åœ°é€ščæ‡ {{- link}} čæ›č”Œå…±äŗ«ć€‚" }, "note_types": { "text": "ę–‡ęœ¬", @@ -1519,7 +1551,8 @@ "hoist-this-note-workspace": "čšē„¦ę­¤ē¬”č®°ļ¼ˆå·„ä½œåŒŗļ¼‰", "refresh-saved-search-results": "åˆ·ę–°äæå­˜ēš„ęœē“¢ē»“ęžœ", "create-child-note": "åˆ›å»ŗå­ē¬”č®°", - "unhoist": "å–ę¶ˆčšē„¦" + "unhoist": "å–ę¶ˆčšē„¦", + "toggle-sidebar": "åˆ‡ę¢ä¾§č¾¹ę " }, "title_bar_buttons": { "window-on-top": "äæęŒę­¤ēŖ—å£ē½®é”¶" @@ -1600,7 +1633,9 @@ "ws": { "sync-check-failed": "åŒę­„ę£€ęŸ„å¤±č“„ļ¼", "consistency-checks-failed": "äø€č‡“ę€§ę£€ęŸ„å¤±č“„ļ¼čÆ·ęŸ„ēœ‹ę—„åæ—äŗ†č§£čÆ¦ē»†äæ”ęÆć€‚", - "encountered-error": "é‡åˆ°é”™čÆÆ \"{{message}}\"ļ¼ŒčÆ·ęŸ„ēœ‹ęŽ§åˆ¶å°ć€‚" + "encountered-error": "é‡åˆ°é”™čÆÆ \"{{message}}\"ļ¼ŒčÆ·ęŸ„ēœ‹ęŽ§åˆ¶å°ć€‚", + "lost-websocket-connection-title": "äøŽęœåŠ”å™Øēš„čæžēŗæäø­ę–­", + "lost-websocket-connection-message": "ę£€ęŸ„ę‚Øēš„åå‘ä»£ē†ļ¼ˆå¦‚ nginx ꈖ Apacheļ¼‰č®¾ē½®ä»„ē”®äæ Websocket čæžēŗæę²”ęœ‰č¢«é˜»ęŒ”ć€‚" }, "hoisted_note": { "confirm_unhoisting": "čÆ·ę±‚ēš„ē¬”č®° '{{requestedNote}}' ä½äŗŽčšē„¦ēš„ē¬”č®° '{{hoistedNote}}' ēš„å­ę ‘ä¹‹å¤–ļ¼Œę‚Øåæ…é”»å–ę¶ˆčšē„¦ę‰čƒ½č®æé—®čÆ„ē¬”č®°ć€‚ę˜Æå¦ē»§ē»­å–ę¶ˆčšē„¦ļ¼Ÿ" @@ -1676,7 +1711,7 @@ "native-title-bar": "åŽŸē”Ÿę ‡é¢˜ę ", "native-title-bar-description": "åÆ¹äŗŽ Windows 和 macOSļ¼Œå…³é—­åŽŸē”Ÿę ‡é¢˜ę åÆä½æåŗ”ē”ØēØ‹åŗēœ‹čµ·ę„ę›“ē“§å‡‘ć€‚åœØ Linux äøŠļ¼Œäæē•™åŽŸē”Ÿę ‡é¢˜ę åÆä»„ę›“å„½åœ°äøŽē³»ē»Ÿé›†ęˆć€‚", "background-effects": "åÆē”ØčƒŒę™Æę•ˆęžœļ¼ˆä»…é€‚ē”ØäŗŽ Windows 11)", - "background-effects-description": "Mica ę•ˆęžœäøŗåŗ”ē”ØēŖ—å£ę·»åŠ ęØ”ē³Šäø”ę—¶å°šēš„čƒŒę™Æļ¼Œč„é€ å‡ŗę·±åŗ¦ę„Ÿå’ŒēŽ°ä»£å¤–č§‚ć€‚", + "background-effects-description": "Mica ę•ˆęžœäøŗåŗ”ē”ØēŖ—å£ę·»åŠ ęØ”ē³Šäø”ę—¶å°šēš„čƒŒę™Æļ¼Œč„é€ å‡ŗę·±åŗ¦ę„Ÿå’ŒēŽ°ä»£å¤–č§‚ć€‚ć€ŒåŽŸē”Ÿę ‡é¢˜ę ć€åæ…é ˆč¢«ē¦ē”Øć€‚", "restart-app-button": "é‡åÆåŗ”ē”ØēØ‹åŗä»„ęŸ„ēœ‹ę›“ę”¹", "zoom-factor": "缩放系数" }, @@ -1929,7 +1964,11 @@ "editorfeatures": { "title": "功能", "emoji_completion_enabled": "åÆē”Øč”Øęƒ…č‡ŖåŠØč”„å…Ø", - "note_completion_enabled": "åÆē”Øē¬”č®°č‡ŖåŠØč”„å…Ø" + "note_completion_enabled": "åÆē”Øē¬”č®°č‡ŖåŠØč”„å…Ø", + "emoji_completion_description": "å¦‚ęžœåÆē”Øļ¼Œč”Øęƒ…åÆä»„č½»ę˜“åœ°ē»ē”±č¾“å…„ `:` åŠ äøŠč”Øęƒ…åē§°ę„ę’å…„ć€‚", + "note_completion_description": "å¦‚ęžœåÆē”Øļ¼ŒåÆ¼å‘ē¬”č®°ēš„é“¾ęŽ„åÆä»„ē»ē”±č¾“å…„ `@` åŠ äøŠē¬”č®°ę ‡é¢˜ę„åˆ›å»ŗć€‚", + "slash_commands_enabled": "åÆē”Øę–œę å‘½ä»¤", + "slash_commands_description": "å¦‚ęžœåÆē”Øļ¼ŒåÆä»„ē»ē”±č¾“å…„ `/` ę„č§¦å‘å‘½ä»¤ļ¼Œå¦‚ę’å…„ę¢č”Œē¬¦ęˆ–ę ‡é¢˜ć€‚" }, "table_view": { "new-row": "ę–°å¢žč”Œ", @@ -1965,14 +2004,21 @@ "delete_row": "åˆ é™¤č”Œ" }, "board_view": { - "delete-note": "åˆ é™¤ē¬”č®°", + "delete-note": "åˆ é™¤ē¬”č®°...", "move-to": "移动到", "insert-above": "åœØäøŠę–¹ę’å…„", "insert-below": "åœØäø‹ę–¹ę’å…„", "delete-column": "删除列", "delete-column-confirmation": "ē”®å®šč¦åˆ é™¤ę­¤åˆ—å—ļ¼Ÿę­¤åˆ—äø‹ę‰€ęœ‰ē¬”č®°äø­åÆ¹åŗ”ēš„å±žę€§ä¹Ÿå°†č¢«åˆ é™¤ć€‚", "new-item": "ę–°å¢žé”¹ē›®", - "add-column": "ę·»åŠ åˆ—" + "add-column": "ę·»åŠ åˆ—", + "archive-note": "å­˜ę”£ē¬”č®°", + "unarchive-note": "č§£åŽ‹ē¬”č®°", + "new-item-placeholder": "č¾“å…„ē¬”č®°ę ‡é¢˜...", + "add-column-placeholder": "čÆ·č¾“å…„åˆ—å...", + "edit-note-title": "ē‚¹å‡»ē¼–č¾‘ē¬”č®°ę ‡é¢˜", + "edit-column-title": "ē‚¹å‡»ē¼–č¾‘åˆ—ę ‡é¢˜", + "remove-from-board": "ä»Žēœ‹ęæäøŠē§»é™¤" }, "command_palette": { "tree-action-name": "ę ‘å½¢ļ¼š{{name}}", @@ -2019,6 +2065,20 @@ "title": "ę€§čƒ½", "enable-motion": "åÆē”Øčæ‡ęø”å’ŒåŠØē”»", "enable-shadows": "åÆē”Øé˜“å½±", - "enable-backdrop-effects": "åÆē”Øčœå•ć€å¼¹ēŖ—å’Œé¢ęæēš„čƒŒę™Æę•ˆęžœ" + "enable-backdrop-effects": "åÆē”Øčœå•ć€å¼¹ēŖ—å’Œé¢ęæēš„čƒŒę™Æę•ˆęžœ", + "enable-smooth-scroll": "åÆē”Øå¹³ę»‘ę»šåŠØ", + "app-restart-required": "ļ¼ˆéœ€é‡åÆēØ‹åŗä»„åŗ”ē”Øę›“ę”¹ļ¼‰" + }, + "pagination": { + "page_title": "第 {{startIndex}} 锵 - 第 {{endIndex}} 锵", + "total_notes": "{{count}} 笔记" + }, + "collections": { + "rendering_error": "å‡ŗēŽ°é”™čÆÆę— ę³•ę˜¾ē¤ŗå†…å®¹ć€‚" + }, + "presentation_view": { + "edit-slide": "编辑此幻灯片", + "start-presentation": "开始演示", + "slide-overview": "åˆ‡ę¢å¹»ēÆē‰‡ę¦‚č§ˆ" } } diff --git a/apps/client/src/translations/cs/translation.json b/apps/client/src/translations/cs/translation.json new file mode 100644 index 000000000..6cdb3321b --- /dev/null +++ b/apps/client/src/translations/cs/translation.json @@ -0,0 +1,64 @@ +{ + "about": { + "title": "O Trilium Notes", + "homepage": "DomovskĆ” strĆ”nka:", + "app_version": "Verze aplikace:", + "db_version": "Verze DB:", + "sync_version": "Verze synchronizace:", + "build_date": "Datum sestavenĆ­:", + "build_revision": "Revize sestavenĆ­:", + "data_directory": "Datový adresÔř:" + }, + "toast": { + "critical-error": { + "title": "KritickĆ” chyba", + "message": "Nastala kritickĆ” chyba kterĆ” aplikaci brĆ”nĆ­ ve spuÅ”těnĆ­:\n\n{{message}}\n\nPravděpodobně neočekĆ”vaným zpÅÆsobem selhal skript. Pokuste se restartovat aplikaci v safe módu a problĆ©m napravit." + }, + "widget-error": { + "title": "Nepodařilo se inicializovat widget", + "message-custom": "Uživatelský widget z poznĆ”mky s ID \"{{id}}\" a nĆ”zvem \"{{title}}\" nemohl být inicializovĆ”n z dÅÆvodu: \n\n{{message}}", + "message-unknown": "NeznĆ”mý widget nemohl být inicializovĆ”n z dÅÆvodu:\n\n{{message}}" + }, + "bundle-error": { + "title": "NačtenĆ­ uživatelskĆ©ho skriptu selhalo", + "message": "Uživatelský skript z poznĆ”mky s ID \"{{id}}\" a nĆ”zvem \"{{title}}\" nemohl být spuÅ”těn z dÅÆvodu: \n\n{{message}}" + } + }, + "ai_llm": { + "n_notes_queued_0": "{{ count }} poznĆ”mka ve frontě k indexaci", + "n_notes_queued_1": "{{ count }} poznĆ”mky ve frontě k indexaci", + "n_notes_queued_2": "{{ count }} poznĆ”mek ve frontě k indexaci", + "notes_indexed_0": "{{ count }} poznĆ”mka indexovĆ”na", + "notes_indexed_1": "{{ count }} poznĆ”mky indexovĆ”ny", + "notes_indexed_2": "{{ count }} poznĆ”mek indexovĆ”no" + }, + "add_link": { + "add_link": "Přidat odkaz", + "help_on_links": "NĆ”pověda k odkazÅÆm", + "note": "PoznĆ”mka", + "search_note": "hledat poznĆ”mku podle nĆ”zvu", + "link_title": "NĆ”zev odkazu", + "button_add_link": "Přidat odkaz" + }, + "branch_prefix": { + "prefix": "Prefix: ", + "save": "Uložit" + }, + "bulk_actions": { + "bulk_actions": "HromadnĆ© akce", + "affected_notes": "OvlivněnĆ© poznĆ”mky", + "notes": "PoznĆ”mky" + }, + "confirm": { + "cancel": "ZruÅ”it", + "ok": "OK" + }, + "delete_notes": { + "cancel": "ZruÅ”it", + "ok": "OK", + "close": "Zavřít" + }, + "export": { + "close": "Zavřít" + } +} diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 0757a87f3..ca0e40d69 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -276,7 +276,12 @@ "preview": "Vorschau:", "preview_not_available": "Für diesen Notiztyp ist keine Vorschau verfügbar.", "restore_button": "Wiederherstellen", - "delete_button": "Lƶschen" + "delete_button": "Lƶschen", + "diff_on": "Zeige Differenz", + "diff_off": "Zeige Inhalt", + "diff_on_hint": "Klicke, um die Differenz des Notiz-Quellcodes zu zeigen", + "diff_off_hint": "Klicke, um den Notizinhalt zu zeigen", + "diff_not_available": "Differenz-Abgleich ist nicht verfügbar." }, "sort_child_notes": { "sort_children_by": "Unternotizen sortieren nach...", @@ -576,7 +581,7 @@ "sun": "So", "cannot_find_day_note": "Tagesnotiz kann nicht gefunden werden", "january": "Januar", - "febuary": "Februar", + "february": "Februar", "march": "MƤrz", "april": "April", "may": "Mai", @@ -587,7 +592,18 @@ "october": "Oktober", "november": "November", "december": "Dezember", - "cannot_find_week_note": "Wochennotiz kann nicht gefunden werden" + "cannot_find_week_note": "Wochennotiz kann nicht gefunden werden", + "week": "Woche", + "week_previous": "vorherige Woche", + "week_next": "nƤchste Woche", + "month": "Monat", + "month_previous": "vorheriger Monat", + "month_next": "nƤchster Monat", + "year": "Jahr", + "year_previous": "vorheriges Jahr", + "year_next": "nƤchstes Jahr", + "list": "Liste", + "today": "Heute" }, "close_pane_button": { "close_this_pane": "Schließe diesen Bereich" @@ -630,7 +646,8 @@ "about": "Über Trilium Notes", "logout": "Abmelden", "show-cheatsheet": "Cheatsheet anzeigen", - "toggle-zen-mode": "Zen Modus" + "toggle-zen-mode": "Zen Modus", + "new-version-available": "Neues Update verfügbar" }, "sync_status": { "unknown": "

Der Synchronisations-Status wird bekannt, sobald der nƤchste Synchronisierungsversuch gestartet wird.

Klicke, um eine Synchronisierung jetzt auszulƶsen.

", @@ -717,7 +734,8 @@ "insert_child_note": "Untergeordnete Notiz einfügen", "delete_this_note": "Diese Notiz lƶschen", "error_cannot_get_branch_id": "BranchId für notePath ā€ž{{notePath}}ā€œ kann nicht abgerufen werden", - "error_unrecognized_command": "Unbekannter Befehl {{command}}" + "error_unrecognized_command": "Unbekannter Befehl {{command}}", + "note_revisions": "Notiz Revisionen" }, "note_icon": { "change_note_icon": "Notiz-Icon Ƥndern", @@ -745,7 +763,9 @@ "book_properties": "Sammlungseigenschaften", "table": "Tabelle", "geo-map": "Weltkarte", - "board": "Tafel" + "board": "Tafel", + "include_archived_notes": "Zeige archivierte Notizen", + "presentation": "PrƤsentation" }, "edited_notes": { "no_edited_notes_found": "An diesem Tag wurden noch keine Notizen bearbeitet...", @@ -946,7 +966,9 @@ "no_attachments": "Diese Notiz enthƤlt keine AnhƤnge." }, "book": { - "no_children_help": "Diese Notiz mit dem Notiztyp Buch besitzt keine Unternotizen, deshalb ist nichts zum Anzeigen vorhanden. Siehe Wiki für mehr Details." + "no_children_help": "Diese Notiz mit dem Notiztyp Buch besitzt keine Unternotizen, deshalb ist nichts zum Anzeigen vorhanden. Siehe Wiki für mehr Details.", + "drag_locked_title": "Für Bearbeitung gesperrt", + "drag_locked_message": "Das Ziehen ist nicht mƶglich, da die Sammlung für die Bearbeitung gesperrt ist." }, "editable_code": { "placeholder": "Gebe hier den Inhalt deiner Codenotiz ein..." @@ -1236,7 +1258,13 @@ "min-days-in-first-week": "Mindestanzahl an Tagen in erster Woche", "first-week-info": "Die erste Woche, die den ersten Donnerstag des Jahres enthƤlt, basiert auf dem Standard ISO 8601.", "first-week-warning": "Das Ƅndern der Optionen für die erste Woche kann zu Duplikaten mit bestehenden Wochen-Notizen führen. Bestehende Wochen-Notizen werden nicht entsprechend aktualisiert.", - "formatting-locale": "Datums- und Zahlenformat" + "formatting-locale": "Datums- und Zahlenformat", + "tuesday": "Dienstag", + "wednesday": "Mittwoch", + "thursday": "Donnerstag", + "friday": "Freitag", + "saturday": "Samstag", + "formatting-locale-auto": "Basierend auf die Anwendungssprache" }, "backup": { "automatic_backup": "Automatische Sicherung", @@ -1371,7 +1399,7 @@ "button-tree-map": "Baumkarte" }, "tree-context-menu": { - "open-in-a-new-tab": "In neuem Tab ƶffnen Strg+Klick", + "open-in-a-new-tab": "In neuem Tab ƶffnen", "open-in-a-new-split": "In neuem Split ƶffnen", "insert-note-after": "Notiz dahinter einfügen", "insert-child-note": "Unternotiz einfügen", @@ -1401,11 +1429,13 @@ "apply-bulk-actions": "Massenaktionen anwenden", "converted-to-attachments": "{{count}} Notizen wurden als Anhang konvertiert.", "convert-to-attachment-confirm": "Bist du sicher, dass du die ausgewƤhlten Notizen in AnhƤnge ihrer übergeordneten Notizen umwandeln mƶchtest?", - "open-in-popup": "Schnellbearbeitung" + "open-in-popup": "Schnellbearbeitung", + "archive": "Archiviere", + "unarchive": "Entarchivieren" }, "shared_info": { - "shared_publicly": "Diese Notiz ist ƶffentlich geteilt auf", - "shared_locally": "Diese Notiz ist lokal geteilt auf", + "shared_publicly": "Diese Notiz ist ƶffentlich geteilt auf {{- link}}.", + "shared_locally": "Diese Notiz ist lokal geteilt auf {{- link}}.", "help_link": "Für Hilfe besuche wiki." }, "note_types": { @@ -1484,7 +1514,8 @@ "hoist-this-note-workspace": "Diese Notiz fokussieren (Arbeitsbereich)", "refresh-saved-search-results": "Gespeicherte Suchergebnisse aktualisieren", "create-child-note": "Unternotiz anlegen", - "unhoist": "Fokus verlassen" + "unhoist": "Fokus verlassen", + "toggle-sidebar": "Seitenleiste ein-/ausblenden" }, "title_bar_buttons": { "window-on-top": "Dieses Fenster immer oben halten" @@ -1565,7 +1596,9 @@ "ws": { "sync-check-failed": "Synchronisationsprüfung fehlgeschlagen!", "consistency-checks-failed": "Konsistenzprüfung fehlgeschlagen! Siehe Logs für Details.", - "encountered-error": "Fehler ā€ž{{message}}ā€œ aufgetreten, siehe Konsole für Details." + "encountered-error": "Fehler ā€ž{{message}}ā€œ aufgetreten, siehe Konsole für Details.", + "lost-websocket-connection-title": "Verbindung zum Server verloren", + "lost-websocket-connection-message": "Überprüfe die Konfiguration des Reverse-Proxys (z. B. nginx oder Apache), um sicherzustellen, dass WebSocket-Verbindungen zugelassen und nicht blockiert werden." }, "hoisted_note": { "confirm_unhoisting": "Die angeforderte Notiz ā€š{{requestedNote}}ā€˜ befindet sich außerhalb des hoisted Bereichs der Notiz ā€š{{hoistedNote}}ā€˜. Du musst sie unhoisten, um auf die Notiz zuzugreifen. Mƶchtest du mit dem Unhoisting fortfahren?" @@ -1641,7 +1674,7 @@ "native-title-bar": "Native Anwendungsleiste", "native-title-bar-description": "In Windows und macOS, sorgt das Deaktivieren der nativen Anwendungsleiste für ein kompakteres Aussehen. Unter Linux, sorgt das Aktivieren der nativen Anwendungsleiste für eine bessere Integration mit anderen Teilen des Systems.", "background-effects": "Hintergrundeffekte aktivieren (nur Windows 11)", - "background-effects-description": "Der Mica Effekt fügt einen unscharfen, stylischen Hintergrund in Anwendungsfenstern ein. Dieser erzeugt Tiefe und ein modernes Auftreten.", + "background-effects-description": "Der Mica Effekt fügt einen unscharfen, stylischen Hintergrund in Anwendungsfenstern ein. Dieser erzeugt Tiefe und ein modernes Auftreten. \"Native Titelleiste\" muss deaktiviert sein.", "restart-app-button": "Anwendung neustarten um Ƅnderungen anzuwenden", "zoom-factor": "Zoomfaktor" }, @@ -1838,7 +1871,9 @@ "title": "Leistung", "enable-motion": "Aktiviere ÜbergƤnge und Animationen", "enable-shadows": "Aktiviere Schatten", - "enable-backdrop-effects": "Aktiviere Hintergrundeffekte für Menüs, Pop-up Fenster und Panele" + "enable-backdrop-effects": "Aktiviere Hintergrundeffekte für Menüs, Pop-up Fenster und Panele", + "enable-smooth-scroll": "Aktiviere sanftes Scrollen", + "app-restart-required": "(Ein Neustart der Anwendung ist erforderlich, damit die Ƅnderungen wirksam werden)" }, "code-editor-options": { "title": "Editor" @@ -1877,7 +1912,7 @@ "oauth_title": "OAuth/OpenID", "oauth_description": "OpenID ist ein standardisiertes Verfahren, mit dem Sie sich über ein Konto eines anderen Dienstes, beispielsweise Google, bei Websites anmelden kƶnnen, um Ihre IdentitƤt zu bestƤtigen. Der Standardaussteller ist Google, Sie kƶnnen jedoch jeden anderen OpenID-Anbieter auswƤhlen. Weitere Informationen finden Sie hier. Befolgen Sie diese Anweisungen, um einen OpenID-Dienst über Google einzurichten.", "oauth_description_warning": "Um OAuth/OpenID zu aktivieren, müssen Sie die OAuth/OpenID-Basis-URL, die Client-ID und den Client-Secret in der Datei config.ini festlegen und die Anwendung neu starten. Wenn Sie die Einstellungen über Umgebungsvariablen vornehmen mƶchten, legen Sie bitte TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID und TRILIUM_OAUTH_CLIENT_SECRET fest.", - "oauth_missing_vars": "Fehlende Einstellung: {{variables}}", + "oauth_missing_vars": "Fehlende Einstellung: {{-variables}}", "oauth_user_account": "Benutzerkonto: ", "oauth_user_email": "Benutzer E-Mail: ", "oauth_user_not_logged_in": "Nicht eingeloggt!" @@ -1942,7 +1977,11 @@ "editorfeatures": { "title": "Funktionen", "emoji_completion_enabled": "Emoji-AutovervollstƤndigung aktivieren", - "note_completion_enabled": "Automatisches VervollstƤndigen von Notizen aktivieren" + "note_completion_enabled": "Automatisches VervollstƤndigen von Notizen aktivieren", + "emoji_completion_description": "Wenn aktiviert, kƶnnen Emojis ganz einfach in den Text eingefügt werden, indem man \":\" gefolgt vom Namen eines Emojis eingibt.", + "note_completion_description": "Wenn aktiviert, kƶnnen Links zu Notizen erstellt werden, indem man \"@\" gefolgt vom Titel einer Notiz eingibt.", + "slash_commands_enabled": "Aktiviere Slash-Befehle", + "slash_commands_description": "Wenn aktiviert, kƶnnen Bearbeitungsbefehle wie das Einfügen von Zeilenumbrüchen oder Überschriften durch Eingabe von \"/\" aktiviert werden." }, "table_view": { "new-row": "Neue Zeile", @@ -1978,14 +2017,21 @@ "delete_row": "Zeile entfernen" }, "board_view": { - "delete-note": "Lƶsche Notiz", + "delete-note": "Lƶsche Notiz...", "move-to": "Verschiebe zu", "insert-above": "Oberhalb einfügen", "insert-below": "Unterhalb einfügen", "delete-column": "Spalte entfernen", "delete-column-confirmation": "Soll die Spalte wirklich gelƶscht werden? AbhƤngige Attribute werden auch in den Notizen unter dieser Spalte gelƶscht.", "new-item": "Neuer Artikel", - "add-column": "Spalte hinzufügen" + "add-column": "Spalte hinzufügen", + "remove-from-board": "Entferne von Tafel", + "archive-note": "archiviere Notiz", + "unarchive-note": "entarchiviere Notiz", + "new-item-placeholder": "Notiz Titel eingeben...", + "add-column-placeholder": "Spaltenname eingeben...", + "edit-note-title": "Klicke zum Editieren des Notiz-Titels", + "edit-column-title": "Klicke zum Editieren des Spalten-Titels" }, "command_palette": { "tree-action-name": "Struktur: {{name}}", @@ -2023,5 +2069,16 @@ }, "units": { "percentage": "%" + }, + "pagination": { + "page_title": "Seite {{startIndex}} von {{endIndex}}", + "total_notes": "{{count}} Notizen" + }, + "collections": { + "rendering_error": "Aufgrund eines Fehlers kƶnnen keine Inhalte angezeigt werden." + }, + "presentation_view": { + "edit-slide": "Folie bearbeiten", + "start-presentation": "PrƤsentation starten" } } diff --git a/apps/client/src/translations/el/translation.json b/apps/client/src/translations/el/translation.json index 60e02cc6f..9de9eee04 100644 --- a/apps/client/src/translations/el/translation.json +++ b/apps/client/src/translations/el/translation.json @@ -1,18 +1,24 @@ { - "about": { - "title": "Πληροφορίες για το Trilium Notes", - "homepage": "Αρχική ΣελίΓα:", - "app_version": "ΈκΓοση εφαρμογής:", - "db_version": "ΈκΓοση Ī²Ī¬ĻƒĪ·Ļ‚ ΓεΓομένων:", - "sync_version": "ΈκΓοση Ļ€ĻĻ‰Ļ„ĪæĪŗĻŒĪ»ĪæĻ… ĻƒĻ…Ī³Ļ‡ĻĪæĪ½Ī¹ĻƒĪ¼ĪæĻ:", - "build_date": "Ημερομηνία Ļ‡Ļ„Ī¹ĻƒĪÆĪ¼Ī±Ļ„ĪæĻ‚ εφαρμογής:", - "build_revision": "Ī‘ĻĪ¹ĪøĪ¼ĻŒĻ‚ Ī±Ī½Ī±ĪøĪµĻŽĻĪ·ĻƒĪ·Ļ‚ Ļ‡Ļ„Ī¹ĻƒĪÆĪ¼Ī±Ļ„ĪæĻ‚:", - "data_directory": "Φάκελος ΓεΓομένων:" - }, - "toast": { - "critical-error": { - "title": "Κρίσιμο ĻƒĻ†Ī¬Ī»Ī¼Ī±", - "message": "Συνέβη κάποιο κρίσιμο ĻƒĻ†Ī¬Ī»Ī¼Ī±, το οποίο Γεν επιτρέπει ĻƒĻ„Ī·Ī½ εφαρμογή Ļ‡ĻĪ®ĻƒĻ„Ī· να ξεκινήσει:\n\n{{message}}\n\nΤο Ļ€Ī¹ĪøĪ±Ī½ĻŒĻ„ĪµĻĪæ είναι να προκλήθηκε Ī±Ļ€ĻŒ κάποιο script που απέτυχε Ī±Ļ€ĻĻŒĪæĻ€Ļ„Ī±. Ī”ĪæĪŗĪ¹Ī¼Ī¬ĻƒĻ„Īµ να Ī¾ĪµĪŗĪ¹Ī½Ī®ĻƒĪµĻ„Īµ την εφαρμογή σε Ī±ĻƒĻ†Ī±Ī»Ī® λειτουργία για να Ī»ĻĻƒĪµĻ„Īµ το Ļ€ĻĻŒĪ²Ī»Ī·Ī¼Ī±." - } + "about": { + "title": "Πληροφορίες για το Trilium Notes", + "homepage": "Αρχική ΣελίΓα:", + "app_version": "ΈκΓοση εφαρμογής:", + "db_version": "ΈκΓοση Ī²Ī¬ĻƒĪ·Ļ‚ ΓεΓομένων:", + "sync_version": "ΈκΓοση Ļ€ĻĻ‰Ļ„ĪæĪŗĻŒĪ»ĪæĻ… ĻƒĻ…Ī³Ļ‡ĻĪæĪ½Ī¹ĻƒĪ¼ĪæĻ:", + "build_date": "Ημερομηνία Ļ‡Ļ„Ī¹ĻƒĪÆĪ¼Ī±Ļ„ĪæĻ‚ εφαρμογής:", + "build_revision": "Ī‘ĻĪ¹ĪøĪ¼ĻŒĻ‚ Ī±Ī½Ī±ĪøĪµĻŽĻĪ·ĻƒĪ·Ļ‚ Ļ‡Ļ„Ī¹ĻƒĪÆĪ¼Ī±Ļ„ĪæĻ‚:", + "data_directory": "Φάκελος ΓεΓομένων:" + }, + "toast": { + "critical-error": { + "title": "Κρίσιμο ĻƒĻ†Ī¬Ī»Ī¼Ī±", + "message": "Συνέβη κάποιο κρίσιμο ĻƒĻ†Ī¬Ī»Ī¼Ī±, το οποίο Γεν επιτρέπει ĻƒĻ„Ī·Ī½ εφαρμογή Ļ‡ĻĪ®ĻƒĻ„Ī· να ξεκινήσει:\n\n{{message}}\n\nΤο Ļ€Ī¹ĪøĪ±Ī½ĻŒĻ„ĪµĻĪæ είναι να προκλήθηκε Ī±Ļ€ĻŒ κάποιο script που απέτυχε Ī±Ļ€ĻĻŒĪæĻ€Ļ„Ī±. Ī”ĪæĪŗĪ¹Ī¼Ī¬ĻƒĻ„Īµ να Ī¾ĪµĪŗĪ¹Ī½Ī®ĻƒĪµĻ„Īµ την εφαρμογή σε Ī±ĻƒĻ†Ī±Ī»Ī® λειτουργία για να Ī»ĻĻƒĪµĻ„Īµ το Ļ€ĻĻŒĪ²Ī»Ī·Ī¼Ī±." } + }, + "ai_llm": { + "n_notes_queued": "{{ count }} ĻƒĪ·Ī¼ĪµĪÆĻ‰ĻƒĪ· ĻƒĻ„Ī·Ī½ ουρά για ĪµĻĻĪµĻƒĪ·", + "n_notes_queued_plural": "{{ count }} ĻƒĪ·Ī¼ĪµĪ¹ĻŽĻƒĪµĪ¹Ļ‚ ĻƒĻ„Ī·Ī½ ουρά για ĪµĻĻĪµĻƒĪ·", + "notes_indexed": "{{ count }} ĻƒĪ·Ī¼ĪµĪÆĻ‰ĻƒĪ· με ευρετήριο", + "notes_indexed_plural": "{{ count }} ĻƒĪ·Ī¼ĪµĪ¹ĻŽĻƒĪµĪ¹Ļ‚ με ευρετήριο" + } } diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 2162bce24..1949d3357 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -164,6 +164,7 @@ "importIntoNote": "Import into note", "chooseImportFile": "Choose import file", "importDescription": "Content of the selected file(s) will be imported as child note(s) into", + "importZipRecommendation": "When importing a ZIP file, the note hierarchy will reflect the subdirectory structure within the archive.", "options": "Options", "safeImportTooltip": "Trilium .zip export files can contain executable scripts which may contain harmful behavior. Safe import will deactivate automatic execution of all imported scripts. Uncheck \"Safe import\" only if the imported archive is supposed to contain executable scripts and you completely trust the contents of the import file.", "safeImport": "Safe import", @@ -263,6 +264,11 @@ "confirm_delete_all": "Do you want to delete all revisions of this note?", "no_revisions": "No revisions for this note yet...", "restore_button": "Restore", + "diff_on": "Show diff", + "diff_off": "Show content", + "diff_on_hint": "Click to show note source diff", + "diff_off_hint": "Click to show note content", + "diff_not_available": "Diff isn't available.", "confirm_restore": "Do you want to restore this revision? This will overwrite the current title and content of the note with this revision.", "delete_button": "Delete", "confirm_delete": "Do you want to delete this revision?", @@ -577,7 +583,7 @@ "cannot_find_day_note": "Cannot find day note", "cannot_find_week_note": "Cannot find week note", "january": "January", - "febuary": "February", + "february": "February", "march": "March", "april": "April", "may": "May", @@ -587,7 +593,18 @@ "september": "September", "october": "October", "november": "November", - "december": "December" + "december": "December", + "week": "Week", + "week_previous": "Previous week", + "week_next": "Next week", + "month": "Month", + "month_previous": "Previous month", + "month_next": "Next month", + "year": "Year", + "year_previous": "Previous year", + "year_next": "Next year", + "list": "List", + "today": "Today" }, "close_pane_button": { "close_this_pane": "Close this pane" @@ -630,7 +647,9 @@ "about": "About Trilium Notes", "logout": "Logout", "show-cheatsheet": "Show Cheatsheet", - "toggle-zen-mode": "Zen Mode" + "toggle-zen-mode": "Zen Mode", + "new-version-available": "New Update Available", + "download-update": "Get Version {{latestVersion}}" }, "zen_mode": { "button_exit": "Exit Zen Mode" @@ -719,6 +738,7 @@ "mobile_detail_menu": { "insert_child_note": "Insert child note", "delete_this_note": "Delete this note", + "note_revisions": "Note revisions", "error_cannot_get_branch_id": "Cannot get branchId for notePath '{{notePath}}'", "error_unrecognized_command": "Unrecognized command {{command}}" }, @@ -748,7 +768,9 @@ "calendar": "Calendar", "table": "Table", "geo-map": "Geo Map", - "board": "Board" + "board": "Board", + "presentation": "Presentation", + "include_archived_notes": "Show archived notes" }, "edited_notes": { "no_edited_notes_found": "No edited notes on this day yet...", @@ -949,7 +971,9 @@ "no_attachments": "This note has no attachments." }, "book": { - "no_children_help": "This collection doesn't have any child notes so there's nothing to display. See wiki for details." + "no_children_help": "This collection doesn't have any child notes so there's nothing to display. See wiki for details.", + "drag_locked_title": "Locked for editing", + "drag_locked_message": "Dragging not allowed since the collection is locked for editing." }, "editable_code": { "placeholder": "Type the content of your code note here..." @@ -1118,7 +1142,9 @@ "title": "Performance", "enable-motion": "Enable transitions and animations", "enable-shadows": "Enable shadows", - "enable-backdrop-effects": "Enable background effects for menus, popups and panels" + "enable-backdrop-effects": "Enable background effects for menus, popups and panels", + "enable-smooth-scroll": "Enable smooth scrolling", + "app-restart-required": "(a restart of the application is required for the change to take effect)" }, "ai_llm": { "not_started": "Not started", @@ -1392,8 +1418,13 @@ "title": "Localization", "language": "Language", "first-day-of-the-week": "First day of the week", - "sunday": "Sunday", "monday": "Monday", + "tuesday": "Tuesday", + "wednesday": "Wednesday", + "thursday": "Thursday", + "friday": "Friday", + "saturday": "Saturday", + "sunday": "Sunday", "first-week-of-the-year": "First week of the year", "first-week-contains-first-day": "First week contains first day of the year", "first-week-contains-first-thursday": "First week contains first Thursday of the year", @@ -1401,7 +1432,8 @@ "min-days-in-first-week": "Minimum days in first week", "first-week-info": "First week contains first Thursday of the year is based on ISO 8601 standard.", "first-week-warning": "Changing first week options may cause duplicate with existing Week Notes and the existing Week Notes will not be updated accordingly.", - "formatting-locale": "Date & number format" + "formatting-locale": "Date & number format", + "formatting-locale-auto": "Based on the application's language" }, "backup": { "automatic_backup": "Automatic backup", @@ -1496,7 +1528,7 @@ "oauth_title": "OAuth/OpenID", "oauth_description": "OpenID is a standardized way to let you log into websites using an account from another service, like Google, to verify your identity. The default issuer is Google, but you can change it to any other OpenID provider. Check here for more information. Follow these instructions to setup an OpenID service through Google.", "oauth_description_warning": "To enable OAuth/OpenID, you need to set the OAuth/OpenID base URL, client ID and client secret in the config.ini file and restart the application. If you want to set from environment variables, please set TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID and TRILIUM_OAUTH_CLIENT_SECRET.", - "oauth_missing_vars": "Missing settings: {{variables}}", + "oauth_missing_vars": "Missing settings: {{-variables}}", "oauth_user_account": "User Account: ", "oauth_user_email": "User Email: ", "oauth_user_not_logged_in": "Not logged in!" @@ -1569,10 +1601,12 @@ "button-tree-map": "Tree map" }, "tree-context-menu": { - "open-in-a-new-tab": "Open in a new tab Ctrl+Click", + "open-in-a-new-tab": "Open in a new tab", "open-in-a-new-split": "Open in a new split", "insert-note-after": "Insert note after", "insert-child-note": "Insert child note", + "archive": "Archive", + "unarchive": "Unarchive", "delete": "Delete", "search-in-subtree": "Search in subtree", "hoist-note": "Hoist note", @@ -1602,8 +1636,8 @@ "open-in-popup": "Quick edit" }, "shared_info": { - "shared_publicly": "This note is shared publicly on", - "shared_locally": "This note is shared locally on", + "shared_publicly": "This note is shared publicly on {{- link}}.", + "shared_locally": "This note is shared locally on {{- link}}.", "help_link": "For help visit wiki." }, "note_types": { @@ -1682,13 +1716,16 @@ "hoist-this-note-workspace": "Hoist this note (workspace)", "refresh-saved-search-results": "Refresh saved search results", "create-child-note": "Create child note", - "unhoist": "Unhoist" + "unhoist": "Unhoist", + "toggle-sidebar": "Toggle sidebar" }, "title_bar_buttons": { "window-on-top": "Keep Window on Top" }, "note_detail": { - "could_not_find_typewidget": "Could not find typeWidget for type '{{type}}'" + "could_not_find_typewidget": "Could not find typeWidget for type '{{type}}'", + "printing": "Printing in progress...", + "printing_pdf": "Exporting to PDF in progress..." }, "note_title": { "placeholder": "type note's title here..." @@ -1763,7 +1800,9 @@ "ws": { "sync-check-failed": "Sync check failed!", "consistency-checks-failed": "Consistency checks failed! See logs for details.", - "encountered-error": "Encountered error \"{{message}}\", check out the console." + "encountered-error": "Encountered error \"{{message}}\", check out the console.", + "lost-websocket-connection-title": "Lost connection to the server", + "lost-websocket-connection-message": "Check your reverse proxy (e.g. nginx or Apache) configuration to ensure WebSocket connections are properly allowed and not being blocked." }, "hoisted_note": { "confirm_unhoisting": "Requested note '{{requestedNote}}' is outside of hoisted note '{{hoistedNote}}' subtree and you must unhoist to access the note. Do you want to proceed with unhoisting?" @@ -1839,7 +1878,7 @@ "native-title-bar": "Native title bar", "native-title-bar-description": "For Windows and macOS, keeping the native title bar off makes the application look more compact. On Linux, keeping the native title bar on integrates better with the rest of the system.", "background-effects": "Enable background effects (Windows 11 only)", - "background-effects-description": "The Mica effect adds a blurred, stylish background to app windows, creating depth and a modern look.", + "background-effects-description": "The Mica effect adds a blurred, stylish background to app windows, creating depth and a modern look. \"Native title bar\" must be disabled.", "restart-app-button": "Restart the application to view the changes", "zoom-factor": "Zoom factor" }, @@ -1938,7 +1977,11 @@ "editorfeatures": { "title": "Features", "emoji_completion_enabled": "Enable Emoji auto-completion", - "note_completion_enabled": "Enable note auto-completion" + "emoji_completion_description": "If enabled, emojis can be easily inserted into text by typing `:`, followed by the name of an emoji.", + "note_completion_enabled": "Enable note auto-completion", + "note_completion_description": "If enabled, links to notes can be created by typing `@` followed by the title of a note.", + "slash_commands_enabled": "Enable slash commands", + "slash_commands_description": "If enabled, editing commands such as inserting line breaks or headings can be toggled by typing `/`." }, "table_view": { "new-row": "New row", @@ -1974,14 +2017,26 @@ "delete_row": "Delete row" }, "board_view": { - "delete-note": "Delete Note", + "delete-note": "Delete note...", + "remove-from-board": "Remove from board", + "archive-note": "Archive note", + "unarchive-note": "Unarchive note", "move-to": "Move to", "insert-above": "Insert above", "insert-below": "Insert below", "delete-column": "Delete column", "delete-column-confirmation": "Are you sure you want to delete this column? The corresponding attribute will be deleted in the notes under this column as well.", "new-item": "New item", - "add-column": "Add Column" + "new-item-placeholder": "Enter note title...", + "add-column": "Add Column", + "add-column-placeholder": "Enter column name...", + "edit-note-title": "Click to edit note title", + "edit-column-title": "Click to edit column title" + }, + "presentation_view": { + "edit-slide": "Edit this slide", + "start-presentation": "Start presentation", + "slide-overview": "Toggle an overview of the slides" }, "command_palette": { "tree-action-name": "Tree: {{name}}", @@ -2023,5 +2078,12 @@ }, "units": { "percentage": "%" + }, + "pagination": { + "page_title": "Page of {{startIndex}} - {{endIndex}}", + "total_notes": "{{count}} notes" + }, + "collections": { + "rendering_error": "Unable to show content due to an error." } } diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index 4a0a7d684..e07ce8036 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -276,7 +276,12 @@ "mime": "MIME: ", "file_size": "TamaƱo del archivo:", "preview": "Vista previa:", - "preview_not_available": "La vista previa no estĆ” disponible para este tipo de notas." + "preview_not_available": "La vista previa no estĆ” disponible para este tipo de notas.", + "diff_off": "Mostrar contenido", + "diff_on": "Mostrar diferencia", + "diff_off_hint": "Haga clic para mostrar el contenido de la nota", + "diff_not_available": "Diferencias no disponibles.", + "diff_on_hint": "Haga clic para ver las diferencias" }, "sort_child_notes": { "sort_children_by": "Ordenar hijos por...", @@ -349,7 +354,7 @@ "calendar_root": "marca la nota que debe usarse como raĆ­z para las notas del dĆ­a. Sólo uno debe estar marcado como tal.", "archived": "las notas con esta etiqueta no serĆ”n visibles de forma predeterminada en los resultados de bĆŗsqueda (tampoco en los cuadros de diĆ”logo Saltar a, Agregar vĆ­nculo, etc.).", "exclude_from_export": "las notas (con su subĆ”rbol) no se incluirĆ”n en ninguna exportación de notas", - "run": "define en quĆ© eventos debe ejecutarse el script. Los valores posibles son:\n
    \n
  • frontendStartup - cuando el frontend de Trilium inicia (o es recargado), pero no en dispositivos móviles.
  • \n
  • backendStartup - cuando el backend de Trilium se inicia
  • \n
  • hourly - se ejecuta una vez cada hora. Puede usar etiqueta adicional runAtHour para especificar a la hora.
  • \n
  • daily - ejecutar una vez al dĆ­a
  • \n
", + "run": "define en quƩ eventos debe ejecutarse el script. Los valores posibles son:\n
    \n
  • frontendStartup - cuando Trilium frontend se inicia (o se actualiza), pero no en móvil.
  • \n
  • mobileStartup - cuando Trilium frontend se inicia (o se actualiza), en móvil.
  • \n
  • backendStartup - cuando Trilium backend se inicia
  • \n
  • hourly - se ejecuta una vez por hora. Se puede usar la etiqueta adicional runAtHour para especificar a quĆ© hora.
  • \n
  • daily - se ejecuta una vez al dĆ­a
  • \n
", "run_on_instance": "Definir en quĆ© instancia de Trilium se debe ejecutar esto. Predeterminado para todas las instancias.", "run_at_hour": "ĀæA quĆ© hora deberĆ­a funcionar? Debe usarse junto con #run=hourly. Se puede definir varias veces para varias ejecuciones durante el dĆ­a.", "disable_inclusion": "los scripts con esta etiqueta no se incluirĆ”n en la ejecución del script principal.", @@ -379,7 +384,7 @@ "inbox": "ubicación predeterminada de la bandeja de entrada para nuevas notas - cuando crea una nota usando el botón \"nueva nota\" en la barra lateral, las notas serĆ”n creadas como subnotas de la nota marcada con la etiqueta #inbox.", "workspace_inbox": "ubicación predeterminada de la bandeja de entrada para nuevas notas cuando se anclan a algĆŗn antecesor de esta nota del espacio de trabajo", "sql_console_home": "ubicación predeterminada de las notas de la consola SQL", - "bookmark_folder": "la nota con esta etiqueta aparecerĆ” en los marcadores como carpeta (permitiendo el acceso a sus elementos hijos).", + "bookmark_folder": "la nota con esta etiqueta aparecerĆ” en los marcadores como carpeta (permitiendo el acceso a sus elementos hijos)", "share_hidden_from_tree": "esta nota estĆ” oculta en el Ć”rbol de navegación izquierdo, pero aĆŗn se puede acceder a ella con su URL", "share_external_link": "la nota actuarĆ” como un enlace a un sitio web externo en el Ć”rbol compartido", "share_alias": "define un alias que al usar la nota va a estar disponible en https://your_trilium_host/share/[tu_alias]", @@ -577,7 +582,7 @@ "cannot_find_day_note": "No se puede encontrar la nota del dĆ­a", "cannot_find_week_note": "No se puede encontrar la nota de la semana", "january": "Enero", - "febuary": "Febrero", + "february": "Febrero", "march": "Marzo", "april": "Abril", "may": "Mayo", @@ -587,7 +592,18 @@ "september": "Septiembre", "october": "Octubre", "november": "Noviembre", - "december": "Diciembre" + "december": "Diciembre", + "week": "Semana", + "week_previous": "Semana anterior", + "week_next": "Semana siguiente", + "month": "Mes", + "month_previous": "Mes anterior", + "month_next": "Mes siguiente", + "year": "AƱo", + "year_previous": "AƱo anterior", + "year_next": "AƱo siguiente", + "list": "Lista", + "today": "Hoy" }, "close_pane_button": { "close_this_pane": "Cerrar este panel" @@ -630,7 +646,9 @@ "about": "Acerca de Trilium Notes", "logout": "Cerrar sesión", "show-cheatsheet": "Mostrar hoja de trucos", - "toggle-zen-mode": "Modo Zen" + "toggle-zen-mode": "Modo Zen", + "new-version-available": "Nueva actualización disponible", + "download-update": "Obtener versión {{latestVersion}}" }, "zen_mode": { "button_exit": "Salir del modo Zen" @@ -720,7 +738,8 @@ "insert_child_note": "Insertar subnota", "delete_this_note": "Eliminar esta nota", "error_cannot_get_branch_id": "No se puede obtener el branchID del notePath '{{notePath}}'", - "error_unrecognized_command": "Comando no reconocido {{command}}" + "error_unrecognized_command": "Comando no reconocido {{command}}", + "note_revisions": "Revisiones de notas" }, "note_icon": { "change_note_icon": "Cambiar icono de nota", @@ -732,7 +751,8 @@ "note_type": "Tipo de nota", "editable": "Editable", "basic_properties": "Propiedades bĆ”sicas", - "language": "Idioma" + "language": "Idioma", + "configure_code_notes": "Configurar notas de código..." }, "book_properties": { "view_type": "Tipo de vista", @@ -747,7 +767,9 @@ "book_properties": "Propiedades de colección", "table": "Tabla", "geo-map": "Mapa Geo", - "board": "Tablero" + "board": "Tablero", + "include_archived_notes": "Mostrar notas archivadas", + "presentation": "Presentación" }, "edited_notes": { "no_edited_notes_found": "AĆŗn no hay notas editadas en este dĆ­a...", @@ -948,7 +970,9 @@ "no_attachments": "Esta nota no tiene archivos adjuntos." }, "book": { - "no_children_help": "Esta nota de tipo libro no tiene ninguna subnota asĆ­ que no hay nada que mostrar. VĆ©a la wiki para mĆ”s detalles." + "no_children_help": "Esta nota de tipo libro no tiene ninguna subnota asĆ­ que no hay nada que mostrar. VĆ©a la wiki para mĆ”s detalles.", + "drag_locked_title": "Bloqueado para edición", + "drag_locked_message": "No se permite Arrastrar pues la colección estĆ” bloqueada para edición." }, "editable_code": { "placeholder": "Escriba el contenido de su nota de código aquĆ­..." @@ -990,7 +1014,7 @@ "start_dragging_relations": "Empiece a arrastrar relaciones desde aquĆ­ y suĆ©ltelas en otra nota.", "note_not_found": "Ā”Nota {{noteId}} no encontrada!", "cannot_match_transform": "No se puede coincidir con la transformación: {{transform}}", - "note_already_in_diagram": "Note \"{{title}}\" is already in the diagram.", + "note_already_in_diagram": "La nota \"{{title}}\" ya estĆ” en el diagrama.", "enter_title_of_new_note": "Ingrese el tĆ­tulo de la nueva nota", "default_new_note_title": "nueva nota", "click_on_canvas_to_place_new_note": "Haga clic en el lienzo para colocar una nueva nota" @@ -1232,8 +1256,9 @@ "indexing_stopped": "Indexado detenido", "indexing_in_progress": "Indexado en progreso...", "last_indexed": "Último indexado", - "n_notes_queued": "{{ count }} nota agregada a la cola para indexado", - "n_notes_queued_plural": "{{ count }} notas agregadas a la cola para indexado", + "n_notes_queued_0": "{{ count }} nota agregada a la cola para indexar", + "n_notes_queued_1": "{{ count }} notas agregadas a la cola para indexar", + "n_notes_queued_2": "", "note_chat": "Chat de nota", "notes_indexed": "{{ count }} nota indexada", "notes_indexed_plural": "{{ count }} notas indexadas", @@ -1253,7 +1278,12 @@ "selected_provider": "Proveedor seleccionado", "selected_provider_description": "Elija el proveedor de IA para el chat y caracterĆ­sticas de completado", "select_model": "Seleccionar modelo...", - "select_provider": "Seleccionar proveedor..." + "select_provider": "Seleccionar proveedor...", + "ai_enabled": "CaracterĆ­sticas de IA activadas", + "ai_disabled": "CaracterĆ­sticas de IA desactivadas", + "no_models_found_online": "No se encontraron modelos. Por favor, comprueba tu clave de API y la configuración.", + "no_models_found_ollama": "No se encontraron modelos de Ollama. Por favor, comprueba si Ollama se estĆ” ejecutando.", + "error_fetching": "Error al obtener los modelos: {{error}}" }, "zoom_factor": { "title": "Factor de zoom (solo versión de escritorio)", @@ -1389,7 +1419,13 @@ "min-days-in-first-week": "DĆ­as mĆ­nimos en la primer semana", "first-week-info": "Primer semana que contiene al primer jueves del aƱo estĆ” basado en el estĆ”ndarISO 8601.", "first-week-warning": "Cambiar las opciones de primer semana puede causar duplicados con las Notas Semanales existentes y las Notas Semanales existentes no serĆ”n actualizadas respectivamente.", - "formatting-locale": "Fecha y formato de nĆŗmero" + "formatting-locale": "Fecha y formato de nĆŗmero", + "tuesday": "Martes", + "wednesday": "MiĆ©rcoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "SĆ”bado", + "formatting-locale-auto": "Basado en el idioma de la aplicación" }, "backup": { "automatic_backup": "Copia de seguridad automĆ”tica", @@ -1482,9 +1518,9 @@ "recovery_keys_used": "Usado: {{date}}", "recovery_keys_unused": "El código de recuperación {{index}} estĆ” sin usar", "oauth_title": "OAuth/OpenID", - "oauth_description": "OpenID es una forma estandarizada de permitirle iniciar sesión en sitios web utilizando una cuenta de otro servicio, como Google, para verificar su identidad. Siga estas instrucciones para configurar un servicio OpenID a travĆ©s de Google.", + "oauth_description": "OpenID es un mĆ©todo estandarizado que permite iniciar sesión en sitios web usando una cuenta de otro servicio, como Google, para verificar tu identidad. El emisor predeterminado es Google, pero se puede cambiar a cualquier otro proveedor de OpenID. Consulta aquĆ­ para mĆ”s información. Sigue estas instrucciones para configurar un servicio OpenID a travĆ©s de Google.", "oauth_description_warning": "Para habilitar OAuth/OpenID, necesita establecer la URL base de OAuth/OpenID, ID de cliente y secreto de cliente en el archivo config.ini y reiniciar la aplicación. Si desea establecerlas desde variables de ambiente, por favor establezca TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID y TRILIUM_OAUTH_CLIENT_SECRET.", - "oauth_missing_vars": "Ajustes faltantes: {{variables}}", + "oauth_missing_vars": "Ajustes faltantes: {{-variables}}", "oauth_user_account": "Cuenta de usuario: ", "oauth_user_email": "Correo electrónico de usuario: ", "oauth_user_not_logged_in": "Ā”No ha iniciado sesión!" @@ -1557,7 +1593,7 @@ "button-tree-map": "Mapa de Ɓrbol" }, "tree-context-menu": { - "open-in-a-new-tab": "Abrir en nueva pestaƱa Ctrl+Click", + "open-in-a-new-tab": "Abrir en nueva pestaƱa", "open-in-a-new-split": "Abrir en nueva división", "insert-note-after": "Insertar nota despuĆ©s de", "insert-child-note": "Insertar subnota", @@ -1587,11 +1623,13 @@ "apply-bulk-actions": "Aplicar acciones en lote", "converted-to-attachments": "{{count}} notas han sido convertidas en archivos adjuntos.", "convert-to-attachment-confirm": "ĀæEstĆ” seguro que desea convertir las notas seleccionadas en archivos adjuntos de sus notas padres?", - "open-in-popup": "Edición rĆ”pida" + "open-in-popup": "Edición rĆ”pida", + "archive": "Archivar", + "unarchive": "Desarchivar" }, "shared_info": { - "shared_publicly": "Esta nota estĆ” compartida pĆŗblicamente en", - "shared_locally": "Esta nota estĆ” compartida localmente en", + "shared_publicly": "Esta nota estĆ” compartida pĆŗblicamente en {{- link}}.", + "shared_locally": "Esta nota estĆ” compartida localmente en {{- link}}.", "help_link": "Para obtener ayuda visite wiki." }, "note_types": { @@ -1670,7 +1708,8 @@ "hoist-this-note-workspace": "Anclar esta nota (espacio de trabajo)", "refresh-saved-search-results": "Refrescar resultados de bĆŗsqueda guardados", "create-child-note": "Crear subnota", - "unhoist": "Desanclar" + "unhoist": "Desanclar", + "toggle-sidebar": "Alternar barra lateral" }, "title_bar_buttons": { "window-on-top": "Mantener esta ventana en la parte superior" @@ -1745,13 +1784,15 @@ "undeleting-notes-finished-successfully": "La recuperación de notas finalizó exitosamente." }, "frontend_script_api": { - "async_warning": "EstĆ” pasando una función asĆ­ncrona a `api.runOnBackend ()` que probablemente no funcionarĆ” como pretendĆ­a.", - "sync_warning": "EstĆ”s pasando una función sincrónica a `api.runasynconbackendwithmanualTransactionHandling ()`, \\ n while deberĆ­a usar `api.runonbackend ()` en su lugar." + "async_warning": "EstĆ” pasando una función asĆ­ncrona a `api.runOnBackend ()` que probablemente no funcionarĆ” como pretendĆ­a.\\nO haga la función sincrónica (removiendo la palabra `async`), o use `api.runAsyncOnBackendWithManualTransactionHandling()`.", + "sync_warning": "EstĆ”s pasando una función sincrónica a `api.runasynconbackendwithmanualTransactionHandling ()`, \\n while deberĆ­a usar `api.runonbackend ()` en su lugar." }, "ws": { "sync-check-failed": "Ā”La comprobación de sincronización falló!", "consistency-checks-failed": "Ā”Las comprobaciones de consistencia fallaron! Vea los registros para mĆ”s detalles.", - "encountered-error": "Error encontrado \"{{message}}\", compruebe la consola." + "encountered-error": "Error encontrado \"{{message}}\", compruebe la consola.", + "lost-websocket-connection-title": "Se ha perdido la conexión con el servidor", + "lost-websocket-connection-message": "Compruebe la configuración de su proxy inverso (por ejemplo, nginx o Apache) para asegurarse de que las conexiones WebSocket estĆ”n correctamente permitidas y no estĆ”n bloqueadas." }, "hoisted_note": { "confirm_unhoisting": "La nota requerida '{{requestedNote}}' estĆ” fuera del subĆ”rbol de la nota anclada '{{hoistedNote}}' y debe desanclarla para acceder a la nota. ĀæDesea proceder con el desanclaje?" @@ -1827,7 +1868,7 @@ "native-title-bar": "Barra de tĆ­tulo nativa", "native-title-bar-description": "Para Windows y macOS, quitar la barra de tĆ­tulo nativa hace que la aplicación se vea mĆ”s compacta. En Linux, mantener la barra de tĆ­tulo nativa hace que se integre mejor con el resto del sistema.", "background-effects": "Habilitar efectos de fondo (sólo en Windows 11)", - "background-effects-description": "El efecto Mica agrega un fondo borroso y elegante a las ventanas de aplicaciones, creando profundidad y un aspecto moderno.", + "background-effects-description": "El efecto Mica agrega un fondo borroso y elegante a las ventanas de la aplicación, creando profundidad y un aspecto moderno. \"TĆ­tulo nativo de la barra\" debe deshabilitarse.", "restart-app-button": "Reiniciar la aplicación para ver los cambios", "zoom-factor": "Factor de zoom" }, @@ -1937,14 +1978,21 @@ "delete_row": "Eliminar fila" }, "board_view": { - "delete-note": "Eliminar nota", + "delete-note": "Eliminar nota...", "move-to": "Mover a", "insert-above": "Insertar arriba", "insert-below": "Insertar abajo", "delete-column": "Eliminar columna", "delete-column-confirmation": "ĀæSeguro que desea eliminar esta columna? El atributo correspondiente tambiĆ©n se eliminarĆ” de las notas de esta columna.", "add-column": "AƱadir columna", - "new-item": "Nuevo elemento" + "new-item": "Nuevo elemento", + "archive-note": "Archivar nota", + "unarchive-note": "Desarchivar nota", + "new-item-placeholder": "Ingresar tĆ­tulo de la nota...", + "add-column-placeholder": "Ingresar tĆ­tulo de la columna...", + "edit-note-title": "Haga clic para editar el tĆ­tulo de la nota", + "edit-column-title": "Haga clic para editar el tĆ­tulo de la columna", + "remove-from-board": "Eliminar del tablero" }, "content_renderer": { "open_externally": "Abrir externamente" @@ -1972,7 +2020,11 @@ "editorfeatures": { "note_completion_enabled": "Activar autocompletado de notas", "emoji_completion_enabled": "Activar autocompletado de emojis", - "title": "Funciones" + "title": "Funciones", + "emoji_completion_description": "Si estĆ” habilitado, los emojis pueden fĆ”cilmente insertarse en el texto escribiendo `:`, seguido del nombre de un emoji.", + "note_completion_description": "Si estĆ” habilitado, los vĆ­nculos a notas pueden crearse escribiendo `@` seguido del tĆ­tulo de una nota.", + "slash_commands_enabled": "Habilitar comandos de barra", + "slash_commands_description": "Si estĆ” habilitado, editar comandos como insertar saltos de lĆ­nea o tĆ­tulos, puede alternarse escribiendo `/`." }, "command_palette": { "tree-action-name": "Ɓrbol:{{name}}", @@ -1995,11 +2047,41 @@ }, "call_to_action": { "next_theme_title": "Prueba el nuevo tema de Trilium", - "next_theme_message": "Estas usando actualmente el tema heredado, ĀæTe gustarĆ­a probar el nuevo tema?", + "next_theme_message": "EstĆ”s usando actualmente el tema heredado. ĀæTe gustarĆ­a probar el nuevo tema?", "next_theme_button": "Prueba el nuevo tema", "background_effects_title": "Los efectos de fondo son ahora estables", "background_effects_message": "En los dispositivos Windows, los efectos de fondo ya son totalmente estables. Los efectos de fondo aƱaden un toque de color a la interfaz de usuario difuminando el fondo que hay detrĆ”s. Esta tĆ©cnica tambiĆ©n se utiliza en otras aplicaciones como el Explorador de Windows.", "background_effects_button": "Activar efectos de fondo", "dismiss": "Desestimar" + }, + "ui-performance": { + "title": "Rendimiento", + "enable-motion": "Habilitar transiciones y animaciones", + "enable-shadows": "Activar sombras", + "enable-backdrop-effects": "Habilitar efectos de fondo para menĆŗs, ventanas emergentes y paneles", + "enable-smooth-scroll": "Habilitar desplazamiento suave", + "app-restart-required": "(es necesario reiniciar la aplicación para que el cambio surta efecto)" + }, + "settings": { + "related_settings": "Configuración relacionada" + }, + "settings_appearance": { + "related_code_blocks": "Esquema de colores para bloques de código en notas de texto", + "related_code_notes": "Esquema de colores para notas de código" + }, + "units": { + "percentage": "%" + }, + "pagination": { + "total_notes": "{{count}} notas", + "page_title": "PĆ”gina de {{startIndex}} - {{endIndex}}" + }, + "presentation_view": { + "edit-slide": "Editar este slide", + "start-presentation": "Iniciar presentación", + "slide-overview": "Alternar vista general de los slides" + }, + "collections": { + "rendering_error": "No se puede mostrar contenido debido a un error." } } diff --git a/apps/client/src/translations/fi/translation.json b/apps/client/src/translations/fi/translation.json index 8485174b9..fe6d636f6 100644 --- a/apps/client/src/translations/fi/translation.json +++ b/apps/client/src/translations/fi/translation.json @@ -15,6 +15,9 @@ }, "widget-error": { "title": "Widgetin luonti epƤonnistui" + }, + "bundle-error": { + "title": "Mukautetun skriptin lataus epƤonnistui" } }, "add_link": { diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json index e085e10e8..926307d18 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -184,7 +184,8 @@ }, "import-status": "Statut de l'importation", "in-progress": "Importation en cours : {{progress}}", - "successful": "Importation terminĆ©e avec succĆØs." + "successful": "Importation terminĆ©e avec succĆØs.", + "importZipRecommendation": "Lors de l'importation d'un fichier ZIP, la hiĆ©rarchie des notes reflĆ©tera la structure des sous-rĆ©pertoires au sein de l'archive." }, "include_note": { "dialog_title": "Inclure une note", @@ -276,7 +277,12 @@ "preview": "AperƧuĀ :", "preview_not_available": "L'aperƧu n'est pas disponible pour ce type de note.", "restore_button": "Restaurer", - "delete_button": "Supprimer" + "delete_button": "Supprimer", + "diff_on": "Afficher les diffĆ©rences", + "diff_off": "Afficher le contenu", + "diff_on_hint": "Cliquer pour afficher les diffĆ©rences avec la note d'origine", + "diff_off_hint": "Cliquer pour afficher le contenu de la note", + "diff_not_available": "La comparaison n'est pas disponible." }, "sort_child_notes": { "sort_children_by": "Trier les enfants par...", @@ -576,7 +582,7 @@ "sun": "Dim", "cannot_find_day_note": "Note journaliĆØre introuvable", "january": "Janvier", - "febuary": "FĆ©vrier", + "february": "FĆ©vrier", "march": "Mars", "april": "Avril", "may": "Mai", @@ -587,7 +593,18 @@ "october": "Octobre", "november": "Novembre", "december": "DĆ©cembre", - "cannot_find_week_note": "Impossible de trouver la note de la semaine" + "cannot_find_week_note": "Impossible de trouver la note de la semaine", + "week": "Semaine", + "week_previous": "Semaine prĆ©cĆ©dente", + "week_next": "Semaine suivante", + "month": "Mois", + "month_previous": "Mois prĆ©cĆ©dent", + "month_next": "Mois suivant", + "year": "AnnĆ©e", + "year_previous": "AnnĆ©e prĆ©cĆ©dente", + "year_next": "AnnĆ©e suivante", + "list": "Liste", + "today": "Aujourd'hui" }, "close_pane_button": { "close_this_pane": "Fermer ce volet" @@ -630,7 +647,9 @@ "about": "ƀ propos de Trilium Notes", "logout": "DĆ©connexion", "show-cheatsheet": "Afficher l'aide rapide", - "toggle-zen-mode": "Zen Mode" + "toggle-zen-mode": "Zen Mode", + "new-version-available": "Nouvelle mise Ć  jour disponible", + "download-update": "Obtenir la version {{latestVersion}}" }, "zen_mode": { "button_exit": "Sortir du Zen mode" @@ -657,7 +676,7 @@ "search_in_note": "Rechercher dans la note", "note_source": "Code source", "note_attachments": "PiĆØces jointes", - "open_note_externally": "Ouverture externe", + "open_note_externally": "Ouvrir la note en externe", "open_note_externally_title": "Le fichier sera ouvert dans une application externe et les modifications apportĆ©es seront surveillĆ©es. Vous pourrez ensuite tĆ©lĆ©verser la version modifiĆ©e dans Trilium.", "open_note_custom": "Ouvrir la note avec", "import_files": "Importer des fichiers", @@ -720,7 +739,8 @@ "insert_child_note": "InsĆ©rer une note enfant", "delete_this_note": "Supprimer cette note", "error_cannot_get_branch_id": "Impossible d'obtenir branchId pour notePath '{{notePath}}'", - "error_unrecognized_command": "Commande non reconnue {{command}}" + "error_unrecognized_command": "Commande non reconnue {{command}}", + "note_revisions": "RĆ©vision de la note" }, "note_icon": { "change_note_icon": "Changer l'icĆ“ne de note", @@ -732,7 +752,8 @@ "note_type": "Type de note", "editable": "Modifiable", "basic_properties": "PropriĆ©tĆ©s de base", - "language": "Langage" + "language": "Langage", + "configure_code_notes": "Configurer les notes de code..." }, "book_properties": { "view_type": "Type d'affichage", @@ -747,7 +768,9 @@ "book_properties": "PropriĆ©tĆ©s de la collection", "table": "Tableau", "geo-map": "Carte gĆ©ographique", - "board": "Tableau de bord" + "board": "Tableau de bord", + "include_archived_notes": "Afficher les notes archivĆ©es", + "presentation": "PrĆ©sentation" }, "edited_notes": { "no_edited_notes_found": "Aucune note modifiĆ©e ce jour-lĆ ...", @@ -948,7 +971,9 @@ "no_attachments": "Cette note ne contient aucune piĆØce jointe." }, "book": { - "no_children_help": "Cette note de type Livre n'a aucune note enfant, donc il n'y a rien Ć  afficher. Consultez le wiki pour plus de dĆ©tails." + "no_children_help": "Cette note de type Livre n'a aucune note enfant, donc il n'y a rien Ć  afficher. Consultez le wiki pour plus de dĆ©tails.", + "drag_locked_title": "Edition verrouillĆ©e", + "drag_locked_message": "Le glisser-dĆ©poser n'est pas autorisĆ© car l'Ć©dition de cette collection est verrouillĆ©." }, "editable_code": { "placeholder": "Saisir le contenu de votre note de code ici..." @@ -1120,7 +1145,8 @@ "code_auto_read_only_size": { "title": "Taille pour la lecture seule automatique", "description": "La taille pour la lecture seule automatique est le seuil au-delĆ  de laquelle les notes seront affichĆ©es en mode lecture seule (pour optimiser les performances).", - "label": "Taille pour la lecture seule automatique (notes de code)" + "label": "Taille pour la lecture seule automatique (notes de code)", + "unit": "caractĆØres" }, "code_mime_types": { "title": "Types MIME disponibles dans la liste dĆ©roulante" @@ -1139,7 +1165,8 @@ "download_images_description": "Le HTML collĆ© peut contenir des rĆ©fĆ©rences Ć  des images en ligne, Trilium trouvera ces rĆ©fĆ©rences et tĆ©lĆ©chargera les images afin qu'elles soient disponibles hors ligne.", "enable_image_compression": "Activer la compression des images", "max_image_dimensions": "Largeur/hauteur maximale d'une image en pixels (l'image sera redimensionnĆ©e si elle dĆ©passe ce paramĆØtre).", - "jpeg_quality_description": "QualitĆ© JPEG (10 - pire qualitĆ©, 100 - meilleure qualitĆ©, 50 - 85 est recommandĆ©)" + "jpeg_quality_description": "QualitĆ© JPEG (10 - pire qualitĆ©, 100 - meilleure qualitĆ©, 50 - 85 est recommandĆ©)", + "max_image_dimensions_unit": "pixels" }, "attachment_erasure_timeout": { "attachment_erasure_timeout": "DĆ©lai d'effacement des piĆØces jointes", @@ -1171,7 +1198,8 @@ "note_revisions_snapshot_limit_description": "La limite du nombre de versions de note dĆ©signe le nombre maximum de versions pouvant ĆŖtre enregistrĆ©es pour chaque note. -1 signifie aucune limite, 0 signifie supprimer toutes les versions. Vous pouvez dĆ©finir le nombre maximal de versions pour une seule note avec le label #versioningLimit.", "snapshot_number_limit_label": "Nombre limite de versions de note :", "erase_excess_revision_snapshots": "Effacer maintenant les versions en excĆØs", - "erase_excess_revision_snapshots_prompt": "Les versions en excĆØs ont Ć©tĆ© effacĆ©es." + "erase_excess_revision_snapshots_prompt": "Les versions en excĆØs ont Ć©tĆ© effacĆ©es.", + "snapshot_number_limit_unit": "instantanĆ©s" }, "search_engine": { "title": "Moteur de recherche", @@ -1213,19 +1241,35 @@ "title": "Table des matiĆØres", "description": "La table des matiĆØres apparaĆ®tra dans les notes textuelles lorsque la note comporte plus d'un nombre dĆ©fini de titres. Vous pouvez personnaliser ce nombre :", "disable_info": "Vous pouvez Ć©galement utiliser cette option pour dĆ©sactiver la table des matiĆØres en dĆ©finissant un nombre trĆØs Ć©levĆ©.", - "shortcut_info": "Vous pouvez configurer un raccourci clavier pour afficher/masquer le volet de droite (y compris la table des matiĆØres) dans Options -> Raccourcis (nom Ā« toggleRightPane Ā»)." + "shortcut_info": "Vous pouvez configurer un raccourci clavier pour afficher/masquer le volet de droite (y compris la table des matiĆØres) dans Options -> Raccourcis (nom Ā« toggleRightPane Ā»).", + "unit": "titres" }, "text_auto_read_only_size": { "title": "Taille automatique en lecture seule", "description": "La taille automatique des notes en lecture seule est la taille au-delĆ  de laquelle les notes seront affichĆ©es en mode lecture seule (pour des raisons de performances).", - "label": "Taille automatique en lecture seule (notes de texte)" + "label": "Taille automatique en lecture seule (notes de texte)", + "unit": "caractĆØres" }, "i18n": { "title": "ParamĆØtres rĆ©gionaux", "language": "Langue", "first-day-of-the-week": "Premier jour de la semaine", "sunday": "Dimanche", - "monday": "Lundi" + "monday": "Lundi", + "tuesday": "Mardi", + "wednesday": "Mercredi", + "thursday": "Jeudi", + "friday": "Vendredi", + "saturday": "Samedi", + "first-week-of-the-year": "PremiĆØre semaine de l'annĆ©e", + "first-week-contains-first-day": "La premiĆØre semaine contient le premier jour de l'annĆ©e", + "first-week-contains-first-thursday": "La premiĆØre semaine contient le premier jeudi de l'annĆ©e", + "first-week-has-minimum-days": "La premiĆØre semaine a un nombre minimum de jours", + "min-days-in-first-week": "Nombre minimum de jours dans la premiĆØre semaine", + "first-week-info": "La premiĆØre semaine contient le premier jeudi de l'annĆ©e et est basĆ©e sur la norme ISO 8601 .", + "first-week-warning": "La modification des options de la premiĆØre semaine peut entraĆ®ner des doublons avec les notes de semaine existantes et les notes de semaine existantes ne seront pas mises Ć  jour en consĆ©quence.", + "formatting-locale": "Format de date et de nombre", + "formatting-locale-auto": "En fonction de la langue de l'application" }, "backup": { "automatic_backup": "Sauvegarde automatique", @@ -1263,7 +1307,9 @@ "delete_token": "Supprimer/dĆ©sactiver ce token", "rename_token_title": "Renommer le jeton", "rename_token_message": "Veuillez saisir le nom du nouveau jeton", - "delete_token_confirmation": "Êtes-vous sĆ»r de vouloir supprimer le jeton ETAPI « {{name}} » ?" + "delete_token_confirmation": "Êtes-vous sĆ»r de vouloir supprimer le jeton ETAPI « {{name}} » ?", + "see_more": "Voir plus de dĆ©tails dans le {{- link_to_wiki}} et le {{- link_to_openapi_spec}} ou le {{- link_to_swagger_ui }}.", + "swagger_ui": "Interface utilisateur ETAPI Swagger" }, "options_widget": { "options_status": "Statut des options", @@ -1326,7 +1372,8 @@ "test_title": "Test de synchronisation", "test_description": "Testera la connexion et la prise de contact avec le serveur de synchronisation. Si le serveur de synchronisation n'est pas initialisĆ©, cela le configurera pour qu'il se synchronise avec le document local.", "test_button": "Tester la synchronisation", - "handshake_failed": "Ɖchec de la nĆ©gociation avec le serveur de synchronisation, erreurĀ :Ā {{message}}" + "handshake_failed": "Ɖchec de la nĆ©gociation avec le serveur de synchronisation, erreurĀ :Ā {{message}}", + "timeout_unit": "millisecondes" }, "api_log": { "close": "Fermer" @@ -1357,7 +1404,7 @@ "button-tree-map": "Carte de l'arborescence" }, "tree-context-menu": { - "open-in-a-new-tab": "Ouvrir dans un nouvel onglet Ctrl+Clic", + "open-in-a-new-tab": "Ouvrir dans un nouvel onglet", "open-in-a-new-split": "Ouvrir dans une nouvelle division", "insert-note-after": "InsĆ©rer une note aprĆØs", "insert-child-note": "InsĆ©rer une note enfant", @@ -1386,11 +1433,14 @@ "import-into-note": "Importer dans la note", "apply-bulk-actions": "Appliquer des Actions groupĆ©es", "converted-to-attachments": "Les notes {{count}} ont Ć©tĆ© converties en piĆØces jointes.", - "convert-to-attachment-confirm": "Êtes-vous sĆ»r de vouloir convertir les notes sĆ©lectionnĆ©es en piĆØces jointes de leurs notes parentes ?" + "convert-to-attachment-confirm": "Êtes-vous sĆ»r de vouloir convertir les notes sĆ©lectionnĆ©es en piĆØces jointes de leurs notes parentes ?", + "archive": "Archive", + "unarchive": "DĆ©sarchiver", + "open-in-popup": "Modification rapide" }, "shared_info": { - "shared_publicly": "Cette note est partagĆ©e publiquement sur", - "shared_locally": "Cette note est partagĆ©e localement sur", + "shared_publicly": "Cette note est partagĆ©e publiquement sur {{- link}}.", + "shared_locally": "Cette note est partagĆ©e localement sur {{- link}}.", "help_link": "Pour obtenir de l'aide, visitez le wiki." }, "note_types": { @@ -1412,7 +1462,11 @@ "confirm-change": "Il n'est pas recommandĆ© de modifier le type de note lorsque son contenu n'est pas vide. Voulez-vous continuer ?", "geo-map": "Carte gĆ©o", "beta-feature": "Beta", - "task-list": "Liste de tĆ¢ches" + "task-list": "Liste de tĆ¢ches", + "book": "Collection", + "ai-chat": "Chat IA", + "new-feature": "Nouveau", + "collections": "Collections" }, "protect_note": { "toggle-on": "ProtĆ©ger la note", @@ -1465,13 +1519,16 @@ "hoist-this-note-workspace": "Focus cette note (espace de travail)", "refresh-saved-search-results": "RafraĆ®chir les rĆ©sultats de recherche enregistrĆ©e", "create-child-note": "CrĆ©er une note enfant", - "unhoist": "DĆ©sactiver le focus" + "unhoist": "DĆ©sactiver le focus", + "toggle-sidebar": "Basculer la barre latĆ©rale" }, "title_bar_buttons": { "window-on-top": "Ɖpingler cette fenĆŖtre au premier plan" }, "note_detail": { - "could_not_find_typewidget": "Impossible de trouver typeWidget pour le type '{{type}}'" + "could_not_find_typewidget": "Impossible de trouver typeWidget pour le type '{{type}}'", + "printing": "Impression en cours...", + "printing_pdf": "Export au format PDF en cours..." }, "note_title": { "placeholder": "saisir le titre de la note ici..." @@ -1522,7 +1579,9 @@ }, "clipboard": { "cut": "Les note(s) ont Ć©tĆ© coupĆ©es dans le presse-papiers.", - "copied": "Les note(s) ont Ć©tĆ© coupĆ©es dans le presse-papiers." + "copied": "Les note(s) ont Ć©tĆ© coupĆ©es dans le presse-papiers.", + "copy_failed": "Impossible de copier dans le presse-papiers en raison de problĆØmes d'autorisation.", + "copy_success": "CopiĆ© dans le presse-papiers." }, "entrypoints": { "note-revision-created": "La version de la note a Ć©tĆ© crƩƩe.", @@ -1544,7 +1603,9 @@ "ws": { "sync-check-failed": "Le test de synchronisation a Ć©chouĆ© !", "consistency-checks-failed": "Les tests de cohĆ©rence ont Ć©chouĆ© ! Consultez les journaux pour plus de dĆ©tails.", - "encountered-error": "Erreur \"{{message}}\", consultez la console." + "encountered-error": "Erreur \"{{message}}\", consultez la console.", + "lost-websocket-connection-title": "Connexion au serveur perdue", + "lost-websocket-connection-message": "VĆ©rifiez la configuration de votre proxy inverse (par exemple nginx ou Apache) pour vous assurer que les connexions WebSocket sont correctement autorisĆ©es et ne sont pas bloquĆ©es." }, "hoisted_note": { "confirm_unhoisting": "La note demandĆ©e Ā«{{requestedNote}}Ā» est en dehors du sous-arbre de la note focus Ā«{{hoistedNote}}Ā». Le focus doit ĆŖtre dĆ©sactivĆ© pour accĆ©der Ć  la note. Voulez-vous enlever le focus ?" @@ -1566,13 +1627,15 @@ }, "highlighting": { "description": "ContrĆ“le la coloration syntaxique des blocs de code Ć  l'intĆ©rieur des notes texte, les notes de code ne seront pas affectĆ©es.", - "color-scheme": "Jeu de couleurs" + "color-scheme": "Jeu de couleurs", + "title": "Blocs de code" }, "code_block": { "word_wrapping": "Saut Ć  la ligne automatique suivant la largeur", "theme_none": "Pas de coloration syntaxique", "theme_group_light": "ThĆØmes clairs", - "theme_group_dark": "ThĆØmes sombres" + "theme_group_dark": "ThĆØmes sombres", + "copy_title": "Copier dans le presse-papiers" }, "classic_editor_toolbar": { "title": "Mise en forme" @@ -1610,7 +1673,8 @@ "link_context_menu": { "open_note_in_new_tab": "Ouvrir la note dans un nouvel onglet", "open_note_in_new_split": "Ouvrir la note dans une nouvelle division", - "open_note_in_new_window": "Ouvrir la note dans une nouvelle fenĆŖtre" + "open_note_in_new_window": "Ouvrir la note dans une nouvelle fenĆŖtre", + "open_note_in_popup": "Ɖdition rapide" }, "electron_integration": { "desktop-application": "Application de bureau", @@ -1630,7 +1694,8 @@ "full-text-search": "Recherche dans le texte" }, "note_tooltip": { - "note-has-been-deleted": "La note a Ć©tĆ© supprimĆ©e." + "note-has-been-deleted": "La note a Ć©tĆ© supprimĆ©e.", + "quick-edit": "Edition rapide" }, "geo-map": { "create-child-note-title": "CrĆ©er une nouvelle note enfant et l'ajouter Ć  la carte", @@ -1639,7 +1704,8 @@ }, "geo-map-context": { "open-location": "Ouvrir la position", - "remove-from-map": "Retirer de la carte" + "remove-from-map": "Retirer de la carte", + "add-note": "Ajouter un marqueur Ć  cet endroit" }, "help-button": { "title": "Ouvrir la page d'aide correspondante" @@ -1666,10 +1732,41 @@ "minimum_input": "La valeur de temps saisie doit ĆŖtre d'au moins {{minimumSeconds}} secondes." }, "multi_factor_authentication": { - "oauth_user_email": "Courriel de l'utilisateurĀ : " + "oauth_user_email": "Courriel de l'utilisateurĀ : ", + "title": "Authentification multifacteur", + "description": "L'authentification multifacteur (MFA) renforce la sĆ©curitĆ© de votre compte. Au lieu de simplement saisir un mot de passe pour vous connecter, le MFA vous demande de fournir une ou plusieurs preuves supplĆ©mentaires pour vĆ©rifier votre identitĆ©. Ainsi, mĆŖme si quelqu'un obtient votre mot de passe, il ne peut accĆ©der Ć  votre compte sans cette deuxiĆØme information. C'est comme ajouter une serrure supplĆ©mentaire Ć  votre porte, rendant l'effraction beaucoup plus difficile.

Veuillez suivre les instructions ci-dessous pour activer le MFA. Si vous ne configurez pas correctement, la connexion se fera uniquement par mot de passe.", + "mfa_enabled": "Activer l'authentification multifacteur", + "mfa_method": "MĆ©thode MFA", + "electron_disabled": "L'authentification multifacteur n'est actuellement pas prise en charge dans la version de bureau.", + "totp_title": "Mot de passe Ć  usage unique basĆ© sur le temps (TOTP)", + "totp_description": "Le TOTP (Time-Based One-Time Password) est une fonctionnalitĆ© de sĆ©curitĆ© qui gĆ©nĆØre un code unique et temporaire, modifiĆ© toutes les 30 secondes. Vous utilisez ce code, associĆ© Ć  votre mot de passe, pour vous connecter Ć  votre compte, ce qui rend l'accĆØs Ć  celui-ci beaucoup plus difficile.", + "totp_secret_title": "GĆ©nĆ©rer un secret TOTP", + "totp_secret_generate": "GĆ©nĆ©rer un secret TOTP", + "totp_secret_regenerate": "Re-gĆ©nĆ©rer un secret TOTP", + "no_totp_secret_warning": "Pour activer TOTP, vous devez d’abord gĆ©nĆ©rer un secret TOTP.", + "totp_secret_description_warning": "AprĆØs avoir gĆ©nĆ©rĆ© un nouveau secret TOTP, vous devrez vous reconnecter avec le nouveau secret TOTP.", + "totp_secret_generated": "Secret TOTP gĆ©nĆ©rĆ©", + "totp_secret_warning": "Veuillez conserver le secret gĆ©nĆ©rĆ© dans un endroit sĆ»r. Il ne sera plus affichĆ©.", + "totp_secret_regenerate_confirm": "Voulez-vous vraiment rĆ©gĆ©nĆ©rer le secret TOTP ? Cela invalidera le secret TOTP prĆ©cĆ©dent et tous les codes de rĆ©cupĆ©ration existants.", + "recovery_keys_title": "ClĆ©s de rĆ©cupĆ©ration d'authentification unique", + "recovery_keys_description": "Les clĆ©s de rĆ©cupĆ©ration d'authentification unique sont utilisĆ©es pour vous connecter mĆŖme si vous ne pouvez pas accĆ©der Ć  vos codes d'authentification.", + "recovery_keys_description_warning": "Les clĆ©s de rĆ©cupĆ©ration ne seront plus affichĆ©es aprĆØs avoir quittĆ© la page, conservez-les dans un endroit sĆ»r et sĆ©curisĆ©.
Une fois qu'une clĆ© de rĆ©cupĆ©ration a Ć©tĆ© utilisĆ©e, elle devient inutilisable.", + "recovery_keys_error": "Erreur lors de la gĆ©nĆ©ration des codes de rĆ©cupĆ©ration", + "recovery_keys_no_key_set": "Aucun code de rĆ©cupĆ©ration dĆ©fini", + "recovery_keys_generate": "GĆ©nĆ©rer des codes de rĆ©cupĆ©ration", + "recovery_keys_regenerate": "Re-gĆ©nĆ©rer des codes de rĆ©cupĆ©ration", + "recovery_keys_used": "Utilisé : {{date}}", + "recovery_keys_unused": "Le code de rĆ©cupĆ©ration {{index}} n'est pas utilisĆ©", + "oauth_title": "OAuth/OpenID", + "oauth_description": "OpenID est un moyen standardisĆ© de vous connecter Ć  des sites web avec un compte d'un autre service, comme Google, afin de vĆ©rifier votre identitĆ©. L'Ć©metteur par dĆ©faut est Google, mais vous pouvez le modifier pour n'importe quel autre fournisseur OpenID. Consultez ici pour plus d'informations. Suivez ces instructions pour configurer un service OpenID via Google.", + "oauth_description_warning": "Pour activer OAuth/OpenID, vous devez dĆ©finir l'URL de base, l'ID client et le secret client OAuth/OpenID dans le fichier config.ini, puis redĆ©marrer l'application. Pour les dĆ©finir Ć  partir des variables d'environnement, dĆ©finissez TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID et TRILIUM_OAUTH_CLIENT_SECRET.", + "oauth_missing_vars": "ParamĆØtres manquantsĀ : {{-variables}}", + "oauth_user_account": "Compte utilisateur: ", + "oauth_user_not_logged_in": "Pas connecté !" }, "modal": { - "close": "Fermer" + "close": "Fermer", + "help_title": "Afficher plus d'informations sur cet Ć©cran" }, "ai_llm": { "not_started": "Non dĆ©marrĆ©", @@ -1690,6 +1787,305 @@ "anthropic_configuration": "Configuration Anthropic", "voyage_configuration": "Configuration IA Voyage", "voyage_url_description": "DĆ©faut: https://api.voyageai.com/v1", - "ollama_configuration": "Configuration Ollama" + "ollama_configuration": "Configuration Ollama", + "total_notes": "Notes totales", + "progress": "ProgrĆØs", + "queued_notes": "Notes dans la file d'attente", + "refresh_stats": "RafraĆ®chir les statistiques", + "enable_ai_features": "Activer les fonctionnalitĆ©s IA/LLM", + "enable_ai_description": "Activer les fonctionnalitĆ©s IA telles que le rĆ©sumĆ© des notes, la gĆ©nĆ©ration de contenu et autres fonctionnalitĆ©s LLM", + "openai_tab": "OpenAI", + "anthropic_tab": "Anthropic", + "voyage_tab": "Voyage AI", + "ollama_tab": "Ollama", + "enable_ai": "Activer les fonctionnalitĆ©s IA/LLM", + "enable_ai_desc": "Activer les fonctionnalitĆ©s IA telles que le rĆ©sumĆ© des notes, la gĆ©nĆ©ration de contenu et autres fonctionnalitĆ©s LLM", + "provider_configuration": "Configuration du fournisseur IA", + "provider_precedence_description": "Liste de fournisseurs sĆ©parĆ©s par virgule, par ordre de prĆ©fĆ©rence (ex. 'openai,anthopic,ollama')", + "temperature": "TempĆ©rature", + "temperature_description": "ContrĆ“le de l'alĆ©atoiritĆ© dans les rĆ©ponses (0 = dĆ©terministe, 2 = hasard maximum)", + "system_prompt": "Prompt systĆØme", + "system_prompt_description": "Prompt systĆØme par dĆ©faut pour toutes les intĆ©ractions IA", + "openai_configuration": "Configuration OpenAI", + "openai_settings": "Options OpenAI", + "api_key": "Clef API", + "url": "URL de base", + "model": "ModĆØle", + "openai_api_key_description": "Votre clef API OpenAI pour accĆ©der Ć  leurs services IA", + "anthropic_api_key_description": "Votre clef API Anthropic pour accĆ©der aux modĆØles Claude", + "default_model": "ModĆØle par dĆ©faut", + "openai_model_description": "ExemplesĀ : gpt-4o, gpt-4-turbo, gpt-3.5-turbo", + "base_url": "URL de base", + "openai_url_description": "DĆ©fautĀ : https://api.openai.com/v1", + "anthropic_settings": "RĆ©glages Anthropic", + "enable_ollama": "Activer Ollama", + "enable_ollama_description": "Activer Ollama comme modĆØle d'IA local", + "ollama_url": "URL Ollama", + "ollama_model": "ModĆØle Ollama", + "refresh_models": "RafraĆ®chir les modĆØles", + "refreshing_models": "Mise Ć  jour...", + "enable_automatic_indexing": "Activer l'indexage automatique", + "rebuild_index": "RafraĆ®chir l'index", + "rebuild_index_error": "Erreur dans le dĆ©marrage du rafraichissement de l'index. Veuillez consulter les logs pour plus de dĆ©tails.", + "note_title": "Titre de la note", + "error": "Erreur", + "last_attempt": "Dernier essai", + "actions": "Actions", + "retry": "RĆ©essayer", + "partial": "ComplĆ©tĆ© Ć  {{ percentage }}%", + "retry_queued": "Note ajoutĆ©e Ć  la file d'attente", + "retry_failed": "Echec de l'ajout de la note Ć  la file d'attente", + "max_notes_per_llm_query": "Notes maximum par requĆŖte", + "max_notes_per_llm_query_description": "Nombre maximum de notes similaires Ć  inclure dans le contexte IA", + "active_providers": "Fournisseurs actifs", + "disabled_providers": "Fournisseurs dĆ©sactivĆ©s", + "remove_provider": "Retirer le fournisseur de la recherche", + "similarity_threshold": "Seuil de similaritĆ©", + "similarity_threshold_description": "Seuil de similaritĆ© minimum (0-1) pour que inclure les notes dans le contexte d'une requĆŖte IA", + "reprocess_index": "RafraĆ®chir l'index de recherche", + "reprocessing_index": "Mise Ć  jour...", + "reprocess_index_started": "L'optimisation de l'indice de recherche Ć  commencer en arriĆØre-plan", + "reprocess_index_error": "Erreur dans le rafraichissement de l'indice de recherche", + "failed_notes": "Notes en erreur", + "last_processed": "Dernier traitement", + "restore_provider": "Restaurer le fournisseur de recherche", + "index_rebuild_progress": "Progression de la reconstruction de l'index", + "index_rebuilding": "Optimisation de l'index ({{percentage}}%)", + "index_rebuild_complete": "Optimisation de l'index terminĆ©e", + "index_rebuild_status_error": "Erreur lors de la vĆ©rification de l'Ć©tat de reconstruction de l'index", + "provider_precedence": "PrioritĆ© du fournisseur", + "never": "Jamais", + "processing": "Traitement en cours ({{percentage}}%)", + "incomplete": "Incomplet ({{percentage}}%)", + "complete": "TerminĆ© (100%)", + "refreshing": "Mise Ć  jour...", + "auto_refresh_notice": "Actualisation automatique toutes les {{seconds}} secondes", + "note_queued_for_retry": "Note mise en file d'attente pour une nouvelle tentative", + "failed_to_retry_note": "Ɖchec de la nouvelle tentative de note", + "all_notes_queued_for_retry": "Toutes les notes ayant Ć©chouĆ© sont mises en file d'attente pour une nouvelle tentative", + "failed_to_retry_all": "Ɖchec du rĆ© essai des notes", + "ai_settings": "ParamĆØtres IA", + "api_key_tooltip": "ClĆ© API pour accĆ©der au service", + "empty_key_warning": { + "anthropic": "La clĆ© API Anthropic est vide. Veuillez saisir une clĆ© API valide.", + "openai": "La clĆ© API OpenAI est vide. Veuillez saisir une clĆ© API valide.", + "voyage": "La clĆ© API Voyage est vide. Veuillez saisir une clĆ© API valide.", + "ollama": "La clĆ© API Ollama est vide. Veuillez saisir une clĆ© API valide." + }, + "agent": { + "processing": "Traitement...", + "thinking": "RĆ©flexion...", + "loading": "Chargement...", + "generating": "GĆ©nĆ©ration..." + }, + "name": "IA", + "openai": "OpenAI", + "use_enhanced_context": "Utiliser un contexte amĆ©liorĆ©", + "enhanced_context_description": "Fournit Ć  l'IA plus de contexte Ć  partir de la note et de ses notes associĆ©es pour de meilleures rĆ©ponses", + "show_thinking": "Montrer la rĆ©flexion", + "show_thinking_description": "Montrer la chaĆ®ne de pensĆ©e de l'IA", + "enter_message": "Entrez votre message...", + "error_contacting_provider": "Erreur lors de la connexion au fournisseur d'IA. Veuillez vĆ©rifier vos paramĆØtres et votre connexion Internet.", + "error_generating_response": "Erreur lors de la gĆ©nĆ©ration de la rĆ©ponse de l'IA", + "index_all_notes": "Indexer toutes les notes", + "index_status": "Statut de l'index", + "indexed_notes": "Notes indexĆ©es", + "indexing_stopped": "ArrĆŖt de l'indexation", + "indexing_in_progress": "Indexation en cours...", + "last_indexed": "DerniĆØre indexĆ©e", + "note_chat": "Note discussion", + "sources": "Sources", + "start_indexing": "DĆ©marrage de l'indexation", + "use_advanced_context": "Utiliser le contexte avancĆ©", + "ollama_no_url": "Ollama n'est pas configurĆ©. Veuillez saisir une URL valide.", + "chat": { + "root_note_title": "Discussions IA", + "root_note_content": "Cette note contient vos conversations de chat IA enregistrĆ©es.", + "new_chat_title": "Nouvelle discussion", + "create_new_ai_chat": "CrĆ©er une nouvelle discussion IA" + }, + "create_new_ai_chat": "CrĆ©er une nouvelle discussion IA", + "configuration_warnings": "Il y a quelques problĆØmes avec la configuration de votre IA. Veuillez vĆ©rifier vos paramĆØtres.", + "experimental_warning": "La fonctionnalitĆ© LLM est actuellement expĆ©rimentale – vous ĆŖtes prĆ©venu.", + "selected_provider": "Fournisseur sĆ©lectionnĆ©", + "selected_provider_description": "Choisissez le fournisseur d’IA pour les fonctionnalitĆ©s de discussion et de complĆ©tion", + "select_model": "SĆ©lectionner le modĆØle...", + "select_provider": "SĆ©lectionnez un fournisseur...", + "ai_enabled": "FonctionnalitĆ©s d'IA activĆ©es", + "ai_disabled": "FonctionnalitĆ©s d'IA dĆ©sactivĆ©es", + "no_models_found_online": "Aucun modĆØle trouvĆ©. Veuillez vĆ©rifier votre clĆ© API et vos paramĆØtres.", + "no_models_found_ollama": "Aucun modĆØle Ollama trouvĆ©. Veuillez vĆ©rifier si Ollama est en cours d'exĆ©cution.", + "error_fetching": "Erreur lors de la rĆ©cupĆ©ration des modĆØlesĀ : {{error}}" + }, + "ui-performance": { + "title": "Performance", + "enable-motion": "Activer les transitions et animations", + "enable-shadows": "Activer les ombres", + "enable-backdrop-effects": "Activer les effets d'arriĆØre plan pour les menus, popups et panneaux", + "enable-smooth-scroll": "Active le dĆ©filement fluide", + "app-restart-required": "(redĆ©marrer l'application pour appliquer les changements)" + }, + "custom_date_time_format": { + "title": "Format de date/heure personnalisĆ©", + "description": "Personnalisez le format de la date et de l'heure insĆ©rĆ©es via ou la barre d'outils. Consultez la Day.js docs pour connaĆ®tre les formats disponibles.", + "format_string": "ChaĆ®ne de formatĀ :", + "formatted_time": "Date/heure formatĆ©eĀ :" + }, + "table_view": { + "delete_column_confirmation": "Êtes-vous sĆ»r de vouloir supprimer cette colonneĀ ? L'attribut correspondant sera supprimĆ© de toutes les notes.", + "delete-column": "Supprimer la colonne", + "new-column-label": "Ɖtiquette", + "new-column-relation": "Relation", + "edit-column": "Editer la colonne", + "add-column-to-the-right": "Ajouter une colonne Ć  droite", + "new-row": "Nouvelle ligne", + "new-column": "Nouvelle colonne", + "sort-column-by": "Trier par « {{title}}Ā Ā»", + "sort-column-ascending": "Ascendant", + "sort-column-descending": "Descendant", + "sort-column-clear": "Annuler le tri", + "hide-column": "Masquer la colonne \"{{title}}\"", + "show-hide-columns": "Afficher/masquer les colonnes", + "row-insert-above": "InsĆ©rer une ligne au-dessus", + "row-insert-below": "InsĆ©rer une ligne au-dessous", + "row-insert-child": "InsĆ©rer une note enfant", + "add-column-to-the-left": "Ajouter une colonne Ć  gauche" + }, + "book_properties_config": { + "hide-weekends": "Masquer les week-ends", + "display-week-numbers": "Afficher les numĆ©ros de semaine", + "map-style": "Style de carteĀ :", + "max-nesting-depth": "Profondeur d'imbrication maximaleĀ :", + "raster": "Trame", + "vector_light": "Vecteur (clair)", + "vector_dark": "Vecteur (foncĆ©)", + "show-scale": "Afficher l'Ć©chelle" + }, + "table_context_menu": { + "delete_row": "Supprimer la ligne" + }, + "board_view": { + "delete-note": "Supprimer la note...", + "remove-from-board": "Retirer du tableau", + "archive-note": "Note archivĆ©e", + "unarchive-note": "Note dĆ©sarchivĆ©e", + "move-to": "DĆ©placer vers", + "insert-above": "InsĆ©rer au-dessus", + "insert-below": "InsĆ©rer au-dessous", + "delete-column": "Supprimer la colonne", + "delete-column-confirmation": "Êtes-vous sĆ»r de vouloir supprimer cette colonne ? L'attribut correspondant sera Ć©galement supprimĆ© dans les notes sous cette colonne.", + "new-item": "Nouvel article", + "new-item-placeholder": "Entrez le titre de note...", + "add-column": "Ajouter une colonne", + "add-column-placeholder": "Entrez le nom de la colonne...", + "edit-note-title": "Cliquez pour modifier le titre de la note", + "edit-column-title": "Cliquez pour modifier le titre de la colonne" + }, + "presentation_view": { + "edit-slide": "Modifier cette diapositive", + "start-presentation": "DĆ©marrer la prĆ©sentation", + "slide-overview": "Afficher un aperƧu des diapositives" + }, + "command_palette": { + "tree-action-name": "ArborescenceĀ : {{name}}", + "export_note_title": "Exporter la note", + "export_note_description": "Exporter la note actuelle", + "show_attachments_title": "Afficher les piĆØces jointes", + "show_attachments_description": "Afficher les piĆØces jointes des notes", + "search_notes_title": "Rechercher des notes", + "search_notes_description": "Ouvrir la recherche avancĆ©e", + "search_subtree_title": "Rechercher dans la sous-arborescence", + "search_subtree_description": "Rechercher dans la sous-arborescence actuelle", + "search_history_title": "Afficher l'historique de recherche", + "search_history_description": "Afficher les recherches prĆ©cĆ©dentes", + "configure_launch_bar_title": "Configurer la barre de lancement", + "configure_launch_bar_description": "Ouvrir la configuration de la barre de lancement pour ajouter ou supprimer des Ć©lĆ©ments." + }, + "content_renderer": { + "open_externally": "Ouverture externe" + }, + "call_to_action": { + "next_theme_title": "Essayez le nouveau thĆØme Trilium", + "next_theme_message": "Vous utilisez actuellement le thĆØme hĆ©ritĆ© de l'ancienne version, souhaitez-vous essayer le nouveau thĆØme ?", + "next_theme_button": "Essayez le nouveau thĆØme", + "background_effects_title": "Les effets d'arriĆØre-plan sont dĆ©sormais stables", + "background_effects_message": "Sur les appareils Windows, les effets d'arriĆØre-plan sont dĆ©sormais parfaitement stables. Ils ajoutent une touche de couleur Ć  l'interface utilisateur en floutant l'arriĆØre-plan. Cette technique est Ć©galement utilisĆ©e dans d'autres applications comme l'Explorateur Windows.", + "background_effects_button": "Activer les effets d'arriĆØre-plan", + "dismiss": "Rejeter" + }, + "settings": { + "related_settings": "ParamĆØtres associĆ©s" + }, + "settings_appearance": { + "related_code_blocks": "SchĆ©ma de coloration syntaxique pour les blocs de code dans les notes de texte", + "related_code_notes": "SchĆ©ma de couleurs pour les notes de code" + }, + "units": { + "percentage": "%" + }, + "pagination": { + "page_title": "Page de {{startIndex}} - {{endIndex}}", + "total_notes": "{{count}} notes" + }, + "collections": { + "rendering_error": "Impossible d'afficher le contenu en raison d'une erreur." + }, + "code-editor-options": { + "title": "Ɖditeur" + }, + "tasks": { + "due": { + "today": "Aujourd'hui", + "tomorrow": "Demain", + "yesterday": "Hier" + } + }, + "content_widget": { + "unknown_widget": "Widget inconnu pour « {{id}}Ā Ā»." + }, + "note_language": { + "not_set": "Non dĆ©fini", + "configure-languages": "Configurer les langues..." + }, + "content_language": { + "title": "Contenu des langues", + "description": "SĆ©lectionnez une ou plusieurs langues Ć  afficher dans la section « PropriĆ©tĆ©s de baseĀ Ā» d'une note textuelle en lecture seule ou modifiable. Cela permettra d'utiliser des fonctionnalitĆ©s telles que la vĆ©rification orthographique ou la prise en charge de l'Ć©criture de droite Ć  gauche." + }, + "switch_layout_button": { + "title_vertical": "DĆ©placer le volet d'Ć©dition vers le bas", + "title_horizontal": "DĆ©placer le panneau d'Ć©dition vers la gauche" + }, + "toggle_read_only_button": { + "unlock-editing": "DĆ©verrouiller l'Ć©dition", + "lock-editing": "Verrouiller l'Ć©dition" + }, + "png_export_button": { + "button_title": "Exporter le diagramme au format PNG" + }, + "svg": { + "export_to_png": "Le diagramme n'a pas pu ĆŖtre exportĆ© au format PNG." + }, + "code_theme": { + "title": "Apparence", + "word_wrapping": "retour Ć  la ligne automatique", + "color-scheme": "Jeu de couleurs" + }, + "cpu_arch_warning": { + "title": "Veuillez tĆ©lĆ©charger la version ARM64", + "message_macos": "TriliumNext fonctionne actuellement sous Rosetta 2, ce qui signifie que vous utilisez la version Intel (x64) sur un Mac Apple Silicon. Cela aura un impact significatif sur les performances et l'autonomie de la batterie.", + "message_windows": "TriliumNext fonctionne actuellement en mode Ć©mulation, ce qui signifie que vous utilisez la version Intel (x64) sur un appareil Windows sur ARM. Cela aura un impact significatif sur les performances et l'autonomie de la batterie.", + "recommendation": "Pour une expĆ©rience optimale, veuillez tĆ©lĆ©charger la version ARM64 native de TriliumNext depuis notre page de versions.", + "download_link": "TĆ©lĆ©charger la version native", + "continue_anyway": "Continuer quand mĆŖme", + "dont_show_again": "Ne plus afficher cet avertissement" + }, + "editorfeatures": { + "title": "CaractĆ©ristiques", + "emoji_completion_enabled": "Activer la saisie semi-automatique des emojis", + "emoji_completion_description": "Si cette option est activĆ©e, les emojis peuvent ĆŖtre facilement insĆ©rĆ©s dans le texte en tapant `:` , suivi du nom d'un emoji.", + "note_completion_enabled": "Activer la saisie semi-automatique des notes", + "note_completion_description": "Si cette option est activĆ©e, des liens vers des notes peuvent ĆŖtre crƩƩs en tapant `@` suivi du titre d'une note.", + "slash_commands_enabled": "Activer les commandes slash", + "slash_commands_description": "Si cette option est activĆ©e, les commandes d'Ć©dition telles que l'insertion de sauts de ligne ou d'en-tĆŖtes peuvent ĆŖtre activĆ©es en tapant `/`." } } diff --git a/apps/client/src/translations/hr/translation.json b/apps/client/src/translations/hr/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/client/src/translations/hr/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json new file mode 100644 index 000000000..9cb3e2e4d --- /dev/null +++ b/apps/client/src/translations/id/translation.json @@ -0,0 +1,32 @@ +{ + "about": { + "title": "Tentang Trilium Notes", + "homepage": "Halaman utama:", + "app_version": "Versi Aplikasi:", + "db_version": "Versi DB:", + "sync_version": "Versi sinkronisasi:", + "build_date": "Tanggal pembuatan:", + "build_revision": "Revisi pembuatan:", + "data_directory": "Direktori data:" + }, + "toast": { + "critical-error": { + "title": "Kesalahan kritis", + "message": "Telah terjadi kesalahan kritis yang mencegah aplikasi klien untuk memulai:\n\n{{message}}\n\nHal ini kemungkinan besar disebabkan oleh skrip yang gagal secara tidak terduga. Coba jalankan aplikasi dalam mode aman dan atasi masalahnya." + }, + "widget-error": { + "title": "Gagal menginisialisasi widget", + "message-custom": "Widget kustom dari catatan dengan ID \"{{id}}\", berjudul \"{{title}}\" tidak dapat diinisialisasi karena:\n\n{{message}}", + "message-unknown": "Widget tidak dikenal tidak dapat diinisialisasi karena:\n\n{{message}}" + }, + "bundle-error": { + "title": "Gagal memuat skrip kustom", + "message": "Skrip dari catatan dengan ID \"{{id}}\", berjudul \"{{title}}\" tidak dapat dijalankan karena:\n\n{{message}}" + } + }, + "add_link": { + "add_link": "Tambah tautan", + "help_on_links": "Bantuan pada tautan", + "note": "Catatan" + } +} diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index f83602521..a49a9a5dc 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -20,7 +20,7 @@ }, "widget-error": { "title": "Impossibile inizializzare un widget", - "message-custom": "Il widget personalizzato della nota con ID \"{{id}}\", dal titolo \"{{title}}\" non ĆØ stato inizializzato a causa di:\n\n{{message}}", + "message-custom": "Il widget personalizzato dalla nota con ID ā€œ{{id}}ā€, intitolato ā€œ{{title}}ā€, non ĆØ stato possibile inizializzare a causa di:\n\n{{message}}", "message-unknown": "Un widget sconosciuto non ĆØ stato inizializzato a causa di:\n\n{{message}}" } }, @@ -31,7 +31,7 @@ "link_title_mirrors": "il titolo del collegamento rispecchia il titolo della nota corrente", "link_title_arbitrary": "il titolo del collegamento può essere modificato arbitrariamente", "link_title": "Titolo del collegamento", - "button_add_link": "Aggiungi il collegamento invio", + "button_add_link": "Aggiungi il collegamento", "help_on_links": "Aiuto sui collegamenti" }, "branch_prefix": { @@ -63,7 +63,7 @@ "search_for_note_by_its_name": "cerca una nota per nome", "cloned_note_prefix_title": "Le note clonate saranno mostrate nell'albero delle note con il dato prefisso", "prefix_optional": "Prefisso (opzionale)", - "clone_to_selected_note": "Clona sotto la nota selezionata invio", + "clone_to_selected_note": "Clona verso la nota selezionata invio", "no_path_to_clone_to": "Nessun percorso per clonare dentro.", "note_cloned": "La nota \"{{clonedTitle}}\" ĆØ stata clonata in \"{{targetTitle}}\"" }, @@ -79,18 +79,19 @@ "ok": "OK", "close": "Chiudi", "delete_notes_preview": "Anteprima di eliminazione delle note", - "delete_all_clones_description": "Elimina anche tutti i cloni (può essere disfatto tramite i cambiamenti recenti)", + "delete_all_clones_description": "Elimina anche tutti i cloni (può essere ripristinato nella sezione cambiamenti recenti)", "erase_notes_description": "L'eliminazione normale (soft) marca le note come eliminate e potranno essere recuperate entro un certo lasso di tempo (dalla finestra dei cambiamenti recenti). Selezionando questa opzione le note si elimineranno immediatamente e non sarĆ  possibile recuperarle.", "erase_notes_warning": "Elimina le note in modo permanente (non potrĆ  essere disfatto), compresi tutti i cloni. Ciò forzerĆ  un nuovo caricamento dell'applicazione.", "cancel": "Annulla", - "notes_to_be_deleted": "Le seguenti note saranno eliminate ({{- noteCount}})", + "notes_to_be_deleted": "Le seguenti note saranno eliminate ({{notesCount}})", "no_note_to_delete": "Nessuna nota sarĆ  eliminata (solo i cloni).", - "broken_relations_to_be_deleted": "Le seguenti relazioni saranno interrotte ed eliminate ({{- relationCount}})", + "broken_relations_to_be_deleted": "Le seguenti relazioni saranno interrotte ed eliminate ({{relationCount}})", "deleted_relation_text": "La nota {{- note}} (da eliminare) ĆØ referenziata dalla relazione {{- relation}} originata da {{- source}}." }, "info": { "okButton": "OK", - "closeButton": "Chiudi" + "closeButton": "Chiudi", + "modalTitle": "Messaggio informativo" }, "export": { "close": "Chiudi", @@ -105,29 +106,64 @@ "format_html": "HTML - raccomandato in quanto mantiene tutti i formati", "format_html_zip": "HTML in archivio ZIP - questo ĆØ raccomandato in quanto conserva tutta la formattazione.", "format_markdown": "MArkdown - questo conserva la maggior parte della formattazione.", - "export_type_single": "Solo questa nota, senza le sottostanti" + "export_type_single": "Solo questa nota, senza le sottostanti", + "format_opml": "OPML - formato per scambio informazioni outline. Formattazione, immagini e files non sono inclusi.", + "opml_version_1": "OPML v.1.0 - solo testo semplice", + "opml_version_2": "OPML v2.0 - supporta anche HTML" }, "password_not_set": { "body1": "Le note protette sono crittografate utilizzando una password utente, ma la password non ĆØ stata ancora impostata.", - "body2": "Per proteggere le note, fare clic su qui per aprire la finestra di dialogo Opzioni e impostare la password." + "body2": "Per proteggere le note, clicca sul pulsante sottostante per aprire la finestra di dialogo Opzioni e impostare la tua password.", + "title": "La password non ĆØ impostata", + "go_to_password_options": "Vai alle opzioni della password" }, "protected_session_password": { - "close_label": "Chiudi" + "close_label": "Chiudi", + "modal_title": "Sessione protetta", + "help_title": "Aiuto sulle note protette", + "form_label": "Per procedere con l’azione richiesta, ĆØ necessario avviare una sessione protetta inserendo la password:", + "start_button": "Avvia sessione protetta" }, "abstract_bulk_action": { "remove_this_search_action": "Rimuovi questa azione di ricerca" }, "etapi": { "new_token_title": "Nuovo token ETAPI", - "new_token_message": "Inserire il nuovo nome del token" + "new_token_message": "Inserisci il nome del nuovo token", + "title": "ETAPI", + "description": "ETAPI ĆØ un'API REST utilizzata per accedere alle istanze di Trilium in modo programmatico, senza interfaccia utente.", + "see_more": "Per maggiori dettagli consulta {{- link_to_wiki}} e {{- link_to_openapi_spec}} o {{- link_to_swagger_ui}}.", + "wiki": "wiki", + "openapi_spec": "Specifiche ETAPI OpenAPI", + "swagger_ui": "Interfaccia utente ETAPI Swagger", + "create_token": "Crea un nuovo token ETAPI", + "existing_tokens": "Token esistenti", + "no_tokens_yet": "Non ci sono ancora token. Clicca sul pulsante qui sopra per crearne uno.", + "token_name": "Nome del token", + "created": "Creato", + "actions": "Azioni", + "default_token_name": "nuovo token", + "error_empty_name": "Il nome del token non può essere vuoto", + "token_created_title": "Token ETAPI creato", + "token_created_message": "Copia il token creato negli appunti. Trilium memorizza l'hash del token e questa ĆØ l'ultima volta che lo vedi.", + "rename_token": "Rinomina questo token", + "delete_token": "Elimina/disattiva questo token", + "rename_token_title": "Rinomina token", + "rename_token_message": "Inserisci il nome del nuovo token", + "delete_token_confirmation": "Sei sicuro di voler eliminare il token ETAPI \"{{name}}\"?" }, "electron_integration": { "zoom-factor": "Fattore di ingrandimento", - "desktop-application": "Applicazione Desktop" + "desktop-application": "Applicazione Desktop", + "native-title-bar": "Barra del titolo nativa", + "native-title-bar-description": "Su Windows e macOS, disattivare la barra del titolo nativa rende l'applicazione più compatta. Su Linux, attivarla si integra meglio con il resto del sistema.", + "background-effects": "Abilita effetti di sfondo (solo Windows 11)", + "background-effects-description": "L'effetto Mica aggiunge uno sfondo sfocato ed elegante alle finestre delle app, creando profonditĆ  e un aspetto moderno. La \"Barra del titolo nativa\" deve essere disattivata.", + "restart-app-button": "Riavviare l'applicazione per visualizzare le modifiche" }, "note_autocomplete": { "search-for": "Cerca \"{{term}}\"", - "create-note": "Crea e collega la nota figlia \"{{term}}\"", + "create-note": "Crea e collega la nota secondaria ā€œ{{term}}ā€", "insert-external-link": "Inserisci il collegamento esterno a \"{{term}}\"", "clear-text-field": "Pulisci il campo di testo", "show-recent-notes": "Mostra le note recenti", @@ -148,31 +184,44 @@ "add-note": "Aggiungi un marcatore in questa posizione" }, "debug": { - "debug": "Debug" + "debug": "Debug", + "debug_info": "Debug stamperĆ  informazioni di debug aggiuntive nella console per facilitare il debug di query complesse.", + "access_info": "Per accedere alle informazioni di debug, eseguire la query e fare clic su \"Mostra registro backend\" nell'angolo in alto a sinistra." }, "database_anonymization": { "light_anonymization": "Anonimizzazione parziale", - "title": "Anonimizzazione del Database", + "title": "Anonimizzazione dei database", "full_anonymization": "Anonimizzazione completa", - "full_anonymization_description": "Questa azione creerĆ  una nuova copia del database e lo anonimizzerĆ  (rimuove tutti i contenuti delle note, lasciando solo la struttura e qualche metadato non sensibile) per condividerlo online allo scopo di debugging, senza paura di far trapelare i tuoi dati personali.", - "save_fully_anonymized_database": "Salva il database completamente anonimizzato", + "full_anonymization_description": "Questa azione creerĆ  una nuova copia del database e la renderĆ  anonima (rimuovendo tutto il contenuto delle note e lasciando solo la struttura e alcuni metadati non sensibili) per poterla condividere online a scopo di debug senza timore di divulgare i tuoi dati personali.", + "save_fully_anonymized_database": "Salva database completamente anonimizzato", "light_anonymization_description": "Questa azione creerĆ  una nuova copia del database e lo anonimizzerĆ  in parzialmente — in particolare, solo il contenuto delle note sarĆ  rimosso, ma i titoli e gli attributi rimarranno. Inoltre, note con script personalizzati JS di frontend/backend e widget personalizzati lasciando rimarranno. Ciò mette a disposizione più contesto per il debug dei problemi.", "choose_anonymization": "Puoi decidere da solo se fornire un database completamente o parzialmente anonimizzato. Anche un database completamente anonimizzato ĆØ molto utile, sebbene in alcuni casi i database parzialmente anonimizzati possono accelerare il processo di identificazione dei bug e la loro correzione.", - "no_anonymized_database_yet": "Nessun database ancora anonimizzato.", - "save_lightly_anonymized_database": "Salva il database parzialmente anonimizzato", + "no_anonymized_database_yet": "Ancora nessun database anonimizzato.", + "save_lightly_anonymized_database": "Salva database leggermente anonimizzato", "successfully_created_fully_anonymized_database": "Database completamente anonimizzato creato in {{anonymizedFilePath}}", - "successfully_created_lightly_anonymized_database": "Database parzialmente anonimizzato creato in {{anonymizedFilePath}}" + "successfully_created_lightly_anonymized_database": "Database parzialmente anonimizzato creato in {{anonymizedFilePath}}", + "existing_anonymized_databases": "Database anonimizzati esistenti", + "creating_fully_anonymized_database": "Creazione di un database completamente anonimizzato...", + "creating_lightly_anonymized_database": "Creazione di un database leggermente anonimizzato...", + "error_creating_anonymized_database": "Impossibile creare un database anonimo, controllare i log del backend per i dettagli" }, "cpu_arch_warning": { "title": "Per favore scarica la versione ARM64", - "continue_anyway": "Continua Comunque", + "continue_anyway": "Continua comunque", "dont_show_again": "Non mostrare più questo avviso", - "download_link": "Scarica la Versione Nativa" + "download_link": "Scarica la Versione Nativa", + "message_macos": "Al momento TriliumNext ĆØ in esecuzione con la traduzione Rosetta 2, il che significa che stai utilizzando la versione Intel (x64) su Mac con Apple Silicon. Ciò avrĆ  un impatto significativo sulle prestazioni e sulla durata della batteria.", + "message_windows": "TriliumNext ĆØ attualmente in emulazione, il che significa che stai utilizzando la versione Intel (x64) su un dispositivo Windows su ARM. Ciò avrĆ  un impatto significativo sulle prestazioni e sulla durata della batteria.", + "recommendation": "Per un'esperienza ottimale, scarica la versione nativa ARM64 di TriliumNext dalla nostra pagina delle versioni." }, "editorfeatures": { "title": "Caratteristiche", "emoji_completion_enabled": "Abilita il completamento automatico delle Emoji", - "note_completion_enabled": "Abilita il completamento automatico delle note" + "note_completion_enabled": "Abilita il completamento automatico delle note", + "emoji_completion_description": "Se abilitata, ĆØ possibile inserire facilmente gli emoji nel testo digitando `:`, seguito dal nome dell'emoji.", + "note_completion_description": "Se abilitato, ĆØ possibile creare collegamenti alle note digitando `@` seguito dal titolo di una nota.", + "slash_commands_enabled": "Abilita i comandi slash", + "slash_commands_description": "Se abilitato, i comandi di modifica come l'inserimento di interruzioni di riga o intestazioni possono essere attivati digitando `/`." }, "table_view": { "new-row": "Nuova riga", @@ -184,24 +233,49 @@ "hide-column": "Nascondi la colonna \"{{title}}\"", "show-hide-columns": "Mostra/nascondi le colonne", "row-insert-above": "Inserisci una riga sopra", - "row-insert-below": "Inserisci una riga sotto" + "row-insert-below": "Inserisci una riga sotto", + "row-insert-child": "Inserisci nota secondaria", + "add-column-to-the-left": "Aggiungi colonna a sinistra", + "add-column-to-the-right": "Aggiungi colonna a destra", + "edit-column": "Modifica colonna", + "delete_column_confirmation": "Vuoi davvero eliminare questa colonna? L'attributo corrispondente verrĆ  rimosso da tutte le note.", + "delete-column": "Elimina colonna", + "new-column-label": "Etichetta", + "new-column-relation": "Relazione" }, "abstract_search_option": { "remove_this_search_option": "Rimuovi questa opzione di ricerca", "failed_rendering": "Opzione di ricerca di rendering non riuscita: {{dto}} con errore: {{error}} {{stack}}" }, "ancestor": { - "label": "Antenato" + "label": "Antenato", + "placeholder": "cerca la nota per nome", + "depth_label": "profonditĆ ", + "depth_doesnt_matter": "non importa", + "depth_eq": "ĆØ esattamente {{count}}", + "direct_children": "figli diretti", + "depth_gt": "ĆØ maggiore di {{count}}", + "depth_lt": "ĆØ inferiore a {{count}}" }, "add_label": { "add_label": "Aggiungi etichetta", "label_name_placeholder": "nome dell'etichetta", "new_value_placeholder": "nuovo valore", - "to_value": "al valore" + "to_value": "al valore", + "label_name_title": "Sono consentiti caratteri alfanumerici, trattino basso e due punti.", + "help_text": "Su tutte le note abbinate:", + "help_text_item1": "crea l'etichetta data se la nota non ne ha ancora una", + "help_text_item2": "o modificare il valore dell'etichetta esistente", + "help_text_note": "ƈ possibile chiamare questo metodo anche senza valore, in tal caso l'etichetta verrĆ  assegnata alla nota senza valore." }, "update_label_value": { "to_value": "al valore", - "label_name_placeholder": "nome dell'etichetta" + "label_name_placeholder": "nome dell'etichetta", + "update_label_value": "Aggiorna il valore dell'etichetta", + "label_name_title": "Sono consentiti caratteri alfanumerici, trattino basso e due punti.", + "new_value_placeholder": "nuovo valore", + "help_text": "Su tutte le note corrispondenti, modifica il valore dell'etichetta esistente.", + "help_text_note": "ƈ possibile chiamare questo metodo anche senza valore, in tal caso l'etichetta verrĆ  assegnata alla nota senza valore." }, "delete_label": { "delete_label": "Elimina etichetta", @@ -210,51 +284,151 @@ }, "tree-context-menu": { "move-to": "Muovi in...", - "cut": "Taglia" + "cut": "Taglia", + "open-in-a-new-tab": "Apri in una nuova scheda", + "open-in-a-new-split": "Apri in una nuova divisione", + "insert-note-after": "Inserisci nota dopo", + "insert-child-note": "Inserisci nota secondaria", + "archive": "Archivio", + "unarchive": "Disarchiviare", + "delete": "Eliminare", + "search-in-subtree": "Cerca nel sottoalbero", + "hoist-note": "Nota di sollevamento", + "unhoist-note": "Nota di sgancio", + "edit-branch-prefix": "Modifica prefisso ramo", + "advanced": "Avanzato", + "expand-subtree": "Espandi sottoalbero", + "collapse-subtree": "Comprimi sottoalbero", + "sort-by": "Ordina per...", + "recent-changes-in-subtree": "Modifiche recenti nel sottoalbero", + "convert-to-attachment": "Converti in allegato", + "copy-note-path-to-clipboard": "Copia il percorso della nota negli appunti", + "protect-subtree": "Proteggi sottoalbero", + "unprotect-subtree": "Rimuovi protezione dal sottoalbero", + "copy-clone": "Copia / clona", + "clone-to": "Clona in...", + "paste-into": "Incolla in", + "paste-after": "Incolla dopo", + "duplicate": "Duplicato", + "export": "Esportare", + "import-into-note": "Importa nella nota", + "apply-bulk-actions": "Applica azioni in blocco", + "converted-to-attachments": "{{count}} note sono state convertite in allegati.", + "convert-to-attachment-confirm": "Sei sicuro di voler convertire le note selezionate in allegati delle note padre?", + "open-in-popup": "Modifica rapida" }, "electron_context_menu": { "cut": "Taglia", "copy": "Copia", "paste": "Incolla", "copy-link": "Copia collegamento", - "paste-as-plain-text": "Incolla come testo semplice" + "paste-as-plain-text": "Incolla come testo semplice", + "add-term-to-dictionary": "Aggiungi \"{{term}}\" al dizionario", + "search_online": "Cerca \"{{term}}\" con {{searchEngine}}" }, "editing": { "editor_type": { - "multiline-toolbar": "Mostra la barra degli strumenti su più linee se non entra." + "multiline-toolbar": "Mostra la barra degli strumenti su più linee se non entra.", + "label": "Barra degli strumenti di formattazione", + "floating": { + "title": "Galleggiante", + "description": "gli strumenti di modifica appaiono vicino al cursore;" + }, + "fixed": { + "title": "Fisso", + "description": "gli strumenti di modifica vengono visualizzati nella scheda \"Formattazione\" della barra multifunzione." + } } }, "edit_button": { "edit_this_note": "Modifica questa nota" }, "shortcuts": { - "shortcuts": "Scorciatoie" + "shortcuts": "Scorciatoie", + "keyboard_shortcuts": "Scorciatoie da tastiera", + "multiple_shortcuts": "Più scorciatoie per la stessa azione possono essere separate da virgola.", + "electron_documentation": "Consultare la documentazione di Electron per i modificatori e i codici chiave disponibili.", + "type_text_to_filter": "Digita il testo per filtrare le scorciatoie...", + "action_name": "Nome dell'azione", + "default_shortcuts": "Scorciatoie predefinite", + "description": "Descrizione", + "reload_app": "Ricarica l'app per applicare le modifiche", + "set_all_to_default": "Imposta tutte le scorciatoie sui valori predefiniti", + "confirm_reset": "Vuoi davvero ripristinare tutte le scorciatoie da tastiera ai valori predefiniti?" }, "shared_switch": { "toggle-on-title": "Condividi la nota", - "toggle-off-title": "Non condividere la nota" + "toggle-off-title": "Non condividere la nota", + "shared": "Condiviso", + "shared-branch": "Questa nota esiste solo come nota condivisa; annullando la condivisione verrebbe eliminata. Vuoi continuare ed eliminare questa nota?", + "inherited": "Non ĆØ possibile annullare la condivisione della nota in questo caso perchĆ© ĆØ condivisa tramite ereditĆ  da un antenato." }, "search_string": { - "search_prefix": "Cerca:" + "search_prefix": "Cerca:", + "title_column": "Stringa di ricerca:", + "placeholder": "parole chiave a testo completo, #tag = valore...", + "search_syntax": "Sintassi di ricerca", + "also_see": "vedi anche", + "complete_help": "aiuto completo sulla sintassi di ricerca", + "full_text_search": "Basta inserire un testo qualsiasi per la ricerca full text", + "label_abc": "restituisce note con etichetta abc", + "label_year": "corrisponde alle note con l'anno dell'etichetta avente valore 2019", + "label_rock_pop": "corrisponde alle note che hanno sia etichette rock che pop", + "label_rock_or_pop": "deve essere presente solo una delle etichette", + "label_year_comparison": "confronto numerico (anche >, >=, <).", + "label_date_created": "note create nell'ultimo mese", + "error": "Errore di ricerca: {{error}}" }, "attachment_detail": { - "open_help_page": "Apri la pagina di aiuto sugli allegati" + "open_help_page": "Apri la pagina di aiuto sugli allegati", + "owning_note": "Nota di proprietĆ : ", + "you_can_also_open": ", puoi anche aprire il ", + "list_of_all_attachments": "Elenco di tutti gli allegati", + "attachment_deleted": "Questo allegato ĆØ stato eliminato." }, "search_definition": { "ancestor": "antenato", "debug": "debug", "action": "azione", - "add_search_option": "Aggiungi un opzione di ricerca:", - "search_string": "cerca la stringa", - "limit": "limite" + "add_search_option": "Aggiungi opzione di ricerca:", + "search_string": "stringa di ricerca", + "limit": "limite", + "search_script": "script di ricerca", + "fast_search": "ricerca veloce", + "fast_search_description": "L'opzione di ricerca rapida disattiva la ricerca del testo completo del contenuto delle note, il che potrebbe velocizzare la ricerca in database di grandi dimensioni.", + "include_archived": "includere archiviato", + "include_archived_notes_description": "Per impostazione predefinita, le note archiviate sono escluse dai risultati della ricerca; con questa opzione verranno incluse.", + "order_by": "ordina per", + "limit_description": "Limita il numero di risultati", + "debug_description": "Debug stamperĆ  informazioni di debug aggiuntive nella console per facilitare il debug di query complesse", + "search_button": "Ricerca", + "search_execute": "Cerca ed esegui azioni", + "save_to_note": "Salva per annotare", + "search_parameters": "Parametri di ricerca", + "unknown_search_option": "Opzione di ricerca sconosciuta {{searchOptionName}}", + "search_note_saved": "La nota di ricerca ĆØ stata salvata in {{- notePathTitle}}", + "actions_executed": "Le azioni sono state eseguite." }, "modal": { - "close": "Chiudi" + "close": "Chiudi", + "help_title": "Visualizza maggiori informazioni su questa schermata" }, "board_view": { "insert-below": "Inserisci sotto", "delete-column": "Elimina la colonna", - "delete-column-confirmation": "Sei sicuro di vole eliminare questa colonna? Il corrispondente attributo sarĆ  eliminato anche nelle note sotto questa colonna." + "delete-column-confirmation": "Sei sicuro di vole eliminare questa colonna? Il corrispondente attributo sarĆ  eliminato anche nelle note sotto questa colonna.", + "delete-note": "Elimina nota...", + "remove-from-board": "Rimuovi dalla bacheca", + "archive-note": "Nota d'archivio", + "unarchive-note": "Decomprimi nota", + "move-to": "Spostarsi a", + "insert-above": "Inserisci sopra", + "new-item": "Nuovo articolo", + "new-item-placeholder": "Inserisci il titolo della nota...", + "add-column": "Aggiungi colonna", + "add-column-placeholder": "Inserisci il nome della colonna...", + "edit-note-title": "Fare clic per modificare il titolo della nota", + "edit-column-title": "Fare clic per modificare il titolo della colonna" }, "backup": { "enable_weekly_backup": "Abilita le archiviazioni settimanali", @@ -266,8 +440,10 @@ "date-and-time": "Data e ora", "path": "Percorso", "database_backed_up_to": "Il database ĆØ stato archiviato in {{backupFilePath}}", - "enable_daily_backup": "Abilita le archiviazioni giornaliere", - "no_backup_yet": "Ancora nessuna archiviazione" + "enable_daily_backup": "Abilita i backup giornalieri", + "no_backup_yet": "Ancora nessuna archiviazione", + "automatic_backup": "Backup Automatico", + "automatic_backup_description": "Trilium può eseguire automaticamente il backup del database:" }, "backend_log": { "refresh": "Aggiorna" @@ -275,19 +451,26 @@ "consistency_checks": { "find_and_fix_button": "Trova e correggi i problemi di coerenza", "finding_and_fixing_message": "In cerca e correzione dei problemi di coerenza...", - "issues_fixed_message": "Qualsiasi problema di coerenza che possa essere stato trovato ora ĆØ corretto." + "issues_fixed_message": "Qualsiasi problema di coerenza che possa essere stato trovato ora ĆØ corretto.", + "title": "Controlli di coerenza" }, "database_integrity_check": { "check_button": "Controllo dell'integritĆ  del database", "checking_integrity": "Controllo dell'integritĆ  del database in corso...", "title": "Controllo di IntegritĆ  del database", "description": "ControllerĆ  che il database non sia corrotto a livello SQLite. Può durare un po' di tempo, a seconda della grandezza del DB.", - "integrity_check_failed": "Controllo di integritĆ  fallito: {{results}}" + "integrity_check_failed": "Controllo di integritĆ  fallito: {{results}}", + "integrity_check_succeeded": "Controllo di integritĆ  riuscito: nessun problema riscontrato." }, "sync": { "title": "Sincronizza", "force_full_sync_button": "Forza una sincronizzazione completa", - "failed": "Sincronizzazione fallita: {{message}}" + "failed": "Sincronizzazione fallita: {{message}}", + "fill_entity_changes_button": "Compila i record delle modifiche dell'entitĆ ", + "full_sync_triggered": "Sincronizzazione completa attivata", + "filling_entity_changes": "Il riempimento delle righe modifica l'entitĆ ...", + "sync_rows_filled_successfully": "Sincronizzazione righe compilate correttamente", + "finished-successfully": "Sincronizzazione completata con successo." }, "sync_2": { "config_title": "Configurazione per la Sincronizzazione", @@ -296,10 +479,28 @@ "timeout": "Timeout per la sincronizzazione", "timeout_unit": "millisecondi", "save": "Salva", - "help": "Aiuto" + "help": "Aiuto", + "server_address": "Indirizzo dell'istanza del server", + "note": "Nota", + "note_description": "Se si lascia vuota l'impostazione del proxy, verrĆ  utilizzato il proxy di sistema (valido solo per le build desktop/electron).", + "special_value_description": "Un altro valore speciale ĆØ noproxy che forza l'ignoramento anche del proxy di sistema e rispetta NODE_TLS_REJECT_UNAUTHORIZED.", + "test_description": "Questo testerĆ  la connessione e l'handshake con il server di sincronizzazione. Se il server di sincronizzazione non ĆØ inizializzato, questo lo imposterĆ  per la sincronizzazione con il documento locale.", + "test_button": "Test di sincronizzazione", + "handshake_failed": "Handshake del server di sincronizzazione non riuscito, errore: {{message}}" }, "search_engine": { - "save_button": "Salva" + "save_button": "Salva", + "title": "Motore di ricerca", + "custom_search_engine_info": "Il motore di ricerca personalizzato richiede l'impostazione sia di un nome che di un URL. Se uno di questi non viene impostato, DuckDuckGo verrĆ  utilizzato come motore di ricerca predefinito.", + "predefined_templates_label": "Modelli predefiniti per motori di ricerca", + "bing": "Bing", + "baidu": "Baidu", + "duckduckgo": "DuckDuckGo", + "google": "Google", + "custom_name_label": "Nome del motore di ricerca personalizzato", + "custom_name_placeholder": "Personalizza il nome del motore di ricerca", + "custom_url_label": "L'URL del motore di ricerca personalizzato deve includere {keyword} come segnaposto per il termine di ricerca.", + "custom_url_placeholder": "Personalizza l'URL del motore di ricerca" }, "sql_table_schemas": { "tables": "Tabelle" @@ -317,10 +518,15 @@ "new_tab": "Nuova scheda" }, "toc": { - "table_of_contents": "Sommario" + "table_of_contents": "Sommario", + "options": "Opzioni" }, "table_of_contents": { - "title": "Sommario" + "title": "Sommario", + "description": "L'indice apparirĆ  nelle note di testo quando la nota contiene più di un numero definito di titoli. ƈ possibile personalizzare questo numero:", + "unit": "titoli", + "disable_info": "ƈ anche possibile utilizzare questa opzione per disattivare efficacemente l'indice impostando un numero molto alto.", + "shortcut_info": "ƈ possibile configurare una scorciatoia da tastiera per alternare rapidamente il riquadro destro (incluso il sommario) in Opzioni -> Scorciatoie (nome 'toggleRightPane')." }, "tray": { "title": "Vassoio di Sistema", @@ -328,12 +534,21 @@ }, "heading_style": { "title": "Stile dell'Intestazione", - "plain": "Normale", + "plain": "Semplice", "underline": "Sottolineato", "markdown": "Stile Markdown" }, "highlights_list": { - "title": "Punti salienti" + "title": "Elenco dei punti salienti", + "description": "ƈ possibile personalizzare l'elenco delle evidenziazioni visualizzato nel pannello di destra:", + "bold": "Testo in grassetto", + "italic": "Testo in corsivo", + "underline": "Testo sottolineato", + "color": "Testo colorato", + "bg_color": "Testo con colore di sfondo", + "visibility_title": "VisibilitĆ  dell'elenco dei punti salienti", + "visibility_description": "ƈ possibile nascondere il widget delle evidenziazioni per nota aggiungendo un'etichetta #hideHighlightWidget.", + "shortcut_info": "ƈ possibile configurare una scorciatoia da tastiera per alternare rapidamente il riquadro destro (inclusi i punti salienti) in Opzioni -> Scorciatoie (nome 'toggleRightPane')." }, "highlights_list_2": { "title": "Punti salienti", @@ -341,13 +556,1536 @@ }, "quick-search": { "placeholder": "Ricerca rapida", - "searching": "Ricerca in corso..." + "searching": "Ricerca in corso...", + "no-results": "Nessun risultato trovato", + "more-results": "... e altri {{number}} risultati.", + "show-in-full-search": "Mostra nella ricerca completa" }, "help": { "goUpDown": "su/giù nella lista delle note", "collapseExpand": "collassa/espande il nodo", "notSet": "non impostato", "goBackForwards": "indietro/avanti nella cronologia", - "showJumpToNoteDialog": "mostra la finestra di dialogo \"Salta alla nota\"" + "showJumpToNoteDialog": "mostra finestra di dialogo ā€œVai aā€", + "title": "Scheda riassuntiva", + "noteNavigation": "Nota navigazione", + "scrollToActiveNote": "scorri fino alla nota attiva", + "jumpToParentNote": "vai alla nota principale", + "collapseWholeTree": "comprimi l'intero albero delle note", + "collapseSubTree": "comprimi sottoalbero", + "tabShortcuts": "Scorciatoie delle schede", + "newTabNoteLink": "Il link alla nota apre la nota in una nuova scheda", + "newTabWithActivationNoteLink": "Il link alla nota si apre e attiva la nota in una nuova scheda", + "onlyInDesktop": "Solo nella versione desktop (Electron build)", + "openEmptyTab": "apri scheda vuota", + "closeActiveTab": "chiudi scheda attiva", + "activateNextTab": "attiva la scheda successiva", + "activatePreviousTab": "attiva la scheda precedente", + "creatingNotes": "Creazione di note", + "createNoteAfter": "crea una nuova nota dopo quella attiva", + "createNoteInto": "crea una nuova sotto-nota nella nota attiva", + "editBranchPrefix": "modifica prefisso del clone della nota attiva", + "movingCloningNotes": "Spostamento / clonazione delle note", + "moveNoteUpDown": "spostare la nota verso l'alto/verso il basso nell'elenco delle note", + "moveNoteUpHierarchy": "spostare la nota verso l'alto nella gerarchia", + "multiSelectNote": "nota multi-selezione sopra/sotto", + "selectAllNotes": "seleziona tutte le note del livello corrente", + "selectNote": "seleziona nota", + "copyNotes": "copia la nota attiva (o la selezione corrente) negli appunti (utilizzata per la clonazione)", + "cutNotes": "taglia la nota corrente (o la selezione corrente) negli appunti (utilizzato per spostare le note)", + "pasteNotes": "Incolla le note come sotto-note nella nota attiva (che viene spostata o clonata a seconda che sia stata copiata o tagliata negli appunti)", + "deleteNotes": "eliminazione nota / sottoalbero", + "editingNotes": "Modifica delle note", + "editNoteTitle": "nel riquadro ad albero passa dal riquadro ad albero al titolo della nota. Premendo Invio dal titolo della nota, il focus passerĆ  all'editor di testo. Ctrl+. riporterĆ  il focus dall'editor al riquadro ad albero.", + "createEditLink": "crea / modifica collegamento esterno", + "createInternalLink": "creare un collegamento interno", + "followLink": "segui il link sotto il cursore", + "insertDateTime": "inserisci la data e l'ora correnti nella posizione del cursore", + "jumpToTreePane": "passa al riquadro dell'albero e scorri fino alla nota attiva", + "markdownAutoformat": "Formattazione automatica simile a Markdown", + "headings": "##, ###, #### ecc. seguiti da uno spazio per i titoli", + "bulletList": "* o - seguito da uno spazio per un elenco puntato", + "numberedList": "1. o 1) seguito da uno spazio per un elenco numerato", + "blockQuote": "inizia una riga con > seguito da uno spazio per il blocco di citazione", + "troubleshooting": "Risoluzione dei problemi", + "reloadFrontend": "ricarica il frontend Trilium", + "showDevTools": "mostra strumenti di sviluppo", + "showSQLConsole": "mostra console SQL", + "other": "Altro", + "quickSearch": "concentrati sull'input della ricerca rapida", + "inPageSearch": "ricerca all'interno della pagina" + }, + "i18n": { + "saturday": "Sabato", + "sunday": "Domenica", + "first-week-of-the-year": "Prima settimana dell'anno", + "first-week-contains-first-day": "La prima settimana contiene il primo giorno dell'anno", + "first-week-contains-first-thursday": "La prima settimana contiene il primo giovedƬ dell'anno", + "first-week-has-minimum-days": "La prima settimana ha giorni ridotti", + "min-days-in-first-week": "Giorni minimi nella prima settimana", + "first-week-info": "La prima settimana che contiene il primo giovedƬ dell'anno si basa su ISO 8601 standard.", + "first-week-warning": "La modifica delle opzioni della prima settimana può causare duplicati con le note settimanali esistenti e queste ultime non verranno aggiornate di conseguenza.", + "formatting-locale": "Formato data e numero", + "formatting-locale-auto": "In base alla lingua dell'applicazione", + "title": "Localizzazione", + "language": "Lingua", + "first-day-of-the-week": "Primo giorno della settimana", + "monday": "Lunedi", + "tuesday": "MartedƬ", + "wednesday": "MercoledƬ", + "thursday": "GiovedƬ", + "friday": "VenerdƬ" + }, + "ai_llm": { + "n_notes_queued_0": "{{ count }} nota in coda per l'indicizzazione", + "n_notes_queued_1": "{{ count }} note in coda per l'indicizzazione", + "n_notes_queued_2": "{{ count }} note in coda per l'indicizzazione", + "notes_indexed_0": "{{ count }} nota indicizzata", + "notes_indexed_1": "{{ count }} note indicizzate", + "notes_indexed_2": "{{ count }} note indicizzate", + "not_started": "Non iniziato", + "title": "Impostazioni AI", + "processed_notes": "Note elaborate", + "total_notes": "Note totali", + "progress": "Progressi", + "queued_notes": "Note in coda", + "failed_notes": "Note non riuscite", + "last_processed": "Ultimo elaborato", + "refresh_stats": "Aggiorna statistiche", + "enable_ai_features": "Abilita le funzionalitĆ  AI/LLM", + "enable_ai_description": "Abilita funzionalitĆ  di intelligenza artificiale come il riepilogo delle note, la generazione di contenuti e altre funzionalitĆ  LLM", + "openai_tab": "OpenAI", + "anthropic_tab": "Antropico", + "voyage_tab": "Viaggio AI", + "ollama_tab": "Ollama", + "enable_ai": "Abilita le funzionalitĆ  AI/LLM", + "enable_ai_desc": "Abilita funzionalitĆ  di intelligenza artificiale come il riepilogo delle note, la generazione di contenuti e altre funzionalitĆ  LLM", + "provider_configuration": "Configurazione del fornitore di intelligenza artificiale", + "provider_precedence": "Precedenza del fornitore", + "provider_precedence_description": "Elenco dei provider separati da virgole in ordine di precedenza (ad esempio, 'openai,anthropic,ollama')", + "temperature": "Temperatura", + "temperature_description": "Controlla la casualitĆ  nelle risposte (0 = deterministico, 2 = casualitĆ  massima)", + "system_prompt": "Prompt di sistema", + "system_prompt_description": "Prompt di sistema predefinito utilizzato per tutte le interazioni con l'IA", + "openai_configuration": "Configurazione OpenAI", + "openai_settings": "Impostazioni OpenAI", + "api_key": "Chiave API", + "url": "URL di base", + "model": "Modello", + "openai_api_key_description": "La tua chiave API OpenAI per accedere ai loro servizi di intelligenza artificiale", + "anthropic_api_key_description": "La tua chiave API Anthropic per accedere ai modelli Claude", + "default_model": "Modello predefinito", + "openai_model_description": "Esempi: gpt-4o, gpt-4-turbo, gpt-3.5-turbo", + "base_url": "URL di base", + "openai_url_description": "Predefinito: https://api.openai.com/v1", + "anthropic_settings": "Ambientazioni antropiche", + "anthropic_url_description": "URL di base per l'API Anthropic (predefinito: https://api.anthropic.com)", + "anthropic_model_description": "Modelli di Anthropic Claude per il completamento della chat", + "voyage_settings": "Impostazioni AI di Voyage", + "ollama_settings": "Impostazioni Ollama", + "ollama_url_description": "URL per l'API Ollama (predefinito: http://localhost:11434)", + "ollama_model_description": "Modello Ollama da utilizzare per il completamento della chat", + "anthropic_configuration": "Configurazione antropica", + "voyage_configuration": "Configurazione AI di viaggio", + "voyage_url_description": "Predefinito: https://api.voyageai.com/v1", + "ollama_configuration": "Configurazione Ollama", + "enable_ollama": "Abilita Ollama", + "enable_ollama_description": "Abilita Ollama per l'utilizzo del modello AI locale", + "ollama_url": "URL di Ollama", + "ollama_model": "Modello Ollama", + "refresh_models": "Aggiorna modelli", + "refreshing_models": "Rinfrescante...", + "enable_automatic_indexing": "Abilita l'indicizzazione automatica", + "rebuild_index": "Ricostruisci indice", + "rebuild_index_error": "Errore durante l'avvio della ricostruzione dell'indice. Controllare i log per i dettagli.", + "note_title": "Titolo della nota", + "error": "Errore", + "last_attempt": "Ultimo tentativo", + "actions": "Azioni", + "retry": "Riprova", + "partial": "{{ percentage }}% completato", + "retry_queued": "Nota in coda per un nuovo tentativo", + "retry_failed": "Impossibile mettere in coda la nota per un nuovo tentativo", + "max_notes_per_llm_query": "Numero massimo di note per query", + "max_notes_per_llm_query_description": "Numero massimo di note simili da includere nel contesto AI", + "active_providers": "Fornitori attivi", + "disabled_providers": "Fornitori disabili", + "remove_provider": "Rimuovi il fornitore dalla ricerca", + "restore_provider": "Ripristina il provider per la ricerca", + "similarity_threshold": "Soglia di similaritĆ ", + "similarity_threshold_description": "Punteggio minimo di similaritĆ  (0-1) per le note da includere nel contesto per le query LLM", + "reprocess_index": "Ricostruisci l'indice di ricerca", + "reprocessing_index": "Ricostruzione...", + "reprocess_index_started": "Ottimizzazione dell'indice di ricerca avviata in background", + "reprocess_index_error": "Errore durante la ricostruzione dell'indice di ricerca", + "index_rebuild_progress": "Progresso nella ricostruzione dell'indice", + "index_rebuilding": "Indice di ottimizzazione ({{percentage}}%)", + "index_rebuild_complete": "Ottimizzazione dell'indice completata", + "index_rebuild_status_error": "Errore durante il controllo dello stato di ricostruzione dell'indice", + "never": "Mai", + "processing": "Elaborazione ({{percentage}}%)", + "incomplete": "Incompleto ({{percentage}}%)", + "complete": "Completato (100%)", + "refreshing": "Rinfrescante...", + "auto_refresh_notice": "Si aggiorna automaticamente ogni {{seconds}} secondi", + "note_queued_for_retry": "Nota in coda per un nuovo tentativo", + "failed_to_retry_note": "Impossibile riprovare nota", + "all_notes_queued_for_retry": "Tutte le note non riuscite sono in coda per un nuovo tentativo", + "failed_to_retry_all": "Impossibile riprovare le note", + "ai_settings": "Impostazioni AI", + "api_key_tooltip": "Chiave API per accedere al servizio", + "empty_key_warning": { + "anthropic": "La chiave API di Anthropic ĆØ vuota. Inserisci una chiave API valida.", + "openai": "La chiave API di OpenAI ĆØ vuota. Inserisci una chiave API valida.", + "voyage": "La chiave API di Voyage ĆØ vuota. Inserisci una chiave API valida.", + "ollama": "La chiave API di Ollama ĆØ vuota. Inserisci una chiave API valida." + }, + "agent": { + "processing": "Elaborazione in corso...", + "thinking": "Pensiero...", + "loading": "Caricamento...", + "generating": "Generazione in corso..." + }, + "name": "intelligenza artificiale", + "openai": "OpenAI", + "use_enhanced_context": "Utilizzare il contesto avanzato", + "enhanced_context_description": "Fornisce all'IA più contesto dalla nota e dalle note correlate per risposte migliori", + "show_thinking": "Mostra il pensiero", + "show_thinking_description": "Mostra la catena del processo di pensiero dell'IA", + "enter_message": "Inserisci il tuo messaggio...", + "error_contacting_provider": "Errore durante la connessione al fornitore dell'IA. Controlla le impostazioni e la connessione Internet.", + "error_generating_response": "Errore durante la generazione della risposta AI", + "index_all_notes": "Indice Tutte le note", + "index_status": "Stato dell'indice", + "indexed_notes": "Note indicizzate", + "indexing_stopped": "Indicizzazione interrotta", + "indexing_in_progress": "Indicizzazione in corso...", + "last_indexed": "Ultimo indicizzato", + "note_chat": "Nota Chat", + "sources": "Fonti", + "start_indexing": "Avvia l'indicizzazione", + "use_advanced_context": "Usa contesto avanzato", + "ollama_no_url": "Ollama non ĆØ configurato. Inserisci un URL valido.", + "chat": { + "root_note_title": "Chat AI", + "root_note_content": "Questa nota contiene le conversazioni della chat AI salvate.", + "new_chat_title": "Nuova chat", + "create_new_ai_chat": "Crea una nuova chat AI" + }, + "create_new_ai_chat": "Crea una nuova chat AI", + "configuration_warnings": "Ci sono alcuni problemi con la configurazione dell'IA. Controlla le impostazioni.", + "experimental_warning": "La funzionalitĆ  LLM ĆØ attualmente sperimentale: sei stato avvisato.", + "selected_provider": "Fornitore selezionato", + "selected_provider_description": "Scegli il fornitore di intelligenza artificiale per le funzionalitĆ  di chat e completamento", + "select_model": "Seleziona il modello...", + "select_provider": "Seleziona il fornitore...", + "ai_enabled": "FunzionalitĆ  AI abilitate", + "ai_disabled": "FunzionalitĆ  AI disabilitate", + "no_models_found_online": "Nessun modello trovato. Controlla la tua chiave API e le impostazioni.", + "no_models_found_ollama": "Nessun modello Ollama trovato. Controlla se Ollama ĆØ in esecuzione.", + "error_fetching": "Errore durante il recupero dei modelli: {{error}}" + }, + "import": { + "importIntoNote": "Importa nella nota", + "chooseImportFile": "Scegli file di importazione", + "importDescription": "Il contenuto dei file selezionati verranno importati come note secondarie in", + "options": "Opzioni", + "safeImportTooltip": "I file di esportazione Trilium .zip possono contenere script eseguibili che potrebbero avere comportamenti dannosi. L'importazione sicura disattiverĆ  l'esecuzione automatica di tutti gli script importati. Deseleziona ā€œImportazione sicuraā€ solo se l'archivio importato dovrebbe contenere script eseguibili e ti fidi completamente del contenuto del file di importazione.", + "safeImport": "Importazione sicura", + "explodeArchivesTooltip": "Se questa opzione ĆØ selezionata, Trilium leggerĆ  i file .zip, .enex e .opml e creerĆ  delle note dai file contenuti in tali archivi. Se l'opzione non ĆØ selezionata, Trilium allegherĆ  gli archivi stessi alla nota.", + "shrinkImages": "Riduci immagini", + "explodeArchives": "Leggi il contenuto degli archivi .zip, .enex e .opml .", + "html_import_tags": { + "title": "Tag di importazione HTML", + "description": "Configura quali tag HTML devono essere mantenuti durante l'importazione delle note. I tag che non sono presenti in questo elenco verranno rimossi durante l'importazione. Alcuni tag (come 'script') vengono sempre rimossi per motivi di sicurezza.", + "placeholder": "Inserisci i tag HTML, uno per riga", + "reset_button": "Ripristina elenco predefinito" + }, + "import-status": "Stato importazione", + "in-progress": "Importazione in corso: {{progress}}", + "successful": "Importazione completata con successo.", + "shrinkImagesTooltip": "

Se selezioni questa opzione, Trilium tenterĆ  di ridurre le immagini importate tramite ridimensionamento e ottimizzazione, il che potrebbe influire sulla qualitĆ  percepita dell’immagine. Se non selezionata, le immagini verranno importate senza modifiche.

Questo non si applica alle importazioni .zip con metadati, poichƩ si presume che questi file siano giƠ ottimizzati.

", + "textImportedAsText": "Importa HTML, Markdown e TXT come note di testo se non è chiaro dai metadati", + "codeImportedAsCode": "Importa i file di codice riconosciuti (ad esempio .json) come note di codice se non è chiaro dai metadati", + "replaceUnderscoresWithSpaces": "Sostituisci i trattini bassi con spazi nei nomi delle note importate", + "import": "Importa", + "failed": "Importazione fallita: {{message}}.", + "importZipRecommendation": "Quando si importa un file ZIP, la gerarchia delle note rifletterà la struttura delle sottodirectory all'interno dell'archivio." + }, + "include_note": { + "dialog_title": "Includi nota", + "label_note": "Note", + "placeholder_search": "cerca una nota per nome", + "box_size_prompt": "Dimensione della casella della nota inclusa:", + "box_size_small": "piccola (~ 10 righe)", + "box_size_medium": "media (~ 30 righe)", + "box_size_full": "completa (la casella mostra il testo completo)", + "button_include": "Includi nota" + }, + "jump_to_note": { + "search_placeholder": "Cerca una nota per nome oppure digita > per i comandi...", + "search_button": "Cerca nel testo completo" + }, + "markdown_import": { + "dialog_title": "Importazione Markdown", + "modal_body_text": "A causa del sandbox del browser non è possibile leggere direttamente gli appunti tramite JavaScript. Incolla il Markdown da importare nell'area di testo sottostante e clicca sul pulsante Importa", + "import_button": "Importa", + "import_success": "Il contenuto Markdown è stato importato nel documento." + }, + "move_to": { + "target_parent_note": "Nota principale di destinazione", + "dialog_title": "Sposta note in ...", + "notes_to_move": "Note da spostare", + "search_placeholder": "cerca una nota per nome", + "move_button": "Sposta nella nota selezionata", + "error_no_path": "Nessun percorso in cui spostarsi.", + "move_success_message": "Le note selezionate sono state spostate in " + }, + "note_type_chooser": { + "change_path_prompt": "Cambia dove creare la nuova nota:", + "search_placeholder": "cerca percorso per nome (predefinito se vuoto)", + "modal_title": "Scegli il tipo di nota", + "modal_body": "Scegli il tipo / modello della nuova nota:", + "templates": "Modelli", + "builtin_templates": "Modelli incorporati" + }, + "prompt": { + "title": "Richiesta", + "ok": "OK", + "defaultTitle": "Richiesta" + }, + "recent_changes": { + "title": "Modifiche recenti", + "erase_notes_button": "Cancella ora le note eliminate", + "deleted_notes_message": "Le note eliminate sono state cancellate.", + "no_changes_message": "Nessuna modifica ancora...", + "undelete_link": "ripristinare", + "confirm_undelete": "Vuoi ripristinare questa nota e le sue sotto-note?" + }, + "revisions": { + "note_revisions": "Note Revisioni", + "delete_all_revisions": "Elimina tutte le revisioni di questa nota", + "delete_all_button": "Elimina tutte le revisioni", + "help_title": "Aiuto sulle revisioni delle note", + "revision_last_edited": "Questa revisione è stata modificata l'ultima volta il {{date}}", + "confirm_delete_all": "Vuoi eliminare tutte le revisioni di questa nota?", + "no_revisions": "Ancora nessuna revisione per questa nota...", + "restore_button": "Ripristina", + "diff_on": "Mostra differenze", + "diff_off": "Mostra contenuto", + "diff_on_hint": "Clicca per mostrare la fonte della nota diff", + "diff_off_hint": "Clicca per visualizzare il contenuto della nota", + "diff_not_available": "Diff non è disponibile.", + "confirm_restore": "Vuoi ripristinare questa revisione? Questo sovrascriverà il titolo e il contenuto attuali della nota con questa revisione.", + "delete_button": "Elimina", + "confirm_delete": "Vuoi eliminare questa revisione?", + "revisions_deleted": "Le revisioni delle note sono state eliminate.", + "revision_restored": "La revisione della nota è stata ripristinata.", + "revision_deleted": "La revisione della nota è stata eliminata.", + "snapshot_interval": "Nota Intervallo di revisione istantanea: {{seconds}}.", + "maximum_revisions": "Nota Limite istantaneo di revisione: {{number}}.", + "settings": "Nota Impostazioni di revisione", + "download_button": "Scarica", + "mime": "MIME: ", + "file_size": "Dimensione del file:", + "preview": "Anteprima:", + "preview_not_available": "L'anteprima non è disponibile per questo tipo di nota." + }, + "sort_child_notes": { + "sort_children_by": "Ordina i bambini per...", + "sorting_criteria": "Criteri di ordinamento", + "title": "titolo", + "date_created": "data di creazione", + "date_modified": "data di modifica", + "sorting_direction": "Direzione", + "ascending": "ascendente", + "descending": "discendente", + "folders": "Cartelle", + "sort_folders_at_top": "ordina le cartelle in alto", + "natural_sort": "Ordinamento naturale", + "sort_with_respect_to_different_character_sorting": "ordinare in base alle diverse regole di ordinamento e collazione dei caratteri nelle diverse lingue o regioni.", + "natural_sort_language": "Linguaggio di ordinamento naturale", + "the_language_code_for_natural_sort": "Il codice lingua per l'ordinamento naturale, ad esempio \"zh-CN\" per il cinese.", + "sort": "Ordina" + }, + "upload_attachments": { + "upload_attachments_to_note": "Carica allegati alla nota", + "choose_files": "Scegli i file", + "files_will_be_uploaded": "I file saranno caricati come allegati in {{noteTitle}}", + "options": "Opzioni", + "shrink_images": "Riduci immagini", + "upload": "Carica", + "tooltip": "Se selezioni questa opzione, Trilium tenterà di ridurre le immagini caricate tramite ridimensionamento e ottimizzazione, il che potrebbe influire sulla qualità percepita delle immagini. Se non selezionata, le immagini verranno caricate senza modifiche." + }, + "attribute_detail": { + "attr_detail_title": "Titolo dettagli attributo", + "close_button_title": "Annulla modifiche e chiudi", + "attr_is_owned_by": "L'attributo è di proprietà di", + "attr_name_title": "Il nome dell'attributo può essere composto solo da caratteri alfanumerici, due punti e trattino basso", + "name": "Nome", + "app_theme_base": "impostare su \"next\", \"next-light\" o \"next-dark\" per utilizzare il tema TriliumNext corrispondente (automatico, chiaro o scuro) come base per un tema personalizzato, invece di quello precedente.", + "css_class": "Il valore di questa etichetta viene quindi aggiunto come classe CSS al nodo che rappresenta una determinata nota nell'albero. Ciò può essere utile per la personalizzazione avanzata dei temi. Può essere utilizzato nelle note dei modelli.", + "icon_class": "Il valore di questa etichetta viene aggiunto come classe CSS all'icona sull'albero, il che può aiutare a distinguere visivamente le note nell'albero. Un esempio potrebbe essere bx bx-home - le icone sono prese da boxicons. Può essere utilizzato nelle note del modello.", + "page_size": "numero di elementi per pagina nell'elenco delle note", + "custom_request_handler": "vedi Gestore richieste personalizzato", + "custom_resource_provider": "vedi Gestore richieste personalizzato", + "widget": "contrassegna questa nota come widget personalizzato che verrà aggiunto all'albero dei componenti Trilium", + "workspace": "contrassegna questa nota come area di lavoro che consente un facile ancoraggio", + "workspace_icon_class": "definisce la classe CSS dell'icona della casella che verrà utilizzata nella scheda quando viene sollevata su questa nota", + "workspace_tab_background_color": "Colore CSS utilizzato nella scheda delle note quando viene sollevato su questa nota", + "workspace_calendar_root": "Definisce la radice del calendario per ogni area di lavoro", + "workspace_template": "Questa nota apparirà nella selezione dei modelli disponibili quando si crea una nuova nota, ma solo se inserita in un'area di lavoro che contiene questo modello", + "search_home": "verranno create nuove note di ricerca come sottovoci di questa nota", + "value": "Valore", + "target_note_title": "La relazione è una connessione denominata tra la nota di origine e la nota di destinazione.", + "target_note": "Nota obiettivo", + "promoted_title": "L'attributo promosso viene visualizzato in modo ben visibile sulla nota.", + "promoted": "Promosso", + "promoted_alias_title": "Il nome da visualizzare nell'interfaccia utente degli attributi promossi.", + "promoted_alias": "Alias", + "multiplicity_title": "La molteplicità definisce quanti attributi con lo stesso nome possono essere creati: al massimo 1 o più di 1.", + "multiplicity": "Molteplicità", + "single_value": "Valore singolo", + "multi_value": "Valore multiplo", + "label_type_title": "Il tipo di etichetta aiuterà Trilium a scegliere l'interfaccia adatta per inserire il valore dell'etichetta.", + "label_type": "Tipo", + "text": "Testo", + "number": "Numero", + "boolean": "Booleano", + "date": "Data", + "date_time": "Data e Ora", + "time": "Ora", + "url": "URL", + "precision_title": "Quante cifre dopo la virgola mobile dovrebbero essere disponibili nell'interfaccia di impostazione del valore.", + "precision": "Precisione", + "digits": "cifre", + "inverse_relation_title": "Impostazione facoltativa per definire a quale relazione è opposta questa. Esempio: padre e figlio sono relazioni inverse l'una rispetto all'altra.", + "inheritable": "Ereditabile", + "inverse_relation": "Relazione inversa", + "inheritable_title": "L'attributo ereditario verrà ereditato da tutti i discendenti sotto questo albero.", + "save_and_close": "Salva e chiudi Ctrl+Enter", + "delete": "Eliminazione", + "related_notes_title": "Altre note con questa etichetta", + "more_notes": "Altre note", + "label": "Dettagli etichetta", + "label_definition": "Dettagli definizione etichetta", + "relation": "Dettagli relazione", + "relation_definition": "Dettagli definizione relazione", + "disable_versioning": "disabilita il versioning automatico. Utile ad esempio per note di grandi dimensioni ma non importanti, come le grandi librerie JS utilizzate per lo scripting", + "calendar_root": "segna le note che devono essere utilizzate come note principali per le note giornaliere. Solo una deve essere contrassegnata come tale.", + "archived": "Le note con questa etichetta non saranno visibili per impostazione predefinita nei risultati di ricerca (anche nelle finestre di dialogo Vai a, Aggiungi collegamento ecc.).", + "run_on_instance": "Definire su quale istanza di Trilium eseguire questa operazione. L'impostazione predefinita è tutte le istanze.", + "exclude_from_export": "le note (con la loro sottostruttura) non saranno incluse in nessuna esportazione di note", + "run": "definisce su quali eventi deve essere eseguito lo script. I valori possibili sono:\n
    \n
  • frontendStartup - quando il frontend Trilium viene avviato (o aggiornato), ma non su dispositivi mobili.
  • \n
  • mobileStartup - quando il frontend Trilium viene avviato (o aggiornato) su dispositivi mobili.
  • \n
  • backendStartup - quando viene avviato il backend Trilium
  • \n
  • hourly - eseguire una volta all'ora. ƈ possibile utilizzare l'etichetta aggiuntiva runAtHour per specificare a che ora.
  • \n
  • daily - eseguire una volta al giorno
  • \n
", + "run_at_hour": "A che ora deve essere eseguito. Deve essere utilizzato insieme a #run=hourly. Può essere definito più volte per più esecuzioni durante il giorno.", + "disable_inclusion": "gli script con questa etichetta non saranno inclusi nell'esecuzione dello script principale.", + "sorted": "mantiene le note figlie ordinate alfabeticamente per titolo", + "sort_direction": "ASC (impostazione predefinita) o DESC", + "sort_folders_first": "Le cartelle (note con figlie) devono essere ordinate in cima", + "top": "mantieni la nota in cima al suo genitore (si applica solo ai genitori ordinati)", + "hide_promoted_attributes": "Nascondi gli attributi promossi in questa nota", + "read_only": "L'editor è in modalità di sola lettura. Funziona solo per note di testo e codice.", + "auto_read_only_disabled": "Le note di testo/codice possono essere impostate automaticamente in modalità di lettura quando sono troppo grandi. È possibile disabilitare questo comportamento per ogni singola nota aggiungendo questa etichetta alla nota", + "app_css": "contrassegna le note CSS che vengono caricate nell'applicazione Trilium e possono quindi essere utilizzate per modificare l'aspetto di Trilium.", + "app_theme": "contrassegna le note CSS che sono temi Trilium completi e sono quindi disponibili nelle opzioni Trilium.", + "workspace_search_home": "nuove note di ricerca verranno create come figlie di questa nota quando sollevate a qualche antenato di questa nota dell'area di lavoro", + "inbox": "Posizione predefinita della casella di posta in arrivo per le nuove note: quando crei una nota utilizzando il pulsante \"Nuova nota\" nella barra laterale, le note verranno create come note secondarie nella nota contrassegnata con l'etichetta #inbox.", + "workspace_inbox": "posizione predefinita della casella di posta in arrivo per le nuove note quando vengono trasferite a un antenato di questa nota dell'area di lavoro", + "sql_console_home": "posizione predefinita delle note della console SQL", + "bookmark_folder": "le note con questa etichetta appariranno nei segnalibri come cartelle (consentendo l'accesso ai loro elementi secondari)", + "share_hidden_from_tree": "questa nota è nascosta dall'albero di navigazione a sinistra, ma è comunque accessibile tramite il suo URL", + "share_external_link": "La nota fungerà da collegamento a un sito web esterno nell'albero di condivisione", + "share_alias": "definisci un alias con cui la nota sarà disponibile all'indirizzo https://your_trilium_host/share/[your_alias]", + "share_omit_default_css": "Il CSS predefinito della pagina di condivisione verrà omesso. Utilizzarlo quando si apportano modifiche stilistiche significative.", + "keep_current_hoisting": "L'apertura di questo link non modificherà l'ancoraggio anche se la nota non è visualizzabile nell'attuale sottoalbero ancorato.", + "share_description": "definire il testo da aggiungere al meta tag HTML per la descrizione", + "share_raw": "La nota verrà visualizzata nel suo formato originale, senza wrapper HTML", + "share_disallow_robot_indexing": "impedirà l'indicizzazione robotica di questa nota tramite l'intestazione X-Robots-Tag: noindex", + "share_credentials": "richiedono credenziali per accedere a questa nota condivisa. Il valore deve essere nel formato 'username:password'. Non dimenticare di renderlo ereditabile affinché si applichi alle note/immagini secondarie.", + "share_index": "La nota con questa etichetta elencherà tutte le radici delle note condivise", + "display_relations": "nomi delle relazioni delimitati da virgola che devono essere visualizzati. Tutti gli altri saranno nascosti.", + "hide_relations": "nomi delle relazioni delimitati da virgola che devono essere nascosti. Tutti gli altri saranno visualizzati.", + "title_template": "titolo predefinito delle note create come figlie di questa nota. Il valore viene valutato come stringa JavaScript. \n e quindi può essere arricchito con contenuti dinamici tramite le variabili now e parentNote inserite. Esempi:\n \n
    \n
  • ${parentNote.getLabelValue('authorName')}'s opere letterarie
  • \n
  • Log per ${now.format('YYYY-MM-DD HH:mm:ss')}
  • \n
\n \n Per ulteriori dettagli, consultare wiki con i dettagli, la documentazione API per parentNote e now.", + "template": "Questa nota apparirà nella selezione dei modelli disponibili durante la creazione di una nuova nota", + "toc": "#toc o #toc=show forzeranno la visualizzazione del sommario, mentre #toc=hide ne forzerà la non visualizzazione. Se l'etichetta non esiste, verrà applicata l'impostazione globale", + "color": "definisce il colore della nota nell'albero delle note, nei link ecc. Utilizza qualsiasi valore di colore CSS valido come \"red\" o #a13d5f", + "keyboard_shortcut": "Definisce una scorciatoia da tastiera che consentirà di passare immediatamente a questa nota. Esempio: \"ctrl+alt+e\". Per rendere effettiva la modifica è necessario ricaricare il frontend.", + "execute_button": "Titolo del pulsante che eseguirà il codice della nota corrente", + "execute_description": "Descrizione più dettagliata della nota di codice corrente visualizzata insieme al pulsante di esecuzione", + "exclude_from_note_map": "Le note con questa etichetta saranno nascoste dalla mappa delle note", + "new_notes_on_top": "Le nuove note verranno create nella parte superiore della nota principale, non nella parte inferiore.", + "hide_highlight_widget": "Nascondi widget Elenco evidenziazioni", + "run_on_note_creation": "Viene eseguito quando viene creata una nota sul backend. Utilizza questa relazione se desideri eseguire lo script per tutte le note create in una sottostruttura specifica. In tal caso, crealo sulla nota radice della sottostruttura e rendilo ereditabile. Una nuova nota creata all'interno della sottostruttura (a qualsiasi profondità) attiverà lo script.", + "run_on_child_note_creation": "viene eseguito quando viene creata una nuova nota sotto la nota in cui è definita questa relazione", + "run_on_note_title_change": "viene eseguito quando viene modificato il titolo della nota (include anche la creazione della nota)", + "run_on_note_content_change": "Viene eseguito quando il contenuto della nota viene modificato (compresa la creazione della nota).", + "run_on_note_change": "Viene eseguito quando la nota viene modificata (compresa la creazione della nota). Non include le modifiche al contenuto", + "run_on_note_deletion": "viene eseguito quando la nota viene eliminata", + "run_on_branch_creation": "Viene eseguito quando viene creato un ramo. Il ramo è un collegamento tra la nota principale e la nota secondaria e viene creato, ad esempio, quando si clona o si sposta una nota.", + "run_on_branch_change": "viene eseguito quando un ramo viene aggiornato.", + "run_on_branch_deletion": "Viene eseguito quando viene eliminato un ramo. Il ramo è un collegamento tra una nota padre e una nota figlio e viene eliminato, ad esempio, quando si sposta una nota (il vecchio ramo/collegamento viene eliminato).", + "run_on_attribute_creation": "viene eseguito quando viene creato un nuovo attributo per la nota che definisce questa relazione", + "run_on_attribute_change": " viene eseguito quando viene modificato l'attributo di una nota che definisce questa relazione. Viene attivato anche quando l'attributo viene eliminato", + "relation_template": "Gli attributi della nota saranno ereditati anche senza una relazione padre-figlio, mentre il contenuto e la sottostruttura della nota saranno aggiunti alle note dell'istanza se vuote. Per ulteriori dettagli, consultare la documentazione.", + "inherit": "Gli attributi della nota saranno ereditati anche senza una relazione padre-figlio. Vedi relazione modello per un concetto simile. Vedi eredità degli attributi nella documentazione.", + "render_note": "le note di tipo \"renderizza nota HTML\" saranno renderizzate utilizzando una nota codice (HTML o script) ed è necessario indicare utilizzando questa relazione quale nota deve essere renderizzata", + "widget_relation": "L'obiettivo di questa relazione verrà eseguito e visualizzato come widget nella barra laterale", + "share_css": "Nota CSS che verrà inserita nella pagina condivisa. Anche la nota CSS deve trovarsi nella sottostruttura condivisa. Valuta anche l'utilizzo di 'share_hidden_from_tree' e 'share_omit_default_css'.", + "share_js": "Nota JavaScript che verrà inserita nella pagina di condivisione. Anche la nota JS deve trovarsi nella sottostruttura condivisa. Valuta l'utilizzo di 'share_hidden_from_tree'.", + "share_template": "Nota JavaScript incorporata che verrà utilizzata come modello per la visualizzazione della nota condivisa. Se non disponibile, verrà utilizzato il modello predefinito. Si consiglia di utilizzare 'share_hidden_from_tree'.", + "share_favicon": "Nota Favicon da impostare nella pagina condivisa. In genere è preferibile impostarla su \"condivisione radice\" e renderla ereditabile. Anche la nota Favicon deve trovarsi nella sottostruttura condivisa. Valutare l'utilizzo di 'share_hidden_from_tree'.", + "is_owned_by_note": "è di proprietà di nota", + "other_notes_with_name": "Altre note con {{attributeType}} nome \"{{attributeName}}\"", + "and_more": "... e altri {{count}}.", + "print_landscape": "Quando si esporta in PDF, cambia l'orientamento della pagina da verticale a orizzontale.", + "print_page_size": "Quando si esporta in PDF, modifica le dimensioni della pagina. Valori supportati: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.", + "color_type": "Colore", + "share_root": "segna la nota che viene servita su /share root." + }, + "attribute_editor": { + "help_text_body1": "Per aggiungere un'etichetta, basta digitare ad esempio #rock oppure, se si desidera aggiungere anche un valore, ad esempio #year = 2020", + "help_text_body2": "Per la relazione, digita ~author = @, che dovrebbe far apparire un completamento automatico in cui puoi cercare la nota desiderata.", + "help_text_body3": "In alternativa, è possibile aggiungere etichette e relazioni utilizzando il pulsante + sul lato destro.", + "save_attributes": "Salva attributi ", + "add_a_new_attribute": "Aggiungi un nuovo attributo", + "add_new_label": "Aggiungi nuova etichetta ", + "add_new_relation": "Aggiungi nuova relazione ", + "add_new_relation_definition": "Aggiungi una nuova definizione di relazione", + "placeholder": "Digitare qui le etichette e le relazioni", + "add_new_label_definition": "Aggiungi nuova definizione di etichetta" + }, + "execute_script": { + "execute_script": "Esegui script", + "help_text": "È possibile eseguire semplici script sulle note abbinate.", + "example_1": "Ad esempio, per aggiungere una stringa al titolo di una nota, utilizzare questo piccolo script:", + "example_2": "Un esempio più complesso sarebbe l'eliminazione di tutti gli attributi delle note corrispondenti:" + }, + "rename_label": { + "rename_label": "Rinomina etichetta", + "rename_label_from": "Rinomina etichetta da", + "old_name_placeholder": "vecchio nome", + "to": "A", + "new_name_placeholder": "nuovo nome", + "name_title": "Sono consentiti caratteri alfanumerici, trattino basso e due punti." + }, + "delete_note": { + "delete_note": "Elimina nota", + "delete_matched_notes": "Elimina le note corrispondenti", + "delete_matched_notes_description": "In questo modo verranno eliminate le note corrispondenti.", + "undelete_notes_instruction": "Dopo l'eliminazione, è possibile ripristinarli dalla finestra di dialogo Modifiche recenti.", + "erase_notes_instruction": "Per cancellare definitivamente le note, dopo l'eliminazione puoi andare su Opzioni -> Altro e cliccare sul pulsante \"Cancella note eliminate ora\"." + }, + "delete_revisions": { + "delete_note_revisions": "Elimina le revisioni delle note", + "all_past_note_revisions": "Tutte le revisioni passate delle note corrispondenti verranno eliminate. La nota stessa verrà conservata integralmente. In altri termini, la cronologia della nota verrà rimossa." + }, + "move_note": { + "move_note": "Sposta nota", + "to": "A", + "target_parent_note": "nota del genitore di destinazione", + "on_all_matched_notes": "Su tutte le note abbinate", + "move_note_new_parent": "sposta la nota al nuovo genitore se la nota ha un solo genitore (ad esempio, il vecchio ramo viene rimosso e viene creato un nuovo ramo nel nuovo genitore)", + "clone_note_new_parent": "clona la nota sul nuovo genitore se la nota ha più cloni/rami (non è chiaro quale ramo debba essere rimosso)", + "nothing_will_happen": "non accadrà nulla se la nota non può essere spostata sulla nota di destinazione (cioè ciò creerebbe un ciclo ad albero)" + }, + "rename_note": { + "rename_note": "Rinomina nota", + "rename_note_title_to": "Rinomina il titolo della nota in", + "new_note_title": "nuovo titolo della nota", + "click_help_icon": "Fare clic sull'icona della guida a destra per vedere tutte le opzioni", + "evaluated_as_js_string": "Il valore specificato viene valutato come stringa JavaScript e può quindi essere arricchito con contenuto dinamico tramite la variabile note inserita (la nota viene rinominata). Esempi:", + "example_note": "Nota - tutte le note corrispondenti vengono rinominate in 'Nota'", + "example_new_title": "NEW: ${note.title} - i titoli delle note corrispondenti sono preceduti dal prefisso 'NEW:'", + "example_date_prefix": "${note.dateCreatedObj.format('MM-DD:')}: ${note.title} - le note corrispondenti sono precedute dal mese e dalla data di creazione della nota", + "api_docs": "Per i dettagli, consultare la documentazione API per nota e le sue proprietà dateCreatedObj / utcDateCreatedObj." + }, + "add_relation": { + "add_relation": "Aggiungi relazione", + "relation_name": "nome della relazione", + "allowed_characters": "Sono consentiti caratteri alfanumerici, trattino basso e due punti.", + "to": "A", + "target_note": "nota di destinazione", + "create_relation_on_all_matched_notes": "Su tutte le note corrispondenti crea la relazione data." + }, + "delete_relation": { + "delete_relation": "Elimina relazione", + "relation_name": "nome della relazione", + "allowed_characters": "Sono consentiti caratteri alfanumerici, trattino basso e due punti." + }, + "rename_relation": { + "rename_relation": "Rinomina relazione", + "rename_relation_from": "Rinomina la relazione da", + "old_name": "vecchio nome", + "to": "A", + "new_name": "nuovo nome", + "allowed_characters": "Sono consentiti caratteri alfanumerici, trattino basso e due punti." + }, + "update_relation_target": { + "update_relation": "Aggiorna relazione", + "relation_name": "nome della relazione", + "allowed_characters": "Sono consentiti caratteri alfanumerici, trattino basso e due punti.", + "to": "A", + "target_note": "nota di destinazione", + "on_all_matched_notes": "Su tutte le note abbinate", + "change_target_note": "cambia la nota di destinazione della relazione esistente", + "update_relation_target": "Aggiorna la destinazione della relazione" + }, + "attachments_actions": { + "open_externally": "Aperto esternamente", + "open_externally_title": "Il file verrà aperto in un'applicazione esterna e monitorato per eventuali modifiche. Potrai quindi caricare la versione modificata su Trilium.", + "open_custom": "Apri personalizzato", + "open_custom_title": "Il file verrà aperto in un'applicazione esterna e monitorato per eventuali modifiche. Potrai quindi caricare la versione modificata su Trilium.", + "download": "Scaricamento", + "rename_attachment": "Rinomina allegato", + "upload_new_revision": "Carica nuova revisione", + "copy_link_to_clipboard": "Copia il collegamento negli appunti", + "convert_attachment_into_note": "Convertire l'allegato in nota", + "delete_attachment": "Elimina allegato", + "upload_success": "È stata caricata una nuova revisione dell'allegato.", + "upload_failed": "Caricamento di una nuova revisione dell'allegato non riuscito.", + "open_externally_detail_page": "L'apertura esterna dell'allegato è disponibile solo dalla pagina dei dettagli. Per prima cosa, fare clic sui dettagli dell'allegato e ripetere l'operazione.", + "open_custom_client_only": "L'apertura personalizzata degli allegati può essere effettuata solo dal client desktop.", + "delete_confirm": "Sei sicuro di voler eliminare l'allegato '{{title}}'?", + "delete_success": "L'allegato '{{title}}' è stato eliminato.", + "convert_confirm": "Sei sicuro di voler convertire l'allegato '{{title}}' in una nota separata?", + "convert_success": "L'allegato '{{title}}' è stato convertito in nota.", + "enter_new_name": "Inserisci il nome del nuovo allegato" + }, + "calendar": { + "mon": "Lun", + "tue": "Mar", + "wed": "Mer", + "thu": "Gio", + "fri": "Ven", + "sat": "Sab", + "sun": "Dom", + "cannot_find_day_note": "Impossibile trovare la nota del giorno", + "cannot_find_week_note": "Impossibile trovare la nota della settimana", + "january": "Gennaio", + "february": "Febbraio", + "march": "Marzo", + "april": "aprile", + "may": "Maggio", + "june": "Giugno", + "july": "Luglio", + "august": "agosto", + "september": "settembre", + "october": "ottobre", + "november": "novembre", + "december": "Dicembre", + "week": "Settimana", + "week_previous": "Settimana precedente", + "week_next": "La prossima settimana", + "month": "Mese", + "month_previous": "Mese precedente", + "month_next": "Il mese prossimo", + "year": "Anno", + "year_previous": "Anno precedente", + "year_next": "L'anno prossimo", + "list": "Lista", + "today": "Oggi" + }, + "close_pane_button": { + "close_this_pane": "Chiudi questo riquadro" + }, + "create_pane_button": { + "create_new_split": "Crea una nuova divisione" + }, + "show_toc_widget_button": { + "show_toc": "Mostra indice" + }, + "show_highlights_list_widget_button": { + "show_highlights_list": "Mostra elenco punti salienti" + }, + "global_menu": { + "menu": "Menu", + "options": "Opzioni", + "open_new_window": "Apri una nuova finestra", + "switch_to_mobile_version": "Passa alla versione mobile", + "switch_to_desktop_version": "Passa alla versione desktop", + "zoom": "Zoom", + "toggle_fullscreen": "Attiva schermo intero", + "zoom_out": "Rimpicciolisci", + "reset_zoom_level": "Ripristina livello di zoom", + "zoom_in": "Ingrandisci", + "configure_launchbar": "Configura Launchbar", + "show_shared_notes_subtree": "Mostra sottoalbero note condivise", + "advanced": "Avanzato", + "open_dev_tools": "Strumenti di sviluppo aperti", + "open_sql_console": "Apri la console SQL", + "open_sql_console_history": "Apri la cronologia della console SQL", + "open_search_history": "Apri cronologia ricerche", + "show_backend_log": "Mostra registro backend", + "reload_hint": "Ricarica può aiutare a risolvere alcuni problemi visivi senza dover riavviare l'intera app.", + "reload_frontend": "Ricarica Frontend", + "show_hidden_subtree": "Mostra sottoalbero nascosto", + "show_help": "Mostra aiuto", + "about": "Informazioni su Trilium Notes", + "logout": "Esci", + "show-cheatsheet": "Mostra il foglietto illustrativo", + "toggle-zen-mode": "Modalità Zen", + "new-version-available": "Nuovo aggiornamento disponibile", + "download-update": "Ottieni la versione {{latestVersion}}" + }, + "zen_mode": { + "button_exit": "Esci dalla modalità Zen" + }, + "sync_status": { + "unknown": "

Lo stato della sincronizzazione sarĆ  noto una volta avviato il prossimo tentativo di sincronizzazione.

Fai clic per avviare la sincronizzazione ora.

", + "connected_with_changes": "

Connesso al server di sincronizzazione.
Ci sono ancora alcune modifiche in sospeso da sincronizzare.

Fai clic per avviare la sincronizzazione.

", + "connected_no_changes": "

Connesso al server di sincronizzazione.
Tutte le modifiche sono giĆ  state sincronizzate.

Fai clic per avviare la sincronizzazione.

", + "disconnected_with_changes": "

La connessione al server di sincronizzazione non ĆØ riuscita.
Ci sono alcune modifiche in sospeso che devono ancora essere sincronizzate.

Fai clic per avviare la sincronizzazione.

", + "disconnected_no_changes": "

La connessione al server di sincronizzazione non ĆØ riuscita.
Tutte le modifiche note sono state sincronizzate.

Fai clic per avviare la sincronizzazione.

", + "in_progress": "La sincronizzazione con il server è in corso." + }, + "left_pane_toggle": { + "show_panel": "Mostra pannello", + "hide_panel": "Nascondi pannello" + }, + "move_pane_button": { + "move_left": "Spostati a sinistra", + "move_right": "Spostati a destra" + }, + "note_actions": { + "convert_into_attachment": "Convertire in allegato", + "re_render_note": "Nota di ri-renderizzazione", + "search_in_note": "Cerca nella nota", + "note_source": "Nota fonte", + "note_attachments": "Allegati di note", + "open_note_externally": "Apri nota esternamente", + "open_note_externally_title": "Il file verrà aperto in un'applicazione esterna e monitorato per eventuali modifiche. Potrai quindi caricare la versione modificata su Trilium.", + "open_note_custom": "Apri nota personalizzata", + "import_files": "Importa file", + "export_note": "Nota di esportazione", + "delete_note": "Elimina nota", + "print_note": "Stampa nota", + "save_revision": "Salva la revisione", + "convert_into_attachment_failed": "Conversione della nota '{{title}}' fallita.", + "convert_into_attachment_successful": "Nota '{{title}}' è stato convertito in allegato.", + "convert_into_attachment_prompt": "Sei sicuro di voler convertire la nota '{{title}}' in un allegato della nota padre?", + "print_pdf": "Esporta come PDF..." + }, + "onclick_button": { + "no_click_handler": "Il widget pulsante '{{componentId}}' non ha un gestore di clic definito" + }, + "protected_session_status": { + "active": "La sessione protetta è attiva. Clicca per uscire dalla sessione protetta.", + "inactive": "Clicca per entrare nella sessione protetta" + }, + "revisions_button": { + "note_revisions": "Revisioni delle note" + }, + "update_available": { + "update_available": "Aggiornamento disponibile" + }, + "note_launcher": { + "this_launcher_doesnt_define_target_note": "Questo launcher non definisce la nota di destinazione." + }, + "code_buttons": { + "execute_button_title": "Esegui script", + "trilium_api_docs_button_title": "Apri la documentazione API di Trilium", + "save_to_note_button_title": "Salva per annotare", + "opening_api_docs_message": "Apertura dei documenti API...", + "sql_console_saved_message": "La nota della console SQL è stata salvata in {{note_path}}" + }, + "copy_image_reference_button": { + "button_title": "Copia il riferimento all'immagine negli appunti, può essere incollato in una nota di testo." + }, + "hide_floating_buttons_button": { + "button_title": "Nascondi pulsanti" + }, + "show_floating_buttons_button": { + "button_title": "Mostra pulsanti" + }, + "svg_export_button": { + "button_title": "Esporta diagramma come SVG" + }, + "relation_map_buttons": { + "create_child_note_title": "Crea una nuova nota secondaria e aggiungila a questa mappa delle relazioni", + "reset_pan_zoom_title": "Ripristina panoramica e zoom alle coordinate e all'ingrandimento iniziali", + "zoom_in_title": "Ingrandisci", + "zoom_out_title": "Rimpicciolisci" + }, + "zpetne_odkazy": { + "backlink": "{{count}} Backlink", + "backlinks": "{{count}} Backlinks", + "relation": "relazione" + }, + "mobile_detail_menu": { + "insert_child_note": "Inserisci nota secondaria", + "delete_this_note": "Elimina questa nota", + "note_revisions": "Revisioni delle note", + "error_cannot_get_branch_id": "Impossibile ottenere branchId per notePath '{{notePath}}'", + "error_unrecognized_command": "Comando non riconosciuto {{command}}" + }, + "note_icon": { + "change_note_icon": "Cambia icona nota", + "category": "Categoria:", + "search": "Ricerca:", + "reset-default": "Ripristina l'icona predefinita" + }, + "basic_properties": { + "note_type": "Tipo di nota", + "editable": "Modificabile", + "basic_properties": "Proprietà di base", + "language": "Lingua", + "configure_code_notes": "Configura le note del codice..." + }, + "book_properties": { + "view_type": "Tipo di visualizzazione", + "grid": "Griglia", + "list": "Lista", + "collapse_all_notes": "Comprimi tutte le note", + "expand_all_children": "Espandi tutti i bambini", + "collapse": "Crollo", + "expand": "Espandere", + "book_properties": "Proprietà della raccolta", + "invalid_view_type": "Tipo di visualizzazione non valido '{{type}}'", + "calendar": "Calendario", + "table": "Tavolo", + "geo-map": "Mappa geografica", + "board": "Asse", + "presentation": "Presentazione", + "include_archived_notes": "Mostra note archiviate" + }, + "edited_notes": { + "no_edited_notes_found": "Nessuna nota modificata per questo giorno...", + "title": "Note modificate", + "deleted": "(eliminato)" + }, + "file_properties": { + "note_id": "ID nota", + "original_file_name": "Nome del file originale", + "file_type": "Tipo di file", + "file_size": "Dimensione del file", + "download": "Scaricamento", + "open": "Aprire", + "upload_new_revision": "Carica nuova revisione", + "upload_success": "È stata caricata una nuova revisione del file.", + "upload_failed": "Caricamento di una nuova revisione del file non riuscito.", + "title": "File" + }, + "image_properties": { + "original_file_name": "Nome del file originale", + "file_type": "Tipo di file", + "file_size": "Dimensione del file", + "download": "Scaricamento", + "open": "Aprire", + "copy_reference_to_clipboard": "Copia il riferimento negli appunti", + "upload_new_revision": "Carica nuova revisione", + "upload_success": "È stata caricata una nuova revisione dell'immagine.", + "upload_failed": "Caricamento di una nuova revisione dell'immagine non riuscito: {{message}}", + "title": "Immagine" + }, + "inherited_attribute_list": { + "title": "Attributi ereditati", + "no_inherited_attributes": "Nessun attributo ereditato." + }, + "note_info_widget": { + "note_id": "ID nota", + "created": "Creato", + "modified": "Modificato", + "type": "Tipo", + "note_size": "Dimensione della nota", + "note_size_info": "La dimensione della nota fornisce una stima approssimativa dei requisiti di archiviazione per questa nota. Tiene conto del contenuto della nota e del contenuto delle sue revisioni.", + "calculate": "calcolare", + "subtree_size": "(dimensione del sottoalbero: {{size}} in {{count}} note)", + "title": "Nota informativa" + }, + "note_map": { + "open_full": "Espandi completamente", + "collapse": "Ritorna alle dimensioni normali", + "title": "Nota Mappa", + "fix-nodes": "Fissare i nodi", + "link-distance": "Distanza del collegamento" + }, + "note_paths": { + "title": "Percorsi delle note", + "clone_button": "Clona la nota nella nuova posizione...", + "intro_placed": "Questa nota è inserita nei seguenti percorsi:", + "intro_not_placed": "Questa nota non è ancora stata inserita nell'albero delle note.", + "outside_hoisted": "Questo percorso è al di fuori della nota sollevata e dovresti sganciarla.", + "archived": "Archiviato", + "search": "Ricerca" + }, + "note_properties": { + "this_note_was_originally_taken_from": "Questa nota è stata originariamente tratta da:", + "info": "Informazioni" + }, + "owned_attribute_list": { + "owned_attributes": "Attributi posseduti" + }, + "promoted_attributes": { + "promoted_attributes": "Attributi promossi", + "unset-field-placeholder": "non impostato", + "url_placeholder": "http://sito web...", + "open_external_link": "Apri collegamento esterno", + "unknown_label_type": "Tipo di etichetta sconosciuto '{{type}}'", + "unknown_attribute_type": "Tipo di attributo sconosciuto '{{type}}'", + "add_new_attribute": "Aggiungi nuovo attributo", + "remove_this_attribute": "Rimuovi questo attributo", + "remove_color": "Rimuovere l'etichetta colorata" + }, + "script_executor": { + "query": "Domanda", + "script": "Sceneggiatura", + "execute_query": "Esegui query", + "execute_script": "Esegui script" + }, + "similar_notes": { + "title": "Note simili", + "no_similar_notes_found": "Nessuna nota simile trovata." + }, + "fast_search": { + "fast_search": "Ricerca veloce", + "description": "L'opzione di ricerca rapida disattiva la ricerca del testo completo del contenuto delle note, il che potrebbe velocizzare la ricerca in database di grandi dimensioni." + }, + "include_archived_notes": { + "include_archived_notes": "Includi note archiviate" + }, + "limit": { + "limit": "Limite", + "take_first_x_results": "Prendi solo i primi X risultati specificati." + }, + "order_by": { + "order_by": "Ordina per", + "relevancy": "Rilevanza (predefinita)", + "title": "Titolo", + "date_created": "Data di creazione", + "date_modified": "Data dell'ultima modifica", + "content_size": "Nota la dimensione del contenuto", + "content_and_attachments_size": "Nota le dimensioni del contenuto, inclusi gli allegati", + "content_and_attachments_and_revisions_size": "Nota la dimensione del contenuto, inclusi allegati e revisioni", + "revision_count": "Numero di revisioni", + "children_count": "Numero di note sui bambini", + "parent_count": "Numero di cloni", + "owned_label_count": "Numero di etichette", + "owned_relation_count": "Numero di relazioni", + "target_relation_count": "Numero di relazioni che hanno come target la nota", + "random": "Ordine casuale", + "asc": "Crescente (predefinito)", + "desc": "Discendente" + }, + "search_script": { + "title": "Cerca script:", + "placeholder": "cerca la nota per nome", + "description1": "Lo script di ricerca consente di definire i risultati di ricerca eseguendo uno script. Ciò offre la massima flessibilità quando la ricerca standard non è sufficiente.", + "description2": "Lo script di ricerca deve essere di tipo \"codice\" e sottotipo \"backend JavaScript\". Lo script deve restituire un array di noteId o note.", + "example_title": "Guarda questo esempio:", + "example_code": "// 1. Prefiltraggio tramite ricerca standard\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. Applicazione di criteri di ricerca personalizzati\nconst matchedNotes = candidateNotes\n.filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;", + "note": "Si noti che lo script di ricerca e la stringa di ricerca non possono essere combinati tra loro." + }, + "attachment_list": { + "open_help_page": "Apri la pagina di aiuto sugli allegati", + "owning_note": "Nota di proprietà: ", + "upload_attachments": "Carica allegati", + "no_attachments": "Questa nota non ha allegati." + }, + "book": { + "no_children_help": "Questa raccolta non ha note secondarie, quindi non c'è nulla da visualizzare. Consulta la wiki per i dettagli.", + "drag_locked_title": "Bloccato per la modifica", + "drag_locked_message": "Trascinamento non consentito poiché la raccolta è bloccata per la modifica." + }, + "editable_code": { + "placeholder": "Digita qui il contenuto della tua nota di codice..." + }, + "editable_text": { + "placeholder": "Digita qui il contenuto della tua nota..." + }, + "empty": { + "open_note_instruction": "Apri una nota digitandone il titolo nel campo sottostante oppure scegli una nota nell'albero.", + "search_placeholder": "cerca una nota per nome", + "enter_workspace": "Accedi all'area di lavoro {{title}}" + }, + "file": { + "file_preview_not_available": "L'anteprima del file non è disponibile per questo formato di file.", + "too_big": "Per motivi di prestazioni, l'anteprima mostra solo i primi {{maxNumChars}} caratteri del file. Scarica il file e aprilo esternamente per poterne visualizzare l'intero contenuto." + }, + "protected_session": { + "enter_password_instruction": "Per visualizzare la nota protetta è necessario inserire la password:", + "start_session_button": "Avvia sessione protetta invio", + "started": "La sessione protetta è stata avviata.", + "wrong_password": "Password errata.", + "protecting-finished-successfully": "Protezione completata con successo.", + "unprotecting-finished-successfully": "Rimozione della protezione completata con successo.", + "protecting-in-progress": "Protezione in corso: {{count}}", + "unprotecting-in-progress-count": "Rimozione della protezione in corso: {{count}}", + "protecting-title": "Stato di protezione", + "unprotecting-title": "Stato non protetto" + }, + "relation_map": { + "open_in_new_tab": "Apri in una nuova scheda", + "remove_note": "Rimuovi nota", + "edit_title": "Modifica titolo", + "rename_note": "Rinomina nota", + "enter_new_title": "Inserisci il titolo della nuova nota:", + "remove_relation": "Rimuovi relazione", + "confirm_remove_relation": "Sei sicuro di voler rimuovere la relazione?", + "specify_new_relation_name": "Specificare il nome della nuova relazione (caratteri consentiti: alfanumerici, due punti e trattino basso):", + "connection_exists": "La connessione '{{name}}' tra queste note esiste già.", + "start_dragging_relations": "Inizia a trascinare le relazioni da qui e rilasciale su un'altra nota.", + "note_not_found": "Nota {{noteId}} non trovata!", + "cannot_match_transform": "Impossibile abbinare la trasformazione: {{transform}}", + "note_already_in_diagram": "Nota che \"{{title}}\" è già presente nel diagramma.", + "enter_title_of_new_note": "Inserisci il titolo della nuova nota", + "default_new_note_title": "nuova nota", + "click_on_canvas_to_place_new_note": "Clicca sulla tela per inserire una nuova nota" + }, + "render": { + "note_detail_render_help_1": "Questa nota di aiuto viene visualizzata perché questa nota di tipo Render HTML non ha la relazione richiesta per funzionare correttamente.", + "note_detail_render_help_2": "Il tipo di nota HTML Render viene utilizzato per lo scripting. In breve, si ottiene una nota in codice HTML (opzionalmente con un po' di JavaScript) che verrà visualizzata. Per farla funzionare, è necessario definire una relazione denominata \"renderNote\" che punti alla nota HTML da visualizzare." + }, + "web_view": { + "web_view": "Visualizzazione Web", + "embed_websites": "La nota di tipo Web View consente di incorporare siti web in Trilium.", + "create_label": "Per iniziare, crea un'etichetta con l'indirizzo URL che desideri incorporare, ad esempio #webViewSrc=\"https://www.google.com\"" + }, + "vacuum_database": { + "title": "Database del vuoto", + "description": "Questa operazione ricostruirà il database, generando in genere un file di dimensioni inferiori. In realtà, nessun dato verrà modificato.", + "button_text": "Database del vuoto", + "vacuuming_database": "Aspirazione del database...", + "database_vacuumed": "Il database è stato svuotato" + }, + "fonts": { + "theme_defined": "Tema definito", + "fonts": "Caratteri", + "main_font": "Carattere principale", + "font_family": "Famiglia di caratteri", + "size": "Misurare", + "note_tree_font": "Carattere dell'albero delle note", + "note_detail_font": "Nota Dettaglio Carattere", + "monospace_font": "Monospace (codice) Font", + "note_tree_and_detail_font_sizing": "Si noti che le dimensioni dei caratteri dell'albero e dei dettagli sono relative all'impostazione della dimensione del carattere principale.", + "not_all_fonts_available": "Non tutti i font elencati potrebbero essere disponibili sul tuo sistema.", + "apply_font_changes": "Per applicare le modifiche al carattere, fare clic su", + "reload_frontend": "ricarica frontend", + "generic-fonts": "Caratteri generici", + "sans-serif-system-fonts": "Caratteri di sistema sans-serif", + "serif-system-fonts": "Caratteri di sistema Serif", + "monospace-system-fonts": "Caratteri di sistema a spaziatura fissa", + "handwriting-system-fonts": "Caratteri del sistema di scrittura a mano", + "serif": "Serif", + "sans-serif": "Sans Serif", + "monospace": "Monospaziatura", + "system-default": "Predefinito del sistema" + }, + "max_content_width": { + "title": "Larghezza del contenuto", + "default_description": "Per impostazione predefinita, Trilium limita la larghezza massima del contenuto per migliorare la leggibilità sugli schermi più grandi.", + "max_width_label": "Larghezza massima del contenuto", + "max_width_unit": "pixel", + "apply_changes_description": "Per applicare le modifiche alla larghezza del contenuto, fare clic su", + "reload_button": "ricarica frontend", + "reload_description": "modifiche dalle opzioni di aspetto" + }, + "native_title_bar": { + "title": "Barra del titolo nativa (richiede il riavvio dell'app)", + "enabled": "abilitato", + "disabled": "disabile" + }, + "ribbon": { + "widgets": "Widget della barra multifunzione", + "promoted_attributes_message": "La scheda della barra multifunzione Attributi promossi si aprirà automaticamente se gli attributi promossi sono presenti nella nota", + "edited_notes_message": "La scheda della barra multifunzione Note modificate si aprirà automaticamente nelle note giornaliere" + }, + "theme": { + "title": "Tema dell'applicazione", + "theme_label": "Tema", + "override_theme_fonts_label": "Ignora i font del tema", + "auto_theme": "Legacy (seguire lo schema dei colori del sistema)", + "light_theme": "Eredità (Luce)", + "dark_theme": "Eredità (Oscuro)", + "triliumnext": "Trilium (seguire lo schema dei colori del sistema)", + "triliumnext-light": "Trilium (Luce)", + "triliumnext-dark": "Trilium (scuro)", + "layout": "Disposizione", + "layout-vertical-title": "Verticale", + "layout-horizontal-title": "Orizzontale", + "layout-vertical-description": "la barra di avvio è a sinistra (impostazione predefinita)", + "layout-horizontal-description": "la barra di avvio si trova sotto la barra delle schede, che ora è a larghezza intera." + }, + "ui-performance": { + "title": "Prestazione", + "enable-motion": "Abilita transizioni e animazioni", + "enable-shadows": "Abilita le ombre", + "enable-backdrop-effects": "Abilita gli effetti di sfondo per menu, popup e pannelli", + "enable-smooth-scroll": "Abilita lo scorrimento fluido", + "app-restart-required": "(per rendere effettiva la modifica è necessario riavviare l'applicazione)" + }, + "zoom_factor": { + "title": "Fattore di zoom (solo versione desktop)", + "description": "Lo zoom può essere controllato anche con le scorciatoie CTRL+- e CTRL+=." + }, + "code_auto_read_only_size": { + "title": "Dimensione automatica di sola lettura", + "description": "La dimensione automatica delle note in sola lettura è la dimensione dopo la quale le note verranno visualizzate in modalità di sola lettura (per motivi di prestazioni).", + "label": "Dimensione automatica di sola lettura (note sul codice)", + "unit": "caratteri" + }, + "code-editor-options": { + "title": "Redattore" + }, + "code_mime_types": { + "title": "Tipi MIME disponibili nel menu a discesa" + }, + "vim_key_bindings": { + "use_vim_keybindings_in_code_notes": "Combinazioni di tasti di Vim", + "enable_vim_keybindings": "Abilita le combinazioni di tasti di Vim nelle note del codice (nessuna modalità ex)" + }, + "wrap_lines": { + "wrap_lines_in_code_notes": "Righe di avvolgimento nelle note del codice", + "enable_line_wrap": "Abilita Line Wrap (la modifica potrebbe richiedere un ricaricamento del frontend per avere effetto)" + }, + "images": { + "images_section_title": "Immagini", + "download_images_automatically": "Scarica automaticamente le immagini per l'utilizzo offline.", + "download_images_description": "L'HTML incollato può contenere riferimenti a immagini online; Trilium troverà tali riferimenti e scaricherà le immagini in modo che siano disponibili offline.", + "enable_image_compression": "Abilita la compressione delle immagini", + "max_image_dimensions": "Larghezza/altezza massima di un'immagine (l'immagine verrà ridimensionata se supera questa impostazione).", + "max_image_dimensions_unit": "pixel", + "jpeg_quality_description": "Qualità JPEG (10 - qualità peggiore, 100 - qualità migliore, 50 - 85 è consigliato)" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "Timeout cancellazione allegato", + "attachment_auto_deletion_description": "Gli allegati vengono eliminati (e cancellati) automaticamente se non vengono più menzionati nella nota dopo un timeout definito.", + "erase_attachments_after": "Cancella gli allegati non utilizzati dopo:", + "manual_erasing_description": "È anche possibile attivare la cancellazione manualmente (senza considerare il timeout definito sopra):", + "erase_unused_attachments_now": "Cancella subito le note degli allegati non utilizzati", + "unused_attachments_erased": "Gli allegati non utilizzati sono stati cancellati." + }, + "network_connections": { + "network_connections_title": "Connessioni di rete", + "check_for_updates": "Controlla automaticamente gli aggiornamenti" + }, + "note_erasure_timeout": { + "note_erasure_timeout_title": "Timeout cancellazione nota", + "note_erasure_description": "Le note eliminate (e gli attributi, le revisioni...) vengono inizialmente contrassegnate come eliminate ed è possibile recuperarle dalla finestra di dialogo Note recenti. Dopo un certo periodo di tempo, le note eliminate vengono \"cancellate\", il che significa che il loro contenuto non è più recuperabile. Questa impostazione consente di configurare l'intervallo di tempo tra l'eliminazione e la cancellazione definitiva della nota.", + "erase_notes_after": "Cancella le note dopo:", + "manual_erasing_description": "È anche possibile attivare la cancellazione manualmente (senza considerare il timeout definito sopra):", + "erase_deleted_notes_now": "Cancella subito le note eliminate", + "deleted_notes_erased": "Le note eliminate sono state eliminate." + }, + "revisions_snapshot_interval": { + "note_revisions_snapshot_interval_title": "Nota Intervallo di istantanea della revisione", + "note_revisions_snapshot_description": "L'intervallo di snapshot della revisione della nota è il tempo dopo il quale verrà creata una nuova revisione per la nota. Per maggiori informazioni, consultare wiki.", + "snapshot_time_interval_label": "Nota intervallo di tempo per l'istantanea della revisione:" + }, + "revisions_snapshot_limit": { + "note_revisions_snapshot_limit_title": "Nota Limite di Snapshot di Revisione", + "note_revisions_snapshot_limit_description": "Il limite del numero di snapshot di revisione della nota si riferisce al numero massimo di revisioni che possono essere salvate per ciascuna nota. Dove -1 significa nessun limite, 0 significa eliminare tutte le revisioni. È possibile impostare il numero massimo di revisioni per una singola nota tramite l'etichetta #versioningLimit.", + "snapshot_number_limit_label": "Nota limite del numero di istantanee di revisione:", + "snapshot_number_limit_unit": "istantanee", + "erase_excess_revision_snapshots": "Cancella subito gli snapshot di revisione in eccesso", + "erase_excess_revision_snapshots_prompt": "Gli snapshot di revisione in eccesso sono stati cancellati." + }, + "text_auto_read_only_size": { + "title": "Dimensione automatica di sola lettura", + "description": "La dimensione automatica delle note in sola lettura è la dimensione dopo la quale le note verranno visualizzate in modalità di sola lettura (per motivi di prestazioni).", + "label": "Dimensione automatica di sola lettura (note di testo)", + "unit": "caratteri" + }, + "custom_date_time_format": { + "title": "Formato data/ora personalizzato", + "description": "Personalizza il formato della data e dell'ora inserite tramite o la barra degli strumenti. Consulta la documentazione Day.js per i token di formato disponibili.", + "format_string": "Stringa di formato:", + "formatted_time": "Data/ora formattata:" + }, + "options_widget": { + "options_status": "Stato delle opzioni", + "options_change_saved": "Le modifiche alle opzioni sono state salvate." + }, + "password": { + "heading": "Password", + "alert_message": "Ricordati di ricordare la nuova password. La password serve per accedere all'interfaccia web e per crittografare le note protette. Se dimentichi la password, tutte le tue note protette andranno perse per sempre.", + "reset_link": "Clicca qui per reimpostarlo.", + "old_password": "Vecchia password", + "new_password": "Nuova password", + "new_password_confirmation": "Conferma della nuova password", + "change_password": "Cambiare la password", + "protected_session_timeout": "Timeout della sessione protetta", + "protected_session_timeout_description": "Il timeout della sessione protetta è un periodo di tempo dopo il quale la sessione protetta viene cancellata dalla memoria del browser. Questo periodo viene calcolato a partire dall'ultima interazione con le note protette. Vedi", + "wiki": "wiki", + "for_more_info": "per maggiori informazioni.", + "protected_session_timeout_label": "Timeout della sessione protetta:", + "reset_confirmation": "Reimpostando la password perderai per sempre l'accesso a tutte le tue note protette. Vuoi davvero reimpostare la password?", + "reset_success_message": "La password è stata resettata. Imposta una nuova password", + "change_password_heading": "Cambiare la password", + "set_password_heading": "Imposta password", + "set_password": "Imposta password", + "password_mismatch": "Le nuove password non sono tutte uguali.", + "password_changed_success": "La password è stata modificata. Trilium verrà ricaricato dopo aver premuto OK." + }, + "multi_factor_authentication": { + "title": "Autenticazione a più fattori", + "description": "L'autenticazione a più fattori (MFA) aggiunge un ulteriore livello di sicurezza al tuo account. Invece di inserire semplicemente una password per accedere, l'MFA richiede di fornire una o più prove aggiuntive per verificare la tua identità. In questo modo, anche se qualcuno dovesse entrare in possesso della tua password, non potrà comunque accedere al tuo account senza la seconda informazione. È come aggiungere una serratura extra alla tua porta, rendendo molto più difficile l'accesso per chiunque altro.

Segui le istruzioni seguenti per abilitare l'MFA. Se la configurazione non è corretta, l'accesso verrà effettuato solo tramite password.", + "mfa_enabled": "Abilita l'autenticazione a più fattori", + "mfa_method": "Metodo MFA", + "electron_disabled": "L'autenticazione a più fattori non è attualmente supportata nella versione desktop.", + "totp_title": "Password monouso basata sul tempo (TOTP)", + "totp_description": "TOTP (Time-Based One-Time Password) è una funzione di sicurezza che genera un codice temporaneo univoco che cambia ogni 30 secondi. Questo codice, insieme alla password, viene utilizzato per accedere al proprio account, rendendolo molto più difficile da accedere per chiunque altro.", + "totp_secret_title": "Genera il segreto TOTP", + "totp_secret_generate": "Genera il segreto TOTP", + "totp_secret_regenerate": "Rigenera il segreto TOTP", + "no_totp_secret_warning": "Per abilitare TOTP, è necessario prima generare un segreto TOTP.", + "totp_secret_description_warning": "Dopo aver generato un nuovo segreto TOTP, ti verrà richiesto di effettuare nuovamente l'accesso con il nuovo segreto TOTP.", + "totp_secret_generated": "TOTP Segreto Generato", + "totp_secret_warning": "Si prega di salvare il segreto generato in un luogo sicuro. Non verrà più visualizzato.", + "totp_secret_regenerate_confirm": "Vuoi davvero rigenerare il segreto TOTP? Questo invaliderà il segreto TOTP precedente e tutti i codici di recupero esistenti.", + "recovery_keys_title": "Chiavi di ripristino Single Sign-on", + "recovery_keys_description": "Le chiavi di recupero Single Sign-On vengono utilizzate per effettuare l'accesso anche se non è possibile accedere ai codici Authenticator.", + "recovery_keys_description_warning": "Le chiavi di recupero non verranno più visualizzate dopo aver abbandonato la pagina: conservale in un luogo sicuro e protetto.
Una volta utilizzata, una chiave di recupero non potrĆ  più essere utilizzata.", + "recovery_keys_error": "Errore durante la generazione dei codici di ripristino", + "recovery_keys_no_key_set": "Nessun codice di ripristino impostato", + "recovery_keys_generate": "Genera codici di recupero", + "recovery_keys_regenerate": "Rigenera i codici di recupero", + "recovery_keys_used": "Utilizzato: {{date}}", + "recovery_keys_unused": "Il codice di ripristino {{index}} non ĆØ utilizzato", + "oauth_title": "OAuth/OpenID", + "oauth_description": "OpenID ĆØ un metodo standardizzato che ti consente di accedere ai siti web utilizzando un account di un altro servizio, come Google, per verificare la tua identitĆ . L'emittente predefinito ĆØ Google, ma puoi cambiarlo con qualsiasi altro provider OpenID. Per ulteriori informazioni, consulta qui. Segui queste istruzioni per configurare un servizio OpenID tramite Google.", + "oauth_description_warning": "Per abilitare OAuth/OpenID, ĆØ necessario impostare l'URL di base di OAuth/OpenID, l'ID client e il segreto client nel file config.ini e riavviare l'applicazione. Per impostare le variabili d'ambiente, impostare TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID e TRILIUM_OAUTH_CLIENT_SECRET.", + "oauth_missing_vars": "Impostazioni mancanti: {{-variables}}", + "oauth_user_account": "Account utente: ", + "oauth_user_email": "Email utente: ", + "oauth_user_not_logged_in": "Non hai effettuato l'accesso!" + }, + "spellcheck": { + "title": "Controllo ortografico", + "description": "Queste opzioni sono valide solo per le versioni desktop; i browser utilizzeranno il proprio controllo ortografico nativo.", + "enable": "Abilita il controllo ortografico", + "language_code_label": "Codice/i della lingua", + "language_code_placeholder": "ad esempio \"en-US\", \"de-AT\"", + "multiple_languages_info": "ƈ possibile separare più lingue con una virgola, ad esempio \"en-US, de-DE, cs\". ", + "available_language_codes_label": "Codici lingua disponibili:", + "restart-required": "Le modifiche alle opzioni di controllo ortografico avranno effetto dopo il riavvio dell'applicazione." + }, + "api_log": { + "close": "Vicino" + }, + "attachment_detail_2": { + "will_be_deleted_in": "Questo allegato verrĆ  eliminato automaticamente tra {{time}}", + "will_be_deleted_soon": "Questo allegato verrĆ  eliminato automaticamente a breve", + "deletion_reason": ", perchĆ© l'allegato non ĆØ collegato al contenuto della nota. Per impedirne l'eliminazione, aggiungi nuovamente il collegamento all'allegato nel contenuto o converti l'allegato in nota.", + "role_and_size": "Ruolo: {{role}}, Dimensione: {{size}}", + "link_copied": "Link all'allegato copiato negli appunti.", + "unrecognized_role": "Ruolo di allegato non riconosciuto '{{role}}'." + }, + "bookmark_switch": { + "bookmark": "Segnalibro", + "bookmark_this_note": "Aggiungi questa nota ai segnalibri nel pannello laterale sinistro", + "remove_bookmark": "Rimuovi segnalibro" + }, + "editability_select": { + "auto": "Auto", + "read_only": "Sola lettura", + "always_editable": "Sempre modificabile", + "note_is_editable": "La nota ĆØ modificabile se non ĆØ troppo lunga.", + "note_is_read_only": "La nota ĆØ di sola lettura, ma può essere modificata cliccando su un pulsante.", + "note_is_always_editable": "La nota ĆØ sempre modificabile, indipendentemente dalla sua lunghezza." + }, + "note-map": { + "button-link-map": "Mappa dei collegamenti", + "button-tree-map": "Mappa degli alberi" + }, + "shared_info": { + "shared_publicly": "Questa nota ĆØ condivisa pubblicamente su {{- link}}.", + "shared_locally": "Questa nota ĆØ condivisa localmente su {{- link}}.", + "help_link": "Per assistenza visita wiki." + }, + "note_types": { + "text": "Testo", + "code": "Codice", + "saved-search": "Ricerca salvata", + "relation-map": "Mappa delle relazioni", + "note-map": "Nota Mappa", + "render-note": "Nota di rendering", + "book": "Collezione", + "mermaid-diagram": "Diagramma della sirena", + "canvas": "Tela", + "web-view": "Visualizzazione Web", + "mind-map": "Mappa mentale", + "file": "File", + "image": "Immagine", + "launcher": "Lanciatore", + "doc": "Dottore", + "widget": "Oggetto", + "confirm-change": "Si sconsiglia di cambiare tipo di nota quando il contenuto della nota non ĆØ vuoto. Vuoi continuare comunque?", + "geo-map": "Mappa geografica", + "beta-feature": "Beta", + "ai-chat": "Chat AI", + "task-list": "Elenco delle attivitĆ ", + "new-feature": "Nuovo", + "collections": "Collezioni" + }, + "protect_note": { + "toggle-on": "Proteggi la nota", + "toggle-off": "Rimuovere la protezione dalla nota", + "toggle-on-hint": "La nota non ĆØ protetta, clicca per proteggerla", + "toggle-off-hint": "La nota ĆØ protetta, clicca per renderla non protetta" + }, + "template_switch": { + "template": "Modello", + "toggle-on-hint": "Trasforma la nota in un modello", + "toggle-off-hint": "Rimuovi la nota come modello" + }, + "open-help-page": "Apri la pagina di aiuto", + "find": { + "case_sensitive": "Maiuscole e minuscole", + "match_words": "Abbina le parole", + "find_placeholder": "Trova nel testo...", + "replace_placeholder": "Sostituisci con...", + "replace": "Sostituire", + "replace_all": "Sostituisci tutto" + }, + "note_tree": { + "collapse-title": "Comprimi l'albero delle note", + "scroll-active-title": "Scorri fino alla nota attiva", + "tree-settings-title": "Impostazioni dell'albero", + "hide-archived-notes": "Nascondi le note archiviate", + "automatically-collapse-notes": "Comprimi automaticamente le note", + "automatically-collapse-notes-title": "Dopo un periodo di inattivitĆ , le note verranno compresse per riordinare l'albero.", + "save-changes": "Salva e applica le modifiche", + "auto-collapsing-notes-after-inactivity": "Compressione automatica delle note dopo inattivitĆ ...", + "saved-search-note-refreshed": "Nota di ricerca salvata aggiornata.", + "hoist-this-note-workspace": "Solleva questa nota (area di lavoro)", + "refresh-saved-search-results": "Aggiorna i risultati della ricerca salvati", + "create-child-note": "Crea nota figlio", + "unhoist": "Sganciare", + "toggle-sidebar": "Attiva/disattiva la barra laterale" + }, + "title_bar_buttons": { + "window-on-top": "Mantieni la finestra in primo piano" + }, + "note_detail": { + "could_not_find_typewidget": "Impossibile trovare typeWidget per il tipo '{{type}}'", + "printing": "Stampa in corso...", + "printing_pdf": "Esportazione in PDF in corso..." + }, + "note_title": { + "placeholder": "scrivi qui il titolo della nota..." + }, + "search_result": { + "no_notes_found": "Non sono state trovate note per i parametri di ricerca specificati.", + "search_not_executed": "La ricerca non ĆØ stata ancora eseguita. Clicca sul pulsante \"Cerca\" qui sopra per visualizzare i risultati." + }, + "spacer": { + "configure_launchbar": "Configura Launchbar" + }, + "sql_result": { + "no_rows": "Nessuna riga ĆØ stata restituita per questa query" + }, + "watched_file_update_status": { + "file_last_modified": "Il file ĆØ stato modificato l'ultima volta il .", + "upload_modified_file": "Carica il file modificato", + "ignore_this_change": "Ignora questa modifica" + }, + "app_context": { + "please_wait_for_save": "Attendi qualche secondo affinchĆ© il salvataggio venga completato, quindi potrai riprovare." + }, + "note_create": { + "duplicated": "Nota: \"{{title}}\" ĆØ stato duplicato." + }, + "image": { + "copied-to-clipboard": "Un riferimento all'immagine ĆØ stato copiato negli appunti. Può essere incollato in qualsiasi nota di testo.", + "cannot-copy": "Impossibile copiare il riferimento all'immagine negli appunti." + }, + "clipboard": { + "cut": "Le note sono state tagliate negli appunti.", + "copied": "Le note sono state copiate negli appunti.", + "copy_failed": "Impossibile copiare negli appunti a causa di problemi di autorizzazione.", + "copy_success": "Copiato negli appunti." + }, + "entrypoints": { + "note-revision-created": "La revisione della nota ĆØ stata creata.", + "note-executed": "Nota eseguita.", + "sql-error": "Si ĆØ verificato un errore durante l'esecuzione della query SQL: {{message}}" + }, + "branches": { + "cannot-move-notes-here": "Impossibile spostare le note qui.", + "delete-status": "Elimina stato", + "delete-notes-in-progress": "Eliminazione note in corso: {{count}}", + "delete-finished-successfully": "Eliminazione completata con successo.", + "undeleting-notes-in-progress": "Ripristino delle note in corso: {{count}}", + "undeleting-notes-finished-successfully": "Recupero note completato con successo." + }, + "frontend_script_api": { + "async_warning": "Stai passando una funzione asincrona a `api.runOnBackend()` che probabilmente non funzionerĆ  come previsto.\\nRendi la funzione sincrona (rimuovendo la parola chiave `async`) oppure usa `api.runAsyncOnBackendWithManualTransactionHandling()`.", + "sync_warning": "Stai passando una funzione sincrona a `api.runAsyncOnBackendWithManualTransactionHandling()`, \\nmentre probabilmente dovresti usare `api.runOnBackend()`." + }, + "ws": { + "sync-check-failed": "Controllo di sincronizzazione fallito!", + "consistency-checks-failed": "Controlli di coerenza falliti! Vedi i log per i dettagli.", + "encountered-error": "Si ĆØ verificato l'errore \"{{message}}\", controlla la console.", + "lost-websocket-connection-title": "Connessione al server persa", + "lost-websocket-connection-message": "Controlla la configurazione del proxy inverso (ad esempio nginx o Apache) per assicurarti che le connessioni WebSocket siano correttamente consentite e non bloccate." + }, + "hoisted_note": { + "confirm_unhoisting": "La nota richiesta '{{requestedNote}}' ĆØ esterna al sottoalbero della nota sollevata '{{hoistedNote}}' e devi rimuoverla per accedervi. Vuoi procedere con la rimozione?" + }, + "launcher_context_menu": { + "reset_launcher_confirm": "Vuoi davvero reimpostare \"{{title}}\"? Tutti i dati/le impostazioni in questa nota (e nelle relative note secondarie) andranno persi e il launcher tornerĆ  alla sua posizione originale.", + "add-note-launcher": "Aggiungi un launcher di note", + "add-script-launcher": "Aggiungi un launcher di script", + "add-custom-widget": "Aggiungi un widget personalizzato", + "add-spacer": "Aggiungi distanziatore", + "delete": "Elimina ", + "reset": "Reset", + "move-to-visible-launchers": "Passa ai launcher visibili", + "move-to-available-launchers": "Passa ai launcher disponibili", + "duplicate-launcher": "Duplica il launcher " + }, + "editable-text": { + "auto-detect-language": "Rilevato automaticamente" + }, + "highlighting": { + "title": "Blocchi di codice", + "description": "Controlla l'evidenziazione della sintassi per i blocchi di codice all'interno delle note di testo; le note di codice non saranno interessate.", + "color-scheme": "Schema di colori" + }, + "code_block": { + "word_wrapping": "A capo automatico", + "theme_none": "Nessuna evidenziazione della sintassi", + "theme_group_light": "Temi chiari", + "theme_group_dark": "Temi scuri", + "copy_title": "Copia negli appunti" + }, + "classic_editor_toolbar": { + "title": "Formattazione" + }, + "editor": { + "title": "Redattore" + }, + "image_context_menu": { + "copy_reference_to_clipboard": "Copia il riferimento negli appunti", + "copy_image_to_clipboard": "Copia l'immagine negli appunti" + }, + "link_context_menu": { + "open_note_in_new_tab": "Apri la nota in una nuova scheda", + "open_note_in_new_split": "Apri nota in una nuova divisione", + "open_note_in_new_window": "Apri la nota in una nuova finestra", + "open_note_in_popup": "Modifica rapida" + }, + "help-button": { + "title": "Apri la pagina di aiuto pertinente" + }, + "duration": { + "seconds": "Secondi", + "minutes": "Minuti", + "hours": "Ore", + "days": "Giorni" + }, + "share": { + "title": "Impostazioni di condivisione", + "redirect_bare_domain": "Reindirizza il dominio nudo alla pagina di condivisione", + "redirect_bare_domain_description": "Reindirizza gli utenti anonimi alla pagina Condividi invece di mostrare l'accesso", + "show_login_link": "Mostra il collegamento di accesso nel tema Condividi", + "show_login_link_description": "Aggiungi un collegamento di accesso al piĆØ di pagina della pagina Condividi", + "check_share_root": "Controlla lo stato della radice condivisa", + "share_root_found": "La nota radice condivisa '{{noteTitle}}' ĆØ pronta", + "share_root_not_found": "Nessuna nota con etichetta #shareRoot trovata", + "share_root_not_shared": "Nota '{{noteTitle}}' ha l'etichetta #shareRoot ma non ĆØ condiviso" + }, + "time_selector": { + "invalid_input": "Il valore temporale immesso non ĆØ un numero valido.", + "minimum_input": "Il valore temporale immesso deve essere di almeno {{minimumSeconds}} secondi." + }, + "tasks": { + "due": { + "today": "Oggi", + "tomorrow": "Domani", + "yesterday": "Ieri" + } + }, + "content_widget": { + "unknown_widget": "Widget sconosciuto per \"{{id}}\"." + }, + "note_language": { + "not_set": "Non impostato", + "configure-languages": "Configura le lingue..." + }, + "content_language": { + "title": "Lingue dei contenuti", + "description": "Seleziona una o più lingue che desideri visualizzare nella sezione \"ProprietĆ  di base\" di una nota di testo di sola lettura o modificabile. Ciò consentirĆ  funzionalitĆ  come il controllo ortografico o il supporto per la scrittura da destra a sinistra." + }, + "switch_layout_button": { + "title_vertical": "Sposta il riquadro di modifica in basso", + "title_horizontal": "Sposta il riquadro di modifica a sinistra" + }, + "toggle_read_only_button": { + "unlock-editing": "Sblocca la modifica", + "lock-editing": "Modifica blocco" + }, + "png_export_button": { + "button_title": "Esporta diagramma come PNG" + }, + "svg": { + "export_to_png": "Non ĆØ stato possibile esportare il diagramma in formato PNG." + }, + "code_theme": { + "title": "Aspetto", + "word_wrapping": "A capo automatico", + "color-scheme": "Schema dei colori" + }, + "book_properties_config": { + "hide-weekends": "Nascondi i fine settimana", + "display-week-numbers": "Visualizza i numeri delle settimane", + "map-style": "Stile mappa:", + "max-nesting-depth": "ProfonditĆ  massima di nidificazione:", + "raster": "Trama", + "vector_light": "Vettore (Luce)", + "vector_dark": "Vettore (scuro)", + "show-scale": "Mostra scala" + }, + "table_context_menu": { + "delete_row": "Elimina riga" + }, + "presentation_view": { + "edit-slide": "Modifica questa diapositiva", + "start-presentation": "Inizia la presentazione", + "slide-overview": "Attiva/disattiva una panoramica delle diapositive" + }, + "command_palette": { + "tree-action-name": "Albero: {{name}}", + "export_note_title": "Nota di esportazione", + "export_note_description": "Esporta la nota corrente", + "show_attachments_title": "Mostra allegati", + "show_attachments_description": "Visualizza gli allegati delle note", + "search_notes_title": "Cerca note", + "search_notes_description": "Apri la ricerca avanzata", + "search_subtree_title": "Cerca nel sottoalbero", + "search_subtree_description": "Cerca all'interno del sottoalbero corrente", + "search_history_title": "Mostra cronologia delle ricerche", + "search_history_description": "Visualizza le ricerche precedenti", + "configure_launch_bar_title": "Configura la barra di avvio", + "configure_launch_bar_description": "Aprire la configurazione della barra di avvio per aggiungere o rimuovere elementi." + }, + "content_renderer": { + "open_externally": "Aperto esternamente" + }, + "call_to_action": { + "next_theme_title": "Prova il nuovo tema Trilium", + "next_theme_message": "Al momento stai utilizzando il tema legacy. Vuoi provare il nuovo tema?", + "next_theme_button": "Prova il nuovo tema", + "background_effects_title": "Gli effetti di sfondo sono ora stabili", + "background_effects_message": "Sui dispositivi Windows, gli effetti di sfondo sono ora completamente stabili. Gli effetti di sfondo aggiungono un tocco di colore all'interfaccia utente sfocando lo sfondo retrostante. Questa tecnica ĆØ utilizzata anche in altre applicazioni come Esplora risorse di Windows.", + "background_effects_button": "Abilita gli effetti di sfondo", + "dismiss": "Congedare" + }, + "settings": { + "related_settings": "Impostazioni correlate" + }, + "settings_appearance": { + "related_code_blocks": "Schema di colori per i blocchi di codice nelle note di testo", + "related_code_notes": "Schema di colori per le note del codice" + }, + "units": { + "percentage": "%" + }, + "pagination": { + "page_title": "Pagina di {{startIndex}} - {{endIndex}}", + "total_notes": "{{count}} note" + }, + "collections": { + "rendering_error": "Impossibile mostrare il contenuto a causa di un errore." } } diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index d35501a37..1f81a4a4f 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -38,12 +38,12 @@ "save": "äæå­˜", "edit_branch_prefix": "ćƒ–ćƒ©ćƒ³ćƒęŽ„é ­č¾žć®ē·Øé›†", "help_on_tree_prefix": "ćƒ„ćƒŖćƒ¼ęŽ„é ­č¾žć«é–¢ć™ć‚‹ćƒ˜ćƒ«ćƒ—", - "prefix": "ęŽ„é ­č¾žļ¼š ", - "branch_prefix_saved": "ćƒ–ćƒ©ćƒ³ćƒęŽ„é ­č¾žćŒäæå­˜ć•ć‚Œć¾ć—ćŸć€‚" + "prefix": "ęŽ„é ­č¾ž: ", + "branch_prefix_saved": "ćƒ–ćƒ©ćƒ³ćƒć®ęŽ„é ­č¾žćŒäæå­˜ć•ć‚Œć¾ć—ćŸć€‚" }, "global_menu": { "menu": "ćƒ”ćƒ‹ćƒ„ćƒ¼", - "options": "ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³", + "options": "設定", "open_new_window": "ę–°ć—ć„ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć‚’é–‹ć", "zoom": "ć‚ŗćƒ¼ćƒ ", "toggle_fullscreen": "ćƒ•ćƒ«ć‚¹ć‚ÆćƒŖćƒ¼ćƒ³ć®åˆ‡ć‚Šę›æćˆ", @@ -66,11 +66,14 @@ "toggle-zen-mode": "ē¦…ćƒ¢ćƒ¼ćƒ‰", "switch_to_mobile_version": "ćƒ¢ćƒć‚¤ćƒ«ē‰ˆć«åˆ‡ć‚Šę›æćˆ", "switch_to_desktop_version": "ćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ—ē‰ˆć«åˆ‡ć‚Šę›æćˆ", - "configure_launchbar": "ランチャーバーの設定" + "configure_launchbar": "ランチャーバーの設定", + "show_shared_notes_subtree": "å…±ęœ‰ćƒŽćƒ¼ćƒˆć®ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć‚’č”Øē¤ŗ", + "new-version-available": "ę–°ć—ć„ć‚¢ćƒƒćƒ—ćƒ‡ćƒ¼ćƒˆćŒåˆ©ē”ØåÆčƒ½", + "download-update": "{{latestVersion}} ć‚’ćƒćƒ¼ć‚øćƒ§ćƒ³ć‚’å…„ę‰‹" }, "left_pane_toggle": { "show_panel": "ćƒ‘ćƒćƒ«ć‚’č”Øē¤ŗ", - "hide_panel": "ćƒ‘ćƒćƒ«ć‚’éš ć™" + "hide_panel": "ćƒ‘ćƒćƒ«ć‚’éžč”Øē¤ŗ" }, "move_pane_button": { "move_left": "左に移動", @@ -78,14 +81,14 @@ }, "clone_to": { "notes_to_clone": "ć‚Æćƒ­ćƒ¼ćƒ³ć™ć‚‹ćƒŽćƒ¼ćƒˆ", - "target_parent_note": "ć‚æćƒ¼ć‚²ćƒƒćƒˆć®č¦ŖćƒŽćƒ¼ćƒˆ", + "target_parent_note": "åÆ¾č±”ć®č¦ŖćƒŽćƒ¼ćƒˆ", "search_for_note_by_its_name": "ćƒŽćƒ¼ćƒˆåć§ę¤œē“¢", "cloned_note_prefix_title": "ć‚Æćƒ­ćƒ¼ćƒ³ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆćÆć€ęŒ‡å®šć•ć‚ŒćŸęŽ„é ­č¾žć‚’ä»˜ć‘ć¦ćƒŽćƒ¼ćƒˆćƒ„ćƒŖćƒ¼ć«č”Øē¤ŗć•ć‚Œć¾ć™", "prefix_optional": "ęŽ„é ­č¾žļ¼ˆä»»ę„ļ¼‰", "clone_to_selected_note": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆć«ć‚Æćƒ­ćƒ¼ćƒ³", "no_path_to_clone_to": "ć‚Æćƒ­ćƒ¼ćƒ³å…ˆć®ćƒ‘ć‚¹ćŒå­˜åœØć—ć¾ć›ć‚“ć€‚", "note_cloned": "ćƒŽćƒ¼ćƒˆ \"{{clonedTitle}}\" は \"{{targetTitle}}\" ć«ć‚Æćƒ­ćƒ¼ćƒ³ć•ć‚Œć¾ć—ćŸ", - "clone_notes_to": "ćƒŽćƒ¼ćƒˆć‚’ć‚Æćƒ­ćƒ¼ćƒ³ć—ć¦...", + "clone_notes_to": "ćƒŽćƒ¼ćƒˆć‚’ć‚Æćƒ­ćƒ¼ćƒ³...", "help_on_links": "ćƒ˜ćƒ«ćƒ—ćøć®ćƒŖćƒ³ć‚Æ" }, "delete_notes": { @@ -110,7 +113,7 @@ "sat": "土", "sun": "ę—„", "january": "1月", - "febuary": "2月", + "february": "2月", "march": "3月", "april": "4月", "may": "5月", @@ -120,7 +123,20 @@ "september": "9月", "october": "10月", "november": "11月", - "december": "12月" + "december": "12月", + "cannot_find_day_note": "dayćƒŽćƒ¼ćƒˆćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“", + "cannot_find_week_note": "weekćƒŽćƒ¼ćƒˆćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“", + "week": "週", + "week_previous": "å‰ć®é€±", + "week_next": "ꬔ恮週", + "month": "月", + "month_previous": "å‰ć®ęœˆ", + "month_next": "欔の月", + "year": "幓", + "year_previous": "å‰ć®å¹“", + "year_next": "欔の幓", + "list": "ćƒŖć‚¹ćƒˆ", + "today": "今ꗄ" }, "note_icon": { "change_note_icon": "ćƒŽćƒ¼ćƒˆć‚¢ć‚¤ć‚³ćƒ³ć®å¤‰ę›“", @@ -132,7 +148,8 @@ "note_type": "ćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒ—", "editable": "ē·Øé›†åÆčƒ½", "basic_properties": "åŸŗęœ¬ćƒ—ćƒ­ćƒ‘ćƒ†ć‚£", - "language": "čØ€čŖž" + "language": "čØ€čŖž", + "configure_code_notes": "ć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆć‚’čØ­å®šć—ć¦ć„ć¾ć™..." }, "i18n": { "title": "ćƒ­ćƒ¼ć‚«ćƒ©ć‚¤ć‚¼ćƒ¼ć‚·ćƒ§ćƒ³", @@ -147,7 +164,13 @@ "min-days-in-first-week": "ęœ€åˆć®é€±ć®ęœ€ä½Žę—„ę•°", "first-week-info": "ęœ€åˆć®é€±ćÆć€ćć®å¹“ć®ęœ€åˆć®ęœØę›œę—„ć‚’å«ć‚€é€±ć‚’ęŒ‡ć—ć€ISO 8601č¦ę ¼ć«åŸŗć„ć„ć¦ć„ć¾ć™ć€‚", "first-week-warning": "ęœ€åˆć®é€±ć®ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć‚’å¤‰ę›“ć™ć‚‹ćØć€ę—¢å­˜ć®ć‚¦ć‚£ćƒ¼ć‚ÆćƒŽćƒ¼ćƒˆćØé‡č¤‡ć™ć‚‹åÆčƒ½ę€§ćŒć‚ć‚Šć€ę—¢å­˜ć®ć‚¦ć‚£ćƒ¼ć‚ÆćƒŽćƒ¼ćƒˆćÆćć‚Œć«åæœć˜ć¦ę›“ę–°ć•ć‚Œć¾ć›ć‚“ć€‚", - "formatting-locale": "ę—„ä»˜ćØę•°å€¤ć®ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆ" + "formatting-locale": "ę—„ä»˜ćØę•°å€¤ć®ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆ", + "formatting-locale-auto": "ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®čØ€čŖžć«åŸŗć„ć„ć¦", + "tuesday": "ē«ę›œę—„", + "wednesday": "ę°“ę›œę—„", + "thursday": "ęœØę›œę—„", + "friday": "é‡‘ę›œę—„", + "saturday": "åœŸę›œę—„" }, "tab_row": { "close_tab": "ć‚æćƒ–ć‚’é–‰ć˜ć‚‹", @@ -191,7 +214,8 @@ "search_parameters": "ę¤œē“¢ćƒ‘ćƒ©ćƒ”ćƒ¼ć‚æ", "unknown_search_option": "äøę˜ŽćŖę¤œē“¢ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ {{searchOptionName}}", "search_note_saved": "ę¤œē“¢ćƒŽćƒ¼ćƒˆćŒ {{- notePathTitle}} ć«äæå­˜ć•ć‚Œć¾ć—ćŸ", - "actions_executed": "ć‚¢ć‚Æć‚·ćƒ§ćƒ³ćŒå®Ÿč”Œć•ć‚Œć¾ć—ćŸć€‚" + "actions_executed": "ć‚¢ć‚Æć‚·ćƒ§ćƒ³ćŒå®Ÿč”Œć•ć‚Œć¾ć—ćŸć€‚", + "ancestor": "ē„–å…ˆ:" }, "shortcuts": { "multiple_shortcuts": "åŒć˜ć‚¢ć‚Æć‚·ćƒ§ćƒ³ć«åÆ¾ć—ć¦č¤‡ę•°ć®ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆć‚’čØ­å®šć™ć‚‹å “åˆć€ć‚«ćƒ³ćƒžć§åŒŗåˆ‡ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚", @@ -235,12 +259,12 @@ "help": { "title": "ćƒćƒ¼ćƒˆć‚·ćƒ¼ćƒˆ", "noteNavigation": "ćƒŽćƒ¼ćƒˆćƒŠćƒ“ć‚²ćƒ¼ć‚·ćƒ§ćƒ³", - "collapseExpand": "ćƒŽćƒ¼ćƒ‰ć®ę ¼ē“/展開", + "collapseExpand": "ćƒŽćƒ¼ćƒ‰ć‚’ęŠ˜ć‚ŠćŸćŸć‚€ / 展開", "goBackForwards": "å±„ę­“ć‚’ęˆ»ć‚‹ļ¼é€²ć‚€", "scrollToActiveNote": "ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćƒŽćƒ¼ćƒˆć¾ć§ć‚¹ć‚Æćƒ­ćƒ¼ćƒ«", "jumpToParentNote": "č¦ŖćƒŽćƒ¼ćƒˆćøē§»å‹•", - "collapseWholeTree": "ć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆćƒ„ćƒŖćƒ¼ć‚’ę ¼ē“", - "collapseSubTree": "ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć‚’ę ¼ē“", + "collapseWholeTree": "ć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆćƒ„ćƒŖćƒ¼ć‚’ęŠ˜ć‚ŠćŸćŸć‚€", + "collapseSubTree": "ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć‚’ęŠ˜ć‚ŠćŸćŸć‚€", "tabShortcuts": "ć‚æćƒ–ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆ", "newTabNoteLink": "ćƒŽćƒ¼ćƒˆć®ćƒŖćƒ³ć‚Æć‚’ć‚ÆćƒŖćƒƒć‚Æć™ć‚‹ćØć€ę–°ć—ć„ć‚æćƒ–ć§é–‹ć", "newTabWithActivationNoteLink": "ćƒŽćƒ¼ćƒˆć®ćƒŖćƒ³ć‚Æć‚’ć‚ÆćƒŖćƒƒć‚Æć™ć‚‹ćØć€ę–°ć—ć„ć‚æćƒ–ć§é–‹ćć€ć‚¢ć‚Æćƒ†ć‚£ćƒ–ć«ć—ć¾ć™", @@ -258,11 +282,11 @@ "selectAllNotes": "ē¾åœØć®ćƒ¬ćƒ™ćƒ«ć®ćƒŽćƒ¼ćƒˆć‚’ć™ć¹ć¦éøęŠž", "selectNote": "ćƒŽćƒ¼ćƒˆć‚’éøęŠž", "copyNotes": "ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒŽćƒ¼ćƒˆļ¼ˆć¾ćŸćÆē¾åœØć®éøęŠžēÆ„å›²ļ¼‰ć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼ć™ć‚‹ļ¼ˆć‚Æćƒ­ćƒ¼ćƒ³ć«ä½æē”Øļ¼‰", - "cutNotes": "ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒŽćƒ¼ćƒˆļ¼ˆć¾ćŸćÆē¾åœØć®éøęŠžēÆ„å›²ļ¼‰ć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚«ćƒƒćƒˆć™ć‚‹ļ¼ˆćƒŽćƒ¼ćƒˆć®ē§»å‹•ć«ä½æē”Øļ¼‰", - "pasteNotes": "ćƒŽćƒ¼ćƒˆć‚’ć‚µćƒ–ćƒŽćƒ¼ćƒˆćØć—ć¦ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćƒŽćƒ¼ćƒˆć«č²¼ć‚Šä»˜ć‘ć‚‹ļ¼ˆć‚³ćƒ”ćƒ¼ć•ć‚ŒćŸć‹ć‚«ćƒƒćƒˆć•ć‚ŒćŸć‹ć« ć‚ˆć£ć¦ć€ē§»å‹•ć¾ćŸćÆć‚Æćƒ­ćƒ¼ćƒ³ć«ćŖć‚‹ļ¼‰", + "cutNotes": "ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒŽćƒ¼ćƒˆļ¼ˆć¾ćŸćÆē¾åœØć®éøęŠžēÆ„å›²ļ¼‰ć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«åˆ‡ć‚Šå–ć‚Šļ¼ˆćƒŽćƒ¼ćƒˆć®ē§»å‹•ć«ä½æē”Øļ¼‰", + "pasteNotes": "ćƒŽćƒ¼ćƒˆć‚’ć‚µćƒ–ćƒŽćƒ¼ćƒˆćØć—ć¦ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćƒŽćƒ¼ćƒˆć«č²¼ć‚Šä»˜ć‘ć‚‹ļ¼ˆć‚³ćƒ”ćƒ¼ć•ć‚ŒćŸć‹åˆ‡ć‚Šå–ć‚Šć•ć‚ŒćŸć‹ć« ć‚ˆć£ć¦ć€ē§»å‹•ć¾ćŸćÆć‚Æćƒ­ćƒ¼ćƒ³ć«ćŖć‚‹ļ¼‰", "deleteNotes": "ćƒŽćƒ¼ćƒˆ/ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć‚’å‰Šé™¤", "editingNotes": "ćƒŽćƒ¼ćƒˆē·Øé›†", - "editNoteTitle": "ęŠ¼äø‹ć™ć‚‹ćØćƒ„ćƒŖćƒ¼ćƒšć‚¤ćƒ³ć‹ć‚‰ć‚æć‚¤ćƒˆćƒ«ć®ē·Øé›†ć«ē§»ć‚Šć¾ć™ć€‚ć‚æć‚¤ćƒˆćƒ«ć®ē·Øé›†ć‹ć‚‰Enterć‚­ćƒ¼ć‚’ęŠ¼ć™ćØć€ęœ¬ę–‡ć®ē·Øé›†ć«ē§»å‹•ć—ć¾ć™ć€‚Ctrl+. ć§ęœ¬ę–‡ć®ē·Øé›†ć‹ć‚‰ćƒ„ćƒŖćƒ¼ćƒšć‚¤ćƒ³ć«ęˆ»ć‚Šć¾ć™ć€‚", + "editNoteTitle": "ćƒ„ćƒŖćƒ¼ćƒšć‚¤ćƒ³ć§Enterć‚­ćƒ¼ć‚’ęŠ¼ć™ćØć€ćƒ„ćƒŖćƒ¼ćƒšć‚¤ćƒ³ć‹ć‚‰ćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒˆćƒ«ć«åˆ‡ć‚Šę›æć‚ć‚Šć¾ć™ć€‚ćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒˆćƒ«ć ćØćƒ†ć‚­ć‚¹ćƒˆć‚Øćƒ‡ć‚£ć‚æć«ćƒ•ć‚©ćƒ¼ć‚«ć‚¹ćŒåˆ‡ć‚Šę›æć‚ć‚Šć¾ć™ć€‚Ctrl+. ć‚’ęŠ¼ć™ćØć€ć‚Øćƒ‡ć‚£ć‚æć‹ć‚‰ćƒ„ćƒŖćƒ¼ćƒšć‚¤ćƒ³ć«ęˆ»ć‚Šć¾ć™ć€‚", "createEditLink": "å¤–éƒØćƒŖćƒ³ć‚Æć®ä½œęˆ/編集", "createInternalLink": "å†…éƒØćƒŖćƒ³ć‚Æć®ä½œęˆ", "followLink": "ć‚«ćƒ¼ć‚½ćƒ«äø‹ć®ćƒŖćƒ³ć‚Æć‚’ćŸć©ć‚‹", @@ -278,7 +302,7 @@ "showDevTools": "é–‹ē™ŗč€…ćƒ„ćƒ¼ćƒ«ć‚’č”Øē¤ŗ", "showSQLConsole": "SQLć‚³ćƒ³ć‚½ćƒ¼ćƒ«ć‚’č”Øē¤ŗ", "other": "ćć®ä»–", - "quickSearch": "ć‚Æć‚¤ćƒƒć‚Æć‚µćƒ¼ćƒć«ćƒ•ć‚©ćƒ¼ć‚«ć‚¹", + "quickSearch": "ć‚Æć‚¤ćƒƒć‚Æę¤œē“¢ć«ćƒ•ć‚©ćƒ¼ć‚«ć‚¹", "inPageSearch": "ćƒšćƒ¼ć‚øå†…ę¤œē“¢", "showJumpToNoteDialog": "ć€Œć‚øćƒ£ćƒ³ćƒ—å…ˆć€ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‚’č”Øē¤ŗ", "moveNoteUpDown": "ćƒŽćƒ¼ćƒˆćƒŖć‚¹ćƒˆć§ćƒŽćƒ¼ćƒˆć‚’äøŠ/下に移動", @@ -309,7 +333,9 @@ }, "import-status": "ć‚¤ćƒ³ćƒćƒ¼ćƒˆēŠ¶ę³", "in-progress": "ć‚¤ćƒ³ćƒćƒ¼ćƒˆäø­: {{progress}}", - "successful": "ć‚¤ćƒ³ćƒćƒ¼ćƒˆćÆę­£åøøć«ēµ‚äŗ†ć—ć¾ć—ćŸć€‚" + "successful": "ć‚¤ćƒ³ćƒćƒ¼ćƒˆćÆę­£åøøć«ēµ‚äŗ†ć—ć¾ć—ćŸć€‚", + "explodeArchives": ".zip, .enex ćŠć‚ˆć³ .opml ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–ć®å†…å®¹ć‚’čŖ­ćæå–ć‚Šć¾ć™ć€‚", + "importZipRecommendation": "ZIP ćƒ•ć‚”ć‚¤ćƒ«ć‚’ć‚¤ćƒ³ćƒćƒ¼ćƒˆć™ć‚‹ćØć€ćƒŽćƒ¼ćƒˆć®éšŽå±¤ćÆć‚¢ćƒ¼ć‚«ć‚¤ćƒ–å†…ć®ć‚µćƒ–ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖę§‹é€ ć‚’åę˜ ć—ć¾ć™ć€‚" }, "password_not_set": { "title": "ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ćŒčØ­å®šć•ć‚Œć¦ć„ćŖć„", @@ -319,26 +345,26 @@ }, "recent_changes": { "title": "ęœ€čæ‘ć®å¤‰ę›“", - "erase_notes_button": "å‰Šé™¤ć—ćŸćƒ”ćƒ¢ć‚’ä»Šć™ćę¶ˆåŽ»ć™ć‚‹", - "deleted_notes_message": "å‰Šé™¤ć•ć‚ŒćŸćƒ”ćƒ¢ćÆå®Œå…Øć«ę¶ˆåŽ»ć•ć‚Œć¾ć—ćŸć€‚", + "erase_notes_button": "å‰Šé™¤ć—ćŸćƒŽćƒ¼ćƒˆć‚’ä»Šć™ćę¶ˆåŽ»", + "deleted_notes_message": "å‰Šé™¤ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆćÆå®Œå…Øć«ę¶ˆåŽ»ć•ć‚Œć¾ć—ćŸć€‚", "no_changes_message": "å¤‰ę›“ćÆć¾ć ć‚ć‚Šć¾ć›ć‚“...", "undelete_link": "å‰Šé™¤ć‚’å–ć‚Šę¶ˆć™", "confirm_undelete": "ć“ć®ćƒŽćƒ¼ćƒˆćØć‚µćƒ–ćƒŽćƒ¼ćƒˆć‚’å¾©å…ƒć—ć¾ć™ć‹ļ¼Ÿ" }, "sort_child_notes": { "sort_children_by": "å­ćƒŽćƒ¼ćƒˆć®äø¦ć³ę›æćˆ...", - "sorting_criteria": "ć‚½ćƒ¼ćƒˆåŸŗęŗ–", + "sorting_criteria": "äø¦ć¹ę›æćˆć®åŸŗęŗ–", "title": "ć‚æć‚¤ćƒˆćƒ«", "date_created": "ä½œęˆę—„", "date_modified": "ꛓꖰꗄ", - "sorting_direction": "ć‚½ćƒ¼ćƒˆę–¹å‘", + "sorting_direction": "äø¦ć¹ę›æćˆć®ę–¹å‘", "ascending": "ꘇ順", "descending": "降順", "folders": "ćƒ•ć‚©ćƒ«ćƒ€", - "sort_folders_at_top": "ćƒ•ć‚©ćƒ«ćƒ€ćƒ¼ć‚’äø€ē•ŖäøŠć«ć‚½ćƒ¼ćƒˆć™ć‚‹", + "sort_folders_at_top": "ćƒ•ć‚©ćƒ«ćƒ€ćƒ¼ć‚’äøŠć«ć—ć¦äø¦ć¹ę›æćˆć‚‹", "natural_sort": "自然順", - "sort_with_respect_to_different_character_sorting": "čØ€čŖžć‚„åœ°åŸŸć«ć‚ˆć£ć¦ē•°ćŖć‚‹ę–‡å­—ć®äø¦ć¹ę›æćˆć‚„ē…§åˆé †åŗć®č¦å‰‡ć«å¾“ć£ć¦ć‚½ćƒ¼ćƒˆć™ć‚‹ć€‚", - "sort": "ć‚½ćƒ¼ćƒˆ", + "sort_with_respect_to_different_character_sorting": "čØ€čŖžć‚„åœ°åŸŸć«ć‚ˆć£ć¦ē•°ćŖć‚‹ę–‡å­—ć®äø¦ć¹ę›æćˆć‚„ē…§åˆé †åŗć®č¦å‰‡ć«å¾“ć£ć¦äø¦ć¹ę›æćˆć‚‹ć€‚", + "sort": "äø¦ć¹ę›æćˆ", "natural_sort_language": "č‡Ŗē„¶é †čØ€čŖž", "the_language_code_for_natural_sort": "č‡Ŗē„¶é †ć®čØ€čŖžć‚³ćƒ¼ćƒ‰ć€‚ä¾‹ćˆć°ć€äø­å›½čŖžć®å “åˆćÆ \"zh-CN\"怂" }, @@ -365,7 +391,7 @@ }, "tree-context-menu": { "advanced": "高度", - "open-in-a-new-tab": "ę–°ć—ć„ć‚æćƒ–ć§é–‹ć Ctrl+Click", + "open-in-a-new-tab": "ę–°ć—ć„ć‚æćƒ–ć§é–‹ć", "open-in-a-new-split": "ę–°ć—ćåˆ†å‰²ć—ć¦é–‹ć", "insert-note-after": "ćƒŽćƒ¼ćƒˆć‚’å¾Œć‚ć«ęŒæå…„", "insert-child-note": "å­ćƒŽćƒ¼ćƒˆć‚’ęŒæå…„", @@ -379,9 +405,9 @@ "protect-subtree": "ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć‚’äæč­·", "unprotect-subtree": "ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć®äæč­·ć‚’č§£é™¤", "copy-clone": "ć‚³ćƒ”ćƒ¼/ć‚Æćƒ­ćƒ¼ćƒ³", - "clone-to": "ć‚Æćƒ­ćƒ¼ćƒ³ć—ć¦...", - "cut": "ć‚«ćƒƒćƒˆ", - "move-to": "移動して...", + "clone-to": "ć‚Æćƒ­ćƒ¼ćƒ³...", + "cut": "åˆ‡ć‚Šå–ć‚Š", + "move-to": "移動...", "paste-into": "č²¼ć‚Šä»˜ć‘", "paste-after": "å¾Œć‚ć«č²¼ć‚Šä»˜ć‘", "duplicate": "複製", @@ -391,7 +417,12 @@ "converted-to-attachments": "{{count}}ćƒŽćƒ¼ćƒˆćŒę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć«å¤‰ę›ć•ć‚Œć¾ć—ćŸć€‚", "convert-to-attachment": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć«å¤‰ę›", "convert-to-attachment-confirm": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆć‚’č¦ŖćƒŽćƒ¼ćƒˆć®ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć«å¤‰ę›ć—ć¾ć™ć‹ļ¼Ÿ", - "open-in-popup": "ć‚Æć‚¤ćƒƒć‚Æć‚Øćƒ‡ć‚£ćƒƒćƒˆ" + "open-in-popup": "ć‚Æć‚¤ćƒƒć‚Æē·Øé›†", + "hoist-note": "ćƒ›ć‚¤ć‚¹ćƒˆćƒŽćƒ¼ćƒˆ", + "unhoist-note": "ćƒŽćƒ¼ćƒˆć‚’ćƒ›ć‚¤ć‚¹ćƒˆć—ćŖć„", + "edit-branch-prefix": "ćƒ–ćƒ©ćƒ³ćƒć®ęŽ„é ­č¾žć‚’ē·Øé›†", + "archive": "ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–", + "unarchive": "ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–č§£é™¤" }, "zen_mode": { "button_exit": "ē¦…ćƒ¢ćƒ¼ćƒ‰ć‚’é€€å‡ŗ" @@ -432,19 +463,35 @@ "search_notes_description": "é«˜åŗ¦ćŖę¤œē“¢ć‚’é–‹ć", "search_subtree_description": "ē¾åœØć®ć‚µćƒ–ćƒ„ćƒŖćƒ¼å†…ć‚’ę¤œē“¢", "search_history_title": "ę¤œē“¢å±„ę­“ć‚’č”Øē¤ŗ", - "search_history_description": "éŽåŽ»ć®ę¤œē“¢ēµęžœć‚’č¦‹ć‚‹" + "search_history_description": "éŽåŽ»ć®ę¤œē“¢ēµęžœć‚’č¦‹ć‚‹", + "show_attachments_title": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć‚’č”Øē¤ŗ", + "show_attachments_description": "ćƒŽćƒ¼ćƒˆć®ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć‚’č”Øē¤ŗ", + "configure_launch_bar_title": "ランチャーバーの設定", + "configure_launch_bar_description": "ćƒ©ćƒ³ćƒćƒ£ćƒ¼ćƒćƒ¼ć®ę§‹ęˆć‚’é–‹ćć€é …ē›®ć‚’čæ½åŠ ć¾ćŸćÆå‰Šé™¤ć—ć¾ć™ć€‚" }, "delete_note": { - "delete_note": "ćƒŽćƒ¼ćƒˆć‚’å‰Šé™¤" + "delete_note": "ćƒŽćƒ¼ćƒˆć‚’å‰Šé™¤", + "delete_matched_notes": "äø€č‡“ć—ćŸćƒŽćƒ¼ćƒˆć‚’å‰Šé™¤", + "delete_matched_notes_description": "ć“ć‚Œć«ć‚ˆć‚Šć€äø€č‡“ć—ćŸćƒŽćƒ¼ćƒˆćŒå‰Šé™¤ć•ć‚Œć¾ć™ć€‚", + "undelete_notes_instruction": "å‰Šé™¤å¾Œć€ć€Œęœ€čæ‘ć®å¤‰ę›“ć€ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‹ć‚‰å‰Šé™¤ć‚’å–ć‚Šę¶ˆć™ć“ćØćŒć§ćć¾ć™ć€‚", + "erase_notes_instruction": "ćƒŽćƒ¼ćƒˆć‚’å®Œå…Øć«ę¶ˆåŽ»ć™ć‚‹ć«ćÆć€å‰Šé™¤å¾Œć«ć€ŒčØ­å®šć€->ć€Œćć®ä»–ć€ć«ē§»å‹•ć—ć€ć€Œå‰Šé™¤ć—ćŸćƒŽćƒ¼ćƒˆć‚’ä»Šć™ćę¶ˆåŽ»ć€ćƒœć‚æćƒ³ć‚’ć‚ÆćƒŖćƒƒć‚Æć—ć¾ć™ć€‚" }, "board_view": { - "delete-note": "ćƒŽćƒ¼ćƒˆć‚’å‰Šé™¤", + "delete-note": "ćƒŽćƒ¼ćƒˆć‚’å‰Šé™¤...", "insert-above": "äøŠć«ęŒæå…„", "insert-below": "äø‹ć«ęŒæå…„", "delete-column": "åˆ—ć‚’å‰Šé™¤", "delete-column-confirmation": "ęœ¬å½“ć«ć“ć®åˆ—ć‚’å‰Šé™¤ć—ć¾ć™ć‹ļ¼ŸåÆ¾åæœć™ć‚‹å±žę€§ćÆć€ć“ć®åˆ—ć®äø‹ć®ćƒŽćƒ¼ćƒˆć§ć‚‚å‰Šé™¤ć•ć‚Œć¾ć™ć€‚", "new-item": "ę–°ć—ć„ć‚¢ć‚¤ćƒ†ćƒ ", - "add-column": "åˆ—ć‚’čæ½åŠ " + "add-column": "åˆ—ć‚’čæ½åŠ ", + "remove-from-board": "ćƒœćƒ¼ćƒ‰ć‹ć‚‰å‰Šé™¤", + "archive-note": "ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–ćƒŽćƒ¼ćƒˆ", + "unarchive-note": "ćƒŽćƒ¼ćƒˆć®ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–ć‚’č§£é™¤", + "move-to": "ē§»å‹•å…ˆ", + "new-item-placeholder": "ćƒŽćƒ¼ćƒˆć®ć‚æć‚¤ćƒˆćƒ«ć‚’å…„åŠ›...", + "add-column-placeholder": "åˆ—åć‚’å…„åŠ›...", + "edit-note-title": "ć‚ÆćƒŖćƒƒć‚Æć—ć¦ćƒŽćƒ¼ćƒˆć®ć‚æć‚¤ćƒˆćƒ«ć‚’ē·Øé›†", + "edit-column-title": "ć‚ÆćƒŖćƒƒć‚Æć—ć¦åˆ—ć®ć‚æć‚¤ćƒˆćƒ«ć‚’ē·Øé›†" }, "code_buttons": { "execute_button_title": "ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œ", @@ -454,7 +501,10 @@ "sql_console_saved_message": "SQLć‚³ćƒ³ć‚½ćƒ¼ćƒ«ćŒ {{note_path}} ć«äæå­˜ć•ć‚Œć¾ć—ćŸ" }, "execute_script": { - "execute_script": "ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œ" + "execute_script": "ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œ", + "help_text": "äø€č‡“ć—ćŸćƒŽćƒ¼ćƒˆć«åÆ¾ć—ć¦ē°”å˜ćŖć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œć§ćć¾ć™ć€‚", + "example_2": "ć‚ˆć‚Šč¤‡é›‘ćŖä¾‹ćØć—ć¦ćÆć€äø€č‡“ć—ćŸćƒŽćƒ¼ćƒˆć®å±žę€§ć‚’ć™ć¹ć¦å‰Šé™¤ć™ć‚‹ć“ćØćŒęŒ™ć’ć‚‰ć‚Œć¾ć™:", + "example_1": "ä¾‹ćˆć°ć€ćƒŽćƒ¼ćƒˆć®ć‚æć‚¤ćƒˆćƒ«ć«ę–‡å­—åˆ—ć‚’čæ½åŠ ć™ć‚‹ć«ćÆć€ć“ć®å°ć•ćŖć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’ä½æē”Øć—ć¾ć™:" }, "script_executor": { "execute_script": "ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œ", @@ -474,9 +524,9 @@ "book_properties": { "grid": "ć‚°ćƒŖćƒƒćƒ‰", "list": "ćƒŖć‚¹ćƒˆ", - "collapse_all_notes": "ć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć‚’ę ¼ē“", + "collapse_all_notes": "ć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć‚’ęŠ˜ć‚ŠćŸćŸć‚€", "expand_all_children": "すべての子を展開", - "collapse": "ę ¼ē“", + "collapse": "ꊘ悊恟恟悀", "expand": "展開", "book_properties": "ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³ćƒ—ćƒ­ćƒ‘ćƒ†ć‚£", "invalid_view_type": "ē„”åŠ¹ćŖćƒ“ćƒ„ćƒ¼ć‚æć‚¤ćƒ— '{{type}}'", @@ -484,7 +534,9 @@ "calendar": "ć‚«ćƒ¬ćƒ³ćƒ€ćƒ¼", "table": "ćƒ†ćƒ¼ćƒ–ćƒ«", "geo-map": "ć‚øć‚Ŗćƒžćƒƒćƒ—", - "board": "ćƒœćƒ¼ćƒ‰" + "board": "ćƒœćƒ¼ćƒ‰", + "include_archived_notes": "ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆć‚’č”Øē¤ŗ", + "presentation": "ćƒ—ćƒ¬ć‚¼ćƒ³ćƒ†ćƒ¼ć‚·ćƒ§ćƒ³" }, "note_types": { "geo-map": "ć‚øć‚Ŗćƒžćƒƒćƒ—", @@ -493,7 +545,7 @@ "text": "ćƒ†ć‚­ć‚¹ćƒˆ", "code": "ć‚³ćƒ¼ćƒ‰", "saved-search": "ę¤œē“¢ć®äæå­˜", - "relation-map": "é–¢äæ‚ćƒžćƒƒćƒ—", + "relation-map": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćƒžćƒƒćƒ—", "note-map": "ćƒŽćƒ¼ćƒˆćƒžćƒƒćƒ—", "render-note": "ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ćƒŽćƒ¼ćƒˆ", "book": "ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³", @@ -508,11 +560,11 @@ "beta-feature": "Beta", "ai-chat": "AI チャット", "task-list": "ć‚æć‚¹ć‚ÆćƒŖć‚¹ćƒˆ", - "new-feature": "ꖰ恗恄", + "new-feature": "New", "collections": "ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³" }, "edited_notes": { - "no_edited_notes_found": "ć“ć®ę—„ć®ē·Øé›†ć•ć‚ŒćŸćƒ”ćƒ¢ćÆć¾ć ć‚ć‚Šć¾ć›ć‚“...", + "no_edited_notes_found": "ć“ć®ę—„ć®ē·Øé›†ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆćÆć¾ć ć‚ć‚Šć¾ć›ć‚“...", "title": "ē·Øé›†ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆ", "deleted": "ļ¼ˆå‰Šé™¤ęøˆćæļ¼‰" }, @@ -523,7 +575,10 @@ "download": "ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰", "open": "開恏", "title": "ćƒ•ć‚”ć‚¤ćƒ«", - "upload_new_revision": "ē·Øé›†å±„ę­“ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰" + "upload_new_revision": "ē·Øé›†å±„ę­“ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰", + "original_file_name": "å…ƒć®ćƒ•ć‚”ć‚¤ćƒ«å", + "upload_success": "ę–°ć—ć„ćƒ•ć‚”ć‚¤ćƒ«ć®å¤‰ę›“ćŒć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć•ć‚Œć¾ć—ćŸć€‚", + "upload_failed": "ę–°ć—ć„ćƒ•ć‚”ć‚¤ćƒ«ć®å¤‰ę›“ć®ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć«å¤±ę•—ć—ć¾ć—ćŸć€‚" }, "note_info_widget": { "note_id": "ćƒŽćƒ¼ćƒˆ ID", @@ -542,7 +597,11 @@ "download": "ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰", "open": "開恏", "title": "ē”»åƒ", - "upload_new_revision": "ē·Øé›†å±„ę­“ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰" + "upload_new_revision": "ē·Øé›†å±„ę­“ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰", + "original_file_name": "å…ƒć®ćƒ•ć‚”ć‚¤ćƒ«å", + "copy_reference_to_clipboard": "å‚ē…§ć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼", + "upload_success": "ę–°ć—ć„ē”»åƒć®å¤‰ę›“ćŒć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć•ć‚Œć¾ć—ćŸć€‚", + "upload_failed": "ę–°ć—ć„ē”»åƒć®å¤‰ę›“ć®ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć«å¤±ę•—ć—ć¾ć—ćŸ: {{message}}" }, "revisions": { "download_button": "ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰", @@ -563,7 +622,15 @@ "settings": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć®čØ­å®š", "file_size": "ćƒ•ć‚”ć‚¤ćƒ«ć‚µć‚¤ć‚ŗ:", "preview": "ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼:", - "preview_not_available": "ć“ć®ćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒ—ć§ćÆćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼ćÆåˆ©ē”Øć§ćć¾ć›ć‚“ć€‚" + "preview_not_available": "ć“ć®ćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒ—ć§ćÆćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼ćÆåˆ©ē”Øć§ćć¾ć›ć‚“ć€‚", + "diff_on": "å·®åˆ†ć‚’č”Øē¤ŗ", + "diff_off": "内容を蔨示", + "diff_on_hint": "ć‚ÆćƒŖćƒƒć‚Æć—ć¦ćƒŽćƒ¼ćƒˆć‚½ćƒ¼ć‚¹ćØć®å·®åˆ†ć‚’č”Øē¤ŗ", + "diff_off_hint": "ć‚ÆćƒŖćƒƒć‚Æć—ć¦ćƒŽćƒ¼ćƒˆć®å†…å®¹ć‚’č”Øē¤ŗ", + "diff_not_available": "å·®åˆ†ćÆåˆ©ē”Øć§ćć¾ć›ć‚“ć€‚", + "snapshot_interval": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć®čØ˜éŒ²é–“éš”: {{seconds}} 秒。", + "maximum_revisions": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć®čØ˜éŒ²åˆ¶é™: {{number}}.", + "mime": "MIME: " }, "attachments_actions": { "download": "ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰", @@ -580,7 +647,11 @@ "delete_confirm": "ęœ¬å½“ć«ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ« '{{title}}' ć‚’å‰Šé™¤ć—ć¾ć™ć‹ļ¼Ÿ", "delete_success": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ« '{{title}}' ćÆå‰Šé™¤ć•ć‚Œć¾ć—ćŸć€‚", "enter_new_name": "ę–°ć—ć„ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®åå‰ć‚’å…„åŠ›ć—ć¦ćć ć•ć„", - "upload_new_revision": "ē·Øé›†å±„ę­“ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰" + "upload_new_revision": "ē·Øé›†å±„ę­“ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰", + "upload_success": "ę–°ć—ć„ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®å¤‰ę›“ćŒć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć•ć‚Œć¾ć—ćŸć€‚", + "upload_failed": "ę–°ć—ć„ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®å¤‰ę›“ć®ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć«å¤±ę•—ć—ć¾ć—ćŸć€‚", + "convert_confirm": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć€Œ{{title}}ć€ć‚’åˆ„ć®ćƒŽćƒ¼ćƒˆć«å¤‰ę›ć—ć¦ć‚‚ć‚ˆć‚ć—ć„ć§ć™ć‹ļ¼Ÿ", + "convert_success": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć€Œ{{title}}ć€ćŒćƒŽćƒ¼ćƒˆć«å¤‰ę›ć•ć‚Œć¾ć—ćŸć€‚" }, "etapi": { "created": "ä½œęˆę—„ę™‚", @@ -610,20 +681,23 @@ "note_paths": { "title": "ćƒŽćƒ¼ćƒˆćƒ‘ć‚¹", "clone_button": "ćƒŽćƒ¼ćƒˆć‚’ę–°ć—ć„å “ę‰€ć«ć‚Æćƒ­ćƒ¼ćƒ³...", - "intro_placed": "ć“ć®ćƒŽćƒ¼ćƒˆćÆä»„äø‹ć®ćƒ‘ć‚¹ć«ē½®ć‹ć‚Œć‚‹:", + "intro_placed": "ć“ć®ćƒŽćƒ¼ćƒˆćÆä»„äø‹ć®ćƒ‘ć‚¹ć«ē½®ć‹ć‚Œć¦ć„ć¾ć™:", "intro_not_placed": "ć“ć®ćƒŽćƒ¼ćƒˆćÆć¾ć ćƒŽćƒ¼ćƒˆćƒ„ćƒŖćƒ¼ć«é…ē½®ć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚", "archived": "ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–ć•ć‚ŒćŸ", - "search": "検瓢" + "search": "検瓢", + "outside_hoisted": "ć“ć®ćƒ‘ć‚¹ćÆćƒ›ć‚¤ć‚¹ćƒˆć•ć‚ŒćŸćƒŽćƒ¼ćƒˆć®å¤–å“ć«ć‚ć‚‹ćŸć‚ć€ćƒ›ć‚¤ć‚¹ćƒˆć‚’č§£é™¤ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚" }, "note_properties": { - "info": "ęƒ…å ±" + "info": "ęƒ…å ±", + "this_note_was_originally_taken_from": "ć“ć®ćƒŽćƒ¼ćƒˆćÆå…ƒć€…ä»„äø‹ć‹ć‚‰å¼•ē”Øć—ćŸć‚‚ć®ć§ć™:" }, "similar_notes": { "title": "é”žä¼¼ćƒŽćƒ¼ćƒˆ", "no_similar_notes_found": "é”žä¼¼ć—ćŸćƒŽćƒ¼ćƒˆćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ć€‚" }, "abstract_search_option": { - "remove_this_search_option": "ć“ć®ę¤œē“¢ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć‚’å‰Šé™¤" + "remove_this_search_option": "ć“ć®ę¤œē“¢ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć‚’å‰Šé™¤", + "failed_rendering": "ę¤œē“¢ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć®ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć«å¤±ę•—ć—ć¾ć—ćŸ: {{dto}} ć‚Øćƒ©ćƒ¼: {{error}}{{stack}}" }, "debug": { "debug": "惇惐惃悰", @@ -657,7 +731,8 @@ "content_and_attachments_and_revisions_size": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćØē·Øé›†å±„ę­“ć‚’å«ć‚€ćƒŽćƒ¼ćƒˆå†…å®¹ć®ć‚µć‚¤ć‚ŗ", "revision_count": "ē·Øé›†å±„ę­“ć®å›žę•°", "owned_label_count": "ćƒ©ćƒ™ćƒ«ć®ę•°", - "owned_relation_count": "関係の数" + "owned_relation_count": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®ę•°", + "target_relation_count": "ćƒŽćƒ¼ćƒˆć‚’åÆ¾č±”ćØć™ć‚‹ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®ę•°" }, "table_view": { "sort-column-descending": "降順", @@ -666,7 +741,7 @@ "new-column": "ę–°ć—ć„åˆ—", "sort-column-by": "\"{{title}}\" ć§äø¦ć¹ę›æćˆ", "sort-column-clear": "äø¦ć¹ę›æćˆć‚’ć‚ÆćƒŖć‚¢", - "hide-column": "列 \"{{title}}\" 悒隠恙", + "hide-column": "列 \"{{title}}\" ć‚’éžč”Øē¤ŗ", "show-hide-columns": "åˆ—ć‚’č”Øē¤ŗ/éžč”Øē¤ŗ", "row-insert-above": "äøŠć«č”Œć‚’ęŒæå…„", "row-insert-below": "äø‹ć«č”Œć‚’ęŒæå…„", @@ -677,7 +752,7 @@ "delete_column_confirmation": "ć“ć®åˆ—ć‚’ęœ¬å½“ć«å‰Šé™¤ć—ć¦ć‚‚ć‚ˆć‚ć—ć„ć§ć™ć‹ļ¼ŸåÆ¾åæœć™ć‚‹å±žę€§ćÆć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć‹ć‚‰å‰Šé™¤ć•ć‚Œć¾ć™ć€‚", "delete-column": "åˆ—ć‚’å‰Šé™¤", "new-column-label": "ćƒ©ćƒ™ćƒ«", - "new-column-relation": "関係" + "new-column-relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³" }, "search_script": { "title": "ę¤œē“¢ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ:", @@ -693,13 +768,29 @@ "dialog_title": "åŸ‹ć‚č¾¼ćæćƒŽćƒ¼ćƒˆ", "box_size_prompt": "åŸ‹ć‚č¾¼ćæćƒŽćƒ¼ćƒˆęž ć®ć‚µć‚¤ć‚ŗļ¼š", "button_include": "åŸ‹ć‚č¾¼ćæćƒŽćƒ¼ćƒˆ", - "label_note": "ćƒŽćƒ¼ćƒˆ" + "label_note": "ćƒŽćƒ¼ćƒˆ", + "box_size_small": "ć‚¹ćƒ¢ćƒ¼ćƒ« (~ 10 蔌)", + "box_size_medium": "ćƒŸćƒ‡ć‚£ć‚¢ćƒ  (~ 30 蔌)", + "box_size_full": "ćƒ•ćƒ« (ćƒœćƒƒć‚Æć‚¹ć«å…Øę–‡ćŒč”Øē¤ŗć•ć‚Œć¾ć™)" }, "ancestor": { - "placeholder": "ćƒŽćƒ¼ćƒˆåć§ę¤œē“¢" + "placeholder": "ćƒŽćƒ¼ćƒˆåć§ę¤œē“¢", + "label": "ē„–å…ˆ", + "depth_label": "귱恕", + "depth_doesnt_matter": "関係なし", + "depth_eq": "恔悇恆恩 {{count}} ć¤äø‹ć®éšŽå±¤", + "direct_children": "ē›“ęŽ„ć®å­", + "depth_gt": "{{count}} ć‚ˆć‚Šäø‹ć®éšŽå±¤", + "depth_lt": "{{count}} ć‚ˆć‚ŠäøŠć®éšŽå±¤" }, "move_to": { - "search_placeholder": "ćƒŽćƒ¼ćƒˆåć§ę¤œē“¢" + "search_placeholder": "ćƒŽćƒ¼ćƒˆåć§ę¤œē“¢", + "dialog_title": "ćƒŽćƒ¼ćƒˆć‚’ē§»å‹•...", + "notes_to_move": "ē§»å‹•ć•ć›ć‚‹ćƒŽćƒ¼ćƒˆ", + "target_parent_note": "åÆ¾č±”ć®č¦ŖćƒŽćƒ¼ćƒˆ", + "move_button": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆć«ē§»å‹•", + "error_no_path": "ē§»å‹•ć™ć‚‹ćƒ‘ć‚¹ćŒć‚ć‚Šć¾ć›ć‚“ć€‚", + "move_success_message": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆćÆä»„äø‹ć«ē§»å‹•ć•ć‚Œć¾ć—ćŸ " }, "web_view": { "web_view": "Web ćƒ“ćƒ„ćƒ¼", @@ -710,7 +801,14 @@ "refresh": "ćƒŖćƒ•ćƒ¬ćƒƒć‚·ćƒ„" }, "sync": { - "title": "同期" + "title": "同期", + "force_full_sync_button": "å®Œå…ØåŒęœŸć‚’å¼·åˆ¶ć™ć‚‹", + "fill_entity_changes_button": "ć‚Øćƒ³ćƒ†ć‚£ćƒ†ć‚£å¤‰ę›“ćƒ¬ć‚³ćƒ¼ćƒ‰ć‚’å…„åŠ›", + "full_sync_triggered": "å®Œå…ØåŒęœŸćŒćƒˆćƒŖć‚¬ćƒ¼ć•ć‚Œć¾ć—ćŸ", + "filling_entity_changes": "ć‚Øćƒ³ćƒ†ć‚£ćƒ†ć‚£å¤‰ę›“č”Œć‚’å…„åŠ›äø­...", + "sync_rows_filled_successfully": "åŒęœŸč”ŒćŒę­£åøøć«å…„åŠ›ć•ć‚Œć¾ć—ćŸ", + "finished-successfully": "åŒęœŸćŒę­£åøøć«å®Œäŗ†ć—ć¾ć—ćŸć€‚", + "failed": "åŒęœŸć«å¤±ę•—ć—ć¾ć—ćŸ: {{message}}" }, "fonts": { "fonts": "ćƒ•ć‚©ćƒ³ćƒˆ", @@ -732,7 +830,8 @@ "serif": "ć‚»ćƒŖćƒ•", "sans-serif": "ć‚µćƒ³ć‚»ćƒŖćƒ•", "monospace": "等幅", - "system-default": "ć‚·ć‚¹ćƒ†ćƒ ć®ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆ" + "system-default": "ć‚·ć‚¹ćƒ†ćƒ ć®ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆ", + "theme_defined": "ćƒ†ćƒ¼ćƒžćŒå®šē¾©ć•ć‚Œć¾ć—ćŸ" }, "max_content_width": { "reload_button": "ćƒ•ćƒ­ćƒ³ćƒˆć‚Øćƒ³ćƒ‰ć‚’ćƒŖćƒ­ćƒ¼ćƒ‰", @@ -740,7 +839,8 @@ "default_description": "TriliumćÆć€ćƒÆć‚¤ćƒ‰ć‚¹ć‚ÆćƒŖćƒ¼ćƒ³ć§ęœ€å¤§åŒ–ć•ć‚ŒćŸē”»é¢ć§ć®åÆčŖ­ę€§ć‚’å‘äøŠć•ć›ć‚‹ćŸć‚ć«ć€ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć®ęœ€å¤§å¹…ć‚’åˆ¶é™ć—ć¦ć„ć¾ć™ć€‚", "max_width_label": "ęœ€å¤§ć‚³ćƒ³ćƒ†ćƒ³ćƒ„å¹…", "max_width_unit": "ćƒ”ć‚Æć‚»ćƒ«", - "apply_changes_description": "ć‚³ćƒ³ćƒ†ćƒ³ćƒ„å¹…ć®å¤‰ę›“ć‚’é©ē”Øć™ć‚‹ć«ćÆć€ć‚ÆćƒŖćƒƒć‚Æć—ć¦ćć ć•ć„" + "apply_changes_description": "ć‚³ćƒ³ćƒ†ćƒ³ćƒ„å¹…ć®å¤‰ę›“ć‚’é©ē”Øć™ć‚‹ć«ćÆć€ć‚ÆćƒŖćƒƒć‚Æć—ć¦ćć ć•ć„", + "reload_description": "å¤–č¦³čØ­å®šć‹ć‚‰å¤‰ę›“" }, "theme": { "title": "ć‚¢ćƒ—ćƒŖć®ćƒ†ćƒ¼ćƒž", @@ -809,14 +909,14 @@ "bg_color": "čƒŒę™Æč‰²ä»˜ććƒ†ć‚­ć‚¹ćƒˆ", "visibility_title": "ćƒć‚¤ćƒ©ć‚¤ćƒˆćƒŖć‚¹ćƒˆč”Øē¤ŗ", "visibility_description": "#hideHighlightWidget ćƒ©ćƒ™ćƒ«ć‚’čæ½åŠ ć™ć‚‹ć“ćØć§ć€ćƒŽćƒ¼ćƒˆć”ćØć«ćƒć‚¤ćƒ©ć‚¤ćƒˆć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆć‚’éžč”Øē¤ŗć«ć§ćć¾ć™ć€‚", - "shortcut_info": "ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ -> ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆļ¼ˆ'å³ćƒšć‚¤ćƒ³åˆ‡ć‚Šę›æćˆ'ļ¼‰ć§ć€å³ćƒšć‚¤ćƒ³ļ¼ˆćƒć‚¤ćƒ©ć‚¤ćƒˆć‚’å«ć‚€ļ¼‰ć‚’ē“ ę—©ćåˆ‡ć‚Šę›æćˆć‚‹ć‚­ćƒ¼ćƒœćƒ¼ćƒ‰ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆć‚’čØ­å®šć§ćć¾ć™ć€‚" + "shortcut_info": "設定 -> ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆļ¼ˆå³ćƒšć‚¤ćƒ³åˆ‡ć‚Šę›æćˆļ¼‰ć§ć€å³ćƒšć‚¤ćƒ³ļ¼ˆćƒć‚¤ćƒ©ć‚¤ćƒˆć‚’å«ć‚€ļ¼‰ć‚’ē“ ę—©ćåˆ‡ć‚Šę›æćˆć‚‹ć‚­ćƒ¼ćƒœćƒ¼ćƒ‰ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆć‚’čØ­å®šć§ćć¾ć™ć€‚" }, "table_of_contents": { "title": "目欔", "description": "ćƒŽćƒ¼ćƒˆć«å®šē¾©ć•ć‚ŒćŸę•°ä»„äøŠć®č¦‹å‡ŗć—ćŒć‚ć‚‹å “åˆć€ćƒ†ć‚­ć‚¹ćƒˆćƒŽćƒ¼ćƒˆć«ē›®ę¬”ćŒč”Øē¤ŗć•ć‚Œć¾ć™ć€‚ć“ć®ę•°ćÆć‚«ć‚¹ć‚æćƒžć‚¤ć‚ŗć§ćć¾ć™:", "unit": "見出し", - "disable_info": "ć“ć®ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć«éžåøøć«å¤§ććŖę•°å€¤ć‚’čØ­å®šć™ć‚‹ć“ćØć§ć€ē›®ę¬”ć‚’åŠ¹ęžœēš„ć«ē„”åŠ¹ć«ć™ć‚‹ć“ćØć‚‚ć§ćć‚‹ć€‚", - "shortcut_info": "ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ -> ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆļ¼ˆ'å³ćƒšć‚¤ćƒ³åˆ‡ć‚Šę›æćˆ'ļ¼‰ć§ć€å³ćƒšć‚¤ćƒ³ļ¼ˆē›®ę¬”ć‚’å«ć‚€ļ¼‰ć‚’ē“ ę—©ćåˆ‡ć‚Šę›æćˆć‚‹ć‚­ćƒ¼ćƒœćƒ¼ćƒ‰ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆć‚’čØ­å®šć§ćć¾ć™ć€‚" + "disable_info": "ć“ć®ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć«éžåøøć«å¤§ććŖę•°å€¤ć‚’čØ­å®šć™ć‚‹ć“ćØć§ć€ē›®ę¬”ć‚’åŠ¹ęžœēš„ć«ē„”åŠ¹ć«ć™ć‚‹ć“ćØć‚‚ć§ćć¾ć™ć€‚", + "shortcut_info": "設定 -> ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆļ¼ˆå³ćƒšć‚¤ćƒ³åˆ‡ć‚Šę›æćˆļ¼‰ć§ć€å³ćƒšć‚¤ćƒ³ļ¼ˆē›®ę¬”ć‚’å«ć‚€ļ¼‰ć‚’ē“ ę—©ćåˆ‡ć‚Šę›æćˆć‚‹ć‚­ćƒ¼ćƒœćƒ¼ćƒ‰ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆć‚’čØ­å®šć§ćć¾ć™ć€‚" }, "toc": { "table_of_contents": "目欔", @@ -906,10 +1006,16 @@ "close": "閉恘悋" }, "info": { - "closeButton": "閉恘悋" + "closeButton": "閉恘悋", + "modalTitle": "ęƒ…å ±ćƒ”ćƒƒć‚»ćƒ¼ć‚ø", + "okButton": "OK" }, "protected_session_password": { - "close_label": "閉恘悋" + "close_label": "閉恘悋", + "modal_title": "äæč­·ć•ć‚ŒćŸć‚»ćƒƒć‚·ćƒ§ćƒ³", + "help_title": "äæč­·ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆć«é–¢ć™ć‚‹ćƒ˜ćƒ«ćƒ—", + "form_label": "ćƒŖć‚Æć‚Øć‚¹ćƒˆć•ć‚ŒćŸć‚¢ć‚Æć‚·ćƒ§ćƒ³ć‚’ē¶šč”Œć™ć‚‹ć«ćÆć€ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ć‚’å…„åŠ›ć—ć¦äæč­·ć•ć‚ŒćŸć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’é–‹å§‹ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™:", + "start_button": "äæč­·ć•ć‚ŒćŸć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’é–‹å§‹" }, "modal": { "close": "閉恘悋", @@ -947,16 +1053,113 @@ "digits": "ꔁ", "inheritable_title": "ē¶™ę‰æå±žę€§ćÆć€ć“ć®ćƒ„ćƒŖćƒ¼é…äø‹ć®ć™ć¹ć¦ć®å­å­«ć«ē¶™ę‰æć•ć‚Œć¾ć™ć€‚", "inheritable": "継承", - "related_notes_title": "ć“ć®ćƒ©ćƒ™ćƒ«ćŒä»˜ć„ćŸä»–ć®ćƒŽćƒ¼ćƒˆ" + "related_notes_title": "ć“ć®ćƒ©ćƒ™ćƒ«ćŒä»˜ć„ćŸä»–ć®ćƒŽćƒ¼ćƒˆ", + "attr_detail_title": "å±žę€§ć®č©³ē“°ćŖć‚æć‚¤ćƒˆćƒ«", + "target_note_title": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćÆć€ć‚½ćƒ¼ć‚¹ćƒŽćƒ¼ćƒˆćØåÆ¾č±”ć®ćƒŽćƒ¼ćƒˆé–“ć®åå‰ä»˜ćęŽ„ē¶šć§ć™ć€‚", + "target_note": "åÆ¾č±”ć®ćƒŽćƒ¼ćƒˆ", + "promoted_title": "ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆå±žę€§ćÆćƒŽćƒ¼ćƒˆć«ē›®ē«‹ć¤ć‚ˆć†ć«č”Øē¤ŗć•ć‚Œć¾ć™ć€‚", + "promoted": "ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆ", + "promoted_alias_title": "ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆå±žę€§ć®UIć«č”Øē¤ŗć•ć‚Œć‚‹åå‰ć€‚", + "inverse_relation_title": "ć“ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćŒć©ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®ååÆ¾ć§ć‚ć‚‹ć‹ć‚’å®šē¾©ć™ć‚‹ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³čØ­å®šć€‚ä¾‹ļ¼šēˆ¶ćØęÆå­ćÆäŗ’ć„ć«é€†ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć§ć™ć€‚", + "inverse_relation": "é€†ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³", + "more_notes": "ćć®ä»–ć®ćƒŽćƒ¼ćƒˆ", + "label": "ćƒ©ćƒ™ćƒ«ć®č©³ē“°", + "label_definition": "ćƒ©ćƒ™ćƒ«å®šē¾©ć®č©³ē“°", + "relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®č©³ē“°", + "relation_definition": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³å®šē¾©ć®č©³ē“°", + "disable_versioning": "č‡Ŗå‹•ćƒćƒ¼ć‚øćƒ§ćƒ³ē®”ē†ć‚’ē„”åŠ¹ć«ć—ć¾ć™ć€‚ä¾‹ćˆć°ć€ć‚¹ć‚ÆćƒŖćƒ—ćƒˆē”Øć®å¤§ććŖJSćƒ©ć‚¤ćƒ–ćƒ©ćƒŖćŖć©ć€é‡č¦ć§ćÆćŖć„å¤§ććŖćƒŽćƒ¼ćƒˆć«ä¾æåˆ©ć§ć™", + "calendar_root": "dayćƒŽćƒ¼ćƒˆć®ćƒ«ćƒ¼ćƒˆćØć—ć¦ä½æē”Øć™ć‚‹ćƒŽćƒ¼ćƒˆć‚’ćƒžćƒ¼ć‚Æć—ć¾ć™ć€‚ć“ć®ć‚ˆć†ć«ćƒžćƒ¼ć‚Æć§ćć‚‹ć®ćÆ 1 恤恠恑恧恙怂", + "archived": "ć“ć®ćƒ©ćƒ™ćƒ«ć®ä»˜ć„ćŸćƒŽćƒ¼ćƒˆćÆć€ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć§ćÆę¤œē“¢ēµęžœć«č”Øē¤ŗć•ć‚Œć¾ć›ć‚“ (ć‚øćƒ£ćƒ³ćƒ—å…ˆć€ćƒŖćƒ³ć‚Æć®čæ½åŠ ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ćŖć©ć«ć‚‚č”Øē¤ŗć•ć‚Œć¾ć›ć‚“)怂", + "exclude_from_export": "ćƒŽćƒ¼ćƒˆļ¼ˆć‚µćƒ–ćƒ„ćƒŖćƒ¼ć‚’å«ć‚€ļ¼‰ćÆćƒŽćƒ¼ćƒˆć®ć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆć«ćÆå«ć¾ć‚Œć¾ć›ć‚“", + "run": "ć©ć®ć‚¤ćƒ™ćƒ³ćƒˆć§ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œć™ć‚‹ć‹ć‚’å®šē¾©ć—ć¾ć™ć€‚åÆčƒ½ćŖå€¤ćÆę¬”ć®é€šć‚Š:\n
    \n
  • frontendStartup - Trilium ćƒ•ćƒ­ćƒ³ćƒˆć‚Øćƒ³ćƒ‰ćŒčµ·å‹•ļ¼ˆć¾ćŸćÆę›“ę–°ļ¼‰ć•ć‚ŒćŸćØćć€‚ćƒ¢ćƒć‚¤ćƒ«ćÆé™¤ć
  • \n
  • mobileStartup - ćƒ¢ćƒć‚¤ćƒ«ć§ Trilium ćƒ•ćƒ­ćƒ³ćƒˆć‚Øćƒ³ćƒ‰ćŒčµ·å‹•ļ¼ˆć¾ćŸćÆę›“ę–°ļ¼‰ć•ć‚ŒćŸćØćć€‚
  • \n
  • backendStartup - Trilium ćƒćƒƒć‚Æć‚Øćƒ³ćƒ‰ćŒčµ·å‹•ć—ćŸćØć
  • \n
  • hourly - 1Ꙃ間恫1å›žå®Ÿč”Œć—ć¾ć™ć€‚ runAtHour ćØć„ć†ćƒ©ćƒ™ćƒ«ć‚’čæ½åŠ ć—ć¦ć€å®Ÿč”Œę™‚åˆ»ć‚’ęŒ‡å®šć§ćć¾ć™ć€‚
  • \n
  • daily - 1ꗄ恫1å›žå®Ÿč”Œ
  • \n
", + "run_on_instance": "恩恮 Trilium ć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹ć§ć“ć‚Œć‚’å®Ÿč”Œć™ć‚‹ć‹ć‚’å®šē¾©ć—ć¾ć™ć€‚ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆćÆć™ć¹ć¦ć®ć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹ć§ć™ć€‚", + "run_at_hour": "ä½•ę™‚ć«å®Ÿč”Œć™ć‚‹ć‹ć‚’ęŒ‡å®šć—ć¾ć™ć€‚ #run=hourly ćØä½µē”Øć—ć¦ćć ć•ć„ć€‚1ę—„ć«č¤‡ę•°å›žå®Ÿč”Œć—ćŸć„å “åˆćÆć€č¤‡ę•°å›žå®šē¾©ć§ćć¾ć™ć€‚", + "disable_inclusion": "ć“ć®ćƒ©ćƒ™ćƒ«ćŒä»˜ć„ćŸć‚¹ć‚ÆćƒŖćƒ—ćƒˆćÆč¦Ŗć‚¹ć‚ÆćƒŖćƒ—ćƒˆć®å®Ÿč”Œć«ćÆå«ć¾ć‚Œć¾ć›ć‚“ć€‚", + "sorted": "å­ćƒŽćƒ¼ćƒˆć‚’ć‚¢ćƒ«ćƒ•ć‚”ćƒ™ćƒƒćƒˆé †ć«äø¦ć¹ę›æćˆć‚‹", + "sort_direction": "ASCļ¼ˆćƒ‡ćƒ•ć‚©ćƒ«ćƒˆļ¼‰ć¾ćŸćÆ DESC", + "sort_folders_first": "ćƒ•ć‚©ćƒ«ćƒ€ļ¼ˆå­ć‚’ęŒć¤ćƒŽćƒ¼ćƒˆļ¼‰ć‚’äøŠć«ć—ć¦äø¦ć¹ć‚‹", + "top": "ęŒ‡å®šć•ć‚ŒćŸćƒŽćƒ¼ćƒˆć‚’ćć®č¦ŖćƒŽćƒ¼ćƒˆć®äø€ē•ŖäøŠć«č”Øē¤ŗć—ć¾ć™ļ¼ˆäø¦ć¹ę›æćˆć‚‰ćŸč¦ŖćƒŽćƒ¼ćƒˆć«ć®ćæé©ē”Øć•ć‚Œć¾ć™ļ¼‰", + "hide_promoted_attributes": "ć“ć®ćƒŽćƒ¼ćƒˆć®ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆå±žę€§ć‚’éžč”Øē¤ŗć«ć™ć‚‹", + "read_only": "ć‚Øćƒ‡ć‚£ć‚æćƒ¼ćÆčŖ­ćæå–ć‚Šå°‚ē”Øćƒ¢ćƒ¼ćƒ‰ć§ć™ć€‚ćƒ†ć‚­ć‚¹ćƒˆćØć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆć®ćæę©Ÿčƒ½ć—ć¾ć™ć€‚", + "auto_read_only_disabled": "ćƒ†ć‚­ć‚¹ćƒˆ/ć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆćÆć€ć‚µć‚¤ć‚ŗćŒå¤§ćć™ćŽć‚‹å “åˆć€č‡Ŗå‹•ēš„ć«čŖ­ćæå–ć‚Šćƒ¢ćƒ¼ćƒ‰ć«čØ­å®šć•ć‚Œć¾ć™ć€‚ć“ć®ćƒ©ćƒ™ćƒ«ć‚’ćƒŽćƒ¼ćƒˆć«čæ½åŠ ć™ć‚‹ć“ćØć§ć€ćƒŽćƒ¼ćƒˆć”ćØć«ć“ć®å‹•ä½œć‚’ē„”åŠ¹ć«ć™ć‚‹ć“ćØćŒć§ćć¾ć™", + "app_css": "Trilium ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć«čŖ­ćæč¾¼ć¾ć‚Œć€Trilium ć®å¤–č¦³ć‚’å¤‰ę›“ć™ć‚‹ćŸć‚ć«ä½æē”Øć§ćć‚‹ CSS ćƒŽćƒ¼ćƒˆć‚’ćƒžćƒ¼ć‚Æć—ć¾ć™ć€‚", + "app_theme": "Trilium ć®ćƒ•ćƒ«ćƒ†ćƒ¼ćƒžć§ć‚ć‚‹ CSS ćƒŽćƒ¼ćƒˆć‚’ćƒžćƒ¼ć‚Æć—ć€Trilium ć®čØ­å®šć§åˆ©ē”Øć§ćć‚‹ć‚ˆć†ć«ć—ć¾ć™ć€‚", + "app_theme_base": "怌next怍态怌next-lightć€ć€ć¾ćŸćÆć€Œnext-darkć€ć«čØ­å®šć™ć‚‹ćØć€å¾“ę„ć®ćƒ†ćƒ¼ćƒžć§ćÆćŖćć€åÆ¾åæœć™ć‚‹ TriliumNext ćƒ†ćƒ¼ćƒž (auto态lightć€ć¾ćŸćÆ dark) ćŒć‚«ć‚¹ć‚æćƒ  ćƒ†ćƒ¼ćƒžć®ćƒ™ćƒ¼ć‚¹ćØć—ć¦ä½æē”Øć•ć‚Œć¾ć™ć€‚", + "css_class": "ć“ć®ćƒ©ćƒ™ćƒ«ć®å€¤ćÆć€ćƒ„ćƒŖćƒ¼å†…ć®ē‰¹å®šć®ćƒŽćƒ¼ćƒˆć‚’č”Øć™ćƒŽćƒ¼ćƒ‰ć«CSSć‚Æćƒ©ć‚¹ćØć—ć¦čæ½åŠ ć•ć‚Œć¾ć™ć€‚ć“ć‚ŒćÆé«˜åŗ¦ćŖćƒ†ćƒ¼ćƒžčØ­å®šć«å½¹ē«‹ć”ć¾ć™ć€‚ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆćƒŽćƒ¼ćƒˆć§ä½æē”Øć§ćć¾ć™ć€‚", + "icon_class": "ć“ć®ćƒ©ćƒ™ćƒ«ć®å€¤ćÆć€ćƒ„ćƒŖćƒ¼äøŠć®ć‚¢ć‚¤ć‚³ćƒ³ć«CSSć‚Æćƒ©ć‚¹ćØć—ć¦čæ½åŠ ć•ć‚Œć€ćƒ„ćƒŖćƒ¼å†…ć®ćƒŽćƒ¼ćƒˆć‚’č¦–č¦šēš„ć«åŒŗåˆ„ć™ć‚‹ć®ć«å½¹ē«‹ć”ć¾ć™ć€‚ä¾‹ćˆć°ć€bx bx-home ć®ć‚ˆć†ć«ć€ć‚¢ć‚¤ć‚³ćƒ³ćÆ boxicons ć‹ć‚‰å–å¾—ć•ć‚Œć¾ć™ć€‚ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆćƒŽćƒ¼ćƒˆć§ä½æē”Øć§ćć¾ć™ć€‚", + "page_size": "ćƒŽćƒ¼ćƒˆćƒŖć‚¹ćƒˆć®1ćƒšćƒ¼ć‚øć‚ćŸć‚Šć®é …ē›®ę•°", + "custom_request_handler": "ć‚«ć‚¹ć‚æćƒ ćƒŖć‚Æć‚Øć‚¹ćƒˆćƒćƒ³ćƒ‰ćƒ©ćƒ¼ć‚’å‚ē…§ć—ć¦ćć ć•ć„", + "custom_resource_provider": "ć‚«ć‚¹ć‚æćƒ ćƒŖć‚Æć‚Øć‚¹ćƒˆćƒćƒ³ćƒ‰ćƒ©ćƒ¼ć‚’å‚ē…§ć—ć¦ćć ć•ć„", + "widget": "ć“ć®ćƒŽćƒ¼ćƒˆć‚’ć‚«ć‚¹ć‚æćƒ ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆćØć—ć¦ćƒžćƒ¼ć‚Æć—ć€Trilium ć‚³ćƒ³ćƒćƒ¼ćƒćƒ³ćƒˆćƒ„ćƒŖćƒ¼ć«čæ½åŠ ć—ć¾ć™", + "workspace": "ć“ć®ćƒŽćƒ¼ćƒˆć‚’ćƒÆćƒ¼ć‚Æć‚¹ćƒšćƒ¼ć‚¹ćØć—ć¦ćƒžćƒ¼ć‚Æć—ć€ē°”å˜ć«ćƒ›ć‚¤ć‚¹ćƒˆć§ćć‚‹ć‚ˆć†ć«ć—ć¾ć™", + "workspace_icon_class": "ć“ć®ćƒŽćƒ¼ćƒˆć«ćƒ›ć‚¤ć‚¹ćƒˆć•ć‚ŒćŸćØćć«ć‚æćƒ–ć§ä½æē”Øć•ć‚Œć‚‹ćƒœćƒƒć‚Æć‚¹ć‚¢ć‚¤ć‚³ćƒ³ć®CSSć‚Æćƒ©ć‚¹ć‚’å®šē¾©ć—ć¾ć™", + "workspace_tab_background_color": "ć“ć®ćƒŽćƒ¼ćƒˆć«ćƒ›ć‚¤ć‚¹ćƒˆć•ć‚ŒćŸćØćć«ćƒŽćƒ¼ćƒˆć‚æćƒ–ć§ä½æē”Øć•ć‚Œć‚‹CSSでの色", + "workspace_calendar_root": "ćƒÆćƒ¼ć‚Æć‚¹ćƒšćƒ¼ć‚¹ć”ćØć®ć‚«ćƒ¬ćƒ³ćƒ€ćƒ¼ćƒ«ćƒ¼ćƒˆć‚’å®šē¾©ć™ć‚‹", + "workspace_template": "ć“ć®ćƒŽćƒ¼ćƒˆćÆć€ę–°ć—ć„ćƒŽćƒ¼ćƒˆć‚’ä½œęˆć™ć‚‹ćØćć«åˆ©ē”ØåÆčƒ½ćŖćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć®éøęŠžč‚¢ć«č”Øē¤ŗć•ć‚Œć¾ć™ćŒć€ć“ć®ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć‚’å«ć‚€ćƒÆćƒ¼ć‚Æć‚¹ćƒšćƒ¼ć‚¹ć«ćƒ›ć‚¤ć‚¹ćƒˆć•ć‚ŒćŸå “åˆć«ć®ćæč”Øē¤ŗć•ć‚Œć¾ć™", + "search_home": "ę–°ć—ć„ę¤œē“¢ćƒŽćƒ¼ćƒˆćÆć“ć®ćƒŽćƒ¼ćƒˆć®å­ćØć—ć¦ä½œęˆć•ć‚Œć¾ć™", + "workspace_search_home": "ć“ć®ćƒÆćƒ¼ć‚Æć‚¹ćƒšćƒ¼ć‚¹ćƒŽćƒ¼ćƒˆć®ē„–å…ˆć«ćƒ›ć‚¤ć‚¹ćƒˆć•ć‚ŒćŸę–°ć—ć„ę¤œē“¢ćƒŽćƒ¼ćƒˆćÆć€ć“ć®ćƒŽćƒ¼ćƒˆć®å­ćØć—ć¦ä½œęˆć•ć‚Œć¾ć™", + "inbox": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆć®ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć®inboxの堓所 - ć‚µć‚¤ćƒ‰ćƒćƒ¼ć®ć€Œę–°ć—ć„ćƒŽćƒ¼ćƒˆć€ćƒœć‚æćƒ³ć‚’ä½æē”Øć—ć¦ćƒŽćƒ¼ćƒˆć‚’ä½œęˆć™ć‚‹ćØć€ćƒŽćƒ¼ćƒˆćÆ #inbox ćƒ©ćƒ™ćƒ«ć§ćƒžćƒ¼ć‚Æć•ć‚ŒćŸćƒŽćƒ¼ćƒˆć®å­ćƒŽćƒ¼ćƒˆćØć—ć¦ä½œęˆć•ć‚Œć¾ć™ć€‚", + "workspace_inbox": "ć“ć®ćƒÆćƒ¼ć‚Æć‚¹ćƒšćƒ¼ć‚¹ćƒŽćƒ¼ćƒˆć®ē„–å…ˆć«ćƒ›ć‚¤ć‚¹ćƒˆć•ć‚ŒćŸå “åˆć€ę–°č¦ćƒŽćƒ¼ćƒˆć®ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć®inboxの堓所", + "sql_console_home": "SQLć‚³ćƒ³ć‚½ćƒ¼ćƒ«ćƒŽćƒ¼ćƒˆć®ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć®å “ę‰€", + "bookmark_folder": "ć“ć®ćƒ©ćƒ™ćƒ«ć®ä»˜ć„ćŸćƒŽćƒ¼ćƒˆćÆć€ćƒ–ćƒƒć‚Æćƒžćƒ¼ć‚Æć«ćƒ•ć‚©ćƒ«ćƒ€ćØć—ć¦č”Øē¤ŗć•ć‚Œć¾ć™ļ¼ˆå­ćƒ•ć‚©ćƒ«ćƒ€ćøć®ć‚¢ć‚Æć‚»ć‚¹ć‚’čØ±åÆć—ć¾ć™ļ¼‰", + "share_hidden_from_tree": "ć“ć®ćƒŽćƒ¼ćƒˆćÆå·¦å“ć®ćƒŠćƒ“ć‚²ćƒ¼ć‚·ćƒ§ćƒ³ćƒ„ćƒŖćƒ¼ć«ćÆč”Øē¤ŗć•ć‚Œć¦ć„ć¾ć›ć‚“ćŒć€URL ć‹ć‚‰ć‚¢ć‚Æć‚»ć‚¹ć§ćć¾ć™", + "share_external_link": "ćƒŽćƒ¼ćƒˆćÆå…±ęœ‰ćƒ„ćƒŖćƒ¼å†…ć§å¤–éƒØć‚¦ć‚§ćƒ–ć‚µć‚¤ćƒˆćøć®ćƒŖćƒ³ć‚ÆćØć—ć¦ę©Ÿčƒ½ć—ć¾ć™", + "share_alias": "https://your_trilium_host/share/[your_alias] ć§ćƒŽćƒ¼ćƒˆć‚’åˆ©ē”Øć§ćć‚‹ć‚ˆć†ć«ć‚Øć‚¤ćƒŖć‚¢ć‚¹ć‚’å®šē¾©ć—ć¾ć™", + "share_omit_default_css": "ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć®å…±ęœ‰ćƒšćƒ¼ć‚øć®CSSćÆēœē•„ć•ć‚Œć¾ć™ć€‚ć‚¹ć‚æć‚¤ćƒ«ć‚’å¤§å¹…ć«å¤‰ę›“ć™ć‚‹å “åˆć«ä½æē”Øć—ć¦ćć ć•ć„ć€‚", + "share_root": "/share root ć§ęä¾›ć•ć‚Œć‚‹ćƒŽćƒ¼ćƒˆć‚’ćƒžćƒ¼ć‚Æć™ć‚‹ć€‚", + "share_raw": "ćƒŽćƒ¼ćƒˆćÆHTMLćƒ©ćƒƒćƒ‘ćƒ¼ćŖć—ć§ćć®ć¾ć¾ć®å½¢å¼ć§ęä¾›ć•ć‚Œć¾ć™", + "share_disallow_robot_indexing": "X-Robots-Tag: noindex ćƒ˜ćƒƒćƒ€ćƒ¼ć«ć‚ˆć‚Šć€ć“ć®ćƒŽćƒ¼ćƒˆć®ćƒ­ćƒœćƒƒćƒˆć«ć‚ˆć‚‹ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ä½œęˆć‚’ē¦ę­¢ć—ć¾ć™", + "share_credentials": "ć“ć®å…±ęœ‰ćƒŽćƒ¼ćƒˆć«ć‚¢ć‚Æć‚»ć‚¹ć™ć‚‹ć«ćÆčŖčØ¼ęƒ…å ±ćŒåæ…č¦ć§ć™ć€‚å€¤ćÆć€Œćƒ¦ćƒ¼ć‚¶ćƒ¼å:ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ć€ć®å½¢å¼ć§ć‚ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚å­ćƒŽćƒ¼ćƒˆ/ē”»åƒć«é©ē”Øć™ć‚‹ć«ćÆć€ć“ć‚Œć‚’ē¶™ę‰æåÆčƒ½ć«ć™ć‚‹ć“ćØć‚’åæ˜ć‚ŒćŖć„ć§ćć ć•ć„ć€‚", + "share_index": "ć“ć®ćƒ©ćƒ™ćƒ«ć®ä»˜ć„ćŸćƒŽćƒ¼ćƒˆć«ćÆć€å…±ęœ‰ćƒŽćƒ¼ćƒˆć®ćƒ«ćƒ¼ćƒˆćŒć™ć¹ć¦ćƒŖć‚¹ćƒˆć•ć‚Œć¾ć™", + "display_relations": "č”Øē¤ŗć™ć‚‹ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³åć‚’ć‚«ćƒ³ćƒžć§åŒŗåˆ‡ć£ć¦ęŒ‡å®šć—ć¾ć™ć€‚ćć‚Œä»„å¤–ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³åćÆéžč”Øē¤ŗć«ćŖć‚Šć¾ć™ć€‚", + "hide_relations": "éžč”Øē¤ŗć«ć™ć‚‹ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³åć‚’ć‚«ćƒ³ćƒžć§åŒŗåˆ‡ć£ć¦ęŒ‡å®šć—ć¾ć™ć€‚ćć‚Œä»„å¤–ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćÆč”Øē¤ŗć•ć‚Œć¾ć™ć€‚", + "template": "ć“ć®ćƒŽćƒ¼ćƒˆćÆć€ę–°ć—ć„ćƒŽćƒ¼ćƒˆć‚’ä½œęˆć™ć‚‹ćØćć«åˆ©ē”ØåÆčƒ½ćŖćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć®éøęŠžč‚¢ć«č”Øē¤ŗć•ć‚Œć¾ć™", + "toc": "#toc または #toc=show ćÆē›®ę¬”ć‚’å¼·åˆ¶ēš„ć«č”Øē¤ŗć—ć€#toc=hide ćÆē›®ę¬”ć‚’å¼·åˆ¶ēš„ć«éžč”Øē¤ŗć«ć—ć¾ć™ć€‚ćƒ©ćƒ™ćƒ«ćŒå­˜åœØć—ćŖć„å “åˆćÆć€ć‚°ćƒ­ćƒ¼ćƒćƒ«čØ­å®šćŒé©ē”Øć•ć‚Œć¾ć™", + "color": "ćƒŽćƒ¼ćƒˆćƒ„ćƒŖćƒ¼ć€ćƒŖćƒ³ć‚ÆćŖć©ć®ćƒŽćƒ¼ćƒˆć®č‰²ć‚’å®šē¾©ć—ć¾ć™ć€‚ 'red' 悄 #a13d5f ćŖć©ć®ęœ‰åŠ¹ćŖ CSS ć‚«ćƒ©ćƒ¼å€¤ć‚’ä½æē”Øć—ć¾ć™", + "keyboard_shortcut": "ć“ć®ćƒŽćƒ¼ćƒˆć«ć™ćć«ć‚øćƒ£ćƒ³ćƒ—ć™ć‚‹ć‚­ćƒ¼ćƒœćƒ¼ćƒ‰ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆć‚’å®šē¾©ć—ć¾ć™ć€‚ä¾‹: 怌ctrl+alt+eć€ć€‚å¤‰ę›“ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć«ćÆć€ćƒ•ćƒ­ćƒ³ćƒˆć‚Øćƒ³ćƒ‰ć‚’ćƒŖćƒ­ćƒ¼ćƒ‰ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚", + "keep_current_hoisting": "ć“ć®ćƒŖćƒ³ć‚Æć‚’é–‹ć„ć¦ć‚‚ć€ćƒŽćƒ¼ćƒˆćŒē¾åœØć®ćƒ›ć‚¤ć‚¹ćƒˆć•ć‚ŒćŸć‚µćƒ–ćƒ„ćƒŖćƒ¼ć«č”Øē¤ŗć§ććŖć„å “åˆć§ć‚‚ć€ćƒ›ć‚¤ć‚¹ćƒˆćÆå¤‰ę›“ć•ć‚Œć¾ć›ć‚“ć€‚", + "execute_button": "ē¾åœØć®ć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆć‚’å®Ÿč”Œć™ć‚‹ćƒœć‚æćƒ³ć®ć‚æć‚¤ćƒˆćƒ«", + "execute_description": "å®Ÿč”Œćƒœć‚æćƒ³ćØäø€ē·’ć«č”Øē¤ŗć•ć‚Œć‚‹ē¾åœØć®ć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆć®č©³ē“°ćŖčŖ¬ę˜Ž", + "exclude_from_note_map": "ć“ć®ćƒ©ćƒ™ćƒ«ć®ä»˜ć„ćŸćƒŽćƒ¼ćƒˆćÆćƒŽćƒ¼ćƒˆćƒžćƒƒćƒ—ć‹ć‚‰éžč”Øē¤ŗć«ćŖć‚Šć¾ć™", + "new_notes_on_top": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆćÆč¦ŖćƒŽćƒ¼ćƒˆć®äø‹éƒØć§ćÆćŖćäøŠéƒØć«ä½œęˆć•ć‚Œć¾ć™ć€‚", + "hide_highlight_widget": "ćƒć‚¤ćƒ©ć‚¤ćƒˆćƒŖć‚¹ćƒˆ ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆć‚’éžč”Øē¤ŗć«ć™ć‚‹", + "run_on_note_creation": "ćƒćƒƒć‚Æć‚Øćƒ³ćƒ‰ć§ćƒŽćƒ¼ćƒˆćŒä½œęˆć•ć‚ŒćŸéš›ć«å®Ÿč”Œć•ć‚Œć¾ć™ć€‚ē‰¹å®šć®ć‚µćƒ–ćƒ„ćƒŖćƒ¼é…äø‹ć«ä½œęˆć•ć‚ŒćŸć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć«åÆ¾ć—ć¦ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œć—ćŸć„å “åˆćÆć€ć“ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’ä½æē”Øć—ć¦ćć ć•ć„ć€‚ćć®å “åˆćÆć€ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć®ćƒ«ćƒ¼ćƒˆćƒŽćƒ¼ćƒˆć«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’ä½œęˆć—ć€ē¶™ę‰æåÆčƒ½ć«ć—ć¦ćć ć•ć„ć€‚ć‚µćƒ–ćƒ„ćƒŖćƒ¼å†…ļ¼ˆä»»ę„ć®ę·±ć•ļ¼‰ć«ę–°ć—ć„ćƒŽćƒ¼ćƒˆćŒä½œęˆć•ć‚Œć‚‹ćØć€ć‚¹ć‚ÆćƒŖćƒ—ćƒˆćŒå®Ÿč”Œć•ć‚Œć¾ć™ć€‚", + "run_on_child_note_creation": "ć“ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćŒå®šē¾©ć•ć‚Œć¦ć„ć‚‹ćƒŽćƒ¼ćƒˆć®äø‹ć«ę–°ć—ć„ćƒŽćƒ¼ćƒˆćŒä½œęˆć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™", + "render_note": "怌HTMLćƒŽćƒ¼ćƒˆć‚’ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć€ć‚æć‚¤ćƒ—ć®ćƒŽćƒ¼ćƒˆćÆć€ć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆļ¼ˆHTMLć¾ćŸćÆć‚¹ć‚ÆćƒŖćƒ—ćƒˆļ¼‰ć‚’ä½æē”Øć—ć¦ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć•ć‚Œć¾ć™ć€‚ć“ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’ä½æē”Øć—ć¦ć€ć©ć®ćƒŽćƒ¼ćƒˆć‚’ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć™ć‚‹ć‹ć‚’ęŒ‡å®šć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™", + "other_notes_with_name": "{{attributeType}} ć®åå‰ćŒć€Œ{{attributeName}}ć€ć§ć‚ć‚‹ćć®ä»–ć®ćƒŽćƒ¼ćƒˆ", + "color_type": "色", + "share_description": "čŖ¬ę˜Žē”Øć«HTMLćƒ”ć‚æć‚æć‚°ć«čæ½åŠ ć™ć‚‹ćƒ†ć‚­ć‚¹ćƒˆć‚’å®šē¾©ć—ć¾ć™", + "title_template": "ć“ć®ćƒŽćƒ¼ćƒˆć®å­ćØć—ć¦ä½œęˆć•ć‚Œć‚‹ćƒŽćƒ¼ćƒˆć®ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć®ć‚æć‚¤ćƒˆćƒ«ć§ć™ć€‚å€¤ćÆ JavaScript ę–‡å­—åˆ—ćØć—ć¦č©•ä¾”ć•ć‚Œć‚‹ćŸć‚ć€\n ęŒæå…„ć•ć‚ŒćŸ now ćŠć‚ˆć³ parentNote å¤‰ę•°ć‚’ä»‹ć—ć¦å‹•ēš„ćŖć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’čæ½åŠ ć§ćć¾ć™ć€‚ä¾‹: \n \n
    \n
  • ${parentNote.getLabelValue('authorName')} ć®ę–‡å­¦ä½œå“
  • \n
  • ${now.format('YYYY-MM-DD HH:mm:ss')} ć®ćƒ­ć‚°
  • \n
\n \n 詳瓰については Wiki の詳瓰 ć€ćŠć‚ˆć³ parentNote と now 恮 API ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚’å‚ē…§ć—ć¦ćć ć•ć„ć€‚", + "run_on_note_title_change": "ćƒŽćƒ¼ćƒˆć®ć‚æć‚¤ćƒˆćƒ«ćŒå¤‰ę›“ć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™ļ¼ˆćƒŽćƒ¼ćƒˆć®ä½œęˆć‚‚å«ć‚€ļ¼‰", + "run_on_note_content_change": "ćƒŽćƒ¼ćƒˆć®å†…å®¹ćŒå¤‰ę›“ć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™ļ¼ˆćƒŽćƒ¼ćƒˆć®ä½œęˆć‚‚å«ć‚€ļ¼‰ć€‚", + "run_on_note_change": "ćƒŽćƒ¼ćƒˆćŒå¤‰ę›“ć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™ļ¼ˆćƒŽćƒ¼ćƒˆć®ä½œęˆć‚‚å«ć‚€ļ¼‰ć€‚å†…å®¹ć®å¤‰ę›“ćÆå«ć¾ć‚Œć¾ć›ć‚“", + "run_on_note_deletion": "ćƒŽćƒ¼ćƒˆćŒå‰Šé™¤ć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™", + "run_on_branch_creation": "ćƒ–ćƒ©ćƒ³ćƒćŒä½œęˆć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™ć€‚ćƒ–ćƒ©ćƒ³ćƒćÆč¦ŖćƒŽćƒ¼ćƒˆćØå­ćƒŽćƒ¼ćƒˆé–“ć®ćƒŖćƒ³ć‚Æć§ć‚ć‚Šć€ä¾‹ćˆć°ćƒŽćƒ¼ćƒˆć®č¤‡č£½ć‚„ē§»å‹•ć®éš›ć«ä½œęˆć•ć‚Œć¾ć™ć€‚", + "run_on_branch_change": "ćƒ–ćƒ©ćƒ³ćƒćŒę›“ę–°ć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™ć€‚", + "run_on_branch_deletion": "ćƒ–ćƒ©ćƒ³ćƒćŒå‰Šé™¤ć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™ć€‚ćƒ–ćƒ©ćƒ³ćƒćÆč¦ŖćƒŽćƒ¼ćƒˆćØå­ćƒŽćƒ¼ćƒˆé–“ć®ćƒŖćƒ³ć‚Æć§ć‚ć‚Šć€ćƒŽćƒ¼ćƒˆć‚’ē§»å‹•ć—ćŸå “åˆćŖć©ć«å‰Šé™¤ć•ć‚Œć¾ć™ļ¼ˆå¤ć„ćƒ–ćƒ©ćƒ³ćƒ/ćƒŖćƒ³ć‚ÆćÆå‰Šé™¤ć•ć‚Œć¾ć™ļ¼‰ć€‚", + "run_on_attribute_creation": "ć“ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å®šē¾©ć™ć‚‹ćƒŽćƒ¼ćƒˆć«ę–°ć—ć„å±žę€§ćŒä½œęˆć•ć‚ŒćŸå “åˆć«å®Ÿč”Œć•ć‚Œć¾ć™", + "run_on_attribute_change": " ć“ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å®šē¾©ć™ć‚‹ćƒŽćƒ¼ćƒˆć®å±žę€§ćŒå¤‰ę›“ć•ć‚ŒćŸćØćć«å®Ÿč”Œć•ć‚Œć¾ć™ć€‚å±žę€§ćŒå‰Šé™¤ć•ć‚ŒćŸå “åˆć«ć‚‚å®Ÿč”Œć•ć‚Œć¾ć™", + "relation_template": "ćƒŽćƒ¼ćƒˆć®å±žę€§ćÆč¦Ŗå­é–¢äæ‚ćŒćŖćć¦ć‚‚ē¶™ę‰æć•ć‚Œć¾ć™ć€‚ćƒŽćƒ¼ćƒˆć®å†…å®¹ćØć‚µćƒ–ćƒ„ćƒŖćƒ¼ćÆć€ē©ŗć®å “åˆćÆć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹ćƒŽćƒ¼ćƒˆć«čæ½åŠ ć•ć‚Œć¾ć™ć€‚č©³ē“°ćÆćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚’ć”č¦§ćć ć•ć„ć€‚", + "inherit": "č¦Ŗå­é–¢äæ‚ćŒćŖćć¦ć‚‚ć€ćƒŽćƒ¼ćƒˆć®å±žę€§ćÆē¶™ę‰æć•ć‚Œć¾ć™ć€‚åŒę§˜ć®ę¦‚åæµć«ć¤ć„ć¦ćÆć€ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å‚ē…§ć—ć¦ćć ć•ć„ć€‚ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć®å±žę€§ē¶™ę‰æć‚’å‚ē…§ć—ć¦ćć ć•ć„ć€‚", + "widget_relation": "ć“ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®ć‚æćƒ¼ć‚²ćƒƒćƒˆćŒå®Ÿč”Œć•ć‚Œć€ć‚µć‚¤ćƒ‰ćƒćƒ¼ć®ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆćØć—ć¦ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć•ć‚Œć¾ć™", + "share_css": "å…±ęœ‰ćƒšćƒ¼ć‚øć«ęŒæå…„ć•ć‚Œć‚‹CSSćƒŽćƒ¼ćƒˆć§ć™ć€‚CSSćƒŽćƒ¼ćƒˆćÆå…±ęœ‰ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć«ć‚‚å«ć¾ć‚Œć¦ć„ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚ć€Œshare_hidden_from_treeć€ćØć€Œshare_omit_default_cssć€ć®ä½æē”Øć‚‚ę¤œčØŽć—ć¦ćć ć•ć„ć€‚", + "share_js": "å…±ęœ‰ćƒšćƒ¼ć‚øć«ęŒæå…„ć•ć‚Œć‚‹JavaScriptćƒŽćƒ¼ćƒˆć§ć™ć€‚JavaScriptćƒŽćƒ¼ćƒˆćÆå…±ęœ‰ć‚µćƒ–ćƒ„ćƒŖćƒ¼å†…ć«ć‚‚å­˜åœØć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚ć€Œshare_hidden_from_treeć€ć®ä½æē”Øć‚’ę¤œčØŽć—ć¦ćć ć•ć„ć€‚", + "share_template": "å…±ęœ‰ćƒŽćƒ¼ćƒˆć‚’č”Øē¤ŗć™ć‚‹ćŸć‚ć®ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆćØć—ć¦ä½æē”Øć•ć‚Œć‚‹åŸ‹ć‚č¾¼ćæJavaScriptćƒŽćƒ¼ćƒˆć§ć™ć€‚ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć®ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć«ćƒ•ć‚©ćƒ¼ćƒ«ćƒćƒƒć‚Æć—ć¾ć™ć€‚ć€Œshare_hidden_from_treeć€ć®ä½æē”Øć‚’ę¤œčØŽć—ć¦ćć ć•ć„ć€‚", + "share_favicon": "å…±ęœ‰ćƒšćƒ¼ć‚øć«čØ­å®šć™ć‚‹ćƒ•ć‚”ćƒ“ć‚³ćƒ³ć®ćƒŽćƒ¼ćƒˆć§ć™ć€‚é€šåøøćÆå…±ęœ‰ćƒ«ćƒ¼ćƒˆć«čØ­å®šć—ć€ē¶™ę‰æåÆčƒ½ć«ć—ć¾ć™ć€‚ćƒ•ć‚”ćƒ“ć‚³ćƒ³ć®ćƒŽćƒ¼ćƒˆćÆå…±ęœ‰ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć«ć‚‚čØ­å®šć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚ć€Œshare_hidden_from_treeć€ć®ä½æē”Øć‚’ę¤œčØŽć—ć¦ćć ć•ć„ć€‚", + "is_owned_by_note": "ćƒŽćƒ¼ćƒˆć«ć‚ˆć£ć¦ę‰€ęœ‰ć•ć‚Œć¦ć„ć¾ć™", + "and_more": "...ćć®ä»– {{count}} 件怂", + "print_landscape": "PDF ć«ć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆć™ć‚‹ćØćć«ć€ćƒšćƒ¼ć‚øć®å‘ćć‚’ēø¦å‘ćć§ćÆćŖćęØŖå‘ćć«å¤‰ę›“ć—ć¾ć™ć€‚", + "print_page_size": "PDF ć«ć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆć™ć‚‹ćØćć«ć€ćƒšćƒ¼ć‚øć®ć‚µć‚¤ć‚ŗć‚’å¤‰ę›“ć—ć¾ć™ć€‚ć‚µćƒćƒ¼ćƒˆć•ć‚Œć‚‹å€¤: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger怂" }, "link_context_menu": { - "open_note_in_popup": "ć‚Æć‚¤ćƒƒć‚Æć‚Øćƒ‡ć‚£ćƒƒćƒˆ", + "open_note_in_popup": "ć‚Æć‚¤ćƒƒć‚Æē·Øé›†", "open_note_in_new_tab": "ę–°ć—ć„ć‚æćƒ–ć§ćƒŽćƒ¼ćƒˆć‚’é–‹ć", "open_note_in_new_split": "ę–°ć—ćåˆ†å‰²ć—ć¦ćƒŽćƒ¼ćƒˆć‚’é–‹ć", "open_note_in_new_window": "ę–°ć—ć„ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć§ćƒŽćƒ¼ćƒˆć‚’é–‹ć" }, "note_tooltip": { - "quick-edit": "ć‚Æć‚¤ćƒƒć‚Æć‚Øćƒ‡ć‚£ćƒƒćƒˆ" + "quick-edit": "ć‚Æć‚¤ćƒƒć‚Æē·Øé›†", + "note-has-been-deleted": "ćƒŽćƒ¼ćƒˆćÆå‰Šé™¤ć•ć‚Œć¾ć—ćŸć€‚" }, "protect_note": { "toggle-on": "ćƒŽćƒ¼ćƒˆć‚’äæč­·", @@ -973,20 +1176,21 @@ }, "template_switch": { "template": "ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆ", - "toggle-on-hint": "ćƒŽćƒ¼ćƒˆć‚’ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆåŒ–ć™ć‚‹" + "toggle-on-hint": "ćƒŽćƒ¼ćƒˆć‚’ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆåŒ–ć™ć‚‹", + "toggle-off-hint": "ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆćØć—ć¦ć®ćƒŽćƒ¼ćƒˆć‚’å‰Šé™¤ć™ć‚‹" }, "open-help-page": "ćƒ˜ćƒ«ćƒ—ćƒšćƒ¼ć‚øć‚’é–‹ć", "shared_info": { - "shared_publicly": "ć“ć®ćƒŽćƒ¼ćƒˆćÆäø€čˆ¬å…¬é–‹ć•ć‚Œć¦ć„ć¾ć™", - "shared_locally": "ć“ć®ćƒŽćƒ¼ćƒˆćÆćƒ­ćƒ¼ć‚«ćƒ«ć§å…±ęœ‰ć•ć‚Œć¦ć„ć¾ć™", - "help_link": "ćƒ˜ćƒ«ćƒ—ć«ć¤ć„ć¦ćÆć€wikić‚’ć”č¦§ćć ć•ć„ć€‚" + "help_link": "ćƒ˜ćƒ«ćƒ—ć«ć¤ć„ć¦ćÆć€wikić‚’ć”č¦§ćć ć•ć„ć€‚", + "shared_locally": "ć“ć®ćƒŽćƒ¼ćƒˆćÆ {{- link}} ć§ćƒ­ćƒ¼ć‚«ćƒ«ć«å…±ęœ‰ć•ć‚Œć¦ć„ć¾ć™ć€‚", + "shared_publicly": "ć“ć®ćƒŽćƒ¼ćƒˆćÆ {{- link}} ć§äø€čˆ¬å…¬é–‹ć•ć‚Œć¦ć„ć¾ć™ć€‚" }, "highlights_list_2": { "title": "ćƒć‚¤ćƒ©ć‚¤ćƒˆćƒŖć‚¹ćƒˆ", "options": "ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³" }, "quick-search": { - "placeholder": "ć‚Æć‚¤ćƒƒć‚Æć‚µćƒ¼ćƒ", + "placeholder": "ć‚Æć‚¤ćƒƒć‚Æę¤œē“¢", "searching": "検瓢中...", "no-results": "ēµęžœćÆč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ć§ć—ćŸ", "more-results": "... ćŠć‚ˆć³ {{number}} ä»¶ć®ä»–ć®ēµęžœć€‚", @@ -996,23 +1200,28 @@ "collapse-title": "ćƒŽćƒ¼ćƒˆćƒ„ćƒŖćƒ¼ć‚’ęŠ˜ć‚ŠćŸćŸć‚€", "scroll-active-title": "ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćƒŽćƒ¼ćƒˆć¾ć§ć‚¹ć‚Æćƒ­ćƒ¼ćƒ«", "tree-settings-title": "ćƒ„ćƒŖćƒ¼ć®čØ­å®š", - "hide-archived-notes": "ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–ćƒŽćƒ¼ćƒˆć‚’éš ć™", + "hide-archived-notes": "ć‚¢ćƒ¼ć‚«ć‚¤ćƒ–ćƒŽćƒ¼ćƒˆć‚’éžč”Øē¤ŗ", "automatically-collapse-notes": "ćƒŽćƒ¼ćƒˆć‚’č‡Ŗå‹•ēš„ć«ęŠ˜ć‚ŠćŸćŸć‚€", "automatically-collapse-notes-title": "äø€å®šęœŸé–“ä½æē”Øć•ć‚ŒćŖć„ćØć€ćƒ„ćƒŖćƒ¼ć‚’ę•“ē†ć™ć‚‹ćŸć‚ć«ćƒŽćƒ¼ćƒˆćÆęŠ˜ć‚ŠćŸćŸć¾ć‚Œć¾ć™ć€‚", "save-changes": "å¤‰ę›“ć‚’äæå­˜ć—ć¦é©ē”Ø", "auto-collapsing-notes-after-inactivity": "éžć‚¢ć‚Æćƒ†ć‚£ćƒ–ēŠ¶ę…‹ćŒē¶šć„ćŸćŸć‚ćƒŽćƒ¼ćƒˆćŒč‡Ŗå‹•ć§ęŠ˜ć‚ŠćŸćŸć¾ć‚Œć¾ć™...", - "create-child-note": "å­ćƒŽćƒ¼ćƒˆć‚’ä½œęˆ" + "create-child-note": "å­ćƒŽćƒ¼ćƒˆć‚’ä½œęˆ", + "hoist-this-note-workspace": "ć“ć®ćƒŽćƒ¼ćƒˆć‚’ćƒ›ć‚¤ć‚¹ćƒˆć™ć‚‹ļ¼ˆćƒÆćƒ¼ć‚Æć‚¹ćƒšćƒ¼ć‚¹ļ¼‰", + "unhoist": "ćƒ›ć‚¤ć‚¹ćƒˆč§£é™¤", + "saved-search-note-refreshed": "äæå­˜ć—ćŸę¤œē“¢ćƒŽćƒ¼ćƒˆćŒę›“ę–°ć•ć‚Œć¾ć—ćŸć€‚", + "refresh-saved-search-results": "äæå­˜ć—ćŸę¤œē“¢ēµęžœć‚’ę›“ę–°", + "toggle-sidebar": "ć‚µć‚¤ćƒ‰ćƒćƒ¼ć‚’åˆ‡ć‚Šę›æćˆ" }, "bulk_actions": { "bulk_actions": "äø€ę‹¬ę“ä½œ", - "affected_notes": "å½±éŸæć•ć‚ŒćŸćƒŽćƒ¼ćƒˆ", + "affected_notes": "å½±éŸæć•ć‚Œć‚‹ćƒŽćƒ¼ćƒˆ", "include_descendants": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆć®å­ćƒŽćƒ¼ćƒˆć‚’å«ć‚€", "available_actions": "åˆ©ē”ØåÆčƒ½ćŖć‚¢ć‚Æć‚·ćƒ§ćƒ³", "chosen_actions": "éøęŠžć•ć‚ŒćŸć‚¢ć‚Æć‚·ćƒ§ćƒ³", "execute_bulk_actions": "äø€ę‹¬ę“ä½œć‚’å®Ÿč”Œ", "bulk_actions_executed": "äø€ę‹¬ę“ä½œćŒęˆåŠŸć«å®Ÿč”Œć•ć‚Œć¾ć—ćŸć€‚", "labels": "ćƒ©ćƒ™ćƒ«", - "relations": "関係", + "relations": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³", "notes": "ćƒŽćƒ¼ćƒˆ", "other": "ćć®ä»–", "none_yet": "ć‚¢ć‚Æć‚·ćƒ§ćƒ³ć‚’äøŠć®ćƒŖć‚¹ćƒˆć‹ć‚‰ć‚ÆćƒŖćƒƒć‚Æć—ć¦čæ½åŠ ć€‚" @@ -1037,7 +1246,7 @@ "duplicated": "ćƒŽćƒ¼ćƒˆ \"{{title}}\" ćÆč¤‡č£½ć•ć‚Œć¾ć—ćŸć€‚" }, "clipboard": { - "cut": "ćƒŽćƒ¼ćƒˆćÆć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚«ćƒƒćƒˆć•ć‚Œć¾ć—ćŸć€‚", + "cut": "ćƒŽćƒ¼ćƒˆćÆć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«åˆ‡ć‚Šå–ć‚ŠćØć‚‰ć‚Œć¾ć—ćŸć€‚", "copied": "ćƒŽćƒ¼ćƒˆćÆć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼ć•ć‚Œć¾ć—ćŸć€‚", "copy_failed": "ęØ©é™ć®å•é”Œć§ć€ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼ć§ćć¾ć›ć‚“ć€‚", "copy_success": "ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼ć—ć¾ć—ćŸć€‚" @@ -1051,7 +1260,8 @@ "reset": "ćƒŖć‚»ćƒƒćƒˆ", "move-to-visible-launchers": "åÆč¦–ćƒ©ćƒ³ćƒćƒ£ćƒ¼ć«ē§»å‹•", "move-to-available-launchers": "åˆ©ē”ØåÆčƒ½ćŖćƒ©ćƒ³ćƒćƒ£ćƒ¼ć«ē§»å‹•", - "duplicate-launcher": "ćƒ©ćƒ³ćƒćƒ£ćƒ¼ć®č¤‡č£½ " + "duplicate-launcher": "ćƒ©ćƒ³ćƒćƒ£ćƒ¼ć®č¤‡č£½ ", + "reset_launcher_confirm": "ęœ¬å½“ć«ć€Œ{{title}}ć€ć‚’ćƒŖć‚»ćƒƒćƒˆć—ć¾ć™ć‹ļ¼Ÿ ć“ć®ćƒŽćƒ¼ćƒˆļ¼ˆćŠć‚ˆć³ćć®å­ćƒŽćƒ¼ćƒˆļ¼‰ć®ć™ć¹ć¦ć®ćƒ‡ćƒ¼ć‚æćØčØ­å®šćŒå¤±ć‚ć‚Œć€ćƒ©ćƒ³ćƒćƒ£ćƒ¼ćÆå…ƒć®å “ę‰€ć«ęˆ»ć‚Šć¾ć™ć€‚" }, "editable-text": { "auto-detect-language": "č‡Ŗå‹•ę¤œå‡ŗ" @@ -1075,7 +1285,8 @@ "editor_type": { "label": "ę›øå¼čØ­å®šćƒ„ćƒ¼ćƒ«ćƒćƒ¼", "floating": { - "description": "ē·Øé›†ćƒ„ćƒ¼ćƒ«ćŒć‚«ćƒ¼ć‚½ćƒ«ä»˜čæ‘ć«č”Øē¤ŗć•ć‚Œć¾ć™;" + "description": "ē·Øé›†ćƒ„ćƒ¼ćƒ«ćŒć‚«ćƒ¼ć‚½ćƒ«ä»˜čæ‘ć«č”Øē¤ŗć•ć‚Œć¾ć™ć€‚", + "title": "ćƒ•ćƒ­ćƒ¼ćƒ†ć‚£ćƒ³ć‚°" }, "fixed": { "title": "å›ŗå®š", @@ -1086,10 +1297,10 @@ }, "electron_context_menu": { "add-term-to-dictionary": "č¾žę›øć« \"{{term}}\" ć‚’čæ½åŠ ", - "cut": "ć‚«ćƒƒćƒˆ", + "cut": "åˆ‡ć‚Šå–ć‚Š", "copy": "ć‚³ćƒ”ćƒ¼", "copy-link": "ćƒŖćƒ³ć‚Æć‚’ć‚³ćƒ”ćƒ¼", - "paste": "ćƒšćƒ¼ć‚¹ćƒˆ", + "paste": "č²¼ć‚Šä»˜ć‘", "paste-as-plain-text": "ćƒ—ćƒ¬ćƒ¼ćƒ³ćƒ†ć‚­ć‚¹ćƒˆć§č²¼ć‚Šä»˜ć‘", "search_online": "{{searchEngine}} 恧 \"{{term}}\" ć‚’ę¤œē“¢" }, @@ -1106,7 +1317,9 @@ "show_login_link_description": "å…±ęœ‰ćƒšćƒ¼ć‚øć®äø‹éƒØć«ćƒ­ć‚°ć‚¤ćƒ³ćƒŖćƒ³ć‚Æć‚’čæ½åŠ ", "share_root_found": "å…±ęœ‰ćƒ«ćƒ¼ćƒˆćƒŽćƒ¼ćƒˆ '{{noteTitle}}' ć®ęŗ–å‚™ćŒå®Œäŗ†", "share_root_not_found": "#shareRoot ć®ćƒ©ćƒ™ćƒ«ćŒä»˜ć„ćŸćƒŽćƒ¼ćƒˆćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“", - "share_root_not_shared": "ćƒŽćƒ¼ćƒˆ '{{noteTitle}}' は #shareRoot ć®ćƒ©ćƒ™ćƒ«ć‚’ęŒć£ć¦ć„ć¾ć™ćŒć€å…±ęœ‰ć•ć‚Œć¦ć„ć¾ć›ć‚“" + "share_root_not_shared": "ćƒŽćƒ¼ćƒˆ '{{noteTitle}}' は #shareRoot ć®ćƒ©ćƒ™ćƒ«ć‚’ęŒć£ć¦ć„ć¾ć™ćŒć€å…±ęœ‰ć•ć‚Œć¦ć„ć¾ć›ć‚“", + "show_login_link": "å…±ęœ‰ćƒ†ćƒ¼ćƒžć«ćƒ­ć‚°ć‚¤ćƒ³ćƒŖćƒ³ć‚Æć‚’č”Øē¤ŗć™ć‚‹", + "check_share_root": "å…±ęœ‰ćƒ«ćƒ¼ćƒˆć®ć‚¹ćƒ†ćƒ¼ć‚æć‚¹ć‚’ē¢ŗčŖ" }, "time_selector": { "invalid_input": "å…„åŠ›ć•ć‚ŒćŸę™‚é–“å€¤ćŒęœ‰åŠ¹ćŖę•°å€¤ć§ćÆć‚ć‚Šć¾ć›ć‚“ć€‚", @@ -1134,11 +1347,20 @@ "cpu_arch_warning": { "title": "ARM64ē‰ˆć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć¦ćć ć•ć„", "dont_show_again": "ć“ć®č­¦å‘Šć‚’äŗŒåŗ¦ćØč”Øē¤ŗć—ćŖć„", - "continue_anyway": "ćØć«ć‹ćē¶šć‘ć‚‹" + "continue_anyway": "ćØć«ć‹ćē¶šć‘ć‚‹", + "message_windows": "TriliumNext ćÆē¾åœØć‚ØćƒŸćƒ„ćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å®Ÿč”Œć—ć¦ć„ć¾ć™ć€‚ć¤ć¾ć‚Šć€ARMē‰ˆWindowsćƒ‡ćƒć‚¤ć‚¹ć§Intel(x64ļ¼‰ē‰ˆć‚’ä½æē”Øć—ć¦ć„ć‚‹ć“ćØć«ćŖć‚Šć¾ć™ć€‚ć“ć‚ŒćÆćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ćØćƒćƒƒćƒ†ćƒŖćƒ¼åÆæå‘½ć«é‡å¤§ćŖå½±éŸæć‚’åŠć¼ć—ć¾ć™ć€‚", + "recommendation": "ęœ€é©ćŖć‚Øć‚Æć‚¹ćƒšćƒŖć‚Øćƒ³ć‚¹ć‚’å¾—ć‚‹ć«ćÆć€ćƒŖćƒŖćƒ¼ć‚¹ ćƒšćƒ¼ć‚øć‹ć‚‰ TriliumNext ć®ćƒć‚¤ćƒ†ć‚£ćƒ– ARM64 ćƒćƒ¼ć‚øćƒ§ćƒ³ć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć¦ćć ć•ć„ć€‚", + "download_link": "ćƒć‚¤ćƒ†ć‚£ćƒ–ē‰ˆć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰", + "message_macos": "TriliumNext ćÆē¾åœØć€Rosetta 2ć«ć‚ˆć‚‹ēæ»čØ³ē’°å¢ƒć§å®Ÿč”Œć•ć‚Œć¦ć„ć¾ć™ć€‚ć¤ć¾ć‚Šć€Apple Silicon MacではIntel (x64)ćƒćƒ¼ć‚øćƒ§ćƒ³ć‚’ä½æē”Øć—ć¦ć„ć‚‹ć“ćØć«ćŖć‚Šć¾ć™ć€‚ć“ć‚ŒćÆćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ćØćƒćƒƒćƒ†ćƒŖćƒ¼åÆæå‘½ć«é‡å¤§ćŖå½±éŸæć‚’åŠć¼ć—ć¾ć™ć€‚" }, "editorfeatures": { "emoji_completion_enabled": "ēµµę–‡å­—ć®ć‚Ŗćƒ¼ćƒˆć‚³ćƒ³ćƒ—ćƒŖćƒ¼ćƒˆć‚’ęœ‰åŠ¹", - "note_completion_enabled": "ćƒŽćƒ¼ćƒˆć®ć‚Ŗćƒ¼ćƒˆć‚³ćƒ³ćƒ—ćƒŖćƒ¼ćƒˆć‚’ęœ‰åŠ¹" + "note_completion_enabled": "ćƒŽćƒ¼ćƒˆć®ć‚Ŗćƒ¼ćƒˆć‚³ćƒ³ćƒ—ćƒŖćƒ¼ćƒˆć‚’ęœ‰åŠ¹", + "emoji_completion_description": "ęœ‰åŠ¹ć«ć™ć‚‹ćØć€ć€Œ:ć€ć«ē¶šć‘ć¦ēµµę–‡å­—ć®åå‰ć‚’å…„åŠ›ć™ć‚‹ć“ćØć§ć€ćƒ†ć‚­ć‚¹ćƒˆć«ēµµę–‡å­—ć‚’ē°”å˜ć«ęŒæå…„ć§ćć¾ć™ć€‚", + "note_completion_description": "ęœ‰åŠ¹ć«ć™ć‚‹ćØć€ć€Œ@怍 ć«ē¶šć‘ć¦ćƒŽćƒ¼ćƒˆć®ć‚æć‚¤ćƒˆćƒ«ć‚’å…„åŠ›ć™ć‚‹ć“ćØć§ć€ćƒŽćƒ¼ćƒˆćøć®ćƒŖćƒ³ć‚Æć‚’ä½œęˆć§ćć¾ć™ć€‚", + "slash_commands_enabled": "ć‚¹ćƒ©ćƒƒć‚·ćƒ„ć‚³ćƒžćƒ³ćƒ‰ć‚’ęœ‰åŠ¹", + "slash_commands_description": "ęœ‰åŠ¹ć«ć™ć‚‹ćØć€ę”¹č”Œć‚„č¦‹å‡ŗć—ć®ęŒæå…„ćŖć©ć®ē·Øé›†ć‚³ćƒžćƒ³ćƒ‰ćÆć€ć€Œ/怍 ćØå…„åŠ›ć—ć¦åˆ‡ć‚Šę›æćˆć‚‹ć“ćØćŒć§ćć¾ć™ć€‚", + "title": "機能" }, "table_context_menu": { "delete_row": "č”Œć‚’å‰Šé™¤" @@ -1206,7 +1428,8 @@ "agent": { "processing": "処理中...", "loading": "読み込み中...", - "generating": "ē”Ÿęˆäø­..." + "generating": "ē”Ÿęˆäø­...", + "thinking": "č€ƒćˆäø­..." }, "name": "AI", "openai": "OpenAI", @@ -1214,7 +1437,7 @@ "ollama_no_url": "OllamaćÆčØ­å®šć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚ęœ‰åŠ¹ćŖURLć‚’å…„åŠ›ć—ć¦ćć ć•ć„ć€‚", "chat": { "root_note_title": "AIチャット", - "root_note_content": "ć“ć®ćƒ”ćƒ¢ć«ćÆć€äæå­˜ć•ć‚ŒćŸAIćƒćƒ£ćƒƒćƒˆć®ä¼šč©±ćŒå«ć¾ć‚Œć¦ć„ć¾ć™ć€‚", + "root_note_content": "ć“ć®ćƒŽćƒ¼ćƒˆć«ćÆć€äæå­˜ć•ć‚ŒćŸAIćƒćƒ£ćƒƒćƒˆć®ä¼šč©±ćŒå«ć¾ć‚Œć¦ć„ć¾ć™ć€‚", "new_chat_title": "ę–°ć—ć„ćƒćƒ£ćƒƒćƒˆ", "create_new_ai_chat": "ꖰ恗恄AIćƒćƒ£ćƒƒćƒˆć‚’ä½œęˆ" }, @@ -1224,13 +1447,82 @@ "selected_provider_description": "ćƒćƒ£ćƒƒćƒˆćŠć‚ˆć³č£œå®Œę©Ÿčƒ½ć®AIćƒ—ćƒ­ćƒć‚¤ćƒ€ćƒ¼ć‚’éøęŠžć™ć‚‹", "selected_provider": "ćƒ—ćƒ­ćƒć‚¤ćƒ€ćƒ¼ć‚’éøęŠž", "select_model": "ćƒ¢ćƒ‡ćƒ«ć‚’éøęŠž...", - "select_provider": "ćƒ—ćƒ­ćƒć‚¤ćƒ€ćƒ¼ć‚’éøęŠž..." + "select_provider": "ćƒ—ćƒ­ćƒć‚¤ćƒ€ćƒ¼ć‚’éøęŠž...", + "not_started": "é–‹å§‹ć•ć‚Œć¦ć„ć¾ć›ć‚“", + "processed_notes": "å‡¦ē†ęøˆćæćƒŽćƒ¼ćƒˆ", + "total_notes": "ćƒŽćƒ¼ćƒˆć®ē·ę•°", + "progress": "é€²č”ŒēŠ¶ę³", + "queued_notes": "ć‚­ćƒ„ćƒ¼ć«ē™»éŒ²ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆ", + "failed_notes": "å¤±ę•—ć—ćŸćƒŽćƒ¼ćƒˆ", + "last_processed": "ęœ€ēµ‚å‡¦ē†ę—„ę™‚", + "refresh_stats": "ēµ±čØˆęƒ…å ±ć‚’ę›“ę–°", + "temperature": "Temperatureļ¼ˆęø©åŗ¦ļ¼‰", + "url": "ćƒ™ćƒ¼ć‚¹URL", + "base_url": "ćƒ™ćƒ¼ć‚¹URL", + "enable_automatic_indexing": "č‡Ŗå‹•ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ä½œęˆć‚’ęœ‰åŠ¹ć«ć™ć‚‹", + "rebuild_index": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®å†ę§‹ēÆ‰", + "rebuild_index_error": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®å†ę§‹ēÆ‰é–‹å§‹ę™‚ć«ć‚Øćƒ©ćƒ¼ćŒē™ŗē”Ÿć—ć¾ć—ćŸć€‚č©³ē“°ćÆćƒ­ć‚°ć‚’ć”ē¢ŗčŖćć ć•ć„ć€‚", + "note_title": "ćƒŽćƒ¼ćƒˆć®ć‚æć‚¤ćƒˆćƒ«", + "last_attempt": "ęœ€ēµ‚č©¦č”Œę—„ę™‚", + "actions": "ć‚¢ć‚Æć‚·ćƒ§ćƒ³", + "retry_queued": "ćƒŽćƒ¼ćƒˆćŒå†č©¦č”Œć‚­ćƒ„ćƒ¼ć«čæ½åŠ ć•ć‚Œć¾ć—ćŸ", + "retry_failed": "ćƒŽćƒ¼ćƒˆć‚’å†č©¦č”Œć‚­ćƒ„ćƒ¼ć«čæ½åŠ ć§ćć¾ć›ć‚“ć§ć—ćŸ", + "max_notes_per_llm_query": "ć‚Æć‚ØćƒŖć‚ćŸć‚Šć®ęœ€å¤§ćƒŽćƒ¼ćƒˆę•°", + "max_notes_per_llm_query_description": "AIć‚³ćƒ³ćƒ†ć‚­ć‚¹ćƒˆć«å«ć‚ć‚‹é”žä¼¼ćƒŽćƒ¼ćƒˆć®ęœ€å¤§ę•°", + "active_providers": "ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒ—ćƒ­ćƒć‚¤ćƒ€ćƒ¼", + "disabled_providers": "ē„”åŠ¹ćŖćƒ—ćƒ­ćƒć‚¤ćƒ€ćƒ¼", + "remove_provider": "ę¤œē“¢ć‹ć‚‰ćƒ—ćƒ­ćƒć‚¤ćƒ€ćƒ¼ć‚’å‰Šé™¤", + "restore_provider": "ę¤œē“¢ć«ćƒ—ćƒ­ćƒć‚¤ćƒ€ćƒ¼ć‚’å¾©å…ƒ", + "similarity_threshold": "é”žä¼¼åŗ¦ć®ć—ćć„å€¤", + "similarity_threshold_description": "LLMć‚Æć‚ØćƒŖć®ć‚³ćƒ³ćƒ†ć‚­ć‚¹ćƒˆć«å«ć‚ć‚‹ćƒŽćƒ¼ćƒˆć®ęœ€å°é”žä¼¼åŗ¦ć‚¹ć‚³ć‚¢ļ¼ˆ0ļ½ž1)", + "reprocess_index": "ę¤œē“¢ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć‚’å†ę§‹ēÆ‰", + "reprocessing_index": "å†ę§‹ēÆ‰äø­...", + "reprocess_index_started": "ę¤œē“¢ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®ęœ€é©åŒ–ćŒćƒćƒƒć‚Æć‚°ćƒ©ć‚¦ćƒ³ćƒ‰ć§é–‹å§‹ć•ć‚Œć¾ć—ćŸ", + "reprocess_index_error": "ę¤œē“¢ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®å†ę§‹ēÆ‰äø­ć«ć‚Øćƒ©ćƒ¼ćŒē™ŗē”Ÿć—ć¾ć—ćŸ", + "index_rebuild_progress": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®å†ę§‹ēÆ‰ć®é€²č”ŒēŠ¶ę³", + "index_rebuilding": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®ęœ€é©åŒ–äø­ļ¼ˆ{{percentage}}%)", + "index_rebuild_complete": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®ęœ€é©åŒ–ćŒå®Œäŗ†ć—ć¾ć—ćŸ", + "index_rebuild_status_error": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®å†ę§‹ēÆ‰ć‚¹ćƒ†ćƒ¼ć‚æć‚¹ć®ē¢ŗčŖäø­ć«ć‚Øćƒ©ćƒ¼ćŒē™ŗē”Ÿć—ć¾ć—ćŸ", + "never": "なし", + "incomplete": "ęœŖå®Œäŗ† ({{percentage}}%)", + "note_queued_for_retry": "ćƒŽćƒ¼ćƒˆćŒå†č©¦č”Œć‚­ćƒ„ćƒ¼ć«čæ½åŠ ć•ć‚Œć¾ć—ćŸ", + "failed_to_retry_note": "ćƒŽćƒ¼ćƒˆć®å†č©¦č”Œć«å¤±ę•—ć—ć¾ć—ćŸ", + "all_notes_queued_for_retry": "å¤±ę•—ć—ćŸć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆćÆå†č©¦č”Œć®ćŸć‚ć«ć‚­ćƒ„ćƒ¼ć«å…„ć‚Œć‚‰ć‚Œć¾ć—ćŸ", + "failed_to_retry_all": "ćƒŽćƒ¼ćƒˆć®å†č©¦č”Œć«å¤±ę•—ć—ć¾ć—ćŸ", + "use_enhanced_context": "ę‹”å¼µć•ć‚ŒćŸć‚³ćƒ³ćƒ†ć‚­ć‚¹ćƒˆć‚’ä½æē”Øć™ć‚‹", + "enhanced_context_description": "ćƒŽćƒ¼ćƒˆćØćć®é–¢é€£ćƒŽćƒ¼ćƒˆć‹ć‚‰ć‚ˆć‚Šå¤šćć®ć‚³ćƒ³ćƒ†ć‚­ć‚¹ćƒˆć‚’AIć«ęä¾›ć—ć€ć‚ˆć‚Šč‰Æć„åæœē­”ć‚’å®Ÿē¾ć—ć¾ć™", + "show_thinking": "ę€č€ƒć‚’č”Øē¤ŗ", + "show_thinking_description": "AIć®ę€č€ƒćƒ—ćƒ­ć‚»ć‚¹ć‚’ćƒć‚§ćƒ¼ćƒ³č”Øē¤ŗ", + "enter_message": "ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚’å…„åŠ›...", + "error_generating_response": "AIåæœē­”ć®ē”Ÿęˆäø­ć«ć‚Øćƒ©ćƒ¼ćŒē™ŗē”Ÿć—ć¾ć—ćŸ", + "index_all_notes": "ć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć‚’ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć«ē™»éŒ²", + "index_status": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć®ć‚¹ćƒ†ćƒ¼ć‚æć‚¹", + "indexed_notes": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ē™»éŒ²ęøˆćæć®ćƒŽćƒ¼ćƒˆ", + "indexing_stopped": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ē™»éŒ²ć‚’åœę­¢ć—ć¾ć—ćŸ", + "indexing_in_progress": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ē™»éŒ²äø­ć§ć™...", + "last_indexed": "ęœ€ēµ‚ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ä½œęˆę—„ę™‚", + "n_notes_queued_0": "{{ count }} ä»¶ć®ćƒŽćƒ¼ćƒˆćŒć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ä½œęˆå¾…ć”ć§ć™", + "note_chat": "ćƒŽćƒ¼ćƒˆćƒćƒ£ćƒƒćƒˆ", + "notes_indexed_0": "{{ count }} ä»¶ć®ćƒŽćƒ¼ćƒˆć‚’ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ć—ć¾ć—ćŸ", + "sources": "ć‚½ćƒ¼ć‚¹", + "start_indexing": "ć‚¤ćƒ³ćƒ‡ćƒƒć‚Æć‚¹ä½œęˆć‚’é–‹å§‹", + "use_advanced_context": "é«˜åŗ¦ćŖć‚³ćƒ³ćƒ†ć‚­ć‚¹ćƒˆć‚’ä½æē”Ø", + "ai_enabled": "AI ę©Ÿčƒ½ćŒęœ‰åŠ¹", + "ai_disabled": "AI ę©Ÿčƒ½ćŒē„”åŠ¹", + "no_models_found_online": "ćƒ¢ćƒ‡ćƒ«ćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ć€‚API ć‚­ćƒ¼ćØčØ­å®šć‚’ē¢ŗčŖć—ć¦ćć ć•ć„ć€‚", + "no_models_found_ollama": "Ollama ćƒ¢ćƒ‡ćƒ«ćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ć€‚Ollama ćŒå®Ÿč”Œäø­ć‹ć©ć†ć‹ć‚’ē¢ŗčŖć—ć¦ćć ć•ć„ć€‚", + "error_fetching": "ćƒ¢ćƒ‡ćƒ«ć®å–å¾—ć‚Øćƒ©ćƒ¼: {{error}}" }, "add_label": { "add_label": "ćƒ©ćƒ™ćƒ«ć‚’čæ½åŠ ", "label_name_placeholder": "ćƒ©ćƒ™ćƒ«å", "label_name_title": "č‹±ę•°å­—ć€ć‚¢ćƒ³ćƒ€ćƒ¼ćƒćƒ¼ć€ć‚³ćƒ­ćƒ³ćŒä½æē”ØåÆčƒ½ćŖę–‡å­—ć§ć™ć€‚", - "new_value_placeholder": "新しい値" + "new_value_placeholder": "新しい値", + "help_text": "äø€č‡“ć—ćŸć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć«:", + "help_text_note": "ć“ć®ćƒ”ć‚½ćƒƒćƒ‰ć‚’å€¤ćŖć—ć§å‘¼ć³å‡ŗć™ć“ćØć‚‚ć§ćć¾ć™ć€‚ćć®å “åˆć€ćƒ©ćƒ™ćƒ«ćÆå€¤ćŖć—ć§ćƒŽćƒ¼ćƒˆć«å‰²ć‚Šå½“ć¦ć‚‰ć‚Œć¾ć™ć€‚", + "to_value": "値", + "help_text_item1": "ćƒŽćƒ¼ćƒˆć«ć¾ć ćƒ©ćƒ™ćƒ«ćŒćŖć„å “åˆćÆć€ęŒ‡å®šć•ć‚ŒćŸćƒ©ćƒ™ćƒ«ć‚’ä½œęˆć—ć¾ć™", + "help_text_item2": "ć¾ćŸćÆę—¢å­˜ć®ćƒ©ćƒ™ćƒ«ć®å€¤ć‚’å¤‰ę›“ć™ć‚‹" }, "delete_label": { "delete_label": "ćƒ©ćƒ™ćƒ«ć‚’å‰Šé™¤", @@ -1250,30 +1542,40 @@ "label_name_placeholder": "ćƒ©ćƒ™ćƒ«å", "label_name_title": "č‹±ę•°å­—ć€ć‚¢ćƒ³ćƒ€ćƒ¼ćƒćƒ¼ć€ć‚³ćƒ­ćƒ³ćŒä½æē”ØåÆčƒ½ćŖę–‡å­—ć§ć™ć€‚", "new_value_placeholder": "新しい値", - "help_text_note": "ć“ć®ćƒ”ć‚½ćƒƒćƒ‰ćÆå€¤ćŖć—ć§å‘¼ć³å‡ŗć™ć“ćØć‚‚ć§ćć¾ć™ć€‚ćć®å “åˆć€å€¤ćŖć—ć§ćƒ©ćƒ™ćƒ«ćŒćƒŽćƒ¼ćƒˆć«å‰²ć‚Šå½“ć¦ć‚‰ć‚Œć¾ć™ć€‚" + "help_text_note": "ć“ć®ćƒ”ć‚½ćƒƒćƒ‰ćÆå€¤ćŖć—ć§å‘¼ć³å‡ŗć™ć“ćØć‚‚ć§ćć¾ć™ć€‚ćć®å “åˆć€å€¤ćŖć—ć§ćƒ©ćƒ™ćƒ«ćŒćƒŽćƒ¼ćƒˆć«å‰²ć‚Šå½“ć¦ć‚‰ć‚Œć¾ć™ć€‚", + "help_text": "äø€č‡“ć—ćŸć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć§ć€ę—¢å­˜ć®ćƒ©ćƒ™ćƒ«ć®å€¤ć‚’å¤‰ę›“ć™ć‚‹ć€‚", + "to_value": "値" }, "add_relation": { - "add_relation": "é–¢äæ‚ć‚’čæ½åŠ ", - "relation_name": "é–¢äæ‚ć®åå‰", - "allowed_characters": "č‹±ę•°å­—ć€ć‚¢ćƒ³ćƒ€ćƒ¼ćƒćƒ¼ć€ć‚³ćƒ­ćƒ³ćŒä½æē”ØåÆčƒ½ćŖę–‡å­—ć§ć™ć€‚" + "add_relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’čæ½åŠ ", + "relation_name": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®åå‰", + "allowed_characters": "č‹±ę•°å­—ć€ć‚¢ćƒ³ćƒ€ćƒ¼ćƒćƒ¼ć€ć‚³ćƒ­ćƒ³ćŒä½æē”ØåÆčƒ½ćŖę–‡å­—ć§ć™ć€‚", + "create_relation_on_all_matched_notes": "äø€č‡“ć—ćŸć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć«åÆ¾ć—ć¦ć€ęŒ‡å®šć•ć‚ŒćŸćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’ä½œęˆć—ć¾ć™ć€‚", + "target_note": "åÆ¾č±”ć®ćƒŽćƒ¼ćƒˆ", + "to": "悒" }, "delete_relation": { - "delete_relation": "é–¢äæ‚ć‚’å‰Šé™¤", - "relation_name": "é–¢äæ‚ć®åå‰", + "delete_relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å‰Šé™¤", + "relation_name": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®åå‰", "allowed_characters": "č‹±ę•°å­—ć€ć‚¢ćƒ³ćƒ€ćƒ¼ćƒćƒ¼ć€ć‚³ćƒ­ćƒ³ćŒä½æē”ØåÆčƒ½ćŖę–‡å­—ć§ć™ć€‚" }, "rename_relation": { - "rename_relation": "é–¢äæ‚ć®åå‰ć‚’å¤‰ę›“", - "rename_relation_from": "é–¢äæ‚ć®åå‰ć‚’", + "rename_relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®åå‰ć‚’å¤‰ę›“", + "rename_relation_from": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®åå‰ć‚’", "old_name": "å¤ć„åå‰", "to": "恋悉", "new_name": "ę–°ć—ć„åå‰", "allowed_characters": "č‹±ę•°å­—ć€ć‚¢ćƒ³ćƒ€ćƒ¼ćƒćƒ¼ć€ć‚³ćƒ­ćƒ³ćŒä½æē”ØåÆčƒ½ćŖę–‡å­—ć§ć™ć€‚" }, "update_relation_target": { - "update_relation": "関係の曓新", - "relation_name": "é–¢äæ‚ć®åå‰", - "allowed_characters": "č‹±ę•°å­—ć€ć‚¢ćƒ³ćƒ€ćƒ¼ćƒćƒ¼ć€ć‚³ćƒ­ćƒ³ćŒä½æē”ØåÆčƒ½ćŖę–‡å­—ć§ć™ć€‚" + "update_relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®ę›“ę–°", + "relation_name": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®åå‰", + "allowed_characters": "č‹±ę•°å­—ć€ć‚¢ćƒ³ćƒ€ćƒ¼ćƒćƒ¼ć€ć‚³ćƒ­ćƒ³ćŒä½æē”ØåÆčƒ½ćŖę–‡å­—ć§ć™ć€‚", + "on_all_matched_notes": "äø€č‡“ć—ćŸć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć«", + "target_note": "åÆ¾č±”ć®ćƒŽćƒ¼ćƒˆ", + "change_target_note": "ę—¢å­˜ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³åÆ¾č±”ć®ćƒŽćƒ¼ćƒˆć‚’å¤‰ę›“ć™ć‚‹", + "update_relation_target": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³åÆ¾č±”ć®ę›“ę–°", + "to": "悒" }, "revisions_button": { "note_revisions": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“" @@ -1284,21 +1586,25 @@ "zpetne_odkazy": { "backlink": "{{count}} ćƒćƒƒć‚ÆćƒŖćƒ³ć‚Æ", "backlinks": "{{count}} ćƒćƒƒć‚ÆćƒŖćƒ³ć‚Æ", - "relation": "関係" + "relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³" }, "mobile_detail_menu": { "delete_this_note": "ć“ć®ćƒŽćƒ¼ćƒˆć‚’å‰Šé™¤", - "error_unrecognized_command": "čŖč­˜ć•ć‚ŒćŖć„ć‚³ćƒžćƒ³ćƒ‰ {{command}}" + "error_unrecognized_command": "čŖč­˜ć•ć‚ŒćŖć„ć‚³ćƒžćƒ³ćƒ‰ {{command}}", + "insert_child_note": "å­ćƒŽćƒ¼ćƒˆć‚’ęŒæå…„", + "error_cannot_get_branch_id": "ćƒŽćƒ¼ćƒˆćƒ‘ć‚¹ 怌{{notePath}} 恮branchIdć‚’å–å¾—ć§ćć¾ć›ć‚“", + "note_revisions": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“" }, "inherited_attribute_list": { "title": "ē¶™ę‰æå±žę€§", - "no_inherited_attributes": "ē¶™ę‰æå±žę€§ć§ćÆć‚ć‚Šć¾ć›ć‚“ć€‚" + "no_inherited_attributes": "ē¶™ę‰æå±žę€§ćÆć‚ć‚Šć¾ć›ć‚“ć€‚" }, "note_map": { "open_full": "拔大蔨示", "collapse": "é€šåøøć‚µć‚¤ć‚ŗć«ęŠ˜ć‚ŠćŸćŸć‚€", "title": "ćƒŽćƒ¼ćƒˆćƒžćƒƒćƒ—", - "link-distance": "ćƒŖćƒ³ć‚Æč·é›¢" + "link-distance": "ćƒŖćƒ³ć‚Æč·é›¢", + "fix-nodes": "ćƒŽćƒ¼ćƒ‰ć‚’äæ®ę­£" }, "owned_attribute_list": { "owned_attributes": "ę‰€ęœ‰å±žę€§" @@ -1310,7 +1616,9 @@ "unknown_attribute_type": "äøę˜ŽćŖå±žę€§ć‚æć‚¤ćƒ— '{{type}}'", "add_new_attribute": "ę–°ć—ć„å±žę€§ć‚’čæ½åŠ ", "remove_this_attribute": "ć“ć®å±žę€§ć‚’å‰Šé™¤", - "remove_color": "ć“ć®ć‚«ćƒ©ćƒ¼ćƒ©ćƒ™ćƒ«ć‚’å‰Šé™¤" + "remove_color": "ć“ć®ć‚«ćƒ©ćƒ¼ćƒ©ćƒ™ćƒ«ć‚’å‰Šé™¤", + "promoted_attributes": "ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆå±žę€§", + "url_placeholder": "http://ć‚¦ć‚§ćƒ–ć‚µć‚¤ćƒˆ..." }, "relation_map": { "open_in_new_tab": "ę–°ć—ć„ć‚æćƒ–ć§é–‹ć", @@ -1318,12 +1626,17 @@ "edit_title": "ć‚æć‚¤ćƒˆćƒ«ć‚’ē·Øé›†", "rename_note": "ćƒŽćƒ¼ćƒˆåć‚’å¤‰ę›“", "enter_new_title": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆåć‚’å…„åŠ›:", - "remove_relation": "é–¢äæ‚ć‚’å‰Šé™¤", - "confirm_remove_relation": "ęœ¬å½“ć«ć“ć®é–¢äæ‚ć‚’å‰Šé™¤ć—ć¾ć™ć‹ļ¼Ÿ", - "specify_new_relation_name": "ę–°ć—ć„é–¢äæ‚ć®åå‰ļ¼ˆä½æē”ØåÆčƒ½ćŖę–‡å­—: č‹±ę•°å­—ć€ć‚³ćƒ­ćƒ³ć€ć‚¢ćƒ³ćƒ€ćƒ¼ć‚¹ć‚³ć‚¢ļ¼‰ć‚’ęŒ‡å®š:", + "remove_relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å‰Šé™¤", + "confirm_remove_relation": "ęœ¬å½“ć«ć“ć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å‰Šé™¤ć—ć¾ć™ć‹ļ¼Ÿ", + "specify_new_relation_name": "ę–°ć—ć„ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć®åå‰ļ¼ˆä½æē”ØåÆčƒ½ćŖę–‡å­—: č‹±ę•°å­—ć€ć‚³ćƒ­ćƒ³ć€ć‚¢ćƒ³ćƒ€ćƒ¼ć‚¹ć‚³ć‚¢ļ¼‰ć‚’ęŒ‡å®š:", "note_not_found": "ćƒŽćƒ¼ćƒˆ {{noteId}} ćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ļ¼", "enter_title_of_new_note": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆć®ć‚æć‚¤ćƒˆćƒ«ć‚’å…„åŠ›", - "default_new_note_title": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆ" + "default_new_note_title": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆ", + "cannot_match_transform": "å¤‰ę›ć‚’äø€č‡“ć•ć›ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“: {{transform}}", + "click_on_canvas_to_place_new_note": "ć‚­ćƒ£ćƒ³ćƒć‚¹ć‚’ć‚ÆćƒŖćƒƒć‚Æć—ć¦ę–°ć—ć„ćƒŽćƒ¼ćƒˆć‚’é…ē½®", + "connection_exists": "ć“ć‚Œć‚‰ć®ćƒŽćƒ¼ćƒˆé–“ć®ęŽ„ē¶š '{{name}}' ćÆę—¢ć«å­˜åœØć—ć¾ć™ć€‚", + "start_dragging_relations": "ć“ć“ć‹ć‚‰ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’ćƒ‰ćƒ©ćƒƒć‚°ć—ć¦ć€åˆ„ć®ćƒŽćƒ¼ćƒˆć«ćƒ‰ćƒ­ćƒƒćƒ—ć—ć¾ć™ć€‚", + "note_already_in_diagram": "ćƒŽćƒ¼ćƒˆć€Œ{{title}}ć€ćÆć™ć§ć«å›³ć«å«ć¾ć‚Œć¦ć„ć¾ć™ć€‚" }, "database_anonymization": { "title": "ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ć®åŒæååŒ–", @@ -1366,7 +1679,8 @@ "label_year_comparison": "ę•°å€¤ęÆ”č¼ƒļ¼ˆ>态>=态<も含む)。", "label_date_created": "過去1ćƒ¶ęœˆä»„å†…ć«ä½œęˆć•ć‚ŒćŸćƒŽćƒ¼ćƒˆ", "error": "ę¤œē“¢ć‚Øćƒ©ćƒ¼: {{error}}", - "search_prefix": "検瓢:" + "search_prefix": "検瓢:", + "placeholder": "å…Øę–‡ ć‚­ćƒ¼ćƒÆćƒ¼ćƒ‰ć€#tag = value..." }, "delete_revisions": { "delete_note_revisions": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć‚’å‰Šé™¤", @@ -1380,19 +1694,394 @@ "example_new_title": "NEW: ${note.title} - äø€č‡“ć—ćŸćƒŽćƒ¼ćƒˆć®åå‰ć®å‰ć« 'NEW: ' ć‚’ä»˜ć‘ć‚‹", "example_date_prefix": "${note.dateCreatedObj.format('MM-DD:')}: ${note.title} - ćƒžćƒƒćƒć—ćŸćƒŽćƒ¼ćƒˆć®å‰ć«ćƒŽćƒ¼ćƒˆć®ä½œęˆęœˆę—„ć‚’ä»˜ć‘ć‚‹", "api_docs": "詳瓰については、 note ćŠć‚ˆć³ dateCreatedObj / utcDateCreatedObj properties 恮 API ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚’å‚ē…§ć—ć¦ćć ć•ć„ć€‚", - "evaluated_as_js_string": "äøŽćˆć‚‰ć‚ŒćŸå€¤ćÆJavaScriptę–‡å­—åˆ—ćØć—ć¦č©•ä¾”ć•ć‚Œć‚‹ćŸć‚ć€ę³Øå…„ć•ć‚ŒćŸnoteå¤‰ę•°ļ¼ˆnotećÆåå‰ćŒå¤‰ę›“ć•ć‚Œć¾ć™ļ¼‰ć‚’ä»‹ć—ć¦å‹•ēš„ćŖć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć§å¼·åŒ–ć§ćć¾ć™ć€‚ä¾‹:" + "evaluated_as_js_string": "äøŽćˆć‚‰ć‚ŒćŸå€¤ćÆJavaScriptę–‡å­—åˆ—ćØć—ć¦č©•ä¾”ć•ć‚Œć‚‹ćŸć‚ć€ę³Øå…„ć•ć‚ŒćŸnoteå¤‰ę•°ļ¼ˆnotećÆåå‰ćŒå¤‰ę›“ć•ć‚Œć¾ć™ļ¼‰ć‚’ä»‹ć—ć¦å‹•ēš„ćŖć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć§å¼·åŒ–ć§ćć¾ć™ć€‚ä¾‹:", + "click_help_icon": "å³å“ć®ćƒ˜ćƒ«ćƒ—ć‚¢ć‚¤ć‚³ćƒ³ć‚’ć‚ÆćƒŖćƒƒć‚Æć™ć‚‹ćØć€ć™ć¹ć¦ć®ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ćŒč”Øē¤ŗć•ć‚Œć¾ć™" }, "electron_integration": { "desktop-application": "ćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ—ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³", "native-title-bar": "ćƒć‚¤ćƒ†ć‚£ćƒ–ć‚æć‚¤ćƒˆćƒ«ćƒćƒ¼", "native-title-bar-description": "WindowsとmacOSć§ćÆć€ćƒć‚¤ćƒ†ć‚£ćƒ–ć‚æć‚¤ćƒˆćƒ«ćƒćƒ¼ć‚’ć‚Ŗćƒ•ć«ć—ć¦ćŠććØć€ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ćŒć‚ˆć‚Šć‚³ćƒ³ćƒ‘ć‚Æćƒˆć«č¦‹ćˆć¾ć™ć€‚Linuxć§ćÆć€ćƒć‚¤ćƒ†ć‚£ćƒ–ć‚æć‚¤ćƒˆćƒ«ćƒćƒ¼ć‚’č”Øē¤ŗć—ćŸć¾ć¾ć®ę–¹ćŒć€ä»–ć®ć‚·ć‚¹ćƒ†ćƒ ćØć®ēµ±äø€ę€§ćŒé«˜ć¾ć‚Šć¾ć™ć€‚", "background-effects": "čƒŒę™ÆåŠ¹ęžœć‚’ęœ‰åŠ¹åŒ–ļ¼ˆWindows 11のみ)", - "background-effects-description": "MicaåŠ¹ęžœćÆć€ć‚¢ćƒ—ćƒŖć®ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć«ć¼ć‹ć•ć‚ŒćŸć‚¹ć‚æć‚¤ćƒŖćƒƒć‚·ćƒ„ćŖčƒŒę™Æć‚’čæ½åŠ ć—ć€å„„č”ŒććØćƒ¢ćƒ€ćƒ³ćŖå¤–č¦³ć‚’ä½œć‚Šå‡ŗć—ć¾ć™ć€‚", + "background-effects-description": "MicaåŠ¹ęžœćÆć€ć‚¢ćƒ—ćƒŖć®ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć«ć¼ć‹ć•ć‚ŒćŸć‚¹ć‚æć‚¤ćƒŖćƒƒć‚·ćƒ„ćŖčƒŒę™Æć‚’čæ½åŠ ć—ć€å„„č”ŒććØćƒ¢ćƒ€ćƒ³ćŖå¤–č¦³ć‚’ę¼”å‡ŗć—ć¾ć™ć€‚ć€Œćƒć‚¤ćƒ†ć‚£ćƒ–ć‚æć‚¤ćƒˆćƒ«ćƒćƒ¼ć€ć‚’ē„”åŠ¹ć«ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚", "restart-app-button": "ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å†čµ·å‹•ć—ć¦å¤‰ę›“ć‚’åę˜ ", "zoom-factor": "ć‚ŗćƒ¼ćƒ å€ēŽ‡" }, "zoom_factor": { "description": "ć‚ŗćƒ¼ćƒ ćÆ CTRL+- と CTRL+= ć®ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆć§ć‚‚ę“ä½œåÆčƒ½ć€‚", "title": "ć‚ŗćƒ¼ćƒ å€ēŽ‡ļ¼ˆćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ—ćƒ“ćƒ«ćƒ‰ć®ćæļ¼‰" + }, + "jump_to_note": { + "search_placeholder": "åå‰ć¾ćŸćÆć‚æć‚¤ćƒ—ć§ćƒŽćƒ¼ćƒˆć‚’ę¤œē“¢ > ć‚³ćƒžćƒ³ćƒ‰ć‚’ę¤œē“¢...", + "search_button": "å…Øę–‡ę¤œē“¢" + }, + "markdown_import": { + "dialog_title": "Markdownć‚’ć‚¤ćƒ³ćƒćƒ¼ćƒˆ", + "modal_body_text": "ćƒ–ćƒ©ć‚¦ć‚¶ć‚µćƒ³ćƒ‰ćƒœćƒƒć‚Æć‚¹ć®ćŸć‚ć€JavaScriptć‹ć‚‰ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć®å†…å®¹ć‚’ē›“ęŽ„čŖ­ćæč¾¼ć‚€ć“ćØćÆć§ćć¾ć›ć‚“ć€‚ć‚¤ćƒ³ćƒćƒ¼ćƒˆć™ć‚‹Markdownć‚’ä»„äø‹ć®ćƒ†ć‚­ć‚¹ćƒˆć‚ØćƒŖć‚¢ć«č²¼ć‚Šä»˜ć‘ć€ć‚¤ćƒ³ćƒćƒ¼ćƒˆćƒœć‚æćƒ³ć‚’ć‚ÆćƒŖćƒƒć‚Æć—ć¦ćć ć•ć„", + "import_button": "ć‚¤ćƒ³ćƒćƒ¼ćƒˆ", + "import_success": "Markdown ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ćŒćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć«ć‚¤ćƒ³ćƒćƒ¼ćƒˆć•ć‚Œć¾ć—ćŸć€‚" + }, + "note_type_chooser": { + "change_path_prompt": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆć‚’ä½œęˆć™ć‚‹å “ę‰€ć‚’å¤‰ę›“ć™ć‚‹:", + "search_placeholder": "åå‰ć«ć‚ˆć‚‹ćƒ‘ć‚¹ć®ę¤œē“¢ ļ¼ˆē©ŗć®å “åˆćÆćƒ‡ćƒ•ć‚©ćƒ«ćƒˆļ¼‰", + "modal_title": "ćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒ—ć‚’éøęŠž", + "modal_body": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆć®ćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒ— / ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć‚’éøęŠžć—ć¦ćć ć•ć„:", + "templates": "ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆ", + "builtin_templates": "ēµ„ćæč¾¼ćæćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆ" + }, + "prompt": { + "title": "ćƒ—ćƒ­ćƒ³ćƒ—ćƒˆ", + "ok": "OK", + "defaultTitle": "ćƒ—ćƒ­ćƒ³ćƒ—ćƒˆ" + }, + "upload_attachments": { + "upload_attachments_to_note": "ćƒŽćƒ¼ćƒˆć«ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰", + "choose_files": "ćƒ•ć‚”ć‚¤ćƒ«ć‚’éøęŠž", + "files_will_be_uploaded": "ćƒ•ć‚”ć‚¤ćƒ«ćÆ {{noteTitle}} ć«ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćØć—ć¦ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć•ć‚Œć¾ć™", + "options": "ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³", + "shrink_images": "ē”»åƒć‚’ēø®å°", + "upload": "ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰", + "tooltip": "ć“ć®ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć«ćƒć‚§ćƒƒć‚Æć‚’å…„ć‚Œć‚‹ćØć€Trilium ćÆć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć•ć‚ŒćŸē”»åƒć‚’ć‚¹ć‚±ćƒ¼ćƒŖćƒ³ć‚°ćØęœ€é©åŒ–ć«ć‚ˆć£ć¦ēø®å°ć—ć‚ˆć†ćØć—ć¾ć™ć€‚ć“ć‚Œć«ć‚ˆć‚Šć€ē”»č³ŖćŒå¤šå°‘å¤‰åŒ–ć™ć‚‹åÆčƒ½ę€§ćŒć‚ć‚Šć¾ć™ć€‚ćƒć‚§ćƒƒć‚Æć‚’å¤–ć™ćØć€ē”»åƒćÆå¤‰ę›“ć•ć‚Œćšć«ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰ć•ć‚Œć¾ć™ć€‚" + }, + "attribute_editor": { + "help_text_body1": "ćƒ©ćƒ™ćƒ«ć‚’čæ½åŠ ć™ć‚‹ć«ćÆć€ä¾‹ #rock ćØå…„åŠ›ć—ć¾ć™ć€‚å€¤ć‚‚čæ½åŠ ć—ćŸć„å “åˆćÆć€ä¾‹ #year = 2020 ćØå…„åŠ›ć—ć¾ć™", + "help_text_body2": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć«ć¤ć„ć¦ćÆć€~author = @ ćØå…„åŠ›ć™ć‚‹ćØć€ć‚Ŗćƒ¼ćƒˆć‚³ćƒ³ćƒ—ćƒŖćƒ¼ćƒˆćŒč”Øē¤ŗć•ć‚Œć€ē›®ēš„ć®ćƒŽćƒ¼ćƒˆć‚’ę¤œē“¢ć§ćć‚‹ć‚ˆć†ć«ćŖć‚Šć¾ć™ć€‚", + "placeholder": "ć“ć“ć«ćƒ©ćƒ™ćƒ«ćØćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å…„åŠ›", + "help_text_body3": "ä»£ć‚ć‚Šć«ć€å³å“ć® + ćƒœć‚æćƒ³ć‚’ä½æē”Øć—ć¦ćƒ©ćƒ™ćƒ«ćØćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’čæ½åŠ ć™ć‚‹ć“ćØć‚‚ć§ćć¾ć™ć€‚", + "save_attributes": "å±žę€§ć‚’äæå­˜ ", + "add_a_new_attribute": "ę–°ć—ć„å±žę€§ć‚’čæ½åŠ ", + "add_new_label": "ę–°ć—ć„ćƒ©ćƒ™ćƒ«ć‚’čæ½åŠ  ", + "add_new_relation": "ę–°ć—ć„ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’čæ½åŠ  ", + "add_new_label_definition": "ę–°ć—ć„ćƒ©ćƒ™ćƒ«å®šē¾©ć‚’čæ½åŠ ", + "add_new_relation_definition": "ę–°ć—ć„ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³å®šē¾©ć‚’čæ½åŠ " + }, + "move_note": { + "on_all_matched_notes": "äø€č‡“ć—ćŸć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć«", + "move_note": "ćƒŽćƒ¼ćƒˆć‚’ē§»å‹•", + "target_parent_note": "åÆ¾č±”ć®č¦ŖćƒŽćƒ¼ćƒˆ", + "move_note_new_parent": "ćƒŽćƒ¼ćƒˆć«č¦ŖćŒ 1 ć¤ć—ć‹ćŖć„å “åˆćÆć€ćƒŽćƒ¼ćƒˆć‚’ę–°ć—ć„č¦Ŗć«ē§»å‹•ć—ć¾ć™ (ć¤ć¾ć‚Šć€å¤ć„ćƒ–ćƒ©ćƒ³ćƒćŒå‰Šé™¤ć•ć‚Œć€ę–°ć—ć„č¦Ŗć«ę–°ć—ć„ćƒ–ćƒ©ćƒ³ćƒćŒä½œęˆć•ć‚Œć¾ć™)", + "clone_note_new_parent": "ćƒŽćƒ¼ćƒˆć«č¤‡ę•°ć®ć‚Æćƒ­ćƒ¼ćƒ³/ćƒ–ćƒ©ćƒ³ćƒćŒć‚ć‚‹å “åˆć€ćƒŽćƒ¼ćƒˆć‚’ę–°ć—ć„č¦Ŗć«ć‚Æćƒ­ćƒ¼ćƒ³ć—ć¾ć™ļ¼ˆć©ć®ćƒ–ćƒ©ćƒ³ćƒć‚’å‰Šé™¤ć™ć¹ćć‹äøę˜ŽćŖćŸć‚ļ¼‰", + "nothing_will_happen": "ćƒŽćƒ¼ćƒˆć‚’åÆ¾č±”ć®ćƒŽćƒ¼ćƒˆć«ē§»å‹•ć§ććŖć„å “åˆćÆä½•ć‚‚čµ·ć“ć‚Šć¾ć›ć‚“ļ¼ˆć¤ć¾ć‚Šć€ćƒ„ćƒŖćƒ¼ć‚µć‚¤ć‚Æćƒ«ćŒē”Ÿć˜ć‚‹ćŸć‚ļ¼‰", + "to": "欔へ" + }, + "onclick_button": { + "no_click_handler": "ćƒœć‚æćƒ³ ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆ '{{componentId}}' ć«ćÆć‚ÆćƒŖćƒƒć‚Æ ćƒćƒ³ćƒ‰ćƒ©ćƒ¼ćŒå®šē¾©ć•ć‚Œć¦ć„ć¾ć›ć‚“" + }, + "protected_session_status": { + "active": "äæč­·ć•ć‚ŒćŸć‚»ćƒƒć‚·ćƒ§ćƒ³ćŒęœ‰åŠ¹ć§ć™ć€‚ć‚ÆćƒŖćƒƒć‚Æć—ć¦äæč­·ć•ć‚ŒćŸć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’ēµ‚äŗ†ć—ć¾ć™ć€‚", + "inactive": "ć‚ÆćƒŖćƒƒć‚Æć—ć¦äæč­·ć•ć‚ŒćŸć‚»ćƒƒć‚·ćƒ§ćƒ³ć«å…„ć‚‹" + }, + "editable_code": { + "placeholder": "ć“ć“ć«ć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆć®å†…å®¹ć‚’å…„åŠ›..." + }, + "editable_text": { + "placeholder": "ć“ć“ć«ćƒŽćƒ¼ćƒˆć®å†…å®¹ć‚’å…„åŠ›..." + }, + "empty": { + "open_note_instruction": "ä»„äø‹ć®å…„åŠ›ę¬„ć«ćƒŽćƒ¼ćƒˆć®ć‚æć‚¤ćƒˆćƒ«ć‚’å…„åŠ›ć™ć‚‹ć‹ć€ćƒ„ćƒŖćƒ¼å†…ć®ćƒŽćƒ¼ćƒˆć‚’éøęŠžć—ć¦ćƒŽćƒ¼ćƒˆć‚’é–‹ćć¾ć™ć€‚", + "search_placeholder": "åå‰ć§ćƒŽćƒ¼ćƒˆć‚’ę¤œē“¢", + "enter_workspace": "ćƒÆćƒ¼ć‚Æć‚¹ćƒšćƒ¼ć‚¹ {{title}} に兄る" + }, + "file": { + "too_big": "ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹äøŠć®ē†ē”±ć«ć‚ˆć‚Šć€ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼ć§ćÆćƒ•ć‚”ć‚¤ćƒ«ć®ęœ€åˆć® {{maxNumChars}} ę–‡å­—ć®ćæćŒč”Øē¤ŗć•ć‚Œć¾ć™ć€‚ćƒ•ć‚”ć‚¤ćƒ«å…Øä½“ć‚’č”Øē¤ŗć™ć‚‹ć«ćÆć€ćƒ•ć‚”ć‚¤ćƒ«ć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć¦å¤–éƒØć§é–‹ć„ć¦ćć ć•ć„ć€‚", + "file_preview_not_available": "ć“ć®ćƒ•ć‚”ć‚¤ćƒ«å½¢å¼ć§ćÆćƒ•ć‚”ć‚¤ćƒ«ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼ćÆåˆ©ē”Øć§ćć¾ć›ć‚“ć€‚" + }, + "protected_session": { + "enter_password_instruction": "äæč­·ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆć‚’č”Øē¤ŗć™ć‚‹ć«ćÆćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ć‚’å…„åŠ›ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™:", + "start_session_button": "äæč­·ć•ć‚ŒćŸć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’é–‹å§‹ enter", + "started": "äæč­·ć•ć‚ŒćŸć‚»ćƒƒć‚·ćƒ§ćƒ³ćŒé–‹å§‹ć•ć‚Œć¾ć—ćŸć€‚", + "wrong_password": "ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ćŒé–“é•ć£ć¦ć„ć¾ć™ć€‚", + "protecting-finished-successfully": "äæč­·ćŒę­£åøøć«å®Œäŗ†ć—ć¾ć—ćŸć€‚", + "unprotecting-finished-successfully": "äæč­·ć®č§£é™¤ćŒę­£åøøć«å®Œäŗ†ć—ć¾ć—ćŸć€‚", + "protecting-in-progress": "äæč­·äø­: {{count}}", + "unprotecting-in-progress-count": "äæč­·č§£é™¤äø­: {{count}}", + "protecting-title": "äæč­·ć®ēŠ¶ę…‹", + "unprotecting-title": "äæč­·č§£é™¤ć®ēŠ¶ę…‹" + }, + "render": { + "note_detail_render_help_1": "ć“ć®ćƒ˜ćƒ«ćƒ—ćƒŽćƒ¼ćƒˆćŒč”Øē¤ŗć•ć‚Œć‚‹ć®ćÆć€ć“ć®ćƒŽćƒ¼ćƒˆć®ć€ŒHTML ć®ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć€ć‚æć‚¤ćƒ—ć«ćÆć€ę­£åøøć«ę©Ÿčƒ½ć™ć‚‹ćŸć‚ć«åæ…č¦ćŖćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćŒćŖć„ćŸć‚ć§ć™ć€‚", + "note_detail_render_help_2": "ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°HTMLćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒ—ćÆć€ć‚¹ć‚ÆćƒŖćƒ—ćƒ†ć‚£ćƒ³ć‚°ć«ä½æē”Øć•ć‚Œć¾ć™ć€‚ē°”å˜ć«čØ€ć†ćØć€HTMLć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆļ¼ˆć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć§JavaScriptć‚’å«ć‚€ļ¼‰ćŒć‚ć‚Šć€ć“ć®ćƒŽćƒ¼ćƒˆćŒćć‚Œć‚’ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć—ć¾ć™ć€‚ć“ć‚Œć‚’å‹•ä½œć•ć›ć‚‹ć«ćÆć€ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć™ć‚‹HTMLćƒŽćƒ¼ćƒˆć‚’ęŒ‡ć™ć€ŒrenderNoteć€ćØć„ć†ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å®šē¾©ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚" + }, + "consistency_checks": { + "find_and_fix_button": "äø€č²«ę€§ć®å•é”Œć‚’č¦‹ć¤ć‘ć¦äæ®ę­£ć™ć‚‹", + "finding_and_fixing_message": "äø€č²«ę€§ć®å•é”Œć‚’č¦‹ć¤ć‘ć¦äæ®ę­£äø­ā€¦", + "title": "äø€č²«ę€§ć‚’ćƒć‚§ćƒƒć‚Æ", + "issues_fixed_message": "ē™ŗč¦‹ć•ć‚ŒćŸåÆčƒ½ę€§ć®ć‚ć‚‹äø€č²«ę€§ć®å•é”ŒćÆć™ć¹ć¦äæ®ę­£ć•ć‚Œć¾ć—ćŸć€‚" + }, + "vacuum_database": { + "title": "ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ć®ćƒć‚­ćƒ„ćƒ¼ćƒ ", + "description": "ć“ć‚Œć«ć‚ˆć‚Šćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ćŒå†ę§‹ēÆ‰ć•ć‚Œć€é€šåøøćÆćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ćƒ•ć‚”ć‚¤ćƒ«ć®ć‚µć‚¤ć‚ŗćŒå°ć•ććŖć‚Šć¾ć™ć€‚å®Ÿéš›ć®ćƒ‡ćƒ¼ć‚æćÆå¤‰ę›“ć•ć‚Œć¾ć›ć‚“ć€‚", + "button_text": "ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ć‚’ćƒć‚­ćƒ„ćƒ¼ćƒ ", + "vacuuming_database": "ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ć®ćƒć‚­ćƒ„ćƒ¼ćƒ ć‚’å®Ÿč”Œäø­...", + "database_vacuumed": "ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ć®ćƒć‚­ćƒ„ćƒ¼ćƒ å‡¦ē†ćŒå®Œäŗ†ć—ć¾ć—ćŸ" + }, + "ribbon": { + "promoted_attributes_message": "ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆå±žę€§ćŒćƒŽćƒ¼ćƒˆć«å­˜åœØć™ć‚‹å “åˆć€ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆå±žę€§ć®ćƒŖćƒœćƒ³ć‚æćƒ–ćŒč‡Ŗå‹•ēš„ć«é–‹ćć¾ć™", + "edited_notes_message": "ē·Øé›†ć—ćŸćƒŽćƒ¼ćƒˆć®ćƒŖćƒœćƒ³ć‚æćƒ–ćÆć€dayćƒŽćƒ¼ćƒˆć§č‡Ŗå‹•ēš„ć«é–‹ćć¾ć™", + "widgets": "ćƒŖćƒœćƒ³ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆ" + }, + "ui-performance": { + "enable-motion": "ćƒˆćƒ©ćƒ³ć‚øć‚·ćƒ§ćƒ³ćØć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ć‚’ęœ‰åŠ¹ć«ć™ć‚‹", + "enable-shadows": "å½±ć‚’ęœ‰åŠ¹ć«ć™ć‚‹", + "enable-backdrop-effects": "ćƒ”ćƒ‹ćƒ„ćƒ¼ć€ćƒćƒƒćƒ—ć‚¢ćƒƒćƒ—ć€ćƒ‘ćƒćƒ«ć®čƒŒę™ÆåŠ¹ęžœć‚’ęœ‰åŠ¹ć«ć™ć‚‹", + "title": "ćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹", + "enable-smooth-scroll": "ć‚¹ćƒ ćƒ¼ć‚ŗć‚¹ć‚Æćƒ­ćƒ¼ćƒ«ć‚’ęœ‰åŠ¹ć«ć™ć‚‹", + "app-restart-required": "ļ¼ˆå¤‰ę›“ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć«ćÆć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®å†čµ·å‹•ćŒåæ…č¦ć§ć™ļ¼‰" + }, + "code_mime_types": { + "title": "ćƒ‰ćƒ­ćƒƒćƒ—ćƒ€ć‚¦ćƒ³ć§åˆ©ē”ØåÆčƒ½ćŖMIMEć‚æć‚¤ćƒ—" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ę¶ˆåŽ»ć®ć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆ", + "attachment_auto_deletion_description": "å®šē¾©ć•ć‚ŒćŸć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆå¾Œć«ćƒŽćƒ¼ćƒˆć«ć‚ˆć£ć¦å‚ē…§ć•ć‚ŒćŖććŖć£ćŸå “åˆć€ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćÆč‡Ŗå‹•ēš„ć«å‰Šé™¤ (ćŠć‚ˆć³ę¶ˆåŽ») ć•ć‚Œć¾ć™ć€‚", + "erase_attachments_after": "ä½æē”Øć•ć‚Œć¦ć„ćŖć„ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć‚’ę¶ˆåŽ»ć™ć‚‹ęœŸé–“:", + "manual_erasing_description": "ę‰‹å‹•ć§ę¶ˆåŽ»ć‚’ćƒˆćƒŖć‚¬ćƒ¼ć™ć‚‹ć“ćØć‚‚ć§ćć¾ć™ (äøŠčØ˜ć§å®šē¾©ć—ćŸć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆć‚’č€ƒę…®ć›ćšć«):", + "erase_unused_attachments_now": "ä½æē”Øć•ć‚Œć¦ć„ćŖć„ę·»ä»˜ćƒŽćƒ¼ćƒˆć‚’ä»Šć™ćę¶ˆåŽ»", + "unused_attachments_erased": "ä½æē”Øć•ć‚Œć¦ć„ćŖć„ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćÆå‰Šé™¤ć•ć‚Œć¾ć—ćŸć€‚" + }, + "network_connections": { + "network_connections_title": "ćƒćƒƒćƒˆćƒÆćƒ¼ć‚ÆęŽ„ē¶š", + "check_for_updates": "ć‚¢ćƒƒćƒ—ćƒ‡ćƒ¼ćƒˆć‚’č‡Ŗå‹•ēš„ć«ē¢ŗčŖć™ć‚‹" + }, + "note_erasure_timeout": { + "note_erasure_timeout_title": "ćƒŽćƒ¼ćƒˆę¶ˆåŽ»ć®ć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆ", + "note_erasure_description": "å‰Šé™¤ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆļ¼ˆćŠć‚ˆć³å±žę€§ć€å¤‰ę›“å±„ę­“ćŖć©ļ¼‰ęœ€åˆćÆå‰Šé™¤ęøˆćæćØć—ć¦ćƒžćƒ¼ć‚Æć•ć‚Œć‚‹ć ć‘ć§ć€ć€Œęœ€čæ‘ć®å¤‰ę›“ć€ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‹ć‚‰å¾©å…ƒć§ćć¾ć™ć€‚äø€å®šęœŸé–“ćŒēµŒéŽć™ć‚‹ćØć€å‰Šé™¤ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆćÆć€Œę¶ˆåŽ»ć€ć•ć‚Œć€å†…å®¹ćÆå¾©å…ƒć§ććŖććŖć‚Šć¾ć™ć€‚ć“ć®čØ­å®šć§ćÆć€ćƒŽćƒ¼ćƒˆć‚’å‰Šé™¤ć—ć¦ć‹ć‚‰ę¶ˆåŽ»ć™ć‚‹ć¾ć§ć®ęœŸé–“ć‚’čØ­å®šć§ćć¾ć™ć€‚", + "erase_notes_after": "ćƒŽćƒ¼ćƒˆć‚’ę¶ˆåŽ»ć™ć‚‹é–“éš”:", + "manual_erasing_description": "ę‰‹å‹•ć§ę¶ˆåŽ»ć‚’ćƒˆćƒŖć‚¬ćƒ¼ć™ć‚‹ć“ćØć‚‚ć§ćć¾ć™ (äøŠčØ˜ć§å®šē¾©ć—ćŸć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆć‚’č€ƒę…®ć›ćšć«):", + "erase_deleted_notes_now": "å‰Šé™¤ć—ćŸćƒŽćƒ¼ćƒˆć‚’ä»Šć™ćę¶ˆåŽ»", + "deleted_notes_erased": "å‰Šé™¤ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆćÆę¶ˆåŽ»ć•ć‚Œć¾ć—ćŸć€‚" + }, + "revisions_snapshot_interval": { + "note_revisions_snapshot_interval_title": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć®čØ˜éŒ²é–“éš”", + "note_revisions_snapshot_description": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć®čØ˜éŒ²é–“éš”ćÆć€ćć®ćƒŽćƒ¼ćƒˆć«åÆ¾ć—ć¦ę–°ć—ć„å¤‰ę›“ćŒä½œęˆć•ć‚Œć‚‹ć¾ć§ć®ę™‚é–“ć§ć™ć€‚č©³ē“°ć«ć¤ć„ć¦ćÆć€wiki ć‚’ć”č¦§ćć ć•ć„ć€‚", + "snapshot_time_interval_label": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ćŒčØ˜ę†¶ć•ć‚Œć‚‹ę™‚é–“:" + }, + "revisions_snapshot_limit": { + "note_revisions_snapshot_limit_title": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć®čØ˜éŒ²åˆ¶é™", + "note_revisions_snapshot_limit_description": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć®čØ˜éŒ²åˆ¶é™ćØćÆć€å„ćƒŽćƒ¼ćƒˆć«äæå­˜ć§ćć‚‹å¤‰ę›“å±„ę­“ć®ęœ€å¤§ę•°ć‚’ęŒ‡ć—ć¾ć™ć€‚-1 ćÆåˆ¶é™ćŖć—ć€0 ćÆć™ć¹ć¦ć®å¤‰ę›“å±„ę­“ć‚’å‰Šé™¤ć™ć‚‹ć“ćØć‚’ę„å‘³ć—ć¾ć™ć€‚#versioningLimit ćƒ©ćƒ™ćƒ«ć‚’ä½æē”Øć—ć¦ć€1 ć¤ć®ćƒŽćƒ¼ćƒˆć®ęœ€å¤§å¤‰ę›“ę•°ć‚’čØ­å®šć§ćć¾ć™ć€‚", + "snapshot_number_limit_label": "ćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć®čØ˜éŒ²ę•°ć®åˆ¶é™:", + "snapshot_number_limit_unit": "ć‚¹ćƒŠćƒƒćƒ—ć‚·ćƒ§ćƒƒćƒˆ", + "erase_excess_revision_snapshots": "ä½™åˆ†ćŖå¤‰ę›“å±„ę­“ć‚’ä»Šć™ćę¶ˆåŽ»", + "erase_excess_revision_snapshots_prompt": "ä½™åˆ†ćŖå¤‰ę›“å±„ę­“ćŒę¶ˆåŽ»ć•ć‚Œć¾ć—ćŸć€‚" + }, + "editability_select": { + "note_is_read_only": "ćƒŽćƒ¼ćƒˆćÆčŖ­ćæå–ć‚Šå°‚ē”Øć§ć™ćŒć€ćƒœć‚æćƒ³ć‚’ć‚ÆćƒŖćƒƒć‚Æć™ć‚‹ćØē·Øé›†ć§ćć¾ć™ć€‚", + "auto": "自動", + "read_only": "čŖ­ćæå–ć‚Šå°‚ē”Ø", + "always_editable": "åøøć«ē·Øé›†åÆčƒ½", + "note_is_editable": "ćƒŽćƒ¼ćƒˆćÆé•·ć™ćŽćŖć‘ć‚Œć°ē·Øé›†åÆčƒ½ć§ć™ć€‚", + "note_is_always_editable": "ćƒŽćƒ¼ćƒˆćÆé•·ć•ć«é–¢äæ‚ćŖćåøøć«ē·Øé›†åÆčƒ½ć§ć™ć€‚" + }, + "find": { + "case_sensitive": "å¤§ę–‡å­—ćØå°ę–‡å­—ć‚’åŒŗåˆ„", + "match_words": "å˜čŖžćŒäø€č‡“", + "find_placeholder": "ćƒ†ć‚­ć‚¹ćƒˆå†…ć‚’ę¤œē“¢...", + "replace_placeholder": "ē½®ę›åÆ¾č±”...", + "replace": "ē½®ę›", + "replace_all": "ć™ć¹ć¦ē½®ę›" + }, + "title_bar_buttons": { + "window-on-top": "ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć‚’ęœ€å‰é¢ć«ē¶­ęŒ" + }, + "note_detail": { + "could_not_find_typewidget": "ć‚æć‚¤ćƒ— {{type}} 恮 typeWidget ćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“ć§ć—ćŸ", + "printing": "å°åˆ·äø­ć§ć™...", + "printing_pdf": "PDF ćøć®ć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆäø­ć§ć™..." + }, + "watched_file_update_status": { + "ignore_this_change": "この変曓を焔視する", + "file_last_modified": "ćƒ•ć‚”ć‚¤ćƒ« は ć«ęœ€å¾Œć«å¤‰ę›“ć•ć‚Œć¾ć—ćŸć€‚", + "upload_modified_file": "å¤‰ę›“ć—ćŸćƒ•ć‚”ć‚¤ćƒ«ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰" + }, + "image": { + "copied-to-clipboard": "ē”»åƒćøć®å‚ē…§ćŒć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼ć•ć‚Œć¾ć—ćŸć€‚ć“ć‚ŒćÆä»»ę„ć®ćƒ†ć‚­ć‚¹ćƒˆćƒŽćƒ¼ćƒˆć«č²¼ć‚Šä»˜ć‘ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚", + "cannot-copy": "ē”»åƒå‚ē…§ć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼ć§ćć¾ć›ć‚“ć§ć—ćŸć€‚" + }, + "entrypoints": { + "note-revision-created": "ćƒŽćƒ¼ćƒˆć®ę”¹čØ‚ē‰ˆćŒä½œęˆć•ć‚Œć¾ć—ćŸć€‚", + "sql-error": "SQL ć‚Æć‚ØćƒŖć®å®Ÿč”Œäø­ć«ć‚Øćƒ©ćƒ¼ćŒē™ŗē”Ÿć—ć¾ć—ćŸ: {{message}}", + "note-executed": "ćƒŽćƒ¼ćƒˆćŒå®Ÿč”Œć•ć‚Œć¾ć—ćŸć€‚" + }, + "branches": { + "cannot-move-notes-here": "ć“ć“ć«ćƒŽćƒ¼ćƒˆć‚’ē§»å‹•ć™ć‚‹ć“ćØćÆć§ćć¾ć›ć‚“ć€‚", + "delete-status": "ć‚¹ćƒ†ćƒ¼ć‚æć‚¹ć‚’å‰Šé™¤", + "delete-notes-in-progress": "å‰Šé™¤é€²č”Œäø­ć®ćƒŽćƒ¼ćƒˆ: {{count}}", + "delete-finished-successfully": "å‰Šé™¤ćŒę­£åøøć«å®Œäŗ†ć—ć¾ć—ćŸć€‚", + "undeleting-notes-in-progress": "å‰Šé™¤ęøˆćæć®ćƒŽćƒ¼ćƒˆć‚’å¾©å…ƒäø­: {{count}}", + "undeleting-notes-finished-successfully": "ćƒŽćƒ¼ćƒˆć®å¾©å…ƒćŒę­£åøøć«å®Œäŗ†ć—ć¾ć—ćŸć€‚" + }, + "frontend_script_api": { + "async_warning": "`api.runOnBackend()` ć«éžåŒęœŸé–¢ę•°ć‚’ęø”ć—ć¦ć„ć¾ć™ćŒć€ć“ć‚ŒćÆę„å›³ć—ćŸćØćŠć‚Šć«å‹•ä½œć—ćŖć„åÆčƒ½ę€§ćŒć‚ć‚Šć¾ć™ć€‚\\né–¢ę•°ć‚’åŒęœŸć•ć›ć‚‹(`async` ć‚­ćƒ¼ćƒÆćƒ¼ćƒ‰ć‚’å‰Šé™¤ć™ć‚‹)恋态`api.runAsyncOnBackendWithManualTransactionHandling()` ć‚’ä½æē”Øć—ć¦ćć ć•ć„ć€‚", + "sync_warning": "`api.runAsyncOnBackendWithManualTransactionHandling()` ć«åŒęœŸé–¢ę•°ć‚’ęø”ć—ć¦ć„ć¾ć™ćŒć€\\nä»£ć‚ć‚Šć« `api.runOnBackend()` ć‚’ä½æē”Øć™ć‚‹åæ…č¦ćŒć‚ć‚‹åÆčƒ½ę€§ćŒć‚ć‚Šć¾ć™ć€‚" + }, + "ws": { + "sync-check-failed": "åŒęœŸćƒć‚§ćƒƒć‚Æć«å¤±ę•—ć—ć¾ć—ćŸļ¼", + "consistency-checks-failed": "ę•“åˆę€§ćƒć‚§ćƒƒć‚Æć«å¤±ę•—ć—ć¾ć—ćŸļ¼ č©³ē“°ćÆćƒ­ć‚°ć‚’å‚ē…§ć—ć¦ćć ć•ć„ć€‚", + "encountered-error": "ć‚Øćƒ©ćƒ¼ć€Œ{{message}}ć€ćŒē™ŗē”Ÿć—ć¾ć—ćŸć€‚ć‚³ćƒ³ć‚½ćƒ¼ćƒ«ć‚’ē¢ŗčŖć—ć¦ćć ć•ć„ć€‚", + "lost-websocket-connection-title": "ć‚µćƒ¼ćƒćƒ¼ćøć®ęŽ„ē¶šćŒå¤±ć‚ć‚Œć¾ć—ćŸ", + "lost-websocket-connection-message": "ćƒŖćƒćƒ¼ć‚¹ćƒ—ćƒ­ć‚­ć‚·ļ¼ˆä¾‹: nginx 悄 Apache ćŖć©ļ¼‰ć®čØ­å®šć‚’ē¢ŗčŖć—ć€WebSocket ęŽ„ē¶šćŒé©åˆ‡ć«čØ±åÆć•ć‚Œć€ćƒ–ćƒ­ćƒƒć‚Æć•ć‚Œć¦ć„ćŖć„ć“ćØć‚’ē¢ŗčŖć—ć¦ćć ć•ć„ć€‚" + }, + "hoisted_note": { + "confirm_unhoisting": "č¦ę±‚ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆć€Œ{{requestedNote}}ć€ćÆć€ćƒ›ć‚¤ć‚¹ćƒˆć•ć‚ŒćŸćƒŽćƒ¼ćƒˆć€Œ{{hoistedNote}}ć€ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć®å¤–éƒØć«ć‚ć‚‹ćŸć‚ć€ćƒŽćƒ¼ćƒˆć«ć‚¢ć‚Æć‚»ć‚¹ć™ć‚‹ć«ćÆćƒ›ć‚¤ć‚¹ćƒˆć‚’č§£é™¤ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚ćƒ›ć‚¤ć‚¹ćƒˆč§£é™¤ć‚’ē¶šč”Œć—ć¾ć™ć‹ļ¼Ÿ" + }, + "image_context_menu": { + "copy_reference_to_clipboard": "å‚ē…§ć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼", + "copy_image_to_clipboard": "ē”»åƒć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼" + }, + "note_autocomplete": { + "search-for": "怌{{term}}ć€ć‚’ę¤œē“¢", + "create-note": "å­ćƒŽćƒ¼ćƒˆć€Œ{{term}}ć€ć‚’ä½œęˆć—ć¦ćƒŖćƒ³ć‚Æć™ć‚‹", + "insert-external-link": "怌{{term}}ć€ćøć®å¤–éƒØćƒŖćƒ³ć‚Æć‚’ęŒæå…„", + "clear-text-field": "ćƒ†ć‚­ć‚¹ćƒˆćƒ•ć‚£ćƒ¼ćƒ«ćƒ‰ć‚’ę¶ˆåŽ»", + "show-recent-notes": "ęœ€čæ‘ć®ćƒŽćƒ¼ćƒˆć‚’č”Øē¤ŗ", + "full-text-search": "å…Øę–‡ę¤œē“¢" + }, + "geo-map": { + "create-child-note-title": "ę–°ć—ć„å­ćƒŽćƒ¼ćƒˆć‚’ä½œęˆć—ć€ćƒžćƒƒćƒ—ć«čæ½åŠ ć™ć‚‹", + "create-child-note-instruction": "åœ°å›³ć‚’ć‚ÆćƒŖćƒƒć‚Æć—ć¦ćć®å “ę‰€ć«ę–°ć—ć„ćƒŽćƒ¼ćƒˆć‚’ä½œęˆć™ć‚‹ć‹ć€Esc ć‚­ćƒ¼ć‚’ęŠ¼ć—ć¦é–‰ć˜ć¾ć™ć€‚", + "unable-to-load-map": "ćƒžćƒƒćƒ—ć‚’čŖ­ćæč¾¼ć‚ć¾ć›ć‚“ć€‚" + }, + "geo-map-context": { + "open-location": "ē¾åœØä½ē½®ć‚’č”Øē¤ŗ", + "remove-from-map": "ćƒžćƒƒćƒ—ć‹ć‚‰å‰Šé™¤", + "add-note": "ć“ć®å “ę‰€ć«ćƒžćƒ¼ć‚«ćƒ¼ć‚’čæ½åŠ " + }, + "help-button": { + "title": "é–¢é€£ć™ć‚‹ćƒ˜ćƒ«ćƒ—ćƒšćƒ¼ć‚øć‚’é–‹ć" + }, + "content_widget": { + "unknown_widget": "怌{{id}}ć€ć®ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆćÆäøę˜Žć§ć™ć€‚" + }, + "switch_layout_button": { + "title_vertical": "ē·Øé›†ćƒ‘ćƒćƒ«ć‚’äø‹ć«ē§»å‹•", + "title_horizontal": "ē·Øé›†ćƒ‘ćƒćƒ«ć‚’å·¦ć«ē§»å‹•" + }, + "toggle_read_only_button": { + "unlock-editing": "ē·Øé›†ć®ćƒ­ćƒƒć‚Æć‚’č§£é™¤", + "lock-editing": "ē·Øé›†ć‚’ćƒ­ćƒƒć‚Æ" + }, + "book_properties_config": { + "hide-weekends": "é€±ęœ«ć‚’éžč”Øē¤ŗ", + "display-week-numbers": "é€±ē•Ŗå·ć‚’č”Øē¤ŗ", + "map-style": "ćƒžćƒƒćƒ—ć‚¹ć‚æć‚¤ćƒ«:", + "max-nesting-depth": "ęœ€å¤§éšŽå±¤ć®ę·±ć•:", + "show-scale": "ć‚¹ć‚±ćƒ¼ćƒ«ć‚’č”Øē¤ŗ", + "raster": "Raster", + "vector_light": "Vectorļ¼ˆćƒ©ć‚¤ćƒˆļ¼‰", + "vector_dark": "Vector ļ¼ˆćƒ€ćƒ¼ć‚Æļ¼‰" + }, + "call_to_action": { + "next_theme_title": "ꖰ恗恄Triliumćƒ†ćƒ¼ćƒžć‚’ćŠč©¦ć—ćć ć•ć„", + "next_theme_message": "ē¾åœØć€ćƒ¬ć‚¬ć‚·ćƒ¼ćƒ†ćƒ¼ćƒžć‚’ä½æē”Øć—ć¦ć„ć¾ć™ć€‚ę–°ć—ć„ćƒ†ćƒ¼ćƒžć‚’č©¦ć—ć¦ćæć¾ć›ć‚“ć‹?", + "next_theme_button": "ę–°ć—ć„ćƒ†ćƒ¼ćƒžć‚’č©¦ć™", + "background_effects_title": "čƒŒę™ÆåŠ¹ęžœćŒå®‰å®šć—ć¾ć—ćŸ", + "background_effects_message": "Windowsćƒ‡ćƒć‚¤ć‚¹ć§ćÆć€čƒŒę™ÆåŠ¹ęžœćŒå®Œå…Øć«å®‰å®šć—ć¾ć—ćŸć€‚čƒŒę™ÆåŠ¹ęžœćÆć€čƒŒę™Æć‚’ć¼ć‹ć™ć“ćØć§ćƒ¦ćƒ¼ć‚¶ćƒ¼ć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹ć«å½©ć‚Šć‚’ę·»ćˆć¾ć™ć€‚ć“ć®ęŠ€č”“ćÆć€Windowsć‚Øć‚Æć‚¹ćƒ—ćƒ­ćƒ¼ćƒ©ćƒ¼ćŖć©ć®ä»–ć®ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć§ć‚‚ä½æē”Øć•ć‚Œć¦ć„ć¾ć™ć€‚", + "background_effects_button": "čƒŒę™ÆåŠ¹ęžœć‚’ęœ‰åŠ¹ć«ć™ć‚‹", + "dismiss": "å“äø‹" + }, + "settings": { + "related_settings": "é–¢é€£čØ­å®š" + }, + "settings_appearance": { + "related_code_blocks": "ćƒ†ć‚­ć‚¹ćƒˆćƒŽćƒ¼ćƒˆå†…ć®ć‚³ćƒ¼ćƒ‰ćƒ–ćƒ­ćƒƒć‚Æć®é…č‰²", + "related_code_notes": "ć‚³ćƒ¼ćƒ‰ćƒŽćƒ¼ćƒˆć®é…č‰²" + }, + "units": { + "percentage": "%" + }, + "pagination": { + "page_title": "{{startIndex}} - {{endIndex}} ćƒšćƒ¼ć‚ø", + "total_notes": "{{count}} ćƒŽćƒ¼ćƒˆ" + }, + "collections": { + "rendering_error": "ć‚Øćƒ©ćƒ¼ć®ćŸć‚ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’č”Øē¤ŗć§ćć¾ć›ć‚“ć€‚" + }, + "abstract_bulk_action": { + "remove_this_search_action": "ć“ć®ę¤œē“¢ć‚¢ć‚Æć‚·ćƒ§ćƒ³ć‚’å‰Šé™¤" + }, + "update_available": { + "update_available": "ć‚¢ćƒƒćƒ—ćƒ‡ćƒ¼ćƒˆćŒåˆ©ē”ØåÆčƒ½" + }, + "copy_image_reference_button": { + "button_title": "ē”»åƒå‚ē…§ć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼ć—ć€ćƒ†ć‚­ć‚¹ćƒˆćƒŽćƒ¼ćƒˆć«č²¼ć‚Šä»˜ć‘ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚" + }, + "attachment_detail": { + "open_help_page": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®ćƒ˜ćƒ«ćƒ—ćƒšćƒ¼ć‚øć‚’é–‹ć", + "owning_note": "ę‰€ęœ‰ćƒŽćƒ¼ćƒˆ: ", + "you_can_also_open": "ć€é–‹ćć“ćØć‚‚ć§ćć¾ć™ ", + "list_of_all_attachments": "ć™ć¹ć¦ć®ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®ćƒŖć‚¹ćƒˆ", + "attachment_deleted": "ć“ć®ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćÆå‰Šé™¤ć•ć‚Œć¾ć—ćŸć€‚" + }, + "attachment_list": { + "open_help_page": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®ćƒ˜ćƒ«ćƒ—ćƒšćƒ¼ć‚øć‚’é–‹ć", + "owning_note": "ę‰€ęœ‰ćƒŽćƒ¼ćƒˆ: ", + "upload_attachments": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć‚’ć‚¢ćƒƒćƒ—ćƒ­ćƒ¼ćƒ‰", + "no_attachments": "ć“ć®ćƒŽćƒ¼ćƒˆć«ćÆę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćÆć‚ć‚Šć¾ć›ć‚“ć€‚" + }, + "book": { + "no_children_help": "ć“ć®ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³ć«ćÆå­ćƒŽćƒ¼ćƒˆćŒćŖć„ćŸć‚ć€č”Øē¤ŗć™ć‚‹ć‚‚ć®ćŒć‚ć‚Šć¾ć›ć‚“ć€‚č©³ē“°ćÆwikić‚’ć”č¦§ćć ć•ć„ć€‚", + "drag_locked_title": "ē·Øé›†ć‚’ćƒ­ćƒƒć‚Æäø­", + "drag_locked_message": "ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³ćÆē·Øé›†ćŒćƒ­ćƒƒć‚Æć•ć‚Œć¦ć„ć‚‹ćŸć‚ć€ćƒ‰ćƒ©ćƒƒć‚°ćÆčØ±åÆć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚" + }, + "native_title_bar": { + "title": "ćƒć‚¤ćƒ†ć‚£ćƒ–ć‚æć‚¤ćƒˆćƒ«ćƒćƒ¼ļ¼ˆć‚¢ćƒ—ćƒŖć®å†čµ·å‹•ćŒåæ…č¦ć§ć™ļ¼‰", + "enabled": "ęœ‰åŠ¹", + "disabled": "ē„”åŠ¹" + }, + "options_widget": { + "options_change_saved": "ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć®å¤‰ę›“ćŒäæå­˜ć•ć‚Œć¾ć—ćŸć€‚", + "options_status": "ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć‚¹ćƒ†ćƒ¼ć‚æć‚¹" + }, + "multi_factor_authentication": { + "title": "å¤šč¦ē“ čŖčØ¼", + "description": "å¤šč¦ē“ čŖčØ¼ļ¼ˆMFAļ¼‰ćÆć€ć‚¢ć‚«ć‚¦ćƒ³ćƒˆć®ć‚»ć‚­ćƒ„ćƒŖćƒ†ć‚£ć‚’ć•ć‚‰ć«å¼·åŒ–ć—ć¾ć™ć€‚ćƒ­ć‚°ć‚¤ćƒ³ę™‚ć«ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ć‚’å…„åŠ›ć™ć‚‹ć ć‘ć§ćŖćć€MFAć§ćÆęœ¬äŗŗē¢ŗčŖć®ćŸć‚ć«1ć¤ä»„äøŠć®čæ½åŠ ęƒ…å ±ć®å…„åŠ›ć‚’ę±‚ć‚ć‚‰ć‚Œć¾ć™ć€‚ć“ć‚Œć«ć‚ˆć‚Šć€ćŸćØćˆčŖ°ć‹ćŒćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ć‚’å…„ę‰‹ć—ćŸćØć—ć¦ć‚‚ć€2ć¤ē›®ć®ęƒ…å ±ćŒćŖć‘ć‚Œć°ć‚¢ć‚«ć‚¦ćƒ³ćƒˆć«ć‚¢ć‚Æć‚»ć‚¹ć§ćć¾ć›ć‚“ć€‚ć¾ć‚‹ć§ćƒ‰ć‚¢ć«éµć‚’čæ½åŠ ć—ćŸć‚ˆć†ćŖć‚‚ć®ć§ć€ä»–äŗŗćŒä¾µå…„ć™ć‚‹ć®ćŒćÆć‚‹ć‹ć«å›°é›£ć«ćŖć‚Šć¾ć™ć€‚

MFAć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć«ćÆć€ä»„äø‹ć®ę‰‹é †ć«å¾“ć£ć¦ćć ć•ć„ć€‚ę­£ć—ćčØ­å®šć—ćŖć„ćØć€ćƒ­ć‚°ć‚¤ćƒ³ćÆćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ć®ćæć§č”Œć‚ć‚Œć¾ć™ć€‚", + "mfa_enabled": "å¤šč¦ē“ čŖčØ¼ć‚’ęœ‰åŠ¹ć«ć™ć‚‹", + "mfa_method": "MFAćƒ”ć‚½ćƒƒćƒ‰", + "electron_disabled": "ē¾åœØć€ćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ— ćƒ“ćƒ«ćƒ‰ć§ćÆå¤šč¦ē“ čŖčØ¼ćÆć‚µćƒćƒ¼ćƒˆć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚", + "totp_title": "ę™‚é–“ćƒ™ćƒ¼ć‚¹ć®ćƒÆćƒ³ć‚æć‚¤ćƒ ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ (TOTP)", + "totp_description": "TOTPļ¼ˆę™‚é–“ćƒ™ćƒ¼ć‚¹ć®ćƒÆćƒ³ć‚æć‚¤ćƒ ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ļ¼‰ćÆć€30ē§’ć”ćØć«å¤‰åŒ–ć™ć‚‹äø€ę„ć®äø€ę™‚ēš„ćŖć‚³ćƒ¼ćƒ‰ć‚’ē”Ÿęˆć™ć‚‹ć‚»ć‚­ćƒ„ćƒŖćƒ†ć‚£ę©Ÿčƒ½ć§ć™ć€‚ć“ć®ć‚³ćƒ¼ćƒ‰ćØćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰ć‚’ä½æē”Øć—ć¦ć‚¢ć‚«ć‚¦ćƒ³ćƒˆć«ćƒ­ć‚°ć‚¤ćƒ³ć™ć‚‹ć“ćØć§ć€ä»–äŗŗćŒć‚¢ć‚Æć‚»ć‚¹ć™ć‚‹ć®ć‚’å¤§å¹…ć«å›°é›£ć«ć—ć¾ć™ć€‚", + "totp_secret_title": "TOTPć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆć‚’ē”Ÿęˆć™ć‚‹", + "totp_secret_generate": "TOTPć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆć‚’ē”Ÿęˆć™ć‚‹", + "totp_secret_regenerate": "TOTPć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆć‚’å†ē”Ÿęˆć™ć‚‹", + "no_totp_secret_warning": "TOTP ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć«ćÆć€ć¾ćš TOTP ć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆć‚’ē”Ÿęˆć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚", + "totp_secret_description_warning": "ꖰ恗恄 TOTP ć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆć‚’ē”Ÿęˆć—ćŸć‚‰ć€ę–°ć—ć„ TOTP ć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆć‚’ä½æē”Øć—ć¦å†åŗ¦ćƒ­ć‚°ć‚¤ćƒ³ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚", + "totp_secret_generated": "TOTPć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆćŒē”Ÿęˆć•ć‚Œć¾ć—ćŸ", + "totp_secret_warning": "ē”Ÿęˆć•ć‚ŒćŸć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆćÆå®‰å…ØćŖå “ę‰€ć«äæå­˜ć—ć¦ćć ć•ć„ć€‚å†åŗ¦č”Øē¤ŗć•ć‚Œć‚‹ć“ćØćÆć‚ć‚Šć¾ć›ć‚“ć€‚", + "totp_secret_regenerate_confirm": "OTP ć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆć‚’å†ē”Ÿęˆć—ć¦ć‚‚ć‚ˆć‚ć—ć„ć§ć™ć‹ļ¼Ÿć“ć‚Œć«ć‚ˆć‚Šć€ä»„å‰ć® TOTP ć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆćØę—¢å­˜ć®ć™ć¹ć¦ć®å›žå¾©ć‚³ćƒ¼ćƒ‰ćŒē„”åŠ¹ć«ćŖć‚Šć¾ć™ć€‚", + "recovery_keys_title": "ć‚·ćƒ³ć‚°ćƒ«ć‚µć‚¤ćƒ³ć‚Ŗćƒ³å›žå¾©ć‚­ćƒ¼", + "recovery_keys_description": "ć‚·ćƒ³ć‚°ćƒ« ć‚µć‚¤ćƒ³ć‚Ŗćƒ³å›žå¾©ć‚­ćƒ¼ćÆć€čŖčØ¼ć‚³ćƒ¼ćƒ‰ć«ć‚¢ć‚Æć‚»ć‚¹ć§ććŖć„å “åˆć§ć‚‚ćƒ­ć‚°ć‚¤ćƒ³ć™ć‚‹ćŸć‚ć«ä½æē”Øć•ć‚Œć¾ć™ć€‚", + "recovery_keys_description_warning": "å›žå¾©ć‚­ćƒ¼ćÆćƒšćƒ¼ć‚øć‚’é›¢ć‚ŒćŸå¾ŒćÆå†åŗ¦č”Øē¤ŗć•ć‚Œć¾ć›ć‚“ć®ć§ć€å®‰å…ØćŖå “ę‰€ć«äæē®”ć—ć¦ćć ć•ć„ć€‚
å›žå¾©ć‚­ćƒ¼ćÆäø€åŗ¦ä½æē”Øć™ć‚‹ćØå†åŗ¦ä½æē”Øć§ććŖććŖć‚Šć¾ć™ć€‚", + "recovery_keys_error": "å›žå¾©ć‚³ćƒ¼ćƒ‰ć®ē”Ÿęˆäø­ć«ć‚Øćƒ©ćƒ¼ćŒē™ŗē”Ÿć—ć¾ć—ćŸ", + "recovery_keys_no_key_set": "å›žå¾©ć‚³ćƒ¼ćƒ‰ćŒčØ­å®šć•ć‚Œć¦ć„ć¾ć›ć‚“", + "recovery_keys_generate": "å›žå¾©ć‚³ćƒ¼ćƒ‰ć‚’ē”Ÿęˆć™ć‚‹", + "recovery_keys_regenerate": "å›žå¾©ć‚³ćƒ¼ćƒ‰ć®å†ē”Ÿęˆ", + "recovery_keys_used": "使用旄: {{date}}", + "recovery_keys_unused": "å›žå¾©ć‚³ćƒ¼ćƒ‰ {{index}} ćÆęœŖä½æē”Øć§ć™", + "oauth_title": "OAuth/OpenID", + "oauth_description": "OpenIDは、GooglećŖć©ć®ä»–ć®ć‚µćƒ¼ćƒ“ć‚¹ć®ć‚¢ć‚«ć‚¦ćƒ³ćƒˆć‚’ä½æē”Øć—ć¦ć‚¦ć‚§ćƒ–ć‚µć‚¤ćƒˆć«ćƒ­ć‚°ć‚¤ćƒ³ć—ć€ęœ¬äŗŗē¢ŗčŖć‚’č”Œć†ćŸć‚ć®ęØ™ęŗ–åŒ–ć•ć‚ŒćŸę–¹ę³•ć§ć™ć€‚ćƒ‡ćƒ•ć‚©ćƒ«ćƒˆć®ē™ŗč”Œč€…ćÆGoogleć§ć™ćŒć€ä»–ć®OpenIDćƒ—ćƒ­ćƒć‚¤ćƒ€ć«å¤‰ę›“ć§ćć¾ć™ć€‚č©³ć—ććÆć“ć”ć‚‰ć‚’ć”č¦§ćć ć•ć„ć€‚GoogleēµŒē”±ć§OpenIDć‚µćƒ¼ćƒ“ć‚¹ć‚’čØ­å®šć™ć‚‹ć«ćÆć€ć“ć”ć‚‰ć®ę‰‹é †ć«å¾“ć£ć¦ćć ć•ć„ć€‚", + "oauth_description_warning": "OAuth/OpenIDć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć«ćÆć€config.inićƒ•ć‚”ć‚¤ćƒ«ć«OAuth/OpenIDć®ćƒ™ćƒ¼ć‚¹URLć€ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆIDć€ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚·ćƒ¼ć‚Æćƒ¬ćƒƒćƒˆć‚’čØ­å®šć—ć€ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć‚’å†čµ·å‹•ć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚ē’°å¢ƒå¤‰ę•°ć‹ć‚‰čØ­å®šć™ć‚‹å “åˆćÆć€TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID and TRILIUM_OAUTH_CLIENT_SECRET ć‚’čØ­å®šć—ć¦ćć ć•ć„ć€‚", + "oauth_missing_vars": "čØ­å®šćŒć‚ć‚Šć¾ć›ć‚“: {{-variables}}", + "oauth_user_account": "ćƒ¦ćƒ¼ć‚¶ćƒ¼ć‚¢ć‚«ć‚¦ćƒ³ćƒˆ: ", + "oauth_user_email": "ćƒ¦ćƒ¼ć‚¶ćƒ¼Eピール: ", + "oauth_user_not_logged_in": "ćƒ­ć‚°ć‚¤ćƒ³ć—ć¦ć„ć¾ć›ć‚“ļ¼" + }, + "note-map": { + "button-link-map": "ćƒŖćƒ³ć‚Æćƒžćƒƒćƒ—", + "button-tree-map": "ćƒ„ćƒŖćƒ¼ćƒžćƒƒćƒ—" + }, + "spacer": { + "configure_launchbar": "ćƒ©ćƒ³ćƒćƒ£ćƒ¼ćƒćƒ¼ć‚’čØ­å®š" + }, + "attachment_detail_2": { + "will_be_deleted_in": "ć“ć®ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćÆ {{time}} å¾Œć«č‡Ŗå‹•ēš„ć«å‰Šé™¤ć•ć‚Œć¾ć™", + "will_be_deleted_soon": "ć“ć®ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćÆć™ćć«č‡Ŗå‹•ēš„ć«å‰Šé™¤ć•ć‚Œć¾ć™", + "deletion_reason": "ć€ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ćŒćƒŽćƒ¼ćƒˆć®ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć«ćƒŖćƒ³ć‚Æć•ć‚Œć¦ć„ćŖć„ćŸć‚ć§ć™ć€‚å‰Šé™¤ć•ć‚ŒćŖć„ć‚ˆć†ć«ć™ć‚‹ć«ćÆć€ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®ćƒŖćƒ³ć‚Æć‚’ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć«å†åŗ¦čæ½åŠ ć™ć‚‹ć‹ć€ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć‚’ćƒŽćƒ¼ćƒˆć«å¤‰ę›ć—ć¦ćć ć•ć„ć€‚", + "role_and_size": "ロール: {{role}},サイズ: {{size}}", + "link_copied": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®ćƒŖćƒ³ć‚Æć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼ć—ć¾ć—ćŸć€‚", + "unrecognized_role": "ę·»ä»˜ćƒ•ć‚”ć‚¤ćƒ«ć®ćƒ­ćƒ¼ćƒ«ć€Œ{{role}}ć€ćÆčŖč­˜ć•ć‚Œć¾ć›ć‚“ć€‚" + }, + "presentation_view": { + "edit-slide": "ć“ć®ć‚¹ćƒ©ć‚¤ćƒ‰ć‚’ē·Øé›†", + "start-presentation": "ćƒ—ćƒ¬ć‚¼ćƒ³ćƒ†ćƒ¼ć‚·ćƒ§ćƒ³ć‚’é–‹å§‹", + "slide-overview": "ć‚¹ćƒ©ć‚¤ćƒ‰ć®ę¦‚č¦ć‚’åˆ‡ć‚Šę›æćˆ" } } diff --git a/apps/client/src/translations/ko/translation.json b/apps/client/src/translations/ko/translation.json index 3a7608169..6cfda1924 100644 --- a/apps/client/src/translations/ko/translation.json +++ b/apps/client/src/translations/ko/translation.json @@ -15,15 +15,45 @@ "message": "ķ“ė¼ģ“ģ–øķŠø ģ• ķ”Œė¦¬ģ¼€ģ“ģ…˜ ģ‹œģž‘ ė„ģ¤‘ ģ‹¬ź°ķ•œ ģ˜¤ė„˜ź°€ ė°œģƒķ–ˆģŠµė‹ˆė‹¤:\n\n{{message}}\n\nģ“ėŠ” ģŠ¤ķ¬ė¦½ķŠøź°€ 예기치 ģ•Šź²Œ ģ‹¤ķŒØķ•˜ė©“ģ„œ ė°œģƒķ•œ ź²ƒģ¼ 수 ģžˆģŠµė‹ˆė‹¤. ģ• ķ”Œė¦¬ģ¼€ģ“ģ…˜ģ„ ģ•ˆģ „ ėŖØė“œė”œ ģ‹œģž‘ķ•œ ė’¤ 문제넼 ķ•“ź²°ķ•“ ė³“ģ„øģš”." }, "widget-error": { - "title": "ģœ„ģ Æ ģ“ˆźø°ķ™” ģ‹¤ķŒØ" + "title": "ģœ„ģ Æ ģ“ˆźø°ķ™” ģ‹¤ķŒØ", + "message-custom": "IDź°€ \"{{id}}\"ź³  ,ģ œėŖ©ģ“ \"{{title}}\" ģø ė…øķŠøģ—ģ„œ ģ‚¬ģš©ģž 지정 ģœ„ģ Æģ„ ģ“ˆźø°ķ™” ķ•˜ėŠ”ė° ģ‹¤ķŒØķ–ˆģŠµė‹ˆė‹¤:\n\n{{message}}", + "message-unknown": "ģ•Œ 수 ģ—†ėŠ” ģœ„ģ Æģ“ ģ“ˆźø°ķ™” ķ•˜ėŠ”ė° ģ‹¤ķŒØķ–ˆģŠµė‹ˆė‹¤:\n\n{{message}}" + }, + "bundle-error": { + "title": "ģ‚¬ģš©ģž ģ •ģ˜ 스크립트넼 ė¶ˆėŸ¬ģ˜¤ėŠ”ė° ģ‹¤ķŒØķ–ˆģŠµė‹ˆė‹¤", + "message": "IDź°€ \"{{id}}\"ź³ , ģ œėŖ©ģ“ \"{{title}}\"ģø ė…øķŠøģ—ģ„œ ģŠ¤ķ¬ė¦½ķŠøź°€ ģ‹¤ķ–‰ė˜ģ§€ ėŖ»ķ–ˆģŠµė‹ˆė‹¤:\n\n{{message}}" } }, "add_link": { "add_link": "링크 추가", "note": "ė…øķŠø", - "search_note": "ģ“ė¦„ģœ¼ė”œ ė…øķŠø ź²€ģƒ‰ķ•˜źø°" + "search_note": "ģ“ė¦„ģœ¼ė”œ ė…øķŠø ź²€ģƒ‰ķ•˜źø°", + "help_on_links": "링크 ꓀련 ė„ģ›€ė§", + "link_title_mirrors": "링크 ģ œėŖ©ģ€ ė…øķŠøģ˜ ķ˜„ģž¬ ģ œėŖ©ģ„ ė°˜ģ˜ķ•©ė‹ˆė‹¤", + "link_title_arbitrary": "링크 ģ œėŖ©ģ€ ģž„ģ˜ė”œ 변경될 수 ģžˆģŠµė‹ˆė‹¤", + "link_title": "링크 제목", + "button_add_link": "링크 추가" }, "branch_prefix": { - "save": "ģ €ģž„" + "save": "ģ €ģž„", + "edit_branch_prefix": "ėøŒėžœģ¹˜ 접두사 ķŽøģ§‘", + "help_on_tree_prefix": "트리 접두사에 ėŒ€ķ•œ ė„ģ›€ė§", + "prefix": "접두사: ", + "branch_prefix_saved": "ėøŒėžœģ¹˜ 접두사가 ģ €ģž„ė˜ģ—ˆģŠµė‹ˆė‹¤." + }, + "bulk_actions": { + "bulk_actions": "ėŒ€ėŸ‰ ģž‘ģ—…", + "affected_notes": "ģ˜ķ–„ģ„ ė°›ģ€ ė…øķŠøė“¤", + "include_descendants": "ģ„ ķƒķ•œ ė…øķŠøģ˜ ģžģ† ķ¬ķ•Ø", + "available_actions": "ź°€ėŠ„ķ•œ ģ•”ģ…˜ė“¤", + "chosen_actions": "ģ„ ķƒķ•œ ģ•”ģ…˜ė“¤", + "execute_bulk_actions": "ėŒ€ėŸ‰ ģ•”ģ…˜ė“¤ 실행", + "bulk_actions_executed": "ėŒ€ėŸ‰ ģ•”ģ…˜ė“¤ģ“ ģ„±ź³µģ ģœ¼ė”œ ģ‹¤ķ–‰ė˜ģ—ˆģŠµė‹ˆė‹¤." + }, + "i18n": { + "saturday": "ķ† ģš”ģ¼", + "sunday": "ģ¼ģš”ģ¼", + "first-week-of-the-year": "ģ¼ė…„ģ˜ 첫째 주", + "first-week-contains-first-day": "첫 번째 ģ£¼ģ—ėŠ” ģ˜¬ķ•“ģ˜ ģ²«ė‚ ģ“ ķ¬ķ•Øė©ė‹ˆė‹¤" } } diff --git a/apps/client/src/translations/md/translation.json b/apps/client/src/translations/md/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/client/src/translations/md/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/client/src/translations/nb-NO/translation.json b/apps/client/src/translations/nb-NO/translation.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/client/src/translations/nb-NO/translation.json @@ -0,0 +1 @@ +{} diff --git a/apps/client/src/translations/nl/translation.json b/apps/client/src/translations/nl/translation.json index 14e853dd6..d07df69e5 100644 --- a/apps/client/src/translations/nl/translation.json +++ b/apps/client/src/translations/nl/translation.json @@ -4,6 +4,67 @@ "homepage": "Homepagina:", "app_version": "App versie:", "db_version": "DB Versie:", - "sync_version": "Sync Versie:" + "sync_version": "Sync Versie:", + "build_date": "Build datum:", + "build_revision": "Build revisie:", + "data_directory": "Gegevensmap:" + }, + "toast": { + "critical-error": { + "title": "Kritische Error", + "message": "Een kritieke fout heeft plaatsgevonden waardoor de cliĆ«nt zich aanmeldt vanaf het begin:\n\n84X\n\nDit is waarschijnlijk veroorzaakt door een script dat op een onverwachte manier faalt. Probeer de sollicitatie in veilige modus te starten en de kwestie aan te spreken." + } + }, + "add_link": { + "add_link": "Voeg link toe", + "help_on_links": "Hulp bij links", + "note": "notitie", + "search_note": "zoek voor notitie op naam", + "link_title_mirrors": "De link titel is hetzelfde als de notitie's huidige titel", + "link_title": "Link titel", + "button_add_link": "Link toevoegen" + }, + "branch_prefix": { + "edit_branch_prefix": "Bewerk branch prefix", + "save": "Opslaan", + "branch_prefix_saved": "Branch prefix is opgeslagen.", + "help_on_tree_prefix": "Help bij boomvoorvoegsel", + "prefix": "Voorvoegsel: " + }, + "bulk_actions": { + "bulk_actions": "Bulk acties", + "affected_notes": "Getroffen notities", + "available_actions": "Beschikbare acties", + "chosen_actions": "Kies acties", + "execute_bulk_actions": "Bulk acties uitvoeren", + "bulk_actions_executed": "Bulk acties zijn succesvol uitgevoerd.", + "none_yet": "Nog niks... voeg een actie toe door een van de beschikbare bovenstaande opties te klikken.", + "labels": "Labels", + "relations": "Relaties", + "notes": "Notities", + "other": "Andere" + }, + "calendar": { + "april": "April", + "may": "Mei", + "june": "Juni", + "july": "Juli", + "august": "Augustus", + "september": "September", + "october": "Oktober", + "november": "November", + "december": "December" + }, + "close_pane_button": { + "close_this_pane": "Sluit dit paneel" + }, + "create_pane_button": { + "create_new_split": "Maak nieuwe split" + }, + "edit_button": { + "edit_this_note": "Notitie bewerken" + }, + "show_toc_widget_button": { + "show_toc": "Laat Inhoudsopgave zien" } } diff --git a/apps/client/src/translations/pl/translation.json b/apps/client/src/translations/pl/translation.json index dbac61b09..1d90a30e8 100644 --- a/apps/client/src/translations/pl/translation.json +++ b/apps/client/src/translations/pl/translation.json @@ -1,41 +1,2088 @@ { "about": { - "title": "O notatkach Trilium", + "title": "O Trilium Notes", "homepage": "Strona główna:", "app_version": "Wersja aplikacji:", "db_version": "Wersja bazy danych:", "sync_version": "Wersja synchronizacji:", - "build_date": "Zbudowano:", - "build_revision": "Rewizja zbudowania:", + "build_date": "Data kompilacji:", + "build_revision": "Wersja:", "data_directory": "Katalog z danymi:" }, "toast": { "critical-error": { "title": "Błąd krytyczny", "message": "Wystąpił krytyczny błąd uniemożliwiający uruchomienie aplikacji:\n\n{{message}}\n\nJest to spowodowane najprawdopodobniej niespodziewanym błędem skryptu. Spróbuj uruchomić aplikację ponownie w trybie bezpiecznym i zaadresuj problem." + }, + "widget-error": { + "title": "Nie udało się zainicjować widżetu", + "message-custom": "Niestandardowy widżet z notatki o identyfikatorze \"{{id}}\", i tytule \"{{title}}\" nie mógł zostać zainicjowany z powodu:\n\n{{message}}", + "message-unknown": "Nieznany widżet nie mógł być zainicjowany z powodu:\n\n{{message}}" + }, + "bundle-error": { + "title": "Nie udało się załadować niestandardowego skryptu", + "message": "Skrypt z notatki o identyfikatorze \"{{id}}\", tytule \"{{title}}: nie został uruchomiony z powodu:\n\n{{message}}" } }, "add_link": { - "add_link": "Dodaj link" + "add_link": "Dodaj link", + "note": "Notatka", + "search_note": "Wyszukaj notatkę po nazwie", + "link_title_arbitrary": "Tytuł linku można dowolnie zmieniać", + "link_title": "Tytuł linku", + "button_add_link": "Dodaj link", + "help_on_links": "Pomoc dotycząca linków", + "link_title_mirrors": "tytuł linku odzwierciedla tytuł obecnej notatki" }, "branch_prefix": { - "save": "Zapisz" + "save": "Zapisz", + "edit_branch_prefix": "Edytuj prefiks gałęzi", + "prefix": "Prefiks: ", + "branch_prefix_saved": "Zapisano prefiks gałęzi.", + "help_on_tree_prefix": "Pomoc dotycząca prefiksu drzewa" }, "bulk_actions": { "labels": "Etykiety", "notes": "Notatki", "other": "Inne", - "relations": "Powiązania" + "relations": "Powiązania", + "bulk_actions": "Działania zbiorcze", + "include_descendants": "Uwzględnia rozwinięcia wybranych notatek", + "available_actions": "Dostępne działania", + "chosen_actions": "Wybrane działania", + "execute_bulk_actions": "Wykonaj zbiór działań", + "bulk_actions_executed": "Zbiór działań został wykonany prawidłowo.", + "none_yet": "Brak zaznaczonych działań... dodaj działanie poprzez kliknięcie jednej z dostępnych opcji powyżej.", + "affected_notes": "Dotyczy notatek" }, "confirm": { "ok": "OK", - "cancel": "Anuluj" + "cancel": "Anuluj", + "confirmation": "Potwierdzenie", + "are_you_sure_remove_note": "Czy napewno chcesz usunąć notatkę \"{{title}}\" z mapy powiązań? ", + "if_you_dont_check": "Jeśli nie zaznaczysz tej opcji, notatka zostanie usunięta jedynie z mapy powiązań.", + "also_delete_note": "Usuń dodatkowo notatkę" }, "delete_notes": { "cancel": "Anuluj", - "close": "Zamknij" + "close": "Zamknij", + "delete_notes_preview": "Usuń podgląd notatek", + "delete_all_clones_description": "Usuń również wszystkie sklonowania (działanie może zostać cofnięte w ostatnich zmianach)", + "erase_notes_description": "Normalne (miękkie) usuwanie zaznacza jedynie notatki jako usunięte i można je przywrócić (w oknie dialogowym ostatnich zmian) przez wyznaczony okres czasu. Zaznaczenie tej opcji spowoduje natychmiastowe usunięcie notatek, bez możliwości ich przywrócenia.", + "erase_notes_warning": "Usuń notatki permanentnie (bez opcji ich przywrócenia), włączając wszystkie kopie. Działanie to wymaga ponownego uruchomienia aplikacji.", + "notes_to_be_deleted": "Następujące notatki zostaną usunięte ({{notesCount}})", + "no_note_to_delete": "Å»adne notatki nie zostaną usunięte (jedynie kopie).", + "broken_relations_to_be_deleted": "Następujące powiązania zostaną uszkodzone i usunięte ({{ relationCount}})", + "ok": "OK", + "deleted_relation_text": "Notatka {{- note}} (do usunięcia) jest powiązana przez relację {{- relation}} pochodzącą z {{- source}}." }, "export": { + "close": "Zamknij", + "export_note_title": "Eksportuj notatkę", + "export_type_subtree": "Ta notatka oraz wszystkie podrzędne", + "format_html": "HTML - rekomendowany jako zachowujący całość formatowania", + "format_html_zip": "HTML w archiwum ZIP - rekomendowany jako zachowujący całość formatowania.", + "format_markdown": "Markdown - zachowuje większość formatowania.", + "format_opml": "OPML - format wymiany danych dla outlinerów zawierający tylko tekst. Formatowanie, obrazy i pliki nie są uwzględnione.", + "opml_version_1": "OPML v1.0 - tylko zwykły tekst", + "opml_version_2": "OPML v2.0 - umożliwia również HTML", + "export_type_single": "Tylko ta notatka, bez elementów podrzędnych", + "export": "Eksportuj", + "choose_export_type": "Wybierz najpierw rodzaj pliku do eksportu", + "export_status": "Status eksportu", + "export_in_progress": "Postęp eksportowania: {{progressCount}}", + "export_finished_successfully": "Eksportowanie zakończone.", + "format_pdf": "PDF - w celu drukowania lub udostępniania." + }, + "clone_to": { + "clone_notes_to": "Sklonuj notatki do...", + "notes_to_clone": "Notatki do sklonowania", + "search_for_note_by_its_name": "Wyszukaj notatkę po jej nazwie", + "cloned_note_prefix_title": "Sklonowana notatka zostanie wyświetlona w drzewie notatki z podanym prefiksem", + "prefix_optional": "Prefiks (opcjonalne)", + "clone_to_selected_note": "Sklonuj do wybranej notatki", + "no_path_to_clone_to": "Brak ścieżki do sklonowania.", + "note_cloned": "Notatka \"{{clonedTitle}}\" została sklonowana do \"{{targetTitle}}\"", + "help_on_links": "Pomoc dotycząca linków", + "target_parent_note": "Docelowa główna notatka" + }, + "help": { + "title": "Ściągawka", + "noteNavigation": "Nawigacja po notatkach", + "goUpDown": "przewijanie w górę/w dół w liście notatek", + "collapseExpand": "zwiń/rozwiń zbiór", + "notSet": "niezdefiniowany", + "goBackForwards": "przewijaj do tyłu/do przodu w historii", + "showJumpToNoteDialog": "pokaż \"przejdÅŗ do dialogu", + "scrollToActiveNote": "przewiń do aktywnej notatki", + "jumpToParentNote": "przejdÅŗ do głównej notatki", + "collapseWholeTree": "zwiń całe drzewko notatki", + "collapseSubTree": "zwiń gałąź notatki", + "tabShortcuts": "Skóry kart", + "newTabNoteLink": "link notatki otwiera notatkę w nowej karcie", + "newTabWithActivationNoteLink": "link notatki otwiera i aktywuje notatkę w nowej karcie", + "onlyInDesktop": "Tylko na komputerze stacjonarnym (wersja Electron)", + "openEmptyTab": "Otwórz pustą kartę", + "closeActiveTab": "zamknij aktywną kartę", + "activateNextTab": "aktywuj następną kartę", + "activatePreviousTab": "aktywuj poprzednią kartę", + "creatingNotes": "Tworzenie notatek", + "createNoteAfter": "Utwórz nową notatkę obok obecnie aktywnej", + "createNoteInto": "Utwórz nową podnotatkę w obecnie otwartej", + "editBranchPrefix": "edytuj prefiks aktywnej kopii notatki", + "movingCloningNotes": "Przenoszenie / kopiowanie notatek", + "moveNoteUpDown": "Przenieś notatkę w górę/w dół na liście notatek", + "moveNoteUpHierarchy": "Przenieś notatkę w górę w hierarchii", + "multiSelectNote": "Zaznacz wiele notatek powyżej/poniżej", + "selectAllNotes": "Wybierz wszystkie notatki na obecnym poziomie", + "selectNote": "Wybierz notatkę", + "copyNotes": "skopiuj obecną notatkę (lub obecną sekcję) do schowka (zastosowanie dlaklonowania)", + "cutNotes": "przytnij obecną notatkę (lub obecną sekcję) do schowka (zastosowanie dla przenoszenia notatek)", + "pasteNotes": "wklej notatkę jako podnotatka w obecnej notatce (rozumiane jako przenieś lub skopiuj, w zależności czy notatka była skopiowana czy wycięta)", + "deleteNotes": "usuń notatkę / gałąź", + "editingNotes": "Edytowanie notatek", + "other": "Inne", + "editNoteTitle": "W panelu drzewa nastąpi przejście z panelu drzewa do tytułu notatki. Naciśnięcie klawisza Enter w tytule notatki spowoduje przejście do edytora tekstu. Ctrl+. spowoduje powrót z edytora do panelu drzewa.", + "createEditLink": "stwórz / edytuj zewnętrzny link", + "createInternalLink": "stwórz wewnętrzny link", + "followLink": "kliknij link pod kursorem", + "insertDateTime": "wstaw aktualną datę i godzinę w pozycji kursora", + "markdownAutoformat": "Autoformatowanie w stylu Markdown", + "headings": "##, ###, #### itd., po których następuje miejsce na nagłówki", + "bulletList": "* lub -, a następnie spacja, aby utworzyć listę", + "jumpToTreePane": "przejdÅŗ do panelu drzewa i przewiń do aktywnej notatki", + "numberedList": "1. or 1) po którym następuje miejsce na listę numerowaną", + "blockQuote": "zacznij linijkę od aby po kliknięciu spacji dodać blok cytatu", + "troubleshooting": "Rozwiązywanie błędów", + "reloadFrontend": "Załaduj ponownie Frontend Trilium", + "showDevTools": "pokaż narzędzia deweloperskie", + "showSQLConsole": "pokaż konsolę SQL", + "quickSearch": "skup się na szybkim wyszukiwaniu", + "inPageSearch": "wyszukiwanie wewnątrz strony" + }, + "book_properties": { + "list": "Lista", + "view_type": "Typ widoku", + "grid": "Siatka", + "collapse_all_notes": "Zwiń wszystkie notatki", + "expand_all_children": "Rozwiń wszystkie dzieci", + "collapse": "Zwiń", + "expand": "Rozwiń", + "book_properties": "Właściwości kolekcji", + "invalid_view_type": "Nieprawidłowy typ widoku '{{type}}'", + "calendar": "Kalendarz", + "table": "Tabela", + "geo-map": "Mapa geograficzna", + "board": "Tablica", + "presentation": "Prezentacja", + "include_archived_notes": "Pokaż zarchiwizowane notatki" + }, + "board_view": { + "move-to": "Przenieś do", + "insert-above": "Umieść nad", + "insert-below": "Umieść pod", + "delete-column": "Usuń kolumnę", + "delete-column-confirmation": "Czy na pewno chcesz usunąć tę kolumnę? Odpowiedni atrybut zostanie również usunięty w notatkach pod tą kolumną.", + "new-item": "Nowy element", + "new-item-placeholder": "Wpisz tytuł notatki...", + "add-column": "Dodaj kolumnę", + "add-column-placeholder": "Wpisz tytuł kolumny...", + "edit-note-title": "Naciśnij aby edytować tytuł notatki", + "edit-column-title": "Naciśnij aby edytować tytuł kolumny", + "delete-note": "Usuń notatkę...", + "remove-from-board": "Usuń z tablicy", + "archive-note": "Archiwalna notatka", + "unarchive-note": "Usuń notatkę z archiwum" + }, + "command_palette": { + "tree-action-name": "Drzewo: {{name}}", + "export_note_title": "Wyeksportuj notatkę", + "export_note_description": "Wyeksportuj aktualną notatkę", + "show_attachments_title": "Pokaż załączniki", + "show_attachments_description": "Zobacz załączniki notatki", + "search_notes_title": "Szukaj notatek", + "search_notes_description": "Otwórz zaawansowane wyszukiwanie", + "search_subtree_title": "Poszukaj w poddrzewie", + "search_subtree_description": "poszukaj wewnątrz poddrzewa", + "search_history_title": "Pokaż historię wyszukiwania", + "search_history_description": "Pokaż poprzednie wyszukiwania", + "configure_launch_bar_title": "Ustaw Launch Bar", + "configure_launch_bar_description": "Otwórz konfigurację Launch Bar, aby dodać lub usunąć elementy." + }, + "content_renderer": { + "open_externally": "Otwórz zewnętrznie" + }, + "modal": { + "close": "Zamknij", + "help_title": "Pokaż więcej informacji na temat tego ekranu" + }, + "call_to_action": { + "next_theme_title": "Spróbuj nowy motyw Trilium", + "next_theme_message": "Obecnie używasz starszego motywu. Czy chcesz wypróbować nowy motyw?", + "next_theme_button": "Spróbuj nowego motywu", + "background_effects_title": "Efekty w tle są już stabilne", + "dismiss": "Odrzuć", + "background_effects_button": "Włącz efekty w tle", + "background_effects_message": "Na urządzeniach z systemem Windows efekty tła są teraz w pełni stabilne. Efekty tła dodają odrobinę koloru do interfejsu użytkownika, rozmywając tło za nim. Ta technika jest również stosowana w innych aplikacjach, takich jak Eksplorator Windows." + }, + "settings": { + "related_settings": "Powiązane ustawienia" + }, + "settings_appearance": { + "related_code_blocks": "Schemat kolorów dla bloków kodu w notatkach tekstowych", + "related_code_notes": "Schemat kolorów dla kodu" + }, + "units": { + "percentage": "%" + }, + "pagination": { + "page_title": "Strony:{{startIndex}}-{{endIndex}}", + "total_notes": "{{count}}notatek" + }, + "collections": { + "rendering_error": "Błąd - Nie można pokazać treści." + }, + "add_label": { + "add_label": "Dodaj etykietę", + "label_name_placeholder": "Nazwa etykiety", + "label_name_title": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.", + "to_value": "do wartości", + "new_value_placeholder": "nowa wartość", + "help_text": "We wszystkich dopasowanych notatkach:", + "help_text_item2": "albo zmień wartość istniejącej etykiety", + "help_text_item1": "utwórz daną etykietę, jeśli notatka jeszcze jej nie ma", + "help_text_note": "Możesz również wywołać tę metodę bez wartości, w takim przypadku etykieta zostanie przypisana do notatki bez wartości." + }, + "attribute_detail": { + "delete": "Usuń", + "related_notes_title": "Inne notatki z tą etykietą", + "more_notes": "Więcej notatek", + "label": "Szczegóły etykiety", + "label_definition": "Szczegóły definicji etykiety", + "relation": "Szczegóły powiązania", + "relation_definition": "Szczegóły definicji powiązania", + "disable_versioning": "Wyłącza automatyczne wersjonowanie. Przydatne np. w przypadku dużych, ale nieistotnych notatek – np. dużych bibliotek JS używanych do skryptów", + "precision": "Prezycja", + "digits": "znaki", + "inverse_relation_title": "Opcjonalne ustawienie definiujące, do której relacji jest ta relacja przeciwna. Przykład: Główna - podnotatka są relacjami odwrotnymi do siebie.", + "inverse_relation": "Odwrócone powiązanie", + "attr_detail_title": "Tytuł szczegółów atrybutu", + "close_button_title": "Anuluj zmiany i zamknij", + "attr_is_owned_by": "Atrybut jest własnością", + "attr_name_title": "Nazwa atrybutu może składać się tylko ze znaków alfanumerycznych, dwukropka i podkreślenia", + "name": "Nazwa", + "value": "Wartość", + "target_note_title": "Relacja to nazwane połączenie między notatką Åŗródłową a docelową.", + "target_note": "Notatka docelowa", + "promoted_title": "Promowany atrybut jest wyraÅŗnie wyświetlany w notatce.", + "promoted": "Promowany", + "promoted_alias_title": "Nazwa, która ma być wyświetlana w interfejsie promowanych atrybutów.", + "promoted_alias": "Alias", + "multiplicity_title": "Krotność definiuje, ile atrybutów o tej samej nazwie można utworzyć - maksymalnie 1 lub więcej niż 1.", + "multiplicity": "Krotność", + "single_value": "Pojedyncza wartość", + "multi_value": "Wiele wartości", + "label_type_title": "Typ etykiety pomoże Trilium wybrać odpowiedni interfejs do wprowadzenia wartości etykiety.", + "label_type": "Typ", + "text": "Tekst", + "number": "Liczba", + "boolean": "Wartość logiczna", + "date": "Data", + "date_time": "Data i czas", + "time": "Czas", + "url": "URL", + "precision_title": "Jaka liczba cyfr po przecinku powinna być dostępna w interfejsie ustawiania wartości.", + "inheritable_title": "Dziedziczny atrybut będzie dziedziczony przez wszystkich potomków w tym drzewie.", + "inheritable": "Dziedziczny", + "save_and_close": "Zapisz i zamknij Ctrl+Enter", + "calendar_root": "oznacza notatkę, która powinna być używana jako korzeń dla notatek dziennych. Tylko jedna powinna być tak oznaczona.", + "archived": "notatki z tą etykietą nie będą domyślnie widoczne w wynikach wyszukiwania (również w dialogach PrzejdÅŗ do, Dodaj link itp.).", + "exclude_from_export": "notatki (wraz z ich poddrzewem) nie będą uwzględniane w żadnym eksporcie notatek", + "run": "definiuje, przy jakich zdarzeniach skrypt powinien być uruchamiany. Możliwe wartości to:\n
    \n
  • frontendStartup - gdy frontend Trilium się uruchamia (lub jest odświeżany), ale nie na urządzeniach mobilnych.
  • \n
  • mobileStartup - gdy frontend Trilium się uruchamia (lub jest odświeżany), na urządzeniach mobilnych.
  • \n
  • backendStartup - gdy backend Trilium się uruchamia
  • \n
  • hourly - uruchamiaj raz na godzinę. Możesz użyć dodatkowej etykiety runAtHour, aby określić, o której godzinie.
  • \n
  • daily - uruchamiaj raz dziennie
  • \n
", + "run_on_instance": "Zdefiniuj, która instancja Trilium ma to uruchomić. Domyślnie wszystkie instancje.", + "run_at_hour": "O której godzinie ma to być uruchomione. Powinno być używane razem z #run=hourly. Można zdefiniować wielokrotnie dla większej liczby uruchomień w ciągu dnia.", + "disable_inclusion": "skrypty z tą etykietą nie będą uwzględniane w wykonaniu skryptu nadrzędnego.", + "sorted": "utrzymuje notatki podrzędne posortowane alfabetycznie według tytułu", + "sort_direction": "ASC (domyślnie) lub DESC", + "sort_folders_first": "Foldery (notatki z dziećmi) powinny być sortowane na górze", + "top": "utrzymuj daną notatkę na górze w jej rodzicu (dotyczy tylko posortowanych rodziców)", + "hide_promoted_attributes": "Ukryj promowane atrybuty w tej notatce", + "read_only": "edytor jest w trybie tylko do odczytu. Działa tylko dla notatek tekstowych i kodowych.", + "auto_read_only_disabled": "notatki tekstowe/kodowe mogą być automatycznie ustawiane w tryb tylko do odczytu, gdy są zbyt duże. Możesz wyłączyć to zachowanie dla poszczególnych notatek, dodając tę etykietę do notatki", + "app_css": "oznacza notatki CSS, które są ładowane do aplikacji Trilium i mogą być używane do modyfikacji wyglądu Trilium.", + "app_theme": "oznacza notatki CSS, które są pełnymi motywami Trilium i są dostępne w opcjach Trilium.", + "app_theme_base": "ustaw na \"next\", \"next-light\" lub \"next-dark\", aby użyć odpowiedniego motywu TriliumNext (auto, jasny lub ciemny) jako podstawy dla niestandardowego motywu, zamiast starszego.", + "css_class": "wartość tej etykiety jest dodawana jako klasa CSS do węzła reprezentującego daną notatkę w drzewie. Może to być przydatne do zaawansowanego motywowania. Może być używane w notatkach-szablonach.", + "icon_class": "wartość tej etykiety jest dodawana jako klasa CSS do ikony w drzewie, co może pomóc wizualnie odróżnić notatki w drzewie. Przykładem może być bx bx-home - ikony pochodzą z boxicons. Może być używane w notatkach-szablonach.", + "page_size": "liczba elementów na stronie w liście notatek", + "custom_request_handler": "zobacz Niestandardowy obsługujący żądania", + "custom_resource_provider": "zobacz Niestandardowy obsługujący żądania", + "widget": "oznacza tę notatkę jako niestandardowy widżet, który zostanie dodany do drzewa komponentów Trilium", + "workspace": "oznacza tę notatkę jako obszar roboczy, co pozwala na łatwe podnoszenie", + "workspace_icon_class": "definiuje klasę CSS ikony box, która będzie używana w karcie po podniesieniu do tej notatki", + "workspace_tab_background_color": "Kolor CSS używany w karcie notatki po podniesieniu do tej notatki", + "workspace_calendar_root": "Definiuje korzeń kalendarza dla obszaru roboczego", + "workspace_template": "Ta notatka pojawi się w wyborze dostępnych szablonów podczas tworzenia nowej notatki, ale tylko po podniesieniu do obszaru roboczego zawierającego ten szablon", + "search_home": "nowe notatki wyszukiwania będą tworzone jako dzieci tej notatki", + "workspace_search_home": "nowe notatki wyszukiwania będą tworzone jako dzieci tej notatki po podniesieniu do jakiegoś przodka tej notatki obszaru roboczego", + "inbox": "domyślna lokalizacja skrzynki odbiorczej dla nowych notatek - gdy tworzysz notatkę za pomocą przycisku \"nowa notatka\" na pasku bocznym, notatki będą tworzone jako notatki podrzędne w notatce oznaczonej etykietą #inbox.", + "workspace_inbox": "domyślna lokalizacja skrzynki odbiorczej dla nowych notatek po podniesieniu do jakiegoś przodka tej notatki obszaru roboczego", + "sql_console_home": "domyślna lokalizacja notatek konsoli SQL", + "bookmark_folder": "notatka z tą etykietą pojawi się w zakładkach jako folder (umożliwiając dostęp do jej dzieci)", + "share_hidden_from_tree": "ta notatka jest ukryta w lewym drzewie nawigacyjnym, ale nadal dostępna pod swoim adresem URL", + "share_external_link": "notatka będzie działać jako link do zewnętrznej strony internetowej w drzewie udostępniania", + "share_alias": "zdefiniuj alias, za pomocą którego notatka będzie dostępna pod adresem https://your_trilium_host/share/[your_alias]", + "share_omit_default_css": "domyślny CSS strony udostępniania zostanie pominięty. Użyj, gdy wprowadzasz obszerne zmiany w stylizacji.", + "share_root": "oznacza notatkę, która jest serwowana w katalogu głównym /share.", + "share_description": "zdefiniuj tekst, który ma być dodany do metatagu HTML dla opisu", + "share_raw": "notatka będzie serwowana w surowym formacie, bez opakowania HTML", + "share_disallow_robot_indexing": "zabroni robotom indeksowania tej notatki za pomocą nagłówka X-Robots-Tag: noindex", + "share_credentials": "wymagaj poświadczeń, aby uzyskać dostęp do tej udostępnionej notatki. Oczekuje się, że wartość będzie w formacie 'nazwa_użytkownika:hasło'. Nie zapomnij uczynić tego dziedzicznym, aby zastosować do notatek podrzędnych/obrazów.", + "share_index": "notatka z tą etykietą będzie zawierać listę wszystkich korzeni udostępnionych notatek", + "display_relations": "rozdzielone przecinkami nazwy relacji, które powinny być wyświetlane. Wszystkie inne będą ukryte.", + "hide_relations": "rozdzielone przecinkami nazwy relacji, które powinny być ukryte. Wszystkie inne będą wyświetlane.", + "title_template": "domyślny tytuł notatek tworzonych jako dzieci tej notatki. Wartość jest oceniana jako ciąg znaków JavaScript\n i dlatego może być wzbogacona o dynamiczną treść za pomocą wstrzykniętych zmiennych now i parentNote. Przykłady:\n \n
    \n
  • ${parentNote.getLabelValue('authorName')}'s literary works
  • \n
  • Log for ${now.format('YYYY-MM-DD HH:mm:ss')}
  • \n
\n \n Zobacz wiki ze szczegółami, dokumentację API dla parentNote i now, aby uzyskać szczegółowe informacje.", + "template": "Ta notatka pojawi się w wyborze dostępnych szablonów podczas tworzenia nowej notatki", + "toc": "#toc lub #toc=show wymusi wyświetlenie spisu treści, #toc=hide wymusi jego ukrycie. Jeśli etykieta nie istnieje, obserwowane jest ustawienie globalne", + "color": "definiuje kolor notatki w drzewie notatek, linkach itp. Użyj dowolnej prawidłowej wartości koloru CSS, np. 'red' lub #a13d5f", + "keyboard_shortcut": "Definiuje skrót klawiaturowy, który natychmiast przejdzie do tej notatki. Przykład: 'ctrl+alt+e'. Wymaga ponownego załadowania frontendu, aby zmiana zaczęła obowiązywać.", + "keep_current_hoisting": "Otwarcie tego linku nie zmieni podniesienia, nawet jeśli notatka nie jest wyświetlana w bieżącym podniesionym poddrzewie.", + "execute_button": "Tytuł przycisku, który wykona bieżącą notatkę kodu", + "execute_description": "Dłuższy opis bieżącej notatki kodu wyświetlany razem z przyciskiem wykonania", + "exclude_from_note_map": "Notatki z tą etykietą będą ukryte na Mapie Notatek", + "new_notes_on_top": "Nowe notatki będą tworzone na górze notatki nadrzędnej, a nie na dole.", + "hide_highlight_widget": "Ukryj widżet listy wyróżnień", + "run_on_note_creation": "wykonuje się, gdy notatka jest tworzona na backendzie. Użyj tej relacji, jeśli chcesz uruchomić skrypt dla wszystkich notatek utworzonych w określonym poddrzewie. W takim przypadku utwórz ją w korzeniu poddrzewa i uczyń dziedziczną. Nowa notatka utworzona w poddrzewie (na dowolnej głębokości) uruchomi skrypt.", + "run_on_child_note_creation": "wykonuje się, gdy nowa notatka jest tworzona pod notatką, w której zdefiniowano tę relację", + "run_on_note_title_change": "wykonuje się, gdy tytuł notatki jest zmieniany (obejmuje również tworzenie notatki)", + "run_on_note_content_change": "wykonuje się, gdy zawartość notatki jest zmieniana (obejmuje również tworzenie notatki).", + "run_on_note_change": "wykonuje się, gdy notatka jest zmieniana (obejmuje również tworzenie notatki). Nie obejmuje zmian w zawartości", + "run_on_note_deletion": "wykonuje się, gdy notatka jest usuwana", + "run_on_branch_creation": "wykonuje się, gdy tworzona jest gałąź. Gałąź to połączenie między notatką nadrzędną a podrzędną i jest tworzona np. podczas klonowania lub przenoszenia notatki.", + "run_on_branch_change": "wykonuje się, gdy gałąź jest aktualizowana.", + "run_on_branch_deletion": "wykonuje się, gdy gałąź jest usuwana. Gałąź to połączenie między notatką nadrzędną a podrzędną i jest usuwana np. podczas przenoszenia notatki (stara gałąź/link jest usuwana).", + "run_on_attribute_creation": "wykonuje się, gdy tworzony jest nowy atrybut dla notatki, która definiuje tę relację", + "run_on_attribute_change": " wykonuje się, gdy atrybut jest zmieniany w notatce, która definiuje tę relację. Jest to również wyzwalane, gdy atrybut jest usuwany", + "relation_template": "atrybuty notatki będą dziedziczone nawet bez relacji rodzic-dziecko, zawartość i poddrzewo notatki zostaną dodane do notatek instancji, jeśli są puste. Zobacz dokumentację, aby uzyskać szczegółowe informacje.", + "inherit": "atrybuty notatki będą dziedziczone nawet bez relacji rodzic-dziecko. Zobacz relację szablonu dla podobnego konceptu. Zobacz dziedziczenie atrybutów w dokumentacji.", + "render_note": "notatki typu \"renderuj notatkę HTML\" będą renderowane za pomocą notatki kodu (HTML lub skrypt) i konieczne jest wskazanie za pomocą tej relacji, która notatka ma być renderowana", + "widget_relation": "cel tej relacji zostanie wykonany i wyrenderowany jako widżet na pasku bocznym", + "share_css": "Notatka CSS, która zostanie wstrzyknięta na stronę udostępniania. Notatka CSS musi również znajdować się w udostępnionym poddrzewie. Rozważ również użycie 'share_hidden_from_tree' i 'share_omit_default_css'.", + "share_js": "Notatka JavaScript, która zostanie wstrzyknięta na stronę udostępniania. Notatka JS musi również znajdować się w udostępnionym poddrzewie. Rozważ użycie 'share_hidden_from_tree'.", + "share_template": "Wbudowana notatka JavaScript, która będzie używana jako szablon do wyświetlania udostępnionej notatki. W razie niepowodzenia używany jest domyślny szablon. Rozważ użycie 'share_hidden_from_tree'.", + "share_favicon": "Notatka favicon do ustawienia na udostępnionej stronie. Zazwyczaj chcesz ustawić ją w katalogu głównym udostępniania i uczynić ją dziedziczną. Notatka favicon musi również znajdować się w udostępnionym poddrzewie. Rozważ użycie 'share_hidden_from_tree'.", + "is_owned_by_note": "jest własnością notatki", + "other_notes_with_name": "Inne notatki z nazwą {{attributeType}} \"{{attributeName}}\"", + "and_more": "... i {{count}} więcej.", + "print_landscape": "Podczas eksportowania do formatu PDF zmienia orientację strony na poziomą zamiast pionowej.", + "print_page_size": "Podczas eksportowania do formatu PDF zmienia rozmiar strony. Obsługiwane wartości: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.", + "color_type": "Kolor" + }, + "import": { + "importIntoNote": "Importuj do notatki", + "chooseImportFile": "Wybierz plik do zaimportowania", + "importDescription": "Zawartość wybranego pliku(ów) zostanie zaimportowana jako notatka(i) podrzędna(e) do", + "options": "Opcje", + "shrinkImages": "Zmniejsz obrazy", + "safeImport": "Bezpieczny import", + "import-status": "Status importu", + "in-progress": "Import w trakcie: {{progress}}", + "successful": "Importowanie zakończone sukcesem.", + "safeImportTooltip": "Pliki eksportu Trilium .zip mogą zawierać skrypty wykonywalne, które mogą powodować szkodliwe zachowania. Bezpieczny import dezaktywuje automatyczne wykonywanie wszystkich importowanych skryptów. Odznacz opcję ā€žBezpieczny importā€ tylko wtedy, gdy importowane archiwum ma zawierać skrypty wykonywalne i masz pełne zaufanie do zawartości importowanego pliku.", + "import": "Import", + "failed": "Błąd importu: {{message}}.", + "html_import_tags": { + "title": "Tagi importu HTML", + "description": "Skonfiguruj, które tagi HTML mają zostać zachowane podczas importowania notatek. Tagi spoza tej listy zostaną usunięte podczas importu. Niektóre tagi (np. ā€žscriptā€) są zawsze usuwane ze względów bezpieczeństwa.", + "placeholder": "Wpisz tagi HTML, jedna na linijkę", + "reset_button": "Zresetuj do domyślnej listy" + }, + "explodeArchivesTooltip": "Jeśli ta opcja jest zaznaczona, Trilium odczyta pliki .zip, .enex i .opml i utworzy notatki z plików wewnątrz tych archiwów. Jeśli opcja nie jest zaznaczona, Trilium dołączy same archiwa do notatki.", + "explodeArchives": "Czytaj zawartość archiwów .zip, .enex i .opml.", + "shrinkImagesTooltip": "

Jeśli zaznaczysz tę opcję, Trilium spróbuje zmniejszyć importowane obrazy poprzez skalowanie i optymalizację, co może wpłynąć na postrzeganą jakość obrazu. Jeśli opcja nie jest zaznaczona, obrazy zostaną zaimportowane bez zmian.

Nie dotyczy to importów .zip z metadanymi, ponieważ zakłada się, że te pliki są już zoptymalizowane.

", + "textImportedAsText": "Importuj HTML, Markdown i TXT jako notatki tekstowe, jeśli nie jest to jasne z metadanych", + "codeImportedAsCode": "Importuj rozpoznane pliki kodu (np. .json) jako notatki kodu, jeśli nie jest to jasne z metadanych", + "replaceUnderscoresWithSpaces": "Zastąp podkreślenia spacjami w nazwach importowanych notatek" + }, + "image_properties": { + "title": "Obraz", + "original_file_name": "Oryginalna nazwa pliku", + "file_type": "Typ pliku", + "file_size": "Rozmiar pliku", + "download": "Pobierz", + "open": "Otwórz", + "copy_reference_to_clipboard": "Kopiuj odniesienie do schowka", + "upload_new_revision": "Wgraj nową wersję", + "upload_success": "Nowa wersja obrazu została wysłana.", + "upload_failed": "Wysyłanie nowej wersji obrazu nie powiodło się: {{message}}" + }, + "inherited_attribute_list": { + "title": "Odziedziczone atrybuty", + "no_inherited_attributes": "Brak odziedziczonych atrybutów." + }, + "note_info_widget": { + "note_id": "ID notatki", + "created": "Stworzona", + "modified": "Zmodyfikowano", + "type": "Typ", + "note_size": "Rozmiar notatki", + "note_size_info": "Rozmiar notatki pozwala oszacować przybliżoną ilość miejsca potrzebnego na przechowanie jej. Uwzględnia ona jej treść oraz treść jej poprawek.", + "calculate": "oblicz", + "subtree_size": "(rozmiar poddrzewa: {{size}} w {{count}} notatkach)", + "title": "Informacje o notatce" + }, + "note_map": { + "open_full": "Pełne rozszerzenie", + "collapse": "Zmniejsz do normalnego rozmiaru", + "title": "Mapa notatki", + "fix-nodes": "Napraw węzły", + "link-distance": "Odległość linku" + }, + "note_paths": { + "title": "Ścieżki notatki", + "clone_button": "Sklonuj notatkę do nowej lokalizacji...", + "intro_placed": "Ta notatka jest umieszczona w następujących lokalizacjach:", + "intro_not_placed": "Ta notatka nie została jeszcze umieszczona w drzewie.", + "outside_hoisted": "Ta ścieżka znajduje się poza podniesioną notatką i trzeba ją odwiesić.", + "archived": "Zarchiwizowane", + "search": "Szukaj" + }, + "note_properties": { + "this_note_was_originally_taken_from": "Ta notatka oryginalnie została wzięta z:", + "info": "Info" + }, + "owned_attribute_list": { + "owned_attributes": "Posiadane atrybuty" + }, + "promoted_attributes": { + "promoted_attributes": "Promowane atrybuty", + "unset-field-placeholder": "nie ustawione", + "url_placeholder": "http://strona...", + "open_external_link": "Otwórz link zewnętrzny", + "unknown_label_type": "Nieznany typ etykiety \"{{type}}\"", + "unknown_attribute_type": "Nieznany typ atrybutu \"{{type}}\"", + "add_new_attribute": "Dodaj nowy atrybut", + "remove_this_attribute": "Usuń ten atrybut", + "remove_color": "Usuń ten kolor etykiety" + }, + "script_executor": { + "query": "Zapytanie", + "script": "Skrypt", + "execute_query": "Wykonaj zapytanie", + "execute_script": "Wykonaj skrypt" + }, + "search_definition": { + "add_search_option": "Dodaj opcje wyszukiwania:", + "search_string": "ciąg wyszukiwania", + "search_script": "skrypt wyszukiwania", + "ancestor": "przodek", + "fast_search": "szybkie wyszukiwanie", + "fast_search_description": "Opcja szybkiego wyszukiwania wyłącza pełno tekstowe przeszukiwanie zawartości notatek, co może przyspieszyć przeszukiwanie dużych baz danych.", + "include_archived": "dodaj zarchiwizowane", + "include_archived_notes_description": "Domyślnie zarchiwizowane notatki są wyłączone z wyszukiwania, z tą opcją zostaną dodane do wyszukiwania.", + "order_by": "sortuj", + "limit": "limituj", + "limit_description": "Limituj liczbę wyników", + "save_to_note": "Zapisz do notatki", + "search_parameters": "Parametry wyszukiwania", + "unknown_search_option": "Nieznana opcja wyszukiwania {{searchOptionName}}", + "search_note_saved": "Wyszukiwana notatka została zapisana do {{- notePathTitle}}", + "actions_executed": "Akcja została wykonana.", + "debug": "debugowanie", + "debug_description": "Debugowanie wydrukuje dodatkowe informacje debugowania w konsoli, aby pomóc w debugowaniu złożonych zapytań", + "action": "akcja", + "search_button": "Szukaj", + "search_execute": "Szukaj i wykonaj akcje" + }, + "similar_notes": { + "title": "Podobne notatki", + "no_similar_notes_found": "Nie znaleziono podobnych notatek." + }, + "abstract_search_option": { + "remove_this_search_option": "Usuń tą opcję wyszukiwania", + "failed_rendering": "Nieudana opcja wyszukiwania: {{dto}} z błędem: {{error}} {{stack}}" + }, + "ancestor": { + "label": "Przodek", + "placeholder": "szukaj notatki po jej nazwie", + "depth_label": "glębokość", + "depth_doesnt_matter": "nie ważne", + "depth_eq": "jest dokładnie {{count}}", + "direct_children": "bezpośrednie podnotatki", + "depth_gt": "jest więcej niż {{count}}", + "depth_lt": "jest mniej niż {{count}}" + }, + "debug": { + "debug": "Debuguj", + "debug_info": "Debugowanie wyświetli dodatkowe informacje debugowania w konsoli, aby ułatwić debugowanie złożonych zapytań.", + "access_info": "Aby uzyskać dostęp do informacji debugowania, wykonaj zapytanie i kliknij \"Pokaż logi backendu\" w lewym górnym rogu." + }, + "fast_search": { + "fast_search": "Szybkie wyszukiwanie", + "description": "Opcja szybkiego wyszukiwania wyłącza pełnotekstowe przeszukiwanie zawartości notatek, co może przyspieszyć wyszukiwanie w dużych bazach danych." + }, + "file_properties": { + "download": "Pobierz", + "open": "Otwórz", + "upload_new_revision": "Wgraj nową wersję", + "upload_success": "Nowa wersja pliku nie została wysłana.", + "upload_failed": "Wysyłanie nowej wersji pliku się nie udało.", + "title": "Plik", + "note_id": "ID notatki", + "original_file_name": "Oryginalna nazwa pliku", + "file_type": "Typ pliku", + "file_size": "Rozmiar pliku" + }, + "include_note": { + "label_note": "Notatka", + "placeholder_search": "szukaj notatki po jej nazwie", + "dialog_title": "Dołącz notatkę", + "button_include": "Dołącz notatkę", + "box_size_prompt": "Rozmiar okna dołączonej notatki:", + "box_size_small": "mały (~ 10 linii)", + "box_size_medium": "średni (~ 30 linii)", + "box_size_full": "pełny (okno pokazuje cały tekst)" + }, + "info": { + "closeButton": "Zamknij", + "okButton": "OK", + "modalTitle": "Wiadomość" + }, + "jump_to_note": { + "search_placeholder": "Szukaj notatki po jej nazwie albo typie > komendy...", + "search_button": "Wyszukiwanie pełno tekstowe" + }, + "markdown_import": { + "dialog_title": "Zaimportuj Markdown", + "import_button": "Import", + "import_success": "Treść Markdown została zaimportowana do dokumentu.", + "modal_body_text": "Ze względu na środowisko przeglądarki nie jest możliwe bezpośrednie odczytanie schowka z JavaScript. Wklej Markdown do importu do poniższego pola tekstowego i kliknij przycisk Importuj" + }, + "limit": { + "limit": "Limit", + "take_first_x_results": "WeÅŗ tylko pierwsze X określonych wyników." + }, + "link_context_menu": { + "open_note_in_popup": "Szybka edycja", + "open_note_in_new_tab": "Otwórz notatkę w nowej karcie", + "open_note_in_new_split": "Otwórz notatkę w nowym podziale ekranu", + "open_note_in_new_window": "Otwórz notatkę w nowym oknie" + }, + "electron_integration": { + "desktop-application": "Aplikacja desktopowa", + "native-title-bar": "Natywny pasek tytułu", + "native-title-bar-description": "Dla systemów Windows i macOS wyłączenie natywnego paska tytułu sprawia, że aplikacja wygląda bardziej kompaktowo. W systemie Linux włączenie natywnego paska tytułu lepiej integruje się z resztą systemu.", + "background-effects": "Włącz efekty tła (tylko Windows 11)", + "background-effects-description": "Efekt Mica dodaje rozmyte, stylowe tło do okien aplikacji, tworząc głębię i nowoczesny wygląd. \"Natywny pasek tytułu\" musi być wyłączony.", + "restart-app-button": "Uruchom ponownie aplikację, aby zobaczyć zmiany", + "zoom-factor": "Współczynnik powiększenia" + }, + "electron_context_menu": { + "cut": "Wytnij", + "copy": "Kopiuj", + "copy-link": "Kopiuj link", + "paste": "Wklej", + "paste-as-plain-text": "Wklej jako plain text", + "search_online": "Szukaj \"{{term}}\" za pomocą {{searchEngine}}", + "add-term-to-dictionary": "Dodaj \"{{term}}\" do słownika" + }, + "image_context_menu": { + "copy_reference_to_clipboard": "Skopiuj odnośnik do schowka", + "copy_image_to_clipboard": "Skopiuj obraz do schowka" + }, + "note_autocomplete": { + "clear-text-field": "Wyczyść pole tekstowe", + "show-recent-notes": "Pokaż ostatnie notatki", + "full-text-search": "Wyszukiwanie pełnotekstowe", + "search-for": "Szukaj \"{{term}}\"", + "create-note": "Utwórz i połącz notatkę podrzędną \"{{term}}\"", + "insert-external-link": "Wstaw link zewnętrzny do \"{{term}}\"" + }, + "note_tooltip": { + "note-has-been-deleted": "Notatka została usunięta.", + "quick-edit": "Szybka edycja" + }, + "duration": { + "seconds": "sekundy", + "minutes": "minuty", + "hours": "godziny", + "days": "dni" + }, + "share": { + "title": "Ustawienia udostępniania", + "redirect_bare_domain": "Przekieruj gołą domenę na stronę udostępniania", + "redirect_bare_domain_description": "Przekieruj anonimowych użytkowników na stronę udostępniania zamiast pokazywać stronę logowania", + "show_login_link": "Pokaż link logowania w motywie udostępniania", + "show_login_link_description": "Dodaj link logowania do stopki strony udostępniania", + "check_share_root": "SprawdÅŗ status korzenia udostępniania", + "share_root_found": "Notatka korzenia udostępniania '{{noteTitle}}' jest gotowa", + "share_root_not_found": "Nie znaleziono notatki z etykietą #shareRoot", + "share_root_not_shared": "Notatka '{{noteTitle}}' ma etykietę #shareRoot, ale nie jest udostępniona" + }, + "tasks": { + "due": { + "today": "Dziś", + "tomorrow": "Jutro", + "yesterday": "Wczoraj" + } + }, + "content_widget": { + "unknown_widget": "Nieznany widget dla \"{{id}}\"." + }, + "note_language": { + "not_set": "Nie ustawione", + "configure-languages": "Konfiguracja języków..." + }, + "content_language": { + "title": "Język treści", + "description": "Wybierz jeden lub więcej języków, które mają być wyświetlane w sekcji Właściwości Podstawowe Notatki Tekstowej tylko do odczytu lub edytowalnej. Umożliwi to korzystanie z takich funkcji, jak sprawdzanie pisowni czy obsługa pisania od prawej do lewej." + }, + "switch_layout_button": { + "title_vertical": "Przesuń panel edycji na dół", + "title_horizontal": "Przesuń panel edycji do lewej" + }, + "toggle_read_only_button": { + "unlock-editing": "Odblokuj edycję", + "lock-editing": "Zablokuj edycję" + }, + "png_export_button": { + "button_title": "Wyeksportuj diagram jako PNG" + }, + "svg": { + "export_to_png": "Diagram nie może zostać wyeksportowany jako PNG." + }, + "code_theme": { + "title": "Wygląd", + "word_wrapping": "Zawijanie słów", + "color-scheme": "Schemat kolorów" + }, + "cpu_arch_warning": { + "title": "Proszę o pobranie wersji ARM64", + "message_macos": "TriliumNext działa obecnie w oparciu o technologię Rosetta 2, co oznacza, że używasz wersji Intel (x64) na komputerze Mac z procesorem Apple Silicon. Będzie to miało znaczący wpływ na wydajność i czas pracy baterii.", + "message_windows": "TriliumNext działa obecnie w trybie emulacji, co oznacza, że używasz wersji Intel (x64) na urządzeniu z systemem Windows na procesorze ARM. Będzie to miało znaczący wpływ na wydajność i czas pracy baterii.", + "recommendation": "Aby uzyskać najlepsze wrażenia, pobierz natywną wersję ARM64 aplikacji TriliumNext ze strony poświęconej wydaniom.", + "download_link": "Pobierz wersję natywną", + "continue_anyway": "Kontynuuj mimo wszystko", + "dont_show_again": "Nie pokazuj więcej tego ostrzeżenia" + }, + "editorfeatures": { + "title": "Cechy", + "emoji_completion_enabled": "Włącz autouzupełnianie Emoji", + "note_completion_enabled": "Włącz autouzupełnianie notatki", + "emoji_completion_description": "Jeśli włączone, emoji można łatwo wstawiać do tekstu, wpisując `:`, a następnie nazwę emoji.", + "note_completion_description": "Jeśli włączone, linki do notatek można tworzyć, wpisując `@`, a następnie tytuł notatki.", + "slash_commands_enabled": "Włącz polecenia z ukośnikiem", + "slash_commands_description": "Jeśli włączone, polecenia edycji, takie jak wstawianie podziałów wierszy lub nagłówków, można przełączać, wpisując `/`." + }, + "table_view": { + "new-row": "Nowy wiersz", + "new-column": "Nowa kolumna", + "sort-column-by": "Sotuj po \"{{title}}\"", + "sort-column-ascending": "Rosnąco", + "sort-column-descending": "Malejąco", + "sort-column-clear": "Wyczyść sortowanie", + "hide-column": "Ukryj kolumnę \"{{title}}\"", + "show-hide-columns": "Pokaż/ukryj kolumny", + "row-insert-above": "Wstaw wiersz nad", + "row-insert-below": "Wstaw wiersz pod", + "row-insert-child": "Wstaw podnotatkę", + "add-column-to-the-left": "Dodaj kolumnę po lewej", + "add-column-to-the-right": "Dodaj kolumnę po prawej", + "edit-column": "Edytuj kolumnę", + "delete_column_confirmation": "Czy na pewno chcesz usunąć tę kolumnę? Odpowiedni atrybut zostanie usunięty ze wszystkich notatek.", + "delete-column": "Usuń kolumnę", + "new-column-label": "Etykieta", + "new-column-relation": "Relacje" + }, + "book_properties_config": { + "hide-weekends": "Ukryj weekendy", + "display-week-numbers": "Pokaż numery tygodni", + "map-style": "Styl mapy:", + "max-nesting-depth": "Maksymalna głębokość zagnieżdżenia:", + "raster": "Raster", + "vector_light": "Wektor (jasny)", + "vector_dark": "Wektor (ciemny)", + "show-scale": "Pokaż skalę" + }, + "table_context_menu": { + "delete_row": "Usuń wiersz" + }, + "move_to": { + "dialog_title": "Przenieś notatki do ...", + "notes_to_move": "Notatki do przeniesienia", + "target_parent_note": "Docelowa notatka nadrzędna", + "search_placeholder": "szukaj notatki po jej nazwie", + "move_button": "Przenieś do wybranej notatki", + "error_no_path": "Brak ścieżki do przeniesienia.", + "move_success_message": "Wybrane notatki zostały przeniesione do " + }, + "note_type_chooser": { + "modal_title": "Wybierz typ notatki", + "modal_body": "Wybierz typ / szablon notatki dla nowej notatki:", + "templates": "Szablony", + "builtin_templates": "Wbudowane szablony", + "change_path_prompt": "Zmień ścieżkę, gdzie utworzyć nową notatkę:", + "search_placeholder": "wyszukaj ścieżkę po nazwie (domyślna, jeśli pusta)" + }, + "password_not_set": { + "title": "Hasło nie zostało ustawione", + "body1": "Chronione notatki są szyfrowane hasłem użytkownika, ale hasło nie zostało jeszcze ustawione.", + "body2": "Aby móc chronić notatki, kliknij poniższy przycisk, aby otworzyć okno dialogowe Opcje i ustawić hasło.", + "go_to_password_options": "PrzejdÅŗ do opcji hasła" + }, + "add_relation": { + "add_relation": "Dodaj powiązanie", + "relation_name": "nazwa powiązania", + "allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.", + "to": "do", + "target_note": "docelowa notatka", + "create_relation_on_all_matched_notes": "We wszystkich dopasowanych notatkach utwórz daną relację." + }, + "ai_llm": { + "actions": "Akcje", + "retry": "Spróbuj ponownie", + "partial": "{{ percentage }}% wykonania", + "retry_queued": "notatka dodana do kolejki", + "retry_failed": "Nieudana próba dodania notatki do kolejki", + "max_notes_per_llm_query": "Maksymalna ilość notatek w zapytaniu", + "index_all_notes": "Zindeksuj wszystkie notatki", + "index_status": "Status indeksowania", + "indexed_notes": "Zindeksowane notatki", + "indexing_stopped": "Indeksowanie zatrzymane", + "indexing_in_progress": "Indeksowanie w trakcie...", + "last_indexed": "Ostatnio zindeksowane", + "n_notes_queued_0": "{{ count }} notatka zakolejkowana do indeksowania", + "n_notes_queued_1": "{{ count }} notatek zakolejkowanych do indeksowania", + "n_notes_queued_2": "{{ count }} notatek zakolejkowanych do indeksowania", + "note_chat": "Czat notatki", + "note_title": "Tytuł notatki", + "error": "Błąd", + "last_attempt": "Ostatnia próba", + "queued_notes": "Zakolejkowane notatki", + "failed_notes": "Nieudane notatki", + "last_processed": "Ostatnio procesowane", + "refresh_stats": "Odśwież Statystyki", + "enable_ai_features": "Włącz funkcje AI/LLM", + "enable_ai_description": "Włącz funkcje AI, takie jak podsumowywanie notatek, generowanie treści i inne możliwości LLM", + "openai_tab": "OpenAI", + "anthropic_tab": "Anthropic", + "voyage_tab": "Voyage AI", + "ollama_tab": "Ollama", + "enable_ai": "Włącz funkcje AI/LLM", + "enable_ai_desc": "Włącz funkcje AI, takie jak podsumowywanie notatek, generowanie treści i inne możliwości LLM", + "provider_configuration": "Konfiguracja dostawcy AI", + "provider_precedence": "Pierwszeństwo dostawcy", + "provider_precedence_description": "Lista dostawców przedzielonych przecinkami w kolejności (np. ā€žopenai,anthropic,ollamaā€)", + "temperature": "Temperatura", + "temperature_description": "Kontroluje losowość odpowiedzi (0 = deterministyczna, 2 = maksymalna losowość)", + "system_prompt": "Monit systemowy", + "system_prompt_description": "Domyślny monit systemowy używany do wszystkich interakcji ze sztuczną inteligencją", + "openai_configuration": "Konfiguracja OpenAI", + "openai_settings": "Ustawienia OpenAI", + "api_key": "Klucz API", + "url": "Bazowy URL", + "model": "Model", + "openai_api_key_description": "Klucz API OpenAI umożliwiający dostęp do usług AI", + "anthropic_api_key_description": "Klucz API Anthropic umożliwiający dostęp do usług AI", + "default_model": "Domyślny Model", + "openai_model_description": "Przykłady: gpt-4o, gpt-4-turbo, gpt-3.5-turbo", + "base_url": "Bazowy URL", + "openai_url_description": "Domyślny: https://api.openai.com/v1", + "anthropic_settings": "Ustawienia Anthropic", + "anthropic_url_description": "Bazowy URL dla Anthropic API (domyślny: https://api.anthropic.com)", + "anthropic_model_description": "Modele Anthropic Claude'a do uzupełniania czatów", + "voyage_settings": "Ustawienia Voyage AI", + "ollama_settings": "Ustawienia Ollama", + "ollama_url_description": "URL dla Ollama API (domyślny: http://localhost:11434)", + "ollama_model_description": "Model Ollama używany do uzupełniania czatów", + "anthropic_configuration": "Konfiguracja Anthropic", + "voyage_configuration": "Konfiguracja Voyage AI", + "voyage_url_description": "Domyślny: https://api.voyageai.com/v1", + "ollama_configuration": "Konfiguracja Ollama", + "enable_ollama": "Włącz Ollama", + "enable_ollama_description": "Włącz Ollama dla lokalnego modelu AI", + "ollama_url": "Ollama URL", + "ollama_model": "Model Ollama", + "refresh_models": "Odśwież modele", + "refreshing_models": "Odświeżanie...", + "enable_automatic_indexing": "Włącz automatyczne indeksowanie", + "rebuild_index": "Odbuduj indeks", + "rebuild_index_error": "Błąd uruchomienia odbudowy indeksu. SprawdÅŗ logi.", + "max_notes_per_llm_query_description": "Maksymalna liczba podobnych notatek do uwzględnienia w kontekście sztucznej inteligencji", + "active_providers": "Aktywni dostawcy", + "disabled_providers": "Wyłączeni dostawcy", + "remove_provider": "Usuń dostawcę z wyszukiwania", + "restore_provider": "Przywróć dostawcę do wyszukiwania", + "similarity_threshold": "Próg podobieństwa", + "not_started": "Nie rozpoczęto", + "title": "Ustawienia AI", + "processed_notes": "Przetworzone notatki", + "total_notes": "Wszystkie notatki", + "progress": "Postęp", + "similarity_threshold_description": "Minimalny wynik podobieństwa (0-1) dla notatek, które mają być uwzględnione w kontekście zapytań LLM", + "reprocess_index": "Odbuduj indeks wyszukiwania", + "reprocessing_index": "Odbudowywanie...", + "reprocess_index_started": "Optymalizacja indeksu wyszukiwania rozpoczęta w tle", + "reprocess_index_error": "Błąd odbudowywania indeksu wyszukiwania", + "index_rebuild_progress": "Postęp odbudowy indeksu", + "index_rebuilding": "Optymalizowanie indeksu ({{percentage}}%)", + "index_rebuild_complete": "Optymalizacja indeksu zakończona", + "index_rebuild_status_error": "Błąd sprawdzania statusu odbudowy indeksu", + "never": "Nigdy", + "processing": "Przetwarzanie ({{percentage}}%)", + "incomplete": "Niekompletne ({{percentage}}%)", + "complete": "Ukończono (100%)", + "refreshing": "Odświeżanie...", + "auto_refresh_notice": "Automatyczne odświeżanie co {{seconds}} sekund", + "note_queued_for_retry": "Notatka zakolejkowana do ponownej próby", + "failed_to_retry_note": "Nie udało się ponowić próby dla notatki", + "all_notes_queued_for_retry": "Wszystkie nieudane notatki zakolejkowane do ponownej próby", + "failed_to_retry_all": "Nie udało się ponowić próby dla notatek", + "ai_settings": "Ustawienia AI", + "api_key_tooltip": "Klucz API do uzyskiwania dostępu do usługi", + "empty_key_warning": { + "anthropic": "Klucz API Anthropic jest pusty. WprowadÅŗ prawidłowy klucz API.", + "openai": "Klucz API OpenAI jest pusty. WprowadÅŗ prawidłowy klucz API.", + "voyage": "Klucz API Voyage jest pusty. WprowadÅŗ prawidłowy klucz API.", + "ollama": "Klucz API Ollama jest pusty. WprowadÅŗ prawidłowy klucz API." + }, + "agent": { + "processing": "Przetwarzanie...", + "thinking": "Myślenie...", + "loading": "Ładowanie...", + "generating": "Generowanie..." + }, + "name": "AI", + "openai": "OpenAI", + "use_enhanced_context": "Użyj rozszerzonego kontekstu", + "enhanced_context_description": "Dostarcza AI więcej kontekstu z notatki i jej powiązanych notatek dla lepszych odpowiedzi", + "show_thinking": "Pokaż proces myślowy", + "show_thinking_description": "Pokaż proces myślowy AI", + "enter_message": "Wpisz swoją wiadomość...", + "error_contacting_provider": "Błąd kontaktu z dostawcą AI. SprawdÅŗ ustawienia i połączenie internetowe.", + "error_generating_response": "Błąd generowania odpowiedzi AI", + "notes_indexed_0": "{{ count }} notatka zaindeksowana", + "notes_indexed_1": "{{ count }} notatek zaindeksowanych", + "notes_indexed_2": "", + "sources": "Źródła", + "start_indexing": "Rozpocznij indeksowanie", + "use_advanced_context": "Użyj zaawansowanego kontekstu", + "ollama_no_url": "Ollama nie jest skonfigurowana. WprowadÅŗ prawidłowy URL.", + "chat": { + "root_note_title": "Czaty AI", + "root_note_content": "Ta notatka zawiera zapisane rozmowy na czacie AI.", + "new_chat_title": "Nowy czat", + "create_new_ai_chat": "Utwórz nowy czat AI" + }, + "create_new_ai_chat": "Utwórz nowy czat AI", + "configuration_warnings": "Występują problemy z konfiguracją AI. SprawdÅŗ ustawienia.", + "experimental_warning": "Funkcja LLM jest obecnie eksperymentalna - zostałeś ostrzeżony.", + "selected_provider": "Wybrany dostawca", + "selected_provider_description": "Wybierz dostawcę AI dla funkcji czatu i uzupełniania", + "select_model": "Wybierz model...", + "select_provider": "Wybierz dostawcę...", + "ai_enabled": "Funkcje AI włączone", + "ai_disabled": "Funkcje AI wyłączone", + "no_models_found_online": "Nie znaleziono modeli. SprawdÅŗ swój klucz API i ustawienia.", + "no_models_found_ollama": "Nie znaleziono modeli Ollama. SprawdÅŗ, czy Ollama jest uruchomiona.", + "error_fetching": "Błąd pobierania modeli: {{error}}" + }, + "prompt": { + "title": "Monit", + "ok": "OK", + "defaultTitle": "Monit" + }, + "protected_session_password": { + "modal_title": "Sesja chroniona", + "help_title": "Pomoc dotycząca notatek chronionych", + "close_label": "Zamknij", + "form_label": "Aby kontynuować żądaną akcję, musisz rozpocząć sesję chronioną, wprowadzając hasło:", + "start_button": "Rozpocznij sesję chronioną" + }, + "recent_changes": { + "title": "Ostatnie zmiany", + "erase_notes_button": "Wymaż teraz usunięte notatki", + "deleted_notes_message": "Usunięte notatki zostały wymazane.", + "no_changes_message": "Brak zmian...", + "undelete_link": "przywróć", + "confirm_undelete": "Czy chcesz przywrócić tę notatkę i jej podnotatki?" + }, + "revisions": { + "note_revisions": "Wersje notatki", + "delete_all_revisions": "Usuń wszystkie wersje tej notatki", + "delete_all_button": "Usuń wszystkie wersje", + "help_title": "Pomoc dotycząca wersji notatki", + "revision_last_edited": "Ta wersja była ostatnio edytowana {{date}}", + "confirm_delete_all": "Czy chcesz usunąć wszystkie wersje tej notatki?", + "no_revisions": "Brak wersji dla tej notatki...", + "restore_button": "Przywróć", + "diff_on": "Pokaż różnice", + "diff_off": "Pokaż zawartość", + "diff_on_hint": "Kliknij, aby pokazać różnice w Åŗródle notatki", + "diff_off_hint": "Kliknij, aby pokazać zawartość notatki", + "diff_not_available": "Różnice nie są dostępne.", + "confirm_restore": "Czy chcesz przywrócić tę wersję? Spowoduje to nadpisanie bieżącego tytułu i zawartości notatki tą wersją.", + "delete_button": "Usuń", + "confirm_delete": "Czy chcesz usunąć tę wersję?", + "revisions_deleted": "Wersje notatki zostały usunięte.", + "revision_restored": "Wersja notatki została przywrócona.", + "revision_deleted": "Wersja notatki została usunięta.", + "snapshot_interval": "Interwał migawki wersji notatki: {{seconds}}s.", + "maximum_revisions": "Limit migawek wersji notatki: {{number}}.", + "settings": "Ustawienia wersji notatki", + "download_button": "Pobierz", + "mime": "MIME: ", + "file_size": "Rozmiar pliku:", + "preview": "Podgląd:", + "preview_not_available": "Podgląd nie jest dostępny dla tego typu notatki." + }, + "sort_child_notes": { + "sort_children_by": "Sortuj elementy podrzędne według...", + "sorting_criteria": "Kryteria sortowania", + "title": "tytuł", + "date_created": "data utworzenia", + "date_modified": "data modyfikacji", + "sorting_direction": "Kierunek sortowania", + "ascending": "rosnąco", + "descending": "malejąco", + "folders": "Foldery", + "sort_folders_at_top": "sortuj foldery na górze", + "natural_sort": "Sortowanie naturalne", + "sort_with_respect_to_different_character_sorting": "sortuj z uwzględnieniem różnych zasad sortowania znaków i zestawień w różnych językach lub regionach.", + "natural_sort_language": "Język sortowania naturalnego", + "the_language_code_for_natural_sort": "Kod języka dla sortowania naturalnego, np. \"zh-CN\" dla chińskiego.", + "sort": "Sortuj" + }, + "upload_attachments": { + "upload_attachments_to_note": "Prześlij załączniki do notatki", + "choose_files": "Wybierz pliki", + "files_will_be_uploaded": "Pliki zostaną przesłane jako załączniki do {{noteTitle}}", + "options": "Opcje", + "shrink_images": "Zmniejsz obrazy", + "upload": "Prześlij", + "tooltip": "Jeśli zaznaczysz tę opcję, Trilium spróbuje zmniejszyć przesyłane obrazy poprzez skalowanie i optymalizację, co może wpłynąć na postrzeganą jakość obrazu. Jeśli opcja nie jest zaznaczona, obrazy zostaną przesłane bez zmian." + }, + "attribute_editor": { + "help_text_body1": "Aby dodać etykietę, po prostu wpisz np. #rock lub jeśli chcesz dodać również wartość, to np. #year = 2020", + "help_text_body2": "Dla relacji wpisz ~author = @, co powinno wywołać autouzupełnianie, w którym możesz wyszukać żądaną notatkę.", + "help_text_body3": "Alternatywnie możesz dodać etykietę i relację za pomocą przycisku + po prawej stronie.", + "save_attributes": "Zapisz atrybuty ", + "add_a_new_attribute": "Dodaj nowy atrybut", + "add_new_label": "Dodaj nową etykietę ", + "add_new_relation": "Dodaj nową relację ", + "add_new_label_definition": "Dodaj nową definicję etykiety", + "add_new_relation_definition": "Dodaj nową definicję relacji", + "placeholder": "Wpisz tutaj etykiety i relacje" + }, + "abstract_bulk_action": { + "remove_this_search_action": "Usuń tę akcję wyszukiwania" + }, + "execute_script": { + "execute_script": "Wykonaj skrypt", + "help_text": "Możesz wykonywać proste skrypty na dopasowanych notatkach.", + "example_1": "Na przykład, aby dołączyć ciąg znaków do tytułu notatki, użyj tego małego skryptu:", + "example_2": "Bardziej złożonym przykładem byłoby usunięcie wszystkich atrybutów dopasowanej notatki:" + }, + "delete_label": { + "delete_label": "Usuń etykietę", + "label_name_placeholder": "nazwa etykiety", + "label_name_title": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek." + }, + "rename_label": { + "rename_label": "Zmień nazwę etykiety", + "rename_label_from": "Zmień nazwę etykiety z", + "old_name_placeholder": "stara nazwa", + "to": "Na", + "new_name_placeholder": "nowa nazwa", + "name_title": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek." + }, + "update_label_value": { + "update_label_value": "Zaktualizuj wartość etykiety", + "label_name_placeholder": "nazwa etykiety", + "label_name_title": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.", + "to_value": "do wartości", + "new_value_placeholder": "nowa wartość", + "help_text": "We wszystkich dopasowanych notatkach zmień wartość istniejącej etykiety.", + "help_text_note": "Możesz również wywołać tę metodę bez wartości, w takim przypadku etykieta zostanie przypisana do notatki bez wartości." + }, + "delete_note": { + "delete_note": "Usuń notatkę", + "delete_matched_notes": "Usuń dopasowane notatki", + "delete_matched_notes_description": "Spowoduje to usunięcie dopasowanych notatek.", + "undelete_notes_instruction": "Po usunięciu można je przywrócić z okna dialogowego Ostatnie zmiany.", + "erase_notes_instruction": "Aby trwale usunąć notatki, możesz po usunięciu przejść do Opcje -> Inne i kliknąć przycisk \"Wymaż teraz usunięte notatki\"." + }, + "delete_revisions": { + "delete_note_revisions": "Usuń wersje notatek", + "all_past_note_revisions": "Wszystkie przeszłe wersje dopasowanych notatek zostaną usunięte. Sama notatka zostanie w pełni zachowana. Innymi słowy, historia notatki zostanie usunięta." + }, + "move_note": { + "move_note": "Przenieś notatkę", + "to": "do", + "target_parent_note": "docelowa notatka nadrzędna", + "on_all_matched_notes": "We wszystkich dopasowanych notatkach", + "move_note_new_parent": "przenieś notatkę do nowego rodzica, jeśli notatka ma tylko jednego rodzica (tj. stara gałąź jest usuwana, a nowa gałąź do nowego rodzica jest tworzona)", + "clone_note_new_parent": "sklonuj notatkę do nowego rodzica, jeśli notatka ma wiele klonów/gałęzi (nie jest jasne, która gałąź powinna zostać usunięta)", + "nothing_will_happen": "nic się nie stanie, jeśli notatka nie może być przeniesiona do notatki docelowej (tj. spowodowałoby to cykl w drzewie)" + }, + "rename_note": { + "rename_note": "Zmień nazwę notatki", + "rename_note_title_to": "Zmień tytuł notatki na", + "new_note_title": "nowy tytuł notatki", + "click_help_icon": "Kliknij ikonę pomocy po prawej stronie, aby zobaczyć wszystkie opcje", + "evaluated_as_js_string": "Podana wartość jest oceniana jako ciąg znaków JavaScript i dlatego może być wzbogacona o dynamiczną treść za pomocą wstrzykniętej zmiennej note (notatka, której nazwa jest zmieniana). Przykłady:", + "example_note": "Notatka - wszystkie dopasowane notatki mają zmienioną nazwę na 'Notatka'", + "example_new_title": "NOWY: ${note.title} - tytuły dopasowanych notatek są poprzedzone prefiksem 'NOWY: '", + "example_date_prefix": "${note.dateCreatedObj.format('MM-DD:')}: ${note.title} - dopasowane notatki są poprzedzone prefiksem miesiąc-dzień utworzenia notatki", + "api_docs": "Zobacz dokumentację API dla note i jej właściwości dateCreatedObj / utcDateCreatedObj, aby uzyskać szczegółowe informacje." + }, + "delete_relation": { + "delete_relation": "Usuń relację", + "relation_name": "nazwa relacji", + "allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek." + }, + "rename_relation": { + "rename_relation": "Zmień nazwę relacji", + "rename_relation_from": "Zmień nazwę relacji z", + "old_name": "stara nazwa", + "to": "Na", + "new_name": "nowa nazwa", + "allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek." + }, + "update_relation_target": { + "update_relation": "Zaktualizuj relację", + "relation_name": "nazwa relacji", + "allowed_characters": "Dozwolone są znaki alfanumeryczne, podkreślenie i dwukropek.", + "to": "do", + "target_note": "notatka docelowa", + "on_all_matched_notes": "We wszystkich dopasowanych notatkach", + "change_target_note": "zmień notatkę docelową istniejącej relacji", + "update_relation_target": "Zaktualizuj cel relacji" + }, + "attachments_actions": { + "open_externally": "Otwórz zewnętrznie", + "open_externally_title": "Plik zostanie otwarty w zewnętrznej aplikacji i będzie obserwowany pod kątem zmian. Następnie będziesz mógł przesłać zmodyfikowaną wersję z powrotem do Trilium.", + "open_custom": "Otwórz niestandardowo", + "open_custom_title": "Plik zostanie otwarty w zewnętrznej aplikacji i będzie obserwowany pod kątem zmian. Następnie będziesz mógł przesłać zmodyfikowaną wersję z powrotem do Trilium.", + "download": "Pobierz", + "rename_attachment": "Zmień nazwę załącznika", + "upload_new_revision": "Prześlij nową wersję", + "copy_link_to_clipboard": "Kopiuj link do schowka", + "convert_attachment_into_note": "Konwertuj załącznik na notatkę", + "delete_attachment": "Usuń załącznik", + "upload_success": "Nowa wersja załącznika została przesłana.", + "upload_failed": "Przesyłanie nowej wersji załącznika nie powiodło się.", + "open_externally_detail_page": "Otwieranie załącznika zewnętrznie jest dostępne tylko ze strony szczegółów, najpierw kliknij szczegóły załącznika i powtórz akcję.", + "open_custom_client_only": "Niestandardowe otwieranie załączników można wykonać tylko z klienta stacjonarnego.", + "delete_confirm": "Czy na pewno chcesz usunąć załącznik '{{title}}'?", + "delete_success": "Załącznik '{{title}}' został usunięty.", + "convert_confirm": "Czy na pewno chcesz przekonwertować załącznik '{{title}}' na osobną notatkę?", + "convert_success": "Załącznik '{{title}}' został przekonwertowany na notatkę.", + "enter_new_name": "WprowadÅŗ nową nazwę załącznika" + }, + "calendar": { + "mon": "Pon", + "tue": "Wt", + "wed": "Śr", + "thu": "Czw", + "fri": "Pt", + "sat": "Sob", + "sun": "Niedz", + "cannot_find_day_note": "Nie można znaleźć notatki dziennej", + "cannot_find_week_note": "Nie można znaleźć notatki tygodniowej", + "january": "Styczeń", + "february": "Luty", + "march": "Marzec", + "april": "Kwiecień", + "may": "Maj", + "june": "Czerwiec", + "july": "Lipiec", + "august": "Sierpień", + "september": "Wrzesień", + "october": "PaÅŗdziernik", + "november": "Listopad", + "december": "Grudzień", + "week": "Tydzień", + "week_previous": "Poprzedni tydzień", + "week_next": "Następny tydzień", + "month": "Miesiąc", + "month_previous": "Poprzedni miesiąc", + "month_next": "Następny miesiąc", + "year": "Rok", + "year_previous": "Poprzedni rok", + "year_next": "Następny rok", + "list": "Lista", + "today": "Dzisiaj" + }, + "close_pane_button": { + "close_this_pane": "Zamknij ten panel" + }, + "create_pane_button": { + "create_new_split": "Utwórz nowy podział" + }, + "edit_button": { + "edit_this_note": "Edytuj tę notatkę" + }, + "show_toc_widget_button": { + "show_toc": "Pokaż spis treści" + }, + "show_highlights_list_widget_button": { + "show_highlights_list": "Pokaż listę wyróżnień" + }, + "global_menu": { + "menu": "Menu", + "options": "Opcje", + "open_new_window": "Otwórz nowe okno", + "switch_to_mobile_version": "Przełącz na wersję mobilną", + "switch_to_desktop_version": "Przełącz na wersję stacjonarną", + "zoom": "Powiększenie", + "toggle_fullscreen": "Przełącz pełny ekran", + "zoom_out": "Pomniejsz", + "reset_zoom_level": "Zresetuj poziom powiększenia", + "zoom_in": "Powiększ", + "configure_launchbar": "Skonfiguruj pasek uruchamiania", + "show_shared_notes_subtree": "Pokaż poddrzewo udostępnionych notatek", + "advanced": "Zaawansowane", + "open_dev_tools": "Otwórz narzędzia deweloperskie", + "open_sql_console": "Otwórz konsolę SQL", + "open_sql_console_history": "Otwórz historię konsoli SQL", + "open_search_history": "Otwórz historię wyszukiwania", + "show_backend_log": "Pokaż logi backendu", + "reload_hint": "Przeładowanie może pomóc w niektórych problemach wizualnych bez ponownego uruchamiania całej aplikacji.", + "reload_frontend": "Przeładuj frontend", + "show_hidden_subtree": "Pokaż ukryte poddrzewo", + "show_help": "Pokaż pomoc", + "about": "O notatkach Trilium", + "logout": "Wyloguj", + "show-cheatsheet": "Pokaż ściągawkę", + "toggle-zen-mode": "Tryb Zen", + "new-version-available": "Dostępna nowa aktualizacja", + "download-update": "Pobierz wersję {{latestVersion}}" + }, + "zen_mode": { + "button_exit": "WyjdÅŗ z trybu Zen" + }, + "sync_status": { + "unknown": "

Status synchronizacji będzie znany po rozpoczęciu następnej próby synchronizacji.

Kliknij, aby wywołać synchronizację teraz.

", + "connected_with_changes": "

Połączono z serwerem synchronizacji.
Istnieją pewne oczekujące zmiany, które należy zsynchronizować.

Kliknij, aby wywołać synchronizację.

", + "connected_no_changes": "

Połączono z serwerem synchronizacji.
Wszystkie zmiany zostały już zsynchronizowane.

Kliknij, aby wywołać synchronizację.

", + "disconnected_with_changes": "

Nawiązanie połączenia z serwerem synchronizacji nie powiodło się.
Istnieją pewne oczekujące zmiany, które należy zsynchronizować.

Kliknij, aby wywołać synchronizację.

", + "disconnected_no_changes": "

Nawiązanie połączenia z serwerem synchronizacji nie powiodło się.
Wszystkie znane zmiany zostały zsynchronizowane.

Kliknij, aby wywołać synchronizację.

", + "in_progress": "Synchronizacja z serwerem jest w toku." + }, + "left_pane_toggle": { + "show_panel": "Pokaż panel", + "hide_panel": "Ukryj panel" + }, + "move_pane_button": { + "move_left": "Przesuń w lewo", + "move_right": "Przesuń w prawo" + }, + "note_actions": { + "convert_into_attachment": "Konwertuj na załącznik", + "re_render_note": "Wyrenderuj ponownie notatkę", + "search_in_note": "Szukaj w notatce", + "note_source": "Źródło notatki", + "note_attachments": "Załączniki notatki", + "open_note_externally": "Otwórz notatkę zewnętrznie", + "open_note_externally_title": "Plik zostanie otwarty w zewnętrznej aplikacji i będzie obserwowany pod kątem zmian. Następnie będziesz mógł przesłać zmodyfikowaną wersję z powrotem do Trilium.", + "open_note_custom": "Otwórz notatkę niestandardowo", + "import_files": "Importuj pliki", + "export_note": "Eksportuj notatkę", + "delete_note": "Usuń notatkę", + "print_note": "Drukuj notatkę", + "save_revision": "Zapisz wersję", + "convert_into_attachment_failed": "Konwersja notatki '{{title}}' nie powiodła się.", + "convert_into_attachment_successful": "Notatka '{{title}}' została przekonwertowana na załącznik.", + "convert_into_attachment_prompt": "Czy na pewno chcesz przekonwertować notatkę '{{title}}' na załącznik notatki nadrzędnej?", + "print_pdf": "Eksportuj jako PDF..." + }, + "onclick_button": { + "no_click_handler": "Widżet przycisku '{{componentId}}' nie ma zdefiniowanego obsługi kliknięcia" + }, + "protected_session_status": { + "active": "Sesja chroniona jest aktywna. Kliknij, aby opuścić sesję chronioną.", + "inactive": "Kliknij, aby wejść w sesję chronioną" + }, + "revisions_button": { + "note_revisions": "Wersje notatki" + }, + "update_available": { + "update_available": "Dostępna aktualizacja" + }, + "note_launcher": { + "this_launcher_doesnt_define_target_note": "Ten program uruchamiający nie definiuje notatki docelowej." + }, + "code_buttons": { + "execute_button_title": "Wykonaj skrypt", + "trilium_api_docs_button_title": "Otwórz dokumentację API Trilium", + "save_to_note_button_title": "Zapisz do notatki", + "opening_api_docs_message": "Otwieranie dokumentacji API...", + "sql_console_saved_message": "Notatka konsoli SQL została zapisana w {{note_path}}" + }, + "copy_image_reference_button": { + "button_title": "Kopiuj odniesienie do obrazu do schowka, można je wkleić do notatki tekstowej." + }, + "hide_floating_buttons_button": { + "button_title": "Ukryj przyciski" + }, + "show_floating_buttons_button": { + "button_title": "Pokaż przyciski" + }, + "svg_export_button": { + "button_title": "Eksportuj diagram jako SVG" + }, + "relation_map_buttons": { + "create_child_note_title": "Utwórz nową notatkę podrzędną i dodaj ją do tej mapy relacji", + "reset_pan_zoom_title": "Zresetuj przesuwanie i powiększanie do początkowych współrzędnych i powiększenia", + "zoom_in_title": "Powiększ", + "zoom_out_title": "Pomniejsz" + }, + "zpetne_odkazy": { + "backlink": "{{count}} Backlink", + "backlinks": "{{count}} Backlinków", + "relation": "relacja" + }, + "mobile_detail_menu": { + "insert_child_note": "Wstaw notatkę podrzędną", + "delete_this_note": "Usuń tę notatkę", + "note_revisions": "Wersje notatki", + "error_cannot_get_branch_id": "Nie można uzyskać branchId dla notePath '{{notePath}}'", + "error_unrecognized_command": "Nierozpoznane polecenie {{command}}" + }, + "note_icon": { + "change_note_icon": "Zmień ikonę notatki", + "category": "Kategoria:", + "search": "Szukaj:", + "reset-default": "Zresetuj do domyślnej ikony" + }, + "basic_properties": { + "note_type": "Typ notatki", + "editable": "Edytowalny", + "basic_properties": "Podstawowe właściwości", + "language": "Język", + "configure_code_notes": "Skonfiguruj notatki kodowe..." + }, + "edited_notes": { + "no_edited_notes_found": "Brak edytowanych notatek tego dnia...", + "title": "Edytowane notatki", + "deleted": "(usunięto)" + }, + "include_archived_notes": { + "include_archived_notes": "Uwzględnij zarchiwizowane notatki" + }, + "order_by": { + "order_by": "Sortuj według", + "relevancy": "Trafność (domyślnie)", + "title": "Tytuł", + "date_created": "Data utworzenia", + "date_modified": "Data ostatniej modyfikacji", + "content_size": "Rozmiar zawartości notatki", + "content_and_attachments_size": "Rozmiar zawartości notatki wraz z załącznikami", + "content_and_attachments_and_revisions_size": "Rozmiar zawartości notatki wraz z załącznikami i wersjami", + "revision_count": "Liczba wersji", + "children_count": "Liczba notatek podrzędnych", + "parent_count": "Liczba klonów", + "owned_label_count": "Liczba etykiet", + "owned_relation_count": "Liczba relacji", + "target_relation_count": "Liczba relacji wskazujących na notatkę", + "random": "Kolejność losowa", + "asc": "Rosnąco (domyślnie)", + "desc": "Malejąco" + }, + "search_script": { + "title": "Skrypt wyszukiwania:", + "placeholder": "szukaj notatki po jej nazwie", + "description1": "Skrypt wyszukiwania pozwala zdefiniować wyniki wyszukiwania poprzez uruchomienie skryptu. Zapewnia to maksymalną elastyczność, gdy standardowe wyszukiwanie nie wystarcza.", + "description2": "Skrypt wyszukiwania musi być typu \"kod\" i podtypu \"JavaScript backend\". Skrypt musi zwrócić tablicę noteIds lub notatek.", + "example_title": "Zobacz ten przykład:", + "example_code": "// 1. wstępne filtrowanie za pomocą standardowego wyszukiwania\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. zastosowanie niestandardowych kryteriów wyszukiwania\nconst matchedNotes = candidateNotes\n .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;", + "note": "Pamiętaj, że skrypt wyszukiwania i ciąg wyszukiwania nie mogą być łączone ze sobą." + }, + "search_string": { + "title_column": "Ciąg wyszukiwania:", + "placeholder": "słowa kluczowe pełnotekstowe, #tag = wartość...", + "search_syntax": "Składnia wyszukiwania", + "also_see": "zobacz również", + "complete_help": "pełna pomoc dotycząca składni wyszukiwania", + "full_text_search": "Wpisz dowolny tekst do wyszukiwania pełnotekstowego", + "label_abc": "zwraca notatki z etykietą abc", + "label_year": "dopasowuje notatki z etykietą rok o wartości 2019", + "label_rock_pop": "dopasowuje notatki, które mają zarówno etykiety rock, jak i pop", + "label_rock_or_pop": "musi być obecna tylko jedna z etykiet", + "label_year_comparison": "porównanie numeryczne (również >, >=, <).", + "label_date_created": "notatki utworzone w ostatnim miesiącu", + "error": "Błąd wyszukiwania: {{error}}", + "search_prefix": "Szukaj:" + }, + "attachment_detail": { + "open_help_page": "Otwórz stronę pomocy dotyczącą załączników", + "owning_note": "Notatka nadrzędna: ", + "you_can_also_open": ", możesz również otworzyć ", + "list_of_all_attachments": "Listę wszystkich załączników", + "attachment_deleted": "Ten załącznik został usunięty." + }, + "attachment_list": { + "open_help_page": "Otwórz stronę pomocy dotyczącą załączników", + "owning_note": "Notatka nadrzędna: ", + "upload_attachments": "Prześlij załączniki", + "no_attachments": "Ta notatka nie ma załączników." + }, + "book": { + "no_children_help": "Ta kolekcja nie ma żadnych notatek podrzędnych, więc nie ma nic do wyświetlenia. Zobacz wiki, aby uzyskać szczegółowe informacje.", + "drag_locked_title": "Zablokowano do edycji", + "drag_locked_message": "Przeciąganie niedozwolone, ponieważ kolekcja jest zablokowana do edycji." + }, + "editable_code": { + "placeholder": "Wpisz tutaj treść swojej notatki kodowej..." + }, + "editable_text": { + "placeholder": "Wpisz tutaj treść swojej notatki..." + }, + "empty": { + "open_note_instruction": "Otwórz notatkę, wpisując jej tytuł w poniższe pole lub wybierz notatkę z drzewa.", + "search_placeholder": "szukaj notatki po jej nazwie", + "enter_workspace": "WejdÅŗ do obszaru roboczego {{title}}" + }, + "file": { + "file_preview_not_available": "Podgląd pliku nie jest dostępny dla tego formatu.", + "too_big": "Podgląd pokazuje tylko pierwsze {{maxNumChars}} znaków pliku ze względów wydajnościowych. Pobierz plik i otwórz go zewnętrznie, aby zobaczyć całą zawartość." + }, + "protected_session": { + "enter_password_instruction": "Wyświetlenie chronionej notatki wymaga wprowadzenia hasła:", + "start_session_button": "Rozpocznij sesję chronioną enter", + "started": "Sesja chroniona została rozpoczęta.", + "wrong_password": "Nieprawidłowe hasło.", + "protecting-finished-successfully": "Ochrona zakończona pomyślnie.", + "unprotecting-finished-successfully": "Odblokowywanie zakończone pomyślnie.", + "protecting-in-progress": "Ochrona w toku: {{count}}", + "unprotecting-in-progress-count": "Odblokowywanie w toku: {{count}}", + "protecting-title": "Status ochrony", + "unprotecting-title": "Status odblokowywania" + }, + "relation_map": { + "open_in_new_tab": "Otwórz w nowej karcie", + "remove_note": "Usuń notatkę", + "edit_title": "Edytuj tytuł", + "rename_note": "Zmień nazwę notatki", + "enter_new_title": "WprowadÅŗ nowy tytuł notatki:", + "remove_relation": "Usuń relację", + "confirm_remove_relation": "Czy na pewno chcesz usunąć tę relację?", + "specify_new_relation_name": "Określ nową nazwę relacji (dozwolone znaki: alfanumeryczne, dwukropek i podkreślenie):", + "connection_exists": "Połączenie '{{name}}' między tymi notatkami już istnieje.", + "start_dragging_relations": "Zacznij przeciągać stąd relacje i upuść je na inną notatkę.", + "note_not_found": "Nie znaleziono notatki {{noteId}}!", + "cannot_match_transform": "Nie można dopasować transformacji: {{transform}}", + "note_already_in_diagram": "Notatka \"{{title}}\" jest już na diagramie.", + "enter_title_of_new_note": "WprowadÅŗ tytuł nowej notatki", + "default_new_note_title": "nowa notatka", + "click_on_canvas_to_place_new_note": "Kliknij na płótno, aby umieścić nową notatkę" + }, + "render": { + "note_detail_render_help_1": "Ta notatka pomocy jest wyświetlana, ponieważ ta notatka typu Renderuj HTML nie ma wymaganej relacji do prawidłowego działania.", + "note_detail_render_help_2": "Typ notatki Renderuj HTML jest używany do skryptowania. W skrócie, masz notatkę kodu HTML (opcjonalnie z pewnym JavaScriptem), a ta notatka ją wyrenderuje. Aby to zadziałało, musisz zdefiniować relację o nazwie \"renderNote\" wskazującą na notatkę HTML do wyrenderowania." + }, + "web_view": { + "web_view": "Widok sieciowy", + "embed_websites": "Notatka typu Widok sieciowy pozwala na osadzanie stron internetowych w Trilium.", + "create_label": "Aby rozpocząć, utwórz etykietę z adresem URL, który chcesz osadzić, np. #webViewSrc=\"https://www.google.com\"" + }, + "backend_log": { + "refresh": "Odśwież" + }, + "consistency_checks": { + "title": "Sprawdzanie spójności", + "find_and_fix_button": "ZnajdÅŗ i napraw problemy ze spójnością", + "finding_and_fixing_message": "Znajdowanie i naprawianie problemów ze spójnością...", + "issues_fixed_message": "Wszelkie problemy ze spójnością, które mogły zostać znalezione, są teraz naprawione." + }, + "database_anonymization": { + "title": "Anonimizacja bazy danych", + "full_anonymization": "Pełna anonimizacja", + "full_anonymization_description": "Ta akcja utworzy nową kopię bazy danych i zanonimizuje ją (usunie całą zawartość notatek, pozostawiając tylko strukturę i niektóre niewrażliwe metadane) w celu udostępnienia online do celów debugowania bez obawy o wyciek danych osobowych.", + "save_fully_anonymized_database": "Zapisz w pełni zanonimizowaną bazę danych", + "light_anonymization": "Lekka anonimizacja", + "light_anonymization_description": "Ta akcja utworzy nową kopię bazy danych i przeprowadzi na niej lekką anonimizację — w szczególności usunięta zostanie tylko zawartość wszystkich notatek, ale tytuły i atrybuty pozostaną. Dodatkowo niestandardowe notatki skryptów JS frontend/backend oraz niestandardowe widżety pozostaną. Zapewnia to więcej kontekstu do debugowania problemów.", + "choose_anonymization": "Możesz sam zdecydować, czy chcesz udostępnić w pełni, czy lekko zanonimizowaną bazę danych. Nawet w pełni zanonimizowana baza danych jest bardzo przydatna, jednak w niektórych przypadkach lekko zanonimizowana baza danych może przyspieszyć proces identyfikacji i naprawy błędów.", + "save_lightly_anonymized_database": "Zapisz lekko zanonimizowaną bazę danych", + "existing_anonymized_databases": "Istniejące zanonimizowane bazy danych", + "creating_fully_anonymized_database": "Tworzenie w pełni zanonimizowanej bazy danych...", + "creating_lightly_anonymized_database": "Tworzenie lekko zanonimizowanej bazy danych...", + "error_creating_anonymized_database": "Nie można utworzyć zanonimizowanej bazy danych, sprawdÅŗ logi backendu, aby uzyskać szczegółowe informacje", + "successfully_created_fully_anonymized_database": "Utworzono w pełni zanonimizowaną bazę danych w {{anonymizedFilePath}}", + "successfully_created_lightly_anonymized_database": "Utworzono lekko zanonimizowaną bazę danych w {{anonymizedFilePath}}", + "no_anonymized_database_yet": "Brak jeszcze zanonimizowanej bazy danych." + }, + "database_integrity_check": { + "title": "Sprawdzanie integralności bazy danych", + "description": "Sprawdzi to, czy baza danych nie jest uszkodzona na poziomie SQLite. Może to zająć trochę czasu, w zależności od rozmiaru bazy danych.", + "check_button": "SprawdÅŗ integralność bazy danych", + "checking_integrity": "Sprawdzanie integralności bazy danych...", + "integrity_check_succeeded": "Sprawdzanie integralności zakończyło się pomyślnie - nie znaleziono żadnych problemów.", + "integrity_check_failed": "Sprawdzanie integralności nie powiodło się: {{results}}" + }, + "sync": { + "title": "Synchronizacja", + "force_full_sync_button": "Wymuś pełną synchronizację", + "fill_entity_changes_button": "Wypełnij rekordy zmian encji", + "full_sync_triggered": "Wywołano pełną synchronizację", + "filling_entity_changes": "Wypełnianie wierszy zmian encji...", + "sync_rows_filled_successfully": "Wiersze synchronizacji wypełnione pomyślnie", + "finished-successfully": "Synchronizacja zakończona pomyślnie.", + "failed": "Synchronizacja nie powiodła się: {{message}}" + }, + "vacuum_database": { + "title": "Odkurzanie bazy danych", + "description": "Spowoduje to przebudowanie bazy danych, co zazwyczaj skutkuje mniejszym plikiem bazy danych. Å»adne dane nie zostaną faktycznie zmienione.", + "button_text": "Odkurz bazę danych", + "vacuuming_database": "Odkurzanie bazy danych...", + "database_vacuumed": "Baza danych została odkurzona" + }, + "fonts": { + "theme_defined": "Zdefiniowane przez motyw", + "fonts": "Czcionki", + "main_font": "Główna czcionka", + "font_family": "Rodzina czcionek", + "size": "Rozmiar", + "note_tree_font": "Czcionka drzewa notatek", + "note_detail_font": "Czcionka szczegółów notatki", + "monospace_font": "Czcionka monospaced (kod)", + "note_tree_and_detail_font_sizing": "Pamiętaj, że rozmiar czcionki drzewa i szczegółów jest względny w stosunku do ustawienia rozmiaru czcionki głównej.", + "not_all_fonts_available": "Nie wszystkie wymienione czcionki mogą być dostępne w Twoim systemie.", + "apply_font_changes": "Aby zastosować zmiany czcionki, kliknij na", + "reload_frontend": "przeładuj frontend", + "generic-fonts": "Czcionki generyczne", + "sans-serif-system-fonts": "Czcionki systemowe bezszeryfowe", + "serif-system-fonts": "Czcionki systemowe szeryfowe", + "monospace-system-fonts": "Czcionki systemowe monospaced", + "handwriting-system-fonts": "Czcionki systemowe odręczne", + "serif": "Szeryfowa", + "sans-serif": "Bezszeryfowa", + "monospace": "Monospaced", + "system-default": "Domyślna systemowa" + }, + "max_content_width": { + "title": "Szerokość zawartości", + "default_description": "Trilium domyślnie ogranicza maksymalną szerokość zawartości, aby poprawić czytelność na zmaksymalizowanych ekranach o dużej szerokości.", + "max_width_label": "Maksymalna szerokość zawartości", + "max_width_unit": "piksele", + "apply_changes_description": "Aby zastosować zmiany szerokości zawartości, kliknij na", + "reload_button": "przeładuj frontend", + "reload_description": "zmiany z opcji wyglądu" + }, + "native_title_bar": { + "title": "Natywny pasek tytułu (wymaga ponownego uruchomienia aplikacji)", + "enabled": "włączony", + "disabled": "wyłączony" + }, + "ribbon": { + "widgets": "Widżety wstążki", + "promoted_attributes_message": "Karta wstążki Promowane atrybuty otworzy się automatycznie, jeśli na notatce znajdują się promowane atrybuty", + "edited_notes_message": "Karta wstążki Edytowane notatki otworzy się automatycznie w notatkach dziennych" + }, + "theme": { + "title": "Motyw aplikacji", + "theme_label": "Motyw", + "override_theme_fonts_label": "Nadpisz czcionki motywu", + "auto_theme": "Starszy (Dostosuj do schematu kolorów systemu)", + "light_theme": "Starszy (Jasny)", + "dark_theme": "Starszy (Ciemny)", + "triliumnext": "Trilium (Dostosuj do schematu kolorów systemu)", + "triliumnext-light": "Trilium (Jasny)", + "triliumnext-dark": "Trilium (Ciemny)", + "layout": "Układ", + "layout-vertical-title": "Pionowy", + "layout-horizontal-title": "Poziomy", + "layout-vertical-description": "pasek uruchamiania znajduje się po lewej stronie (domyślnie)", + "layout-horizontal-description": "pasek uruchamiania znajduje się pod paskiem kart, pasek kart ma teraz pełną szerokość." + }, + "ui-performance": { + "title": "Wydajność", + "enable-motion": "Włącz przejścia i animacje", + "enable-shadows": "Włącz cienie", + "enable-backdrop-effects": "Włącz efekty tła dla menu, wyskakujących okien i paneli", + "enable-smooth-scroll": "Włącz płynne przewijanie", + "app-restart-required": "(ponowne uruchomienie aplikacji jest wymagane, aby zmiana zaczęła obowiązywać)" + }, + "zoom_factor": { + "title": "Współczynnik powiększenia (tylko w wersji stacjonarnej)", + "description": "Powiększanie można również kontrolować za pomocą skrótów CTRL+- i CTRL+=" + }, + "code_auto_read_only_size": { + "title": "Automatyczny rozmiar tylko do odczytu", + "description": "Automatyczny rozmiar notatki tylko do odczytu to rozmiar, po którym notatki będą wyświetlane w trybie tylko do odczytu (ze względów wydajnościowych).", + "label": "Automatyczny rozmiar tylko do odczytu (notatki kodowe)", + "unit": "znaki" + }, + "code-editor-options": { + "title": "Edytor" + }, + "code_mime_types": { + "title": "Dostępne typy MIME w rozwijanym menu" + }, + "vim_key_bindings": { + "use_vim_keybindings_in_code_notes": "Skróty klawiszowe Vim", + "enable_vim_keybindings": "Włącz skróty klawiszowe Vim w notatkach kodowych (bez trybu ex)" + }, + "wrap_lines": { + "wrap_lines_in_code_notes": "Zawijaj wiersze w notatkach kodowych", + "enable_line_wrap": "Włącz zawijanie wierszy (zmiana może wymagać ponownego załadowania frontendu, aby zaczęła obowiązywać)" + }, + "images": { + "images_section_title": "Obrazy", + "download_images_automatically": "Pobieraj obrazy automatycznie do użytku offline.", + "download_images_description": "Wklejony HTML może zawierać odniesienia do obrazów online, Trilium znajdzie te odniesienia i pobierze obrazy, aby były dostępne offline.", + "enable_image_compression": "Włącz kompresję obrazów", + "max_image_dimensions": "Maksymalna szerokość / wysokość obrazu (obraz zostanie przeskalowany, jeśli przekroczy to ustawienie).", + "max_image_dimensions_unit": "piksele", + "jpeg_quality_description": "Jakość JPEG (10 - najgorsza jakość, 100 - najlepsza jakość, 50 - 85 jest zalecane)" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "Limit czasu usuwania załączników", + "attachment_auto_deletion_description": "Załączniki są automatycznie usuwane (i wymazywane), jeśli nie są już powiązane z ich notatką po określonym czasie.", + "erase_attachments_after": "Wymaż nieużywane załączniki po:", + "manual_erasing_description": "Możesz również wywołać wymazywanie ręcznie (bez uwzględniania powyższego limitu czasu):", + "erase_unused_attachments_now": "Wymaż teraz nieużywane załączniki", + "unused_attachments_erased": "Nieużywane załączniki zostały wymazane." + }, + "network_connections": { + "network_connections_title": "Połączenia sieciowe", + "check_for_updates": "Sprawdzaj aktualizacje automatycznie" + }, + "note_erasure_timeout": { + "note_erasure_timeout_title": "Limit czasu usuwania notatek", + "note_erasure_description": "Usunięte notatki (i atrybuty, wersje...) są na początku tylko oznaczane jako usunięte i można je odzyskać z okna dialogowego Ostatnie notatki. Po pewnym czasie usunięte notatki są \"wymazywane\", co oznacza, że ich zawartość nie jest już możliwa do odzyskania. To ustawienie pozwala skonfigurować długość okresu między usunięciem a wymazaniem notatki.", + "erase_notes_after": "Wymaż notatki po:", + "manual_erasing_description": "Możesz również wywołać wymazywanie ręcznie (bez uwzględniania powyższego limitu czasu):", + "erase_deleted_notes_now": "Wymaż teraz usunięte notatki", + "deleted_notes_erased": "Usunięte notatki zostały wymazane." + }, + "revisions_snapshot_interval": { + "note_revisions_snapshot_interval_title": "Interwał migawki wersji notatki", + "note_revisions_snapshot_description": "Interwał migawki wersji notatki to czas, po którym dla notatki zostanie utworzona nowa wersja. Zobacz wiki, aby uzyskać więcej informacji.", + "snapshot_time_interval_label": "Interwał czasowy migawki wersji notatki:" + }, + "revisions_snapshot_limit": { + "note_revisions_snapshot_limit_title": "Limit migawek wersji notatki", + "note_revisions_snapshot_limit_description": "Limit liczby migawek wersji notatki odnosi się do maksymalnej liczby wersji, które można zapisać dla każdej notatki. Gdzie -1 oznacza brak limitu, 0 oznacza usunięcie wszystkich wersji. Możesz ustawić maksymalną liczbę wersji dla pojedynczej notatki za pomocą etykiety #versioningLimit.", + "snapshot_number_limit_label": "Limit liczby migawek wersji notatki:", + "snapshot_number_limit_unit": "migawki", + "erase_excess_revision_snapshots": "Wymaż teraz nadmiarowe migawki wersji", + "erase_excess_revision_snapshots_prompt": "Nadmiarowe migawki wersji zostały wymazane." + }, + "search_engine": { + "title": "Wyszukiwarka", + "custom_search_engine_info": "Niestandardowa wyszukiwarka wymaga ustawienia zarówno nazwy, jak i adresu URL. Jeśli którykolwiek z nich nie jest ustawiony, domyślną wyszukiwarką będzie DuckDuckGo.", + "predefined_templates_label": "Predefiniowane szablony wyszukiwarek", + "bing": "Bing", + "baidu": "Baidu", + "duckduckgo": "DuckDuckGo", + "google": "Google", + "custom_name_label": "Niestandardowa nazwa wyszukiwarki", + "custom_name_placeholder": "Dostosuj nazwę wyszukiwarki", + "custom_url_label": "Niestandardowy adres URL wyszukiwarki powinien zawierać {keyword} jako symbol zastępczy dla wyszukiwanego terminu.", + "custom_url_placeholder": "Dostosuj adres URL wyszukiwarki", + "save_button": "Zapisz" + }, + "tray": { + "title": "Zasobnik systemowy", + "enable_tray": "Włącz zasobnik (zmiana ta wymaga ponownego uruchomienia Trilium, aby zaczęła obowiązywać)" + }, + "heading_style": { + "title": "Styl nagłówka", + "plain": "Zwykły", + "underline": "Podkreślenie", + "markdown": "Styl Markdown" + }, + "highlights_list": { + "title": "Lista wyróżnień", + "description": "Możesz dostosować listę wyróżnień wyświetlaną w prawym panelu:", + "bold": "Pogrubiony tekst", + "italic": "Kursywa", + "underline": "Podkreślony tekst", + "color": "Kolorowy tekst", + "bg_color": "Tekst z kolorem tła", + "visibility_title": "Widoczność listy wyróżnień", + "visibility_description": "Możesz ukryć widżet wyróżnień dla poszczególnych notatek, dodając etykietę #hideHighlightWidget.", + "shortcut_info": "Możesz skonfigurować skrót klawiaturowy do szybkiego przełączania prawego panelu (w tym wyróżnień) w Opcje -> Skróty (nazwa 'toggleRightPane')." + }, + "table_of_contents": { + "title": "Spis treści", + "description": "Spis treści pojawi się w notatkach tekstowych, gdy notatka ma więcej niż zdefiniowaną liczbę nagłówków. Możesz dostosować tę liczbę:", + "unit": "nagłówki", + "disable_info": "Możesz również użyć tej opcji, aby skutecznie wyłączyć spis treści, ustawiając bardzo wysoką liczbę.", + "shortcut_info": "Możesz skonfigurować skrót klawiaturowy do szybkiego przełączania prawego panelu (w tym spisu treści) w Opcje -> Skróty (nazwa 'toggleRightPane')." + }, + "text_auto_read_only_size": { + "title": "Automatyczny rozmiar tylko do odczytu", + "description": "Automatyczny rozmiar notatki tylko do odczytu to rozmiar, po którym notatki będą wyświetlane w trybie tylko do odczytu (ze względów wydajnościowych).", + "label": "Automatyczny rozmiar tylko do odczytu (notatki tekstowe)", + "unit": "znaki" + }, + "custom_date_time_format": { + "title": "Niestandardowy format daty/czasu", + "description": "Dostosuj format daty i czasu wstawianego za pomocą lub paska narzędzi. Zobacz dokumentację Day.js dla dostępnych tokenów formatu.", + "format_string": "Ciąg formatujący:", + "formatted_time": "Sformatowana data/czas:" + }, + "i18n": { + "title": "Lokalizacja", + "language": "Język", + "first-day-of-the-week": "Pierwszy dzień tygodnia", + "monday": "Poniedziałek", + "tuesday": "Wtorek", + "wednesday": "Środa", + "thursday": "Czwartek", + "friday": "Piątek", + "saturday": "Sobota", + "sunday": "Niedziela", + "first-week-of-the-year": "Pierwszy tydzień roku", + "first-week-contains-first-day": "Pierwszy tydzień zawiera pierwszy dzień roku", + "first-week-contains-first-thursday": "Pierwszy tydzień zawiera pierwszy czwartek roku", + "first-week-has-minimum-days": "Pierwszy tydzień ma minimalną liczbę dni", + "min-days-in-first-week": "Minimalna liczba dni w pierwszym tygodniu", + "first-week-info": "Pierwszy tydzień zawiera pierwszy czwartek roku jest oparty na standardzie ISO 8601.", + "first-week-warning": "Zmiana opcji pierwszego tygodnia może powodować duplikaty z istniejącymi notatkami tygodniowymi, a istniejące notatki tygodniowe nie zostaną odpowiednio zaktualizowane.", + "formatting-locale": "Format daty i liczb", + "formatting-locale-auto": "Na podstawie języka aplikacji" + }, + "backup": { + "automatic_backup": "Automatyczna kopia zapasowa", + "automatic_backup_description": "Trilium może automatycznie tworzyć kopie zapasowe bazy danych:", + "enable_daily_backup": "Włącz codzienną kopię zapasową", + "enable_weekly_backup": "Włącz tygodniową kopię zapasową", + "enable_monthly_backup": "Włącz miesięczną kopię zapasową", + "backup_recommendation": "Zaleca się włączenie kopii zapasowej, ale może to spowolnić uruchamianie aplikacji przy dużych bazach danych i/lub wolnych urządzeniach pamięci masowej.", + "backup_now": "Utwórz kopię zapasową teraz", + "backup_database_now": "Utwórz kopię zapasową bazy danych teraz", + "existing_backups": "Istniejące kopie zapasowe", + "date-and-time": "Data i godzina", + "path": "Ścieżka", + "database_backed_up_to": "Baza danych została zarchiwizowana do {{backupFilePath}}", + "no_backup_yet": "brak jeszcze kopii zapasowej" + }, + "etapi": { + "title": "ETAPI", + "description": "ETAPI to interfejs API REST używany do programowego dostępu do instancji Trilium, bez interfejsu użytkownika.", + "see_more": "Zobacz więcej szczegółów w {{- link_to_wiki}} oraz w {{- link_to_openapi_spec}} lub {{- link_to_swagger_ui }}.", + "wiki": "wiki", + "openapi_spec": "specyfikacja ETAPI OpenAPI", + "swagger_ui": "ETAPI Swagger UI", + "create_token": "Utwórz nowy token ETAPI", + "existing_tokens": "Istniejące tokeny", + "no_tokens_yet": "Nie ma jeszcze żadnych tokenów. Kliknij przycisk powyżej, aby utworzyć jeden.", + "token_name": "Nazwa tokenu", + "created": "Utworzono", + "actions": "Akcje", + "new_token_title": "Nowy token ETAPI", + "new_token_message": "WprowadÅŗ nazwę nowego tokenu", + "default_token_name": "nowy token", + "error_empty_name": "Nazwa tokenu nie może być pusta", + "token_created_title": "Utworzono token ETAPI", + "token_created_message": "Skopiuj utworzony token do schowka. Trilium przechowuje token w postaci zaszyfrowanej i jest to ostatni raz, kiedy go widzisz.", + "rename_token": "Zmień nazwę tego tokenu", + "delete_token": "Usuń / dezaktywuj ten token", + "rename_token_title": "Zmień nazwę tokenu", + "rename_token_message": "WprowadÅŗ nową nazwę tokenu", + "delete_token_confirmation": "Czy na pewno chcesz usunąć token ETAPI \"{{name}}\"?" + }, + "options_widget": { + "options_status": "Status opcji", + "options_change_saved": "Zmiany w opcjach zostały zapisane." + }, + "password": { + "heading": "Hasło", + "alert_message": "Pamiętaj o zapamiętaniu nowego hasła. Hasło jest używane do logowania się do interfejsu internetowego i szyfrowania chronionych notatek. Jeśli zapomnisz hasła, wszystkie Twoje chronione notatki zostaną utracone na zawsze.", + "reset_link": "Kliknij tutaj, aby je zresetować.", + "old_password": "Stare hasło", + "new_password": "Nowe hasło", + "new_password_confirmation": "Potwierdzenie nowego hasła", + "change_password": "Zmień hasło", + "protected_session_timeout": "Limit czasu sesji chronionej", + "protected_session_timeout_description": "Limit czasu sesji chronionej to okres, po którym sesja chroniona jest usuwana z pamięci przeglądarki. Mierzy się go od ostatniej interakcji z chronionymi notatkami. Zobacz", + "wiki": "wiki", + "for_more_info": "aby uzyskać więcej informacji.", + "protected_session_timeout_label": "Limit czasu sesji chronionej:", + "reset_confirmation": "Resetując hasło, na zawsze utracisz dostęp do wszystkich istniejących chronionych notatek. Czy na pewno chcesz zresetować hasło?", + "reset_success_message": "Hasło zostało zresetowane. Ustaw nowe hasło", + "change_password_heading": "Zmień hasło", + "set_password_heading": "Ustaw hasło", + "set_password": "Ustaw hasło", + "password_mismatch": "Nowe hasła nie są takie same.", + "password_changed_success": "Hasło zostało zmienione. Trilium zostanie przeładowane po naciśnięciu OK." + }, + "multi_factor_authentication": { + "title": "Uwierzytelnianie wieloskładnikowe", + "description": "Uwierzytelnianie wieloskładnikowe (MFA) dodaje dodatkową warstwę zabezpieczeń do Twojego konta. Zamiast wpisywać tylko hasło, aby się zalogować, MFA wymaga podania jednego lub więcej dodatkowych dowodów weryfikujących Twoją tożsamość. W ten sposób, nawet jeśli ktoś zdobędzie Twoje hasło, nadal nie będzie mógł uzyskać dostępu do Twojego konta bez drugiego elementu informacji. To jak dodanie dodatkowego zamka do drzwi, co znacznie utrudnia włamanie.

Postępuj zgodnie z poniższymi instrukcjami, aby włączyć MFA. Jeśli nie skonfigurujesz go poprawnie, logowanie powróci do samego hasła.", + "mfa_enabled": "Włącz uwierzytelnianie wieloskładnikowe", + "mfa_method": "Metoda MFA", + "electron_disabled": "Uwierzytelnianie wieloskładnikowe nie jest obecnie obsługiwane w wersji stacjonarnej.", + "totp_title": "Jednorazowe hasło czasowe (TOTP)", + "totp_description": "TOTP (Time-Based One-Time Password) to funkcja bezpieczeństwa, która generuje unikalny, tymczasowy kod, który zmienia się co 30 sekund. Używasz tego kodu wraz z hasłem do logowania się na swoje konto, co znacznie utrudnia dostęp do niego innym osobom.", + "totp_secret_title": "Wygeneruj sekret TOTP", + "totp_secret_generate": "Wygeneruj sekret TOTP", + "totp_secret_regenerate": "Wygeneruj ponownie sekret TOTP", + "no_totp_secret_warning": "Aby włączyć TOTP, musisz najpierw wygenerować sekret TOTP.", + "totp_secret_description_warning": "Po wygenerowaniu nowego sekretu TOTP będziesz musiał ponownie zalogować się przy użyciu nowego sekretu TOTP.", + "totp_secret_generated": "Wygenerowano sekret TOTP", + "totp_secret_warning": "Zapisz wygenerowany sekret w bezpiecznym miejscu. Nie zostanie on ponownie pokazany.", + "totp_secret_regenerate_confirm": "Czy na pewno chcesz wygenerować ponownie sekret TOTP? Spowoduje to unieważnienie poprzedniego sekretu TOTP i wszystkich istniejących kodów odzyskiwania.", + "recovery_keys_title": "Klucze odzyskiwania jednorazowego logowania", + "recovery_keys_description": "Klucze odzyskiwania jednorazowego logowania są używane do logowania w przypadku, gdy nie możesz uzyskać dostępu do swoich kodów Authenticator.", + "recovery_keys_description_warning": "Klucze odzyskiwania nie zostaną ponownie pokazane po opuszczeniu strony, przechowuj je w bezpiecznym miejscu.
Po użyciu klucza odzyskiwania nie można go użyć ponownie.", + "recovery_keys_error": "Błąd generowania kodów odzyskiwania", + "recovery_keys_no_key_set": "Nie ustawiono kodów odzyskiwania", + "recovery_keys_generate": "Wygeneruj kody odzyskiwania", + "recovery_keys_regenerate": "Wygeneruj ponownie kody odzyskiwania", + "recovery_keys_used": "Użyto: {{date}}", + "recovery_keys_unused": "Kod odzyskiwania {{index}} jest nieużywany", + "oauth_title": "OAuth/OpenID", + "oauth_description": "OpenID to standaryzowany sposób logowania się na strony internetowe przy użyciu konta z innej usługi, takiej jak Google, w celu zweryfikowania Twojej tożsamości. Domyślnym dostawcą jest Google, ale możesz zmienić go na dowolnego innego dostawcę OpenID. SprawdÅŗ tutaj, aby uzyskać więcej informacji. Postępuj zgodnie z tymi instrukcjami, aby skonfigurować usługę OpenID za pośrednictwem Google.", + "oauth_description_warning": "Aby włączyć OAuth/OpenID, musisz ustawić podstawowy adres URL OAuth/OpenID, identyfikator klienta i sekret klienta w pliku config.ini i ponownie uruchomić aplikację. Jeśli chcesz ustawić je ze zmiennych środowiskowych, ustaw TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID i TRILIUM_OAUTH_CLIENT_SECRET.", + "oauth_missing_vars": "Brakujące ustawienia: {{-variables}}", + "oauth_user_account": "Konto użytkownika: ", + "oauth_user_email": "E-mail użytkownika: ", + "oauth_user_not_logged_in": "Niezalogowany!" + }, + "shortcuts": { + "keyboard_shortcuts": "Skróty klawiaturowe", + "multiple_shortcuts": "Wiele skrótów dla tej samej akcji można oddzielić przecinkiem.", + "electron_documentation": "Zobacz dokumentację Electron dla dostępnych modyfikatorów i kodów klawiszy.", + "type_text_to_filter": "Wpisz tekst, aby filtrować skróty...", + "action_name": "Nazwa akcji", + "shortcuts": "Skróty", + "default_shortcuts": "Domyślne skróty", + "description": "Opis", + "reload_app": "Przeładuj aplikację, aby zastosować zmiany", + "set_all_to_default": "Ustaw wszystkie skróty na domyślne", + "confirm_reset": "Czy na pewno chcesz zresetować wszystkie skróty klawiaturowe do domyślnych?" + }, + "spellcheck": { + "title": "Sprawdzanie pisowni", + "description": "Te opcje dotyczą tylko wersji stacjonarnych, przeglądarki będą używać własnego natywnego sprawdzania pisowni.", + "enable": "Włącz sprawdzanie pisowni", + "language_code_label": "Kod(y) języka", + "language_code_placeholder": "na przykład \"en-US\", \"de-AT\"", + "multiple_languages_info": "Wiele języków można oddzielić przecinkiem, np. \"en-US, de-DE, cs\". ", + "available_language_codes_label": "Dostępne kody języków:", + "restart-required": "Zmiany w opcjach sprawdzania pisowni zaczną obowiązywać po ponownym uruchomieniu aplikacji." + }, + "sync_2": { + "config_title": "Konfiguracja synchronizacji", + "server_address": "Adres instancji serwera", + "timeout": "Limit czasu synchronizacji", + "timeout_unit": "milisekundy", + "proxy_label": "Serwer proxy synchronizacji (opcjonalnie)", + "note": "Notatka", + "note_description": "Jeśli pozostawisz ustawienie proxy puste, zostanie użyty systemowy serwer proxy (dotyczy tylko wersji stacjonarnej/electron).", + "special_value_description": "Inną specjalną wartością jest noproxy, która wymusza ignorowanie nawet systemowego serwera proxy i respektuje NODE_TLS_REJECT_UNAUTHORIZED.", + "save": "Zapisz", + "help": "Pomoc", + "test_title": "Test synchronizacji", + "test_description": "Sprawdzi to połączenie i uzgadnianie z serwerem synchronizacji. Jeśli serwer synchronizacji nie jest zainicjowany, spowoduje to jego skonfigurowanie do synchronizacji z lokalnym dokumentem.", + "test_button": "Testuj synchronizację", + "handshake_failed": "Uzgadnianie serwera synchronizacji nie powiodło się, błąd: {{message}}" + }, + "api_log": { "close": "Zamknij" + }, + "attachment_detail_2": { + "will_be_deleted_in": "Ten załącznik zostanie automatycznie usunięty za {{time}}", + "will_be_deleted_soon": "Ten załącznik zostanie wkrótce automatycznie usunięty", + "deletion_reason": ", ponieważ załącznik nie jest powiązany z treścią notatki. Aby zapobiec usunięciu, dodaj link do załącznika z powrotem do treści lub przekonwertuj załącznik na notatkę.", + "role_and_size": "Rola: {{role}}, Rozmiar: {{size}}", + "link_copied": "Link do załącznika skopiowany do schowka.", + "unrecognized_role": "Nierozpoznana rola załącznika '{{role}}'." + }, + "bookmark_switch": { + "bookmark": "Zakładka", + "bookmark_this_note": "Dodaj tę notatkę do zakładek w lewym panelu bocznym", + "remove_bookmark": "Usuń zakładkę" + }, + "editability_select": { + "auto": "Auto", + "read_only": "Tylko do odczytu", + "always_editable": "Zawsze edytowalny", + "note_is_editable": "Notatka jest edytowalna, jeśli nie jest zbyt długa.", + "note_is_read_only": "Notatka jest tylko do odczytu, ale można ją edytować po kliknięciu przycisku.", + "note_is_always_editable": "Notatka jest zawsze edytowalna, niezależnie od jej długości." + }, + "note-map": { + "button-link-map": "Mapa linków", + "button-tree-map": "Mapa drzewa" + }, + "tree-context-menu": { + "open-in-a-new-tab": "Otwórz w nowej karcie", + "open-in-a-new-split": "Otwórz w nowym podziale", + "insert-note-after": "Wstaw notatkę po", + "insert-child-note": "Wstaw notatkę podrzędną", + "archive": "Archiwizuj", + "unarchive": "Przywróć z archiwum", + "delete": "Usuń", + "search-in-subtree": "Szukaj w poddrzewie", + "hoist-note": "Podnieś notatkę", + "unhoist-note": "Opuść notatkę", + "edit-branch-prefix": "Edytuj prefiks gałęzi", + "advanced": "Zaawansowane", + "expand-subtree": "Rozwiń poddrzewo", + "collapse-subtree": "Zwiń poddrzewo", + "sort-by": "Sortuj według...", + "recent-changes-in-subtree": "Ostatnie zmiany w poddrzewie", + "convert-to-attachment": "Konwertuj na załącznik", + "copy-note-path-to-clipboard": "Kopiuj ścieżkę notatki do schowka", + "protect-subtree": "Chroń poddrzewo", + "unprotect-subtree": "Odblokuj poddrzewo", + "copy-clone": "Kopiuj / klonuj", + "clone-to": "Klonuj do...", + "cut": "Wytnij", + "move-to": "Przenieś do...", + "paste-into": "Wklej do", + "paste-after": "Wklej po", + "duplicate": "Duplikuj", + "export": "Eksportuj", + "import-into-note": "Importuj do notatki", + "apply-bulk-actions": "Zastosuj akcje zbiorcze", + "converted-to-attachments": "{{count}} notatek zostało przekonwertowanych na załączniki.", + "convert-to-attachment-confirm": "Czy na pewno chcesz przekonwertować wybrane notatki na załączniki ich notatek nadrzędnych?", + "open-in-popup": "Szybka edycja" + }, + "shared_info": { + "shared_publicly": "Ta notatka jest udostępniona publicznie na {{- link}}.", + "shared_locally": "Ta notatka jest udostępniona lokalnie na {{- link}}.", + "help_link": "Aby uzyskać pomoc, odwiedÅŗ wiki." + }, + "note_types": { + "text": "Tekst", + "code": "Kod", + "saved-search": "Zapisane wyszukiwanie", + "relation-map": "Mapa relacji", + "note-map": "Mapa notatek", + "render-note": "Renderuj notatkę", + "book": "Kolekcja", + "mermaid-diagram": "Diagram Mermaid", + "canvas": "Płótno", + "web-view": "Widok sieciowy", + "mind-map": "Mapa myśli", + "file": "Plik", + "image": "Obraz", + "launcher": "Program uruchamiający", + "doc": "Dokument", + "widget": "Widżet", + "confirm-change": "Nie zaleca się zmiany typu notatki, gdy zawartość notatki nie jest pusta. Czy chcesz kontynuować mimo to?", + "geo-map": "Mapa geograficzna", + "beta-feature": "Beta", + "ai-chat": "Czat AI", + "task-list": "Lista zadań", + "new-feature": "Nowość", + "collections": "Kolekcje" + }, + "protect_note": { + "toggle-on": "Chroń notatkę", + "toggle-off": "Odblokuj notatkę", + "toggle-on-hint": "Notatka nie jest chroniona, kliknij, aby ją chronić", + "toggle-off-hint": "Notatka jest chroniona, kliknij, aby ją odblokować" + }, + "shared_switch": { + "shared": "Udostępnione", + "toggle-on-title": "Udostępnij notatkę", + "toggle-off-title": "Przestań udostępniać notatkę", + "shared-branch": "Ta notatka istnieje tylko jako notatka udostępniona, zaprzestanie udostępniania spowoduje jej usunięcie. Czy chcesz kontynuować i tym samym usunąć tę notatkę?", + "inherited": "Notatka nie może być tutaj nieudostępniona, ponieważ jest udostępniana poprzez dziedziczenie od przodka." + }, + "template_switch": { + "template": "Szablon", + "toggle-on-hint": "Uczyń notatkę szablonem", + "toggle-off-hint": "Usuń notatkę jako szablon" + }, + "open-help-page": "Otwórz stronę pomocy", + "find": { + "case_sensitive": "Uwzględniaj wielkość liter", + "match_words": "Dopasuj słowa", + "find_placeholder": "ZnajdÅŗ w tekście...", + "replace_placeholder": "Zastąp...", + "replace": "Zastąp", + "replace_all": "Zastąp wszystko" + }, + "highlights_list_2": { + "title": "Lista wyróżnień", + "options": "Opcje" + }, + "quick-search": { + "placeholder": "Szybkie wyszukiwanie", + "searching": "Wyszukiwanie...", + "no-results": "Nie znaleziono wyników", + "more-results": "... i {{number}} więcej wyników.", + "show-in-full-search": "Pokaż w pełnym wyszukiwaniu" + }, + "note_tree": { + "collapse-title": "Zwiń drzewo notatek", + "scroll-active-title": "Przewiń do aktywnej notatki", + "tree-settings-title": "Ustawienia drzewa", + "hide-archived-notes": "Ukryj zarchiwizowane notatki", + "automatically-collapse-notes": "Automatycznie zwijaj notatki", + "automatically-collapse-notes-title": "Notatki zostaną zwinięte po okresie bezczynności, aby uporządkować drzewo.", + "save-changes": "Zapisz i zastosuj zmiany", + "auto-collapsing-notes-after-inactivity": "Automatyczne zwijanie notatek po bezczynności...", + "saved-search-note-refreshed": "Odświeżono zapisaną notatkę wyszukiwania.", + "hoist-this-note-workspace": "Podnieś tę notatkę (obszar roboczy)", + "refresh-saved-search-results": "Odśwież zapisane wyniki wyszukiwania", + "create-child-note": "Utwórz notatkę podrzędną", + "unhoist": "Opuść", + "toggle-sidebar": "Przełącz pasek boczny" + }, + "title_bar_buttons": { + "window-on-top": "Trzymaj okno na wierzchu" + }, + "note_detail": { + "could_not_find_typewidget": "Nie można znaleźć typeWidget dla typu '{{type}}'" + }, + "note_title": { + "placeholder": "wpisz tutaj tytuł notatki..." + }, + "search_result": { + "no_notes_found": "Nie znaleziono żadnych notatek dla podanych parametrów wyszukiwania.", + "search_not_executed": "Wyszukiwanie nie zostało jeszcze wykonane. Kliknij przycisk \"Szukaj\" powyżej, aby zobaczyć wyniki." + }, + "spacer": { + "configure_launchbar": "Skonfiguruj pasek uruchamiania" + }, + "sql_result": { + "no_rows": "Nie zwrócono żadnych wierszy dla tego zapytania" + }, + "sql_table_schemas": { + "tables": "Tabele" + }, + "tab_row": { + "close_tab": "Zamknij kartę", + "add_new_tab": "Dodaj nową kartę", + "close": "Zamknij", + "close_other_tabs": "Zamknij inne karty", + "close_right_tabs": "Zamknij karty po prawej", + "close_all_tabs": "Zamknij wszystkie karty", + "reopen_last_tab": "Otwórz ponownie ostatnią zamkniętą kartę", + "move_tab_to_new_window": "Przenieś tę kartę do nowego okna", + "copy_tab_to_new_window": "Skopiuj tę kartę do nowego okna", + "new_tab": "Nowa karta" + }, + "toc": { + "table_of_contents": "Spis treści", + "options": "Opcje" + }, + "watched_file_update_status": { + "file_last_modified": "Plik został ostatnio zmodyfikowany .", + "upload_modified_file": "Prześlij zmodyfikowany plik", + "ignore_this_change": "Ignoruj tę zmianę" + }, + "app_context": { + "please_wait_for_save": "Poczekaj kilka sekund na zakończenie zapisywania, a następnie spróbuj ponownie." + }, + "note_create": { + "duplicated": "Notatka \"{{title}}\" została zduplikowana." + }, + "image": { + "copied-to-clipboard": "Odniesienie do obrazu zostało skopiowane do schowka. Można je wkleić w dowolnej notatce tekstowej.", + "cannot-copy": "Nie można skopiować odniesienia do obrazu do schowka." + }, + "clipboard": { + "cut": "Notatka(i) została(y) wycięta(e) do schowka.", + "copied": "Notatka(i) została(y) skopiowana(e) do schowka.", + "copy_failed": "Nie można skopiować do schowka z powodu problemów z uprawnieniami.", + "copy_success": "Skopiowano do schowka." + }, + "entrypoints": { + "note-revision-created": "Utworzono wersję notatki.", + "note-executed": "Notatka wykonana.", + "sql-error": "Wystąpił błąd podczas wykonywania zapytania SQL: {{message}}" + }, + "branches": { + "cannot-move-notes-here": "Nie można przenieść tutaj notatek.", + "delete-status": "Status usuwania", + "delete-notes-in-progress": "Usuwanie notatek w toku: {{count}}", + "delete-finished-successfully": "Usuwanie zakończone pomyślnie.", + "undeleting-notes-in-progress": "Przywracanie notatek w toku: {{count}}", + "undeleting-notes-finished-successfully": "Przywracanie notatek zakończone pomyślnie." + }, + "frontend_script_api": { + "async_warning": "Przekazujesz funkcję asynchroniczną do `api.runOnBackend()`, co prawdopodobnie nie zadziała zgodnie z zamierzeniami.\\nAlbo uczyń funkcję synchroniczną (usuwając słowo kluczowe `async`), albo użyj `api.runAsyncOnBackendWithManualTransactionHandling()`.", + "sync_warning": "Przekazujesz funkcję synchroniczną do `api.runAsyncOnBackendWithManualTransactionHandling()`,\\npodczas gdy prawdopodobnie powinieneś użyć `api.runOnBackend()`." + }, + "ws": { + "sync-check-failed": "Sprawdzanie synchronizacji nie powiodło się!", + "consistency-checks-failed": "Sprawdzanie spójności nie powiodło się! Zobacz logi, aby uzyskać szczegółowe informacje.", + "encountered-error": "Napotkano błąd \"{{message}}\", sprawdÅŗ konsolę.", + "lost-websocket-connection-title": "Utracono połączenie z serwerem", + "lost-websocket-connection-message": "SprawdÅŗ konfigurację swojego odwrotnego serwera proxy (np. nginx lub Apache), aby upewnić się, że połączenia WebSocket są prawidłowo dozwolone i nie są blokowane." + }, + "hoisted_note": { + "confirm_unhoisting": "Żądana notatka '{{requestedNote}}' znajduje się poza poddrzewem podniesionej notatki '{{hoistedNote}}' i musisz ją opuścić, aby uzyskać do niej dostęp. Czy chcesz kontynuować opuszczanie?" + }, + "launcher_context_menu": { + "reset_launcher_confirm": "Czy na pewno chcesz zresetować \"{{title}}\"? Wszystkie dane / ustawienia w tej notatce (i jej dzieciach) zostaną utracone, a program uruchamiający zostanie przywrócony do pierwotnej lokalizacji.", + "add-note-launcher": "Dodaj program uruchamiający notatkę", + "add-script-launcher": "Dodaj program uruchamiający skrypt", + "add-custom-widget": "Dodaj niestandardowy widżet", + "add-spacer": "Dodaj odstęp", + "delete": "Usuń ", + "reset": "Resetuj", + "move-to-visible-launchers": "Przenieś do widocznych programów uruchamiających", + "move-to-available-launchers": "Przenieś do dostępnych programów uruchamiających", + "duplicate-launcher": "Duplikuj program uruchamiający " + }, + "editable-text": { + "auto-detect-language": "Wykryto automatycznie" + }, + "highlighting": { + "title": "Bloki kodu", + "description": "Kontroluje podświetlanie składni dla bloków kodu w notatkach tekstowych, notatki kodowe nie będą miały wpływu.", + "color-scheme": "Schemat kolorów" + }, + "code_block": { + "word_wrapping": "Zawijanie słów", + "theme_none": "Brak podświetlania składni", + "theme_group_light": "Jasne motywy", + "theme_group_dark": "Ciemne motywy", + "copy_title": "Kopiuj do schowka" + }, + "classic_editor_toolbar": { + "title": "Formatowanie" + }, + "editor": { + "title": "Edytor" + }, + "editing": { + "editor_type": { + "label": "Pasek narzędzi formatowania", + "floating": { + "title": "Pływający", + "description": "narzędzia do edycji pojawiają się w pobliżu kursora;" + }, + "fixed": { + "title": "Stały", + "description": "narzędzia do edycji pojawiają się na karcie wstążki \"Formatowanie\"." + }, + "multiline-toolbar": "Wyświetlaj pasek narzędzi w wielu wierszach, jeśli się nie mieści." + } + }, + "geo-map": { + "create-child-note-title": "Utwórz nową notatkę podrzędną i dodaj ją do mapy", + "create-child-note-instruction": "Kliknij na mapę, aby utworzyć nową notatkę w tej lokalizacji, lub naciśnij Escape, aby anulować.", + "unable-to-load-map": "Nie można załadować mapy." + }, + "geo-map-context": { + "open-location": "Otwórz lokalizację", + "remove-from-map": "Usuń z mapy", + "add-note": "Dodaj znacznik w tej lokalizacji" + }, + "help-button": { + "title": "Otwórz odpowiednią stronę pomocy" + }, + "time_selector": { + "invalid_input": "Wprowadzona wartość czasu nie jest prawidłową liczbą.", + "minimum_input": "Wprowadzona wartość czasu musi wynosić co najmniej {{minimumSeconds}} sekund." + }, + "presentation_view": { + "edit-slide": "Edytuj ten slajd", + "start-presentation": "Rozpocznij prezentację", + "slide-overview": "Przełącz podgląd slajdów" } } diff --git a/apps/client/src/translations/pt/translation.json b/apps/client/src/translations/pt/translation.json new file mode 100644 index 000000000..b4b1366bb --- /dev/null +++ b/apps/client/src/translations/pt/translation.json @@ -0,0 +1,2027 @@ +{ + "about": { + "title": "Sobre o Trilium Notes", + "app_version": "VersĆ£o da App:", + "homepage": "PĆ”gina inicial:", + "db_version": "VersĆ£o da base de dados:", + "sync_version": "VersĆ£o de sincronização:", + "build_date": "Data de compilação:", + "build_revision": "RevisĆ£o da compilação:", + "data_directory": "Diretório de dados:" + }, + "toast": { + "critical-error": { + "title": "Erro crĆ­tico", + "message": "Ocorreu um erro crĆ­tico que impede a inicialização da aplicação cliente:\n\n{{message}}\n\nProvavelmente foi causado por um script que falhou de maneira inesperada. Tente iniciar a aplicação no modo seguro e resolva o problema." + }, + "widget-error": { + "title": "Falha ao inicializar um widget", + "message-custom": "O widget personalizado da nota com ID \"{{id}}\", intitulada \"{{title}}\", nĆ£o pĆ“de ser inicializado devido a:\n\n{{message}}", + "message-unknown": "Widget desconhecido nĆ£o pĆ“de ser inicializado devido a:\n\n{{message}}" + }, + "bundle-error": { + "title": "Falha para carregar o script customizado", + "message": "O script da nota com ID \"{{id}}\", intitulada \"{{title}}\", nĆ£o pĆ“de ser executado devido a:\n\n{{message}}" + } + }, + "add_link": { + "add_link": "Adicionar ligação", + "help_on_links": "Ajuda sobre ligaƧƵes", + "note": "Nota", + "search_note": "pesquisar nota pelo nome", + "link_title_mirrors": "o tĆ­tulo da ligação reflete o tĆ­tulo atual da nota", + "link_title_arbitrary": "o tĆ­tulo da ligação pode ser alterado livremente", + "link_title": "Titulo da ligação", + "button_add_link": "Adicionar ligação" + }, + "branch_prefix": { + "edit_branch_prefix": "Editar Prefixo do Branch", + "help_on_tree_prefix": "Ajuda sobre o prefixo da Ć”rvore de notas", + "prefix": "Prefixo: ", + "save": "Gravar", + "branch_prefix_saved": "O prefixo de ramificação foi gravado." + }, + "bulk_actions": { + "bulk_actions": "AƧƵes em massa", + "affected_notes": "Notas Afetadas", + "include_descendants": "Incluir notas filhas das notas selecionadas", + "available_actions": "AƧƵes disponĆ­veis", + "chosen_actions": "AƧƵes selecionadas", + "execute_bulk_actions": "Executar aƧƵes em massa", + "bulk_actions_executed": "As aƧƵes em massa foram concluĆ­das com sucesso.", + "none_yet": "Nenhuma atĆ© agora... adicione uma ação a clicar numa das disponĆ­veis acima.", + "labels": "Etiquetas", + "relations": "RelaƧƵes", + "notes": "Notas", + "other": "Outros" + }, + "clone_to": { + "clone_notes_to": "Clonar notas para...", + "help_on_links": "Ajuda sobre ligaƧƵes", + "notes_to_clone": "Notas para clonar", + "target_parent_note": "Nota pai-alvo", + "search_for_note_by_its_name": "pesquisar nota pelo nome", + "cloned_note_prefix_title": "A nota clonada aparecerĆ” na Ć”rvore de notas com o prefixo fornecido", + "prefix_optional": "Prefixo (opcional)", + "clone_to_selected_note": "Clonar para a nota selecionada", + "no_path_to_clone_to": "Nenhum caminho para clonar.", + "note_cloned": "A nota \"{{clonedTitle}}\" foi clonada para \"{{targetTitle}}\"" + }, + "confirm": { + "confirmation": "Confirmação", + "cancel": "Cancelar", + "ok": "OK", + "are_you_sure_remove_note": "Tem certeza que deseja remover a nota '{{title}}' do mapa de relaƧƵes? ", + "if_you_dont_check": "Se nĆ£o marcar isto, a nota serĆ” removida apenas do mapa de relaƧƵes.", + "also_delete_note": "TambĆ©m apagar a nota" + }, + "delete_notes": { + "delete_notes_preview": "Apagar prĆ©-visualização de notas", + "close": "Fechar", + "delete_all_clones_description": "Apagar tambĆ©m todos os clones (pode ser desfeito em alteraƧƵes recentes)", + "erase_notes_description": "Apagar normal (suave) apenas marca as notas como apagadas, permitindo que sejam recuperadas (no diĆ”logo de alteraƧƵes recentes) num perĆ­odo. Se esta opção for marcada, as notas serĆ£o apagadas imediatamente e nĆ£o serĆ” possĆ­vel restaurĆ”-las.", + "erase_notes_warning": "Apagar notas permanentemente (nĆ£o pode ser desfeito), incluindo todos os clones. Isto forƧarĆ” o recarregamento da aplicação.", + "notes_to_be_deleted": "As seguintes notas serĆ£o apagadas ({{notesCount}})", + "no_note_to_delete": "Nenhuma nota serĆ” apagada (apenas os clones).", + "broken_relations_to_be_deleted": "As seguintes relaƧƵes serĆ£o quebradas e apagadas ({{ relationCount}})", + "cancel": "Cancelar", + "ok": "OK", + "deleted_relation_text": "A nota {{- note}} (a ser apagada) estĆ” referenciada pela relação {{- relation}} originada de {{- source}}." + }, + "export": { + "export_note_title": "Exportar nota", + "close": "Fechar", + "export_type_subtree": "Esta nota e todos os seus descendentes", + "format_html": "HTML – recomendado, pois mantĆ©m toda a formatação", + "format_html_zip": "HTML num ficheiro ZIP – recomendado, pois preserva toda a formatação.", + "format_markdown": "Markdown – isto preserva a maior parte da formatação.", + "format_opml": "OPML - formato de intercĆ¢mbio de outliners apenas para texto. Formatação, imagens e ficheiros nĆ£o estĆ£o incluĆ­dos.", + "opml_version_1": "OPML v1.0 – apenas texto simples", + "opml_version_2": "OPML v2.0 – permite tambĆ©m HTML", + "export_type_single": "Apenas esta nota, sem os seus descendentes", + "export": "Exportar", + "choose_export_type": "Por favor, escolha primeiro o tipo de exportação", + "export_status": "Estado da exportação", + "export_in_progress": "Exportação em andamento: {{progressCount}}", + "export_finished_successfully": "Exportação concluĆ­da com sucesso.", + "format_pdf": "PDF – para impressĆ£o ou compartilhamento." + }, + "help": { + "title": "Folha de Dicas", + "noteNavigation": "Navegação de notas", + "goUpDown": "subir/descer na lista de notas", + "collapseExpand": "recolher/expandir nó", + "notSet": "nĆ£o definido", + "goBackForwards": "voltar / avanƧar no histórico", + "showJumpToNoteDialog": "mostrar diĆ”logo \"Ir para\"", + "scrollToActiveNote": "rolar atĆ© a nota atual", + "jumpToParentNote": "ir Ć  nota pai", + "collapseWholeTree": "recolher toda a Ć”rvore de notas", + "collapseSubTree": "recolher subĆ”rvore", + "tabShortcuts": "Atalhos de guias", + "newTabNoteLink": "a ligação na nota abre essa nota numa guia nova", + "newTabWithActivationNoteLink": "a ligação na nota abre e ativa a nota numa guia nova", + "onlyInDesktop": "Apenas na versĆ£o para desktop (compilação Electron)", + "openEmptyTab": "abrir guia vazia", + "closeActiveTab": "fechar guia ativa", + "activateNextTab": "ativar próxima guia", + "activatePreviousTab": "ativar guia anterior", + "creatingNotes": "Criar notas", + "createNoteAfter": "criar nota após a nota atual", + "createNoteInto": "criar subnota dentro da nota atual", + "editBranchPrefix": "editar prefixo do clone da nota ativa", + "movingCloningNotes": "A mover / clonar notas", + "moveNoteUpDown": "mover nota para cima/baixo na lista de notas", + "moveNoteUpHierarchy": "mover nota para cima na hierarquia", + "multiSelectNote": "selecionar mĆŗltiplas notas acima/abaixo", + "selectAllNotes": "selecionar todas as notas no nĆ­vel atual", + "selectNote": "selecionar nota", + "copyNotes": "copiar nota ativa (ou seleção atual) para a Ć”rea de transferĆŖncia (usado para clonar)", + "cutNotes": "recortar nota atual (ou seleção atual) para a Ć”rea de transferĆŖncia (usado para mover notas)", + "pasteNotes": "colar nota(s) como subnota dentro da nota ativa (o que pode ser mover ou clonar dependendo se foi copiado ou recortado para a Ć”rea de transferĆŖncia)", + "deleteNotes": "apagar nota / subĆ”rvore", + "editingNotes": "Edição de notas", + "editNoteTitle": "no painel de Ć”rvore, a navegação mudarĆ” do painel de Ć”rvore para o tĆ­tulo da nota. Pressionar Enter no tĆ­tulo da nota mudarĆ” o foco para o editor de texto. Ctrl+. mudarĆ” o foco de volta do editor para o painel de Ć”rvore.", + "createEditLink": "criar / editar ligação externa", + "createInternalLink": "criar ligação interna", + "followLink": "seguir ligação sob o cursor", + "insertDateTime": "inserir data e hora atual na posição do cursor", + "jumpToTreePane": "ir Ć  Ć”rvore de notas e rolar atĆ© a nota ativa", + "markdownAutoformat": "Autoformatação estilo Markdown", + "headings": "##, ###, #### etc. seguidos de espaƧo para tĆ­tulos", + "bulletList": "* ou - seguidos de espaƧo para lista com marcadores", + "numberedList": "1. ou 1) seguidos de espaƧo para lista numerada", + "blockQuote": "comece uma linha com > seguido de espaƧo para citação em bloco", + "troubleshooting": "Solução de problemas", + "reloadFrontend": "recarregar o frontend do Trilium", + "showDevTools": "mostrar ferramentas de programador", + "showSQLConsole": "mostrar console SQL", + "other": "Outros", + "quickSearch": "focar no campo de pesquisa rĆ”pida", + "inPageSearch": "pesquisa na pĆ”gina" + }, + "import": { + "importIntoNote": "Importar para a nota", + "chooseImportFile": "Escolher ficheiro para importar", + "importDescription": "O conteĆŗdo do(s) ficheiro(s) selecionado(s) serĆ” importado como nota(s) filha(s) em", + "options": "OpƧƵes", + "safeImportTooltip": "Ficheiros de exportação Trilium .zip podem conter scripts executĆ”veis que podem apresentar comportamentos prejudiciais. A importação segura desativarĆ” a execução automĆ”tica de todos os scripts importados. Desmarque ā€œImportação seguraā€ apenas se o ficheiro de importação contiver scripts executĆ”veis e vocĆŖ confiar totalmente no conteĆŗdo do ficheiro importado.", + "safeImport": "Importação segura", + "explodeArchivesTooltip": "Se esta opção estiver marcada, o Trilium irĆ” ler ficheiros .zip, .enex e .opml e criar notas a partir dos ficheiros contidos nesses ficheiros compactados. Se estiver desmarcada, o Trilium irĆ” anexar os próprios ficheiros compactados Ć  nota.", + "explodeArchives": "Ler conteĆŗdos de arquivos .zip, .enex e .opml.", + "shrinkImagesTooltip": "

Se marcar esta opção, o Trilium tentarÔ reduzir o tamanho das imagens importadas por meio de escala e otimização, o que pode afetar a qualidade visual das imagens. Se desmarcada, as imagens serão importadas sem alterações.

Isto não se aplica a importações de ficheiros .zip com metadados, pois presume-se que estes ficheiros jÔ estejam otimizados.

", + "shrinkImages": "Reduzir imagens", + "textImportedAsText": "Importar ficheiros de HTML, Markdown e TXT como notas de texto caso nĆ£o esteja claro pelos metadados", + "codeImportedAsCode": "Importar ficheiros de código reconhecidos (por exemplo, .json) como notas de código caso nĆ£o esteja claro pelos metadados", + "replaceUnderscoresWithSpaces": "Substituir sublinhados por espaƧos nos nomes das notas importadas", + "import": "Importar", + "failed": "Falha na importação: {{message}}.", + "html_import_tags": { + "title": "Tags de importação HTML", + "description": "Configurar quais tags HTML devem ser preservadas ao importar notas. As tags que nĆ£o estiverem nesta lista serĆ£o removidas durante a importação. Algumas tags (como 'script') sĆ£o sempre removidas por motivos de seguranƧa.", + "placeholder": "Digite as tags HTML, uma por linha", + "reset_button": "Redefinir para lista padrĆ£o" + }, + "import-status": "Estado da importação", + "in-progress": "Importação em andamento: {{progress}}", + "successful": "Importação concluĆ­da com sucesso." + }, + "include_note": { + "dialog_title": "Incluir nota", + "label_note": "Nota", + "placeholder_search": "pesquisar nota pelo nome", + "box_size_prompt": "DimensĆ£o da caixa da nota incluĆ­da:", + "box_size_small": "pequeno (~ 10 linhas)", + "box_size_medium": "mĆ©dio (~ 30 linhas)", + "box_size_full": "completo (a caixa exibe o texto completo)", + "button_include": "Incluir nota" + }, + "info": { + "modalTitle": "Mensagem informativa", + "closeButton": "Fechar", + "okButton": "OK" + }, + "jump_to_note": { + "search_placeholder": "Pesquise uma nota pelo nome ou digite > para comandos...", + "search_button": "Pesquisar no texto completo" + }, + "markdown_import": { + "dialog_title": "Importar Markdown", + "modal_body_text": "Por motivos de seguranƧa (sandbox do navegador), o JavaScript nĆ£o pode aceder diretamente a Ć”rea de transferĆŖncia. Por favor, cole o conteĆŗdo Markdown na Ć”rea de texto abaixo e clique em Importar", + "import_button": "Importar", + "import_success": "O conteĆŗdo Markdown foi importado para o documento." + }, + "move_to": { + "dialog_title": "Mover notas para...", + "notes_to_move": "Notas para mover", + "target_parent_note": "Nota pai-alvo", + "search_placeholder": "pesquisar nota pelo nome", + "move_button": "Mover para a nota selecionada", + "error_no_path": "Nenhum caminho para mover.", + "move_success_message": "As notas selecionadas foram movidas para " + }, + "note_type_chooser": { + "change_path_prompt": "Alterar onde criar a nova nota:", + "search_placeholder": "pesquisar caminho pelo nome (valor predefinido se nĆ£o for preenchido)", + "modal_title": "Escolher tipo de nota", + "modal_body": "Escolha o tipo/modelo da nova nota:", + "templates": "Modelos", + "builtin_templates": "Modelos Incorporados" + }, + "password_not_set": { + "title": "A palavra-passe nĆ£o estĆ” definida", + "body1": "Notas protegidas sĆ£o criptografadas usando uma palavra-passe do utilizador, mas a palavra-passe ainda nĆ£o foi definida.", + "body2": "Para poder proteger notas, clique no botĆ£o abaixo para abrir a caixa de diĆ”logo de OpƧƵes e definir a sua palavra-passe.", + "go_to_password_options": "Ir para opƧƵes de Palavra-passe" + }, + "prompt": { + "title": "Prompt", + "ok": "OK", + "defaultTitle": "Prompt" + }, + "protected_session_password": { + "modal_title": "SessĆ£o protegida", + "help_title": "Ajuda sobre notas protegidas", + "close_label": "Fechar", + "form_label": "Para prosseguir com a ação solicitada, deve iniciar uma sessĆ£o protegida digitando a palavra-passe:", + "start_button": "Iniciar sessĆ£o protegida" + }, + "recent_changes": { + "title": "AlteraƧƵes recentes", + "erase_notes_button": "Remover permanentemente as notas apagadas agora", + "deleted_notes_message": "As notas apagadas foram removidas permanentemente.", + "no_changes_message": "Nenhuma alteração ainda...", + "undelete_link": "Restaurar", + "confirm_undelete": "Deseja restaurar esta nota e as suas subnotas?" + }, + "revisions": { + "note_revisions": "VersƵes da nota", + "delete_all_revisions": "Apagar todas as versƵes desta nota", + "delete_all_button": "Apagar todas as versƵes", + "help_title": "Ajuda sobre as versƵes da nota", + "revision_last_edited": "Esta versĆ£o foi editada pela Ćŗltima vez em {{date}}", + "confirm_delete_all": "Quer apagar todas as versƵes desta nota?", + "no_revisions": "Ainda nĆ£o hĆ” versƵes para esta nota...", + "restore_button": "Recuperar", + "confirm_restore": "Deseja restaurar esta versĆ£o? Isto irĆ” substituir o tĆ­tulo e o conteĆŗdo atuais da nota por esta versĆ£o.", + "delete_button": "Apagar", + "confirm_delete": "Deseja apagar esta versĆ£o?", + "revisions_deleted": "As versƵes da nota foram removidas.", + "revision_restored": "A versĆ£o da nota foi restaurada.", + "revision_deleted": "A versĆ£o da nota foi apagada.", + "snapshot_interval": "Intervalo de captura das versƵes da nota: {{seconds}}s.", + "maximum_revisions": "Limite de capturas das versƵes da nota: {{number}}.", + "settings": "ConfiguraƧƵes de versƵes da nota", + "download_button": "Descarregar", + "mime": "MIME: ", + "file_size": "Tamanho do ficheiro:", + "preview": "Visualizar:", + "preview_not_available": "A visualização nĆ£o estĆ” disponĆ­vel para este tipo de nota." + }, + "sort_child_notes": { + "sort_children_by": "Ordenar notas filhas por...", + "sorting_criteria": "CritĆ©rios de ordenação", + "title": "tĆ­tulo", + "date_created": "data de criação", + "date_modified": "data de modificação", + "sorting_direction": "Direção de ordenação", + "ascending": "crescente", + "descending": "decrescente", + "folders": "Pastas", + "sort_folders_at_top": "posicionar pastas no topo", + "natural_sort": "Ordenação Natural", + "sort_with_respect_to_different_character_sorting": "classificar de acordo com diferentes regras de ordenação de caracteres e colação em diferentes idiomas ou regiƵes.", + "natural_sort_language": "Linguagem da ordenação natural", + "the_language_code_for_natural_sort": "O código do idioma para ordenação natural, por exemplo, \"zh-CN\" para chinĆŖs.", + "sort": "Ordenar" + }, + "upload_attachments": { + "upload_attachments_to_note": "Enviar anexos para a nota", + "choose_files": "Escolher ficheiros", + "files_will_be_uploaded": "Os ficheiros serĆ£o enviados como anexos para {{noteTitle}}", + "options": "OpƧƵes", + "shrink_images": "Reduzir imagens", + "upload": "Enviar", + "tooltip": "Se marcar esta opção, o Trilium tentarĆ” reduzir as imagens enviadas a redimensionar e otimizar, o que pode afetar a qualidade visual percebida. Se desmarcada, as imagens serĆ£o enviadas sem alteraƧƵes." + }, + "attribute_detail": { + "attr_detail_title": "TĆ­tulo Detalhado do Atributo", + "close_button_title": "Cancelar alteraƧƵes e fechar", + "attr_is_owned_by": "O atributo pertence a", + "attr_name_title": "O nome do atributo pode ser composto apenas por caracteres alfanumĆ©ricos, dois-pontos e sublinhado", + "name": "Nome", + "value": "Valor", + "target_note_title": "Relação Ć© uma conexĆ£o nomeada entre a nota de origem e a nota de destino.", + "target_note": "Nota de destino", + "promoted_title": "O atributo promovido Ć© exibido de forma destacada na nota.", + "promoted": "Promovido", + "promoted_alias_title": "O nome a ser exibido na interface de atributos promovidos.", + "promoted_alias": "Alias", + "multiplicity_title": "Multiplicidade define quantos atributos com o mesmo nome podem ser criados — no mĆ”ximo 1 ou mais que 1.", + "multiplicity": "Multiplicidade", + "single_value": "Valor Ćŗnico", + "multi_value": "Valor mĆŗltiplo", + "label_type_title": "O tipo do rótulo ajudarĆ” o Trilium a escolher a interface adequada para inserir o valor do rótulo.", + "label_type": "Tipo", + "text": "Texto", + "number": "NĆŗmero", + "boolean": "Booleano", + "date": "Data", + "date_time": "Data e Hora", + "time": "Hora", + "url": "URL", + "precision_title": "Qual nĆŗmero de dĆ­gitos após o ponto decimal deve estar disponĆ­vel na interface de configuração de valor.", + "precision": "PrecisĆ£o", + "digits": "dĆ­gitos", + "inverse_relation_title": "Configuração opcional para definir a qual relação esta Ć© oposta. Exemplo: Pai - Filho sĆ£o relaƧƵes inversas entre si.", + "inverse_relation": "Relação inversa", + "inheritable_title": "O atributo herdĆ”vel serĆ” transmitido para todos os descendentes deste ramo.", + "inheritable": "HerdĆ”vel", + "save_and_close": "Gravar e fechar Ctrl+Enter", + "delete": "Apagar", + "related_notes_title": "Outras notas com este rótulo", + "more_notes": "Mais notas", + "label": "Pormenor do rótulo", + "label_definition": "Pormenor da definição do rótulo", + "relation": "Pormenor da relação", + "relation_definition": "Pormenor da definição da relação", + "disable_versioning": "desativa a versĆ£o automĆ”tica. Útil, por exemplo, para notas grandes, mas sem importĆ¢ncia – como grandes bibliotecas JS usadas para scripts", + "calendar_root": "marca a nota que deve ser usada como raiz para notas diĆ”rias. Apenas uma deve ser marcada assim.", + "archived": "notas com este rótulo nĆ£o serĆ£o exibidas por padrĆ£o nos resultados de pesquisa (tambĆ©m nos diĆ”logos Ir para, Adicionar ligaƧƵes, etc).", + "exclude_from_export": "notas (com as suas subĆ”rvores) nĆ£o serĆ£o incluĆ­das em nenhuma exportação de notas", + "run": "define em quais eventos o script deve ser executado. Os valores possĆ­veis sĆ£o:\n
    \n
  • frontendStartup - quando o frontend do Trilium inicia (ou Ć© atualizado), mas nĆ£o no telemóvel.
  • \n
  • mobileStartup - quando o frontend do Trilium inicia (ou Ć© atualizado), no telemóvel.
  • \n
  • backendStartup - quando o backend do Trilium inicia
  • \n
  • hourly - executa uma vez por hora. Pode usar o rótulo adicional runAtHour para especificar em qual hora.
  • \n
  • daily - executa uma vez por dia
  • \n
", + "run_on_instance": "Define em qual instĆ¢ncia do Trilium isto deve ser executado. Por padrĆ£o, todas as instĆ¢ncias.", + "run_at_hour": "Em qual hora isto deve ser executado. Deve ser usado junto com #run=hourly. Pode ser definido vĆ”rias vezes para executar mais que uma vez ao dia.", + "disable_inclusion": "scripts com este rótulo nĆ£o serĆ£o incluĆ­dos na execução do script pai.", + "sorted": "mantĆ©m as notas filhas ordenadas alfabeticamente pelo tĆ­tulo", + "sort_direction": "ASC (padrĆ£o) ou DESC", + "sort_folders_first": "Pastas (notas com filhos) devem ser ordenadas no topo", + "top": "mantenha a nota fornecida no topo no seu pai (aplica-se apenas a pais ordenados)", + "hide_promoted_attributes": "Ocultar atributos promovidos nesta nota", + "read_only": "o editor estĆ” em modo somente leitura. Funciona apenas para notas de texto e código.", + "auto_read_only_disabled": "notas de texto/código podem ser automaticamente configuradas para modo de leitura quando sĆ£o muito grandes. Pode desativar este comportamento por nota a adicionar este rótulo Ć  nota", + "app_css": "marca notas CSS que sĆ£o carregadas na aplicação Trilium e, portanto, podem ser usadas para modificar a aparĆŖncia do Trilium.", + "app_theme": "marca notas CSS que sĆ£o temas completos do Trilium e, portanto, estĆ£o disponĆ­veis nas opƧƵes do Trilium.", + "app_theme_base": "defina como \"next\", \"next-light\" ou \"next-dark\" para usar o tema TriliumNext correspondente (auto, claro ou escuro) como base para um tema personalizado em vez do tema legado.", + "css_class": "o valor deste rótulo Ć© depois adicionado como classe CSS ao nó que representa a nota especĆ­fica na Ć”rvore. Isto pode ser Ćŗtil para temas avanƧados. Pode ser usado em notas de modelo.", + "icon_class": "o valor deste rótulo Ć© adicionado como uma classe CSS ao Ć­cone na Ć”rvore, o que pode ajudar a distinguir visualmente as notas na Ć”rvore. Um exemplo pode ser bx bx-home – os Ć­cones sĆ£o retirados do boxicons. Pode ser usado em notas de modelo.", + "page_size": "nĆŗmero de elementos por pĆ”gina na listagem de notas", + "custom_request_handler": "veja Manipulador de requisição personalizada", + "custom_resource_provider": "veja Manipulador de requisição personalizada", + "widget": "marca esta nota como um widget personalizado que serĆ” adicionado Ć  Ć”rvore de componentes do Trilium", + "workspace": "marca esta nota como um espaƧo de trabalho, o que permite fĆ”cil hoisting", + "workspace_icon_class": "define a classe CSS do Ć­cone box que serĆ” usada na guia quando esta nota for hoisted", + "workspace_tab_background_color": "cor CSS usada na guia da nota quando esta nota Ć© hoisted", + "workspace_calendar_root": "Define a raiz do calendĆ”rio por espaƧo de trabalho", + "workspace_template": "Esta nota aparecerĆ” na seleção de modelos disponĆ­veis ao criar uma nova nota, mas apenas quando estiver destacada num espaƧo de trabalho que contenha este modelo", + "search_home": "novas notas de pesquisa serĆ£o criadas como filhas desta nota", + "workspace_search_home": "novas notas de pesquisa serĆ£o criadas como filhas desta nota quando ela for destacada para algum ancestral desta nota de Ć”rea de trabalho", + "inbox": "localização padrĆ£o da caixa de entrada para novas notas – quando cria uma nota atravĆ©s do botĆ£o \"nova nota\" na barra lateral, as notas serĆ£o criadas como notas filhas na nota marcada com o rótulo #inbox.", + "workspace_inbox": "local padrĆ£o da caixa de entrada para novas notas quando esta nota for destacada para algum ancestral desta nota de Ć”rea de trabalho", + "sql_console_home": "localização padrĆ£o das notas do console SQL", + "bookmark_folder": "nota com este rótulo aparecerĆ” nos favoritos como uma pasta (permitindo acesso aos seus filhos)", + "share_hidden_from_tree": "esta nota estĆ” oculta na Ć”rvore de navegação Ć  esquerda, mas ainda pode ser aceidda pela sua URL", + "share_external_link": "a nota funcionarĆ” como uma ligação para um site externo na Ć”rvore de compartilhamento", + "share_alias": "defina um alias por meio do qual a nota ficarĆ” disponĆ­vel em https://your_trilium_host/share/[your_alias]", + "share_omit_default_css": "o CSS padrĆ£o da pĆ”gina de compartilhamento serĆ” omitido. Use quando fizer alteraƧƵes extensas de estilo.", + "share_root": "marca a nota que Ć© servida na raiz de /share.", + "share_description": "defina o texto a ser adicionado Ć  meta tag HTML \"description\"", + "share_raw": "a nota serĆ” servida no seu formato bruto, sem o wrapper HTML", + "share_disallow_robot_indexing": "impedirĆ” que robĆ“s indexem esta nota por meio do cabeƧalho X-Robots-Tag: noindex", + "share_credentials": "exigir credenciais para aceder esta nota partilhada. O valor deve estar no formato 'utilizador:palavra-passe'. NĆ£o se esqueƧa de fazer esta configuração herdĆ”vel para que seja aplicada Ć s notas-filhas/imagens.", + "share_index": "notas com este rótulo irĆ£o listar todas as raĆ­zes das notas partilhadas", + "display_relations": "nomes das relaƧƵes separados por vĆ­rgula que devem ser exibidos. Todas as outras serĆ£o ocultadas.", + "hide_relations": "nomes das relaƧƵes separados por vĆ­rgula que devem ser ocultados. Todas as outras serĆ£o exibidas.", + "title_template": "tĆ­tulo padrĆ£o das notas criadas como filhas desta nota. O valor Ć© avaliado como uma cadeia JavaScript \n e pode ser enriquecido com conteĆŗdo dinĆ¢mico usando as variĆ”veis injetadas now e parentNote. Exemplos:\n \n
    \n
  • ${parentNote.getLabelValue('authorName')}'s literary works
  • \n
  • Log for ${now.format('YYYY-MM-DD HH:mm:ss')}
  • \n
\n \n Veja a wiki com pormenores, a documentação da API para parentNote e para now para mais informaƧƵes.", + "template": "Esta nota aparecerĆ” na seleção de modelos disponĆ­veis ao criar uma nova nota", + "toc": "#toc ou #toc=show irĆ” forƧar a exibição do SumĆ”rio, #toc=hide irĆ” forƧar que ele fique oculto. Se o rótulo nĆ£o existir, serĆ” considerado o ajuste global", + "color": "define a cor da nota na Ć”rvore de notas, ligaƧƵes etc. Use qualquer valor de cor CSS vĆ”lido, como 'red' ou #a13d5f", + "keyboard_shortcut": "Define um atalho de teclado que irĆ” pular imediatamente para esta nota. Exemplo: 'ctrl+alt+e'. Ɖ necessĆ”rio recarregar o frontend para que a alteração tenha efeito.", + "keep_current_hoisting": "Abrir este ligação nĆ£o alterarĆ” o destaque, mesmo que a nota nĆ£o seja exibĆ­vel na subĆ”rvore destacada atual.", + "execute_button": "Titulo do botĆ£o que executarĆ” a nota de código atual", + "execute_description": "Descrição longa da nota de código atualmente exibida junto ao botĆ£o executar", + "exclude_from_note_map": "Notas com este rótulo ficarĆ£o ocultas no Mapa de Notas", + "new_notes_on_top": "Novas notas serĆ£o criadas no topo da nota raiz, nĆ£o na parte inferior.", + "hide_highlight_widget": "Ocultar o widget da lista de destaques", + "run_on_note_creation": "executa quando a nota Ć© criada no backend. Use esta relação se quiser executar o script para todas as notas criadas numa subĆ”rvore especĆ­fica. Neste caso, crie-a na nota raiz da subĆ”rvore e fazĆŖ-la herdĆ”vel. Uma nova nota criada dentro da subĆ”rvore (qualquer profundidade) irĆ” acionar o script.", + "run_on_child_note_creation": "executa quando uma nova nota Ć© criada sob a nota onde esta relação estĆ” definida", + "run_on_note_title_change": "executa quando o tĆ­tulo da nota Ć© alterado (inclusive na criação de nota)", + "run_on_note_content_change": "executa quando o conteĆŗdo da nota Ć© alterado (inclusive na criação de nota).", + "run_on_note_change": "executa quando a nota Ć© alterada (inclusive na criação de nota). NĆ£o incluĆ­ alteraƧƵes no conteĆŗdo", + "run_on_note_deletion": "executa quando a nota estĆ” a ser apagada", + "run_on_branch_creation": "executa quando uma ramificação Ć© criada. Ramificação Ć© uma ligação entre nota pai e nota filha e Ć© criado, por exemplo, ao clonar ou mover uma nota.", + "run_on_branch_change": "executa quando uma remificação Ć© atualizada.", + "run_on_branch_deletion": "executa quando uma ramificação Ć© apagada. Ramificação Ć© uma ligação entre a nota pai e a nota filha e Ć© apagada, por exemplo, ao mover a nota (a ramificação/ligação antiga Ć© apagada).", + "run_on_attribute_creation": "executa quando um novo atributo Ć© criado para a nota que define esta relação", + "run_on_attribute_change": " executa quando o atributo Ć© alterado na nota que define esta relação. TambĆ©m Ć© disparado quando o atributo Ć© apagado", + "relation_template": "os atributos da nota serĆ£o herdados mesmo sem um relacionamento pai-filho, o conteĆŗdo e subĆ”rvore da nota serĆ£o adicionados Ć s notas da instĆ¢ncia se estarem vazias. Veja a documentação para pormenores.", + "inherit": "os atributos da nota serĆ£o herdados mesmo sem um relacionamento pai-filho. Veja relação de modelos para um conceito semelhante. Veja a heranƧa de atributos na documentação.", + "render_note": "notas do tipo \"nota de renderização HTML\" serĆ£o renderizadas atravĆ©s de uma nota de código (HTML ou script) e Ć© necessĆ”rio apontar por esta relação qual nota deve ser renderizada", + "widget_relation": "o destino desta relação serĆ” executado e renderizado como um widget na barra lateral", + "share_css": "Nota CSS que serĆ” injetada na pĆ”gina de partilhamento. A nota CSS tambĆ©m deve estar na subĆ”rvore partilhada. Considere usar tambĆ©m 'share_hidden_from_tree' e 'share_omit_default_css'.", + "share_js": "Nota JavaScript que serĆ” injetada na pĆ”gina de partilhamento. A nota JS tambĆ©m deve estar na subĆ”rvore partilhada. Considere usar 'share_hidden_from_tree'.", + "share_template": "Nota JavaScript incorporada que serĆ” usada como modelo para exibir a nota partilhada. Retorna ao modelo padrĆ£o. Considere usar 'share_hidden_from_tree'.", + "share_favicon": "Nota Favicon que serĆ” usada na pĆ”gina partilhada. Tipicamente vai defini-la na raiz do partilhamento e fazĆŖ-la herdĆ”vel. A nota de Favicon tambĆ©m deve estar na subĆ”rvore partilhada. Considere usar 'share_hidden_from_tree'.", + "is_owned_by_note": "Ć© propriedade da nota", + "other_notes_with_name": "Outras notas com {{attributeType}} igual a \"{{attributeName}}\"", + "and_more": "... e {{count}} mais.", + "print_landscape": "Ao exportar para PDF, muda a orientação da pĆ”gina para paisagem em vez de retrato.", + "print_page_size": "Quando exportar para PDF, altera o tamanho da pĆ”gina. Valores suportados: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.", + "color_type": "Cor" + }, + "attribute_editor": { + "help_text_body1": "Para adicionar uma etiqueta, digite por exemplo #rock ou se tambĆ©m quer adicionar um valor depois por exemplo #year = 2020", + "help_text_body2": "Para relação, digite ~author = @, que deve ser exibido um autocompletar onde pode encontrar a nota desejada.", + "help_text_body3": "Alternativamente, pode adicionar etiqueta e relação pelo botĆ£o + no lado direito.", + "save_attributes": "Gravar atributos ", + "add_a_new_attribute": "Adicionar um novo atributo", + "add_new_label": "Adicionar nova etiqueta ", + "add_new_relation": "Adicionar nova relação ", + "add_new_label_definition": "Adicionar nova definição de etiqueta", + "add_new_relation_definition": "Adicionar nova definição de relação", + "placeholder": "Digite as etiquetas e relaƧƵes aqui" + }, + "abstract_bulk_action": { + "remove_this_search_action": "Remover esta ação de pesquisa" + }, + "execute_script": { + "execute_script": "Executar script", + "help_text": "Pode executar scripts simples nas notas correspondentes.", + "example_1": "Por exemplo para anexar uma cadeia ao tĆ­tulo de uma nota, use este pequeno script:", + "example_2": "Um exemplo mais complexo seria apagar todos os atributos das notas correspondentes:" + }, + "add_label": { + "add_label": "Adicionar etiqueta", + "label_name_placeholder": "nome da etiqueta", + "label_name_title": "Caracteres alfanumĆ©ricos, underscore e vĆ­rgula sĆ£o permitidos.", + "to_value": "para o valor", + "new_value_placeholder": "novo valor", + "help_text": "Em todas as notas correspondentes:", + "help_text_item1": "criar a etiqueta indicada se a nota ainda nĆ£o tiver uma", + "help_text_item2": "ou altere o valor da etiqueta existente", + "help_text_note": "TambĆ©m pode chamar este mĆ©todo sem valor, neste caso a etiqueta serĆ” atribuĆ­da Ć  nota sem valor." + }, + "delete_label": { + "delete_label": "Apagar etiqueta", + "label_name_placeholder": "nome da etiqueta", + "label_name_title": "Caracteres alfanumĆ©ricos, underscore e vĆ­rgula sĆ£o permitidos." + }, + "rename_label": { + "rename_label": "Renomear etiqueta", + "rename_label_from": "Renomear etiqueta de", + "old_name_placeholder": "nome antigo", + "to": "Para", + "new_name_placeholder": "novo nome", + "name_title": "Caracteres alfanumĆ©ricos, underscore e vĆ­rgula sĆ£o permitidos." + }, + "update_label_value": { + "update_label_value": "Atualizar valor da etiqueta", + "label_name_placeholder": "nome da etiqueta", + "label_name_title": "Caracteres alfanumĆ©ricos, underscore e vĆ­rgula sĆ£o permitidos.", + "to_value": "para o valor", + "new_value_placeholder": "novo valor", + "help_text": "Em todas as notas correspondentes, altera o valor da etiqueta existente.", + "help_text_note": "TambĆ©m pode chamar este mĆ©todo sem um valor, neste caso a etiqueta serĆ” Ć  nota sem um valor." + }, + "delete_note": { + "delete_note": "Apagar nota", + "delete_matched_notes": "Apagar notas correspondentes", + "delete_matched_notes_description": "Isto irĆ” apagar as notas correspondentes.", + "undelete_notes_instruction": "Depois de apagar, Ć© possĆ­vel desapagĆ”-las atravĆ©s da janela de AlteraƧƵes Recentes.", + "erase_notes_instruction": "Para apagar notas permanentemente, pode fazĆŖ-lo depois de apagar em OpƧƵes -> Outros e clicar no botĆ£o \"Apagar notas apagadas agora\"." + }, + "delete_revisions": { + "delete_note_revisions": "Apagar revisƵes da nota", + "all_past_note_revisions": "Todas as revisƵes anteriores das notas correspondentes serĆ£o apagadas. A nota em si serĆ” perservada. Ou seja, o histórico da nota serĆ” removido." + }, + "move_note": { + "move_note": "Mover nota", + "to": "para", + "target_parent_note": "nota pai destino", + "on_all_matched_notes": "Em todas as notas correspondentes", + "move_note_new_parent": "move a nota para o novo pai se a nota tem apenas um pai (ou seja, a antiga ramificação Ć© removida e uma nova ramificação Ć© criada para o novo pai)", + "clone_note_new_parent": "clona a nota para o novo pai se a nota tem vĆ”rios clones / ramificaƧƵes (nĆ£o Ć© claro qual ramificação deve ser removida)", + "nothing_will_happen": "nada acontecerĆ” se a nota nĆ£o puder ser movida para a nota de destino (por exemplo, criaria um ciclo de Ć”rvore)" + }, + "rename_note": { + "rename_note": "Renomear nota", + "rename_note_title_to": "Renomear tĆ­tulo da nota para", + "new_note_title": "novo tĆ­tulo da nota", + "click_help_icon": "Clique no Ć­cone de ajuda a direita para ver todas as opƧƵes", + "evaluated_as_js_string": "O valor digitado Ć© avaliado como cadeia JavaScript e, portanto, pode ser enriquecido com conteĆŗdo dinĆ¢mico atravĆ©s da variĆ”vel injetada note (nota a ser renomeada). Exemplos:", + "example_note": "Nota - todas as notas correspondentes serĆ£o renomeadas para 'Nota'", + "example_new_title": "NOVO: ${note.title} - o tĆ­tulo das notas correspondentes receberĆ” o prefixo 'NOVO: '", + "example_date_prefix": "${note.dateCreatedObj.format('MM-DD:')}: ${note.title} - notas correspondentes receberĆ£o um prefixo com o mĆŖs-dia da data de criação da nota", + "api_docs": "Veja da documentação da API para nota e as suas propriedades dateCreatedObj / utcDateCreatedObj para pormenores." + }, + "add_relation": { + "add_relation": "Adicionar relação", + "relation_name": "nome da relação", + "allowed_characters": "Caracteres alfanumĆ©ricos, underscore e vĆ­rgula sĆ£o permitidos.", + "to": "para", + "target_note": "nota destino", + "create_relation_on_all_matched_notes": "Crie a relação informada em todas as notas correspondentes." + }, + "delete_relation": { + "delete_relation": "Apagar relação", + "relation_name": "nome da relação", + "allowed_characters": "Caracteres alfanumĆ©ricos, underscore e vĆ­rgula sĆ£o permitidos." + }, + "rename_relation": { + "rename_relation": "Renomar relação", + "rename_relation_from": "Renomear relação de", + "old_name": "nome antigo", + "to": "Para", + "new_name": "novo nome", + "allowed_characters": "Caracteres alfanumĆ©ricos, underscore e vĆ­rgula sĆ£o permitidos." + }, + "update_relation_target": { + "update_relation": "Atualizar relação", + "relation_name": "nome da relação", + "allowed_characters": "Caracteres alfanumĆ©ricos, underscore e vĆ­rgula sĆ£o permitidos.", + "to": "para", + "target_note": "nota destino", + "on_all_matched_notes": "Em todas as notas correspondentes", + "change_target_note": "alterar nota destino da relação existente", + "update_relation_target": "Atualizar destino da relação" + }, + "attachments_actions": { + "open_externally": "Abrir externamente", + "open_externally_title": "O ficheiro serĆ” aberto numa aplicação externa e monitorado por alteraƧƵes. Depois poderĆ” enviar a versĆ£o modificada de volta para o Trilium.", + "open_custom": "Abrir customizado", + "open_custom_title": "O ficheiro serĆ” aberto numa aplicação externa e monitorado por alteraƧƵes. Depois poderĆ” enviar a versĆ£o modificada de volta para o Trilium.", + "download": "Descarregar", + "rename_attachment": "Renomear anexo", + "upload_new_revision": "Enviar nova revisĆ£o", + "copy_link_to_clipboard": "Copiar ligação para a Ć”rea de transferĆŖncia", + "convert_attachment_into_note": "Converter anexo para nota", + "delete_attachment": "Apagar anexo", + "upload_success": "Uma nova revisĆ£o de anexo foi enviada.", + "upload_failed": "O envio de uma nova revisĆ£o de anexo falhou.", + "open_externally_detail_page": "A abertura de anexo externamente só estĆ” disponĆ­vel atravĆ©s da pĆ”gina de pormenores. Por favor, primeiro clique nos pormenores do anexo e repita a ação.", + "open_custom_client_only": "A abertura customizada de anexos só pode ser feita no cliente de desktop.", + "delete_confirm": "Tem certeza que deseja apagar o anexo '{{title}}'?", + "delete_success": "O anexo '{{title}}' foi apagado.", + "convert_confirm": "Tem certeza que deseja converter o anexo '{{title}}' numa nota separada?", + "convert_success": "O anexo '{{title}}' foi convertido para uma nota.", + "enter_new_name": "Por favor, digite o novo nome do anexo" + }, + "calendar": { + "mon": "Seg", + "tue": "Ter", + "wed": "Qua", + "thu": "Qui", + "fri": "Sex", + "sat": "SĆ”b", + "sun": "Dom", + "cannot_find_day_note": "Nota do dia nĆ£o encontrada", + "cannot_find_week_note": "Nota semanal nĆ£o encontrada", + "january": "Janeiro", + "february": "Fevereiro", + "march": "MarƧo", + "april": "Abril", + "may": "Maio", + "june": "Junho", + "july": "Julho", + "august": "Agosto", + "september": "Setembro", + "october": "Outubro", + "november": "Novembro", + "december": "Dezembro" + }, + "close_pane_button": { + "close_this_pane": "Fechar este painel" + }, + "create_pane_button": { + "create_new_split": "Criar divisĆ£o" + }, + "edit_button": { + "edit_this_note": "Editar esta nota" + }, + "show_toc_widget_button": { + "show_toc": "Mostrar Tabela de ConteĆŗdo" + }, + "show_highlights_list_widget_button": { + "show_highlights_list": "Mostrar Lista de Destaques" + }, + "global_menu": { + "menu": "Menu", + "options": "OpƧƵes", + "open_new_window": "Abrir Nova Janela", + "switch_to_mobile_version": "Alternar para VersĆ£o Mobile", + "switch_to_desktop_version": "Alternar para VersĆ£o Desktop", + "zoom": "Zoom", + "toggle_fullscreen": "Alternar EcrĆ£ Cheio", + "zoom_out": "Reduzir", + "reset_zoom_level": "Redefinir Zoom", + "zoom_in": "Aumentar", + "configure_launchbar": "Configurar Barra de LanƧamento", + "show_shared_notes_subtree": "Exibir SubĆ”rvore de Notas Partilhadas", + "advanced": "AvanƧado", + "open_dev_tools": "Abrir Ferramentas de Programador", + "open_sql_console": "Abrir Console SQL", + "open_sql_console_history": "Abrir Histórico de Console SQL", + "open_search_history": "Abrir Histórico de Pesquisa", + "show_backend_log": "Abrir Log do Servidor", + "reload_hint": "Recarregar pode ajudar em alguns problemas visuais sem reiniciar toda a app.", + "reload_frontend": "Recarregar Frontend", + "show_hidden_subtree": "Exibir SubĆ”rvore Oculta", + "show_help": "Exibir Ajuda", + "about": "Sobre o Trilium Notes", + "logout": "Sair", + "show-cheatsheet": "Exibir Cheatsheet", + "toggle-zen-mode": "Modo Zen" + }, + "zen_mode": { + "button_exit": "Sair do Modo Zen" + }, + "sync_status": { + "unknown": "

O estado da sincronização serÔ conhecido assim que a próxima tentativa começar.

Clique para iniciar a sincronização agora.

", + "connected_with_changes": "

Conectado ao servidor de sincronização.
Existem algumas alteraƧƵes a serem sincronizadas.

Clique para sincronizar.

", + "connected_no_changes": "

Conectado ao servidor de sincronização.
Todas as alteraƧƵes jƔ foram sincronizadas.

Clique para sincronizar.

", + "disconnected_with_changes": "

A conexão ao servidor de sincronização falhou.
Existem algumas alteraƧƵes a serem sincronizadas.

Clique para sincronizar.

", + "disconnected_no_changes": "

A conexão ao servidor de sincronização falhou.
Todas as alteraƧƵes jƔ foram sincronizadas.

Clique para sincronizar.

", + "in_progress": "Sincronização com o servidor em andamento." + }, + "left_pane_toggle": { + "show_panel": "Exibir painel", + "hide_panel": "Esconder painel" + }, + "move_pane_button": { + "move_left": "Mover para a esquerda", + "move_right": "Mover para a direita" + }, + "note_actions": { + "convert_into_attachment": "Converter no anexo", + "re_render_note": "Renderizar nota novamente", + "search_in_note": "Pesquisar na nota", + "note_source": "Código Fonte da nota", + "note_attachments": "Anexos da nota", + "open_note_externally": "Abrir nota externamente", + "open_note_externally_title": "O ficheiro serĆ” aberto numa aplicação externa e monitorado por alteraƧƵes. Depois poderĆ” enviar a versĆ£o modificada de volta para o Trilium.", + "open_note_custom": "Abrir nota de forma customizada", + "import_files": "Importar ficheiros", + "export_note": "Exportar nota", + "delete_note": "Apagar nota", + "print_note": "Imprimir nota", + "save_revision": "Gravar revisĆ£o", + "convert_into_attachment_failed": "A conversĆ£o da nota '{{title}}' falhou.", + "convert_into_attachment_successful": "A nota '{{title}}' foi convertida para anexo.", + "convert_into_attachment_prompt": "Tem certeza que quer converter a nota '{{title}}' num anexo da nota pai?", + "print_pdf": "Exportar como PDF…" + }, + "onclick_button": { + "no_click_handler": "Componente de botĆ£o '{{componentId}}' nĆ£o possui manipulador de clique definido" + }, + "protected_session_status": { + "active": "SessĆ£o protegida estĆ” ativada. Clique para deixar a sessĆ£o protegida.", + "inactive": "Clique para entrar na sessĆ£o protegida" + }, + "revisions_button": { + "note_revisions": "RevisƵes da Nota" + }, + "update_available": { + "update_available": "Atualização disponĆ­vel" + }, + "note_launcher": { + "this_launcher_doesnt_define_target_note": "Este lanƧador nĆ£o define uma nota destino." + }, + "code_buttons": { + "execute_button_title": "Executar script", + "trilium_api_docs_button_title": "Abrir documentação da Trilium API", + "save_to_note_button_title": "Gravar para uma nota", + "opening_api_docs_message": "A abrir documentação da API…", + "sql_console_saved_message": "Nota do Console SQL foi gravada no caminho {{note_path}}" + }, + "copy_image_reference_button": { + "button_title": "Copiar referĆŖncia da imagem para a Ć”rea de transferĆŖncia, pode ser colado numa nota de texto." + }, + "hide_floating_buttons_button": { + "button_title": "Esconder botƵes" + }, + "show_floating_buttons_button": { + "button_title": "Exibir botƵes" + }, + "svg_export_button": { + "button_title": "Exportar diagrama como SVG" + }, + "relation_map_buttons": { + "create_child_note_title": "Criar nota filha e adicione neste mapa de relação", + "reset_pan_zoom_title": "Redefinir pan & zoom para coordenadas e ampliação iniciais", + "zoom_in_title": "Aumentar", + "zoom_out_title": "Reduzir" + }, + "zpetne_odkazy": { + "backlink": "{{count}} Ligação Reversa", + "backlinks": "{{count}} LigaƧƵes Reversas", + "relation": "relação" + }, + "mobile_detail_menu": { + "insert_child_note": "Inserir nota filha", + "delete_this_note": "Apagar esta nota", + "error_cannot_get_branch_id": "NĆ£o foi possĆ­vel obter o branchId para o notePath '{{notePath}} '", + "error_unrecognized_command": "Comando nĆ£o reconhecido {{command}}" + }, + "note_icon": { + "change_note_icon": "Alterar Ć­cone da nota", + "category": "Categoria:", + "search": "Pesquisa:", + "reset-default": "Redefinir para o Ć­cone padrĆ£o" + }, + "basic_properties": { + "note_type": "Tipo da nota", + "editable": "EditĆ”vel", + "basic_properties": "Propriedades BĆ”sicas", + "language": "Idioma", + "configure_code_notes": "Configurar notas de código..." + }, + "book_properties": { + "view_type": "Tipo de visualização", + "grid": "Grade", + "list": "Lista", + "collapse_all_notes": "Recolher todas as notas", + "expand_all_children": "Expandir todos os filhos", + "collapse": "Recolher", + "expand": "Expandir", + "book_properties": "Propriedades da Coleção", + "invalid_view_type": "Tipo de visualização invĆ”lido '{{type}}'", + "calendar": "CalendĆ”rio", + "table": "Tabela", + "geo-map": "Mapa geogrĆ”fico", + "board": "Quadro" + }, + "edited_notes": { + "no_edited_notes_found": "Ainda nĆ£o hĆ” nenhuma nota editada neste dia…", + "title": "Notas Editadas", + "deleted": "(apagado)" + }, + "file_properties": { + "note_id": "ID da Nota", + "original_file_name": "Nome original do ficheiro", + "file_type": "Tipo do ficheiro", + "file_size": "Tamanho do ficheiro", + "download": "Descarregar", + "open": "Abrir", + "upload_new_revision": "Enviar nova revisĆ£o", + "upload_success": "Uma nova revisĆ£o de ficheiro foi enviada.", + "upload_failed": "O envio de uma nova revisĆ£o de ficheiro falhou.", + "title": "Ficheiro" + }, + "image_properties": { + "original_file_name": "Nome original do ficheiro", + "file_type": "Tipo do ficheiro", + "file_size": "Tamanho do ficheiro", + "download": "Descarregar", + "open": "Abrir", + "copy_reference_to_clipboard": "Copiar referĆŖncia para a Ć”rea de transferĆŖncia", + "upload_new_revision": "Enviar nova revisĆ£o", + "upload_success": "Uma nova revisĆ£o de imagem foi enviado.", + "upload_failed": "O envio de uma nova revisĆ£o de imagem falhou: {{message}}", + "title": "Imagem" + }, + "inherited_attribute_list": { + "title": "Atributos Herdados", + "no_inherited_attributes": "Nenhum atributo herdado." + }, + "note_info_widget": { + "note_id": "ID da Nota", + "created": "Criado", + "modified": "Editado", + "type": "Tipo", + "note_size": "Tamanho da nota", + "note_size_info": "O tamanho da nota fornece uma estimativa aproximada dos requisitos de armazenamento para esta nota. Leva em conta o conteĆŗdo e o conteĆŗdo das suas revisƵes de nota.", + "calculate": "calcular", + "subtree_size": "(tamanho da subĆ”rvore: {{size}} em {{count}} notas)", + "title": "InformaƧƵes da nota" + }, + "note_map": { + "open_full": "Expandir completamente", + "collapse": "Recolher para tamanho normal", + "title": "Mapa de Notas", + "fix-nodes": "Fixar nós", + "link-distance": "DistĆ¢ncia da Ligação" + }, + "note_paths": { + "title": "Caminho das Notas", + "clone_button": "Clonar nota para novo local…", + "intro_placed": "Esta nova estĆ” localizada nos caminhos:", + "intro_not_placed": "Esta nota ainda nĆ£o estĆ” em nenhuma Ć”rvore de notas.", + "outside_hoisted": "Este caminho estĆ” fora de uma nota fixada e teria que desafixar.", + "archived": "Arquivado", + "search": "Pesquisar" + }, + "note_properties": { + "this_note_was_originally_taken_from": "Esta nota foi originalmente obtida de:", + "info": "InformaƧƵes" + }, + "owned_attribute_list": { + "owned_attributes": "Atributos próprios" + }, + "promoted_attributes": { + "promoted_attributes": "Atributos Promovidos", + "unset-field-placeholder": "nĆ£o atribuĆ­do", + "url_placeholder": "http://website...", + "open_external_link": "Abrir ligação externa", + "unknown_label_type": "Tipo de etiqueta desconhecido '{{type}}'", + "unknown_attribute_type": "Tipo de atributo desconhecido '{{type}}'", + "add_new_attribute": "Adicionar novo atributo", + "remove_this_attribute": "Remover este atributo", + "remove_color": "Remover a etiqueta de cor" + }, + "script_executor": { + "query": "Consulta", + "script": "Script", + "execute_query": "Executar Consulta", + "execute_script": "Executar Script" + }, + "search_definition": { + "add_search_option": "Adicionar opção de pesquisa:", + "search_string": "pesquisar cadeia", + "search_script": "pesquisa de script", + "ancestor": "ancestral", + "fast_search": "pesquisa rĆ”pida", + "fast_search_description": "A opção de pesquisa rĆ”pida desativa a pesquisa de texto completo do conteĆŗdo de nota, o que pode acelerar a pesquisa em grandes bases de dados.", + "include_archived": "incluir arquivados", + "include_archived_notes_description": "As notas arquivadas sĆ£o por padrĆ£o excluĆ­das dos resultados da pesquisa, com esta opção elas serĆ£o incluĆ­das.", + "order_by": "ordenar por", + "limit": "limite", + "limit_description": "Limitar quantidade de resultados", + "debug": "depurar", + "debug_description": "A depuração irĆ” imprimir informaƧƵes adicionais no console para ajudar na depuração de consultas complexas", + "action": "ação", + "search_button": "Pesquisar", + "search_execute": "Pesquisar & Executar aƧƵes", + "save_to_note": "Gravar para nota", + "search_parameters": "ParĆ¢metros de Pesquisa", + "unknown_search_option": "Opção de pesquisa desconhecida {{searchOptionName}}", + "search_note_saved": "Nota de pesquisa foi gravada em {{- notePathTitle}}", + "actions_executed": "As aƧƵes foram executadas." + }, + "similar_notes": { + "title": "Notas Similares", + "no_similar_notes_found": "Nenhum nota similar encontrada." + }, + "abstract_search_option": { + "remove_this_search_option": "Remover esta opção de pesquisa", + "failed_rendering": "A renderização da opção de pesquisa falhou: {{dto}} com o erro: {{error}} {{stack}}" + }, + "ancestor": { + "label": "Ancestral", + "placeholder": "pesquisar notas pelo nome", + "depth_label": "profundidade", + "depth_doesnt_matter": "nĆ£o importa", + "depth_eq": "Ć© exatamente {{count}}", + "direct_children": "filho direto", + "depth_gt": "Ć© maior que {{count}}", + "depth_lt": "Ć© menor que {{count}}" + }, + "debug": { + "debug": "Depurar", + "debug_info": "A depuração irĆ” imprimir informaƧƵes adicionais no console para ajudar em depuração de consultas complexas.", + "access_info": "Para aceder as informaƧƵes de depuração, execute a consulta e clique em \"Exibir log do servidor\" no canto superior esquerdo." + }, + "fast_search": { + "fast_search": "Pesquisa rĆ”pida", + "description": "A opção de pesquisa rĆ”pida desativa a pesquisa de texto completo do conteĆŗdo de nota, o que pode acelerar a pesquisa em grandes bases de dados." + }, + "include_archived_notes": { + "include_archived_notes": "Incluir notas arquivadas" + }, + "limit": { + "limit": "Limite", + "take_first_x_results": "Escolher apenas os X primeiros resultados." + }, + "order_by": { + "order_by": "Ordenar por", + "relevancy": "RelevĆ¢ncia (padrĆ£o)", + "title": "TĆ­tulo", + "date_created": "Data de criação", + "date_modified": "Data da Ćŗltima modificação", + "content_size": "Tamaho do conteĆŗdo da nota", + "content_and_attachments_size": "Tamanho do conteĆŗdo da nota incluindo anexos", + "content_and_attachments_and_revisions_size": "Tamanho do conteĆŗdo da nota incluindo anexos e revisƵes", + "revision_count": "Quantidade de revisƵes", + "children_count": "Quantidade de notas filhas", + "parent_count": "Quantidade de clones", + "owned_label_count": "Quantidade de etiquetas", + "owned_relation_count": "Quantidade de relaƧƵes", + "target_relation_count": "Quantidade de relaƧƵes para esta nota", + "random": "Ordem aleatória", + "asc": "Crescente (padrĆ£o)", + "desc": "Decrescente" + }, + "search_script": { + "title": "Pesquisar script:", + "placeholder": "pesquisar notas pelo nome", + "description1": "O script de pesquisa permite definir os resultados da pesquisa por executar um script. Isto proporciona flexibilidade mĆ”xima quando a pesquisa padrĆ£o nĆ£o Ć© suficiente.", + "description2": "O script de pesquisa deve ser do tipo \"código\" e subtipo \"JavaScript no servidor\". O script precisa retornar um array de noteIds ou de notas.", + "example_title": "Veja este exemplo:", + "example_code": "// 1. prĆ©-filtro usando uma pesquisa predefinida\nconst candidateNotes = api.searchForNotes(\"#journal\"); \n\n// 2. aplicar critĆ©rios de pesquisa customizados\nconst matchedNotes = candidateNotes\n .filter(note => note.title.match(/[0-9]{1,2}\\. ?[0-9]{1,2}\\. ?[0-9]{4}/));\n\nreturn matchedNotes;", + "note": "Note que o script de pesquisa e a pesquisa de cadeia nĆ£o podem ser combinados entre si." + }, + "search_string": { + "title_column": "Pesquisar cadeia:", + "placeholder": "palavras-chave fulltext, #tag = valor...", + "search_syntax": "Sintaxe de pesquisa", + "also_see": "veja tambĆ©m", + "complete_help": "ajuda completa da sintaxe de pesquisa", + "full_text_search": "Digite qualquer texto para pesquisa no texto completo", + "label_abc": "retorna notas com a etiqueta abc", + "label_year": "corresponde notas com a etiqueta de ano 2019", + "label_rock_pop": "corresponde notas que tenham tanto a etiqueta rock quando pop", + "label_rock_or_pop": "apenas uma das etiquetas deve estar presente", + "label_year_comparison": "comparação numĆ©rica (tambĆ©m >, >=, <).", + "label_date_created": "notas criadas no Ćŗltimo mĆŖs", + "error": "Erro na pesquisa: {{error}}", + "search_prefix": "Pesquisa:" + }, + "attachment_detail": { + "open_help_page": "Abrir pĆ”gina de ajuda nos anexos", + "owning_note": "Nota proprietĆ”ria: ", + "you_can_also_open": ", tambĆ©m pode abrir o(a) ", + "list_of_all_attachments": "Lista de todos os anexos", + "attachment_deleted": "Este anexo foi apagado." + }, + "attachment_list": { + "open_help_page": "Abrir pĆ”gina de ajuda nos anexos", + "owning_note": "Nota proprietĆ”ria: ", + "upload_attachments": "Enviar anexos", + "no_attachments": "Esta nota nĆ£o possuĆ­ anexos." + }, + "book": { + "no_children_help": "Esta coleção nĆ£o possui nenhum nota filha, entĆ£o nĆ£o hĆ” nada para exibir. Veja wiki para pormenores." + }, + "editable_code": { + "placeholder": "Digite o conteĆŗdo da sua nota de código aqui…" + }, + "editable_text": { + "placeholder": "Digite o conteĆŗdo da sua nota aqui…" + }, + "empty": { + "open_note_instruction": "Abra uma nota a digitar o tĆ­tulo da nota no campo abaixo ou escolha uma nota na Ć”rvore.", + "search_placeholder": "pesquisar uma nota pelo nome", + "enter_workspace": "Entrar no workspace {{title}}" + }, + "file": { + "file_preview_not_available": "PrĆ©via nĆ£o disponĆ­vel para este formato de ficheiro.", + "too_big": "A prĆ©via mostra apenas os primeiros {{maxNumChars}} caracteres do ficheiro por razƵes de desempenho. Descarregue o ficheiro e abra-o externamente para ver todo o conteĆŗdo." + }, + "protected_session": { + "enter_password_instruction": "Ɖ necessĆ”rio digitar a sua palavra-passe para mostar notas protegidas:", + "start_session_button": "Iniciar sessĆ£o protegida enter", + "started": "A sessĆ£o protegida foi iniciada.", + "wrong_password": "Palavra-passe incorreta.", + "protecting-finished-successfully": "A proteção foi finalizada com sucesso.", + "unprotecting-finished-successfully": "A remoção da proteção foi finalizada com sucesso.", + "protecting-in-progress": "ProteƧƵes em andamento: {{count}}", + "unprotecting-in-progress-count": "RemoƧƵes de proteção em andamento: {{count}}", + "protecting-title": "Estado da proteção", + "unprotecting-title": "Estado da remoção de proteção" + }, + "relation_map": { + "open_in_new_tab": "Abrir em nova guia", + "remove_note": "Remover nota", + "edit_title": "Editar tĆ­tulo", + "rename_note": "Renomear nota", + "enter_new_title": "Digite o novo tĆ­tulo da nota:", + "remove_relation": "Remover relação", + "confirm_remove_relation": "Tem certeza que deseja remover esta relação?", + "specify_new_relation_name": "Especifique o novo nome da relação (caracteres disponĆ­veis: alfanumĆ©ricos, vĆ­rgula e underscore):", + "connection_exists": "A conexĆ£o '{{name}}' jĆ” existe entre estas notas.", + "start_dragging_relations": "Comece a arrastar as relaƧƵes daqui e solte-as noutra nota.", + "note_not_found": "Nota {{noteId}} nĆ£o encontrada!", + "cannot_match_transform": "NĆ£o foi possĆ­vel combinar a transformação: {{transform}}", + "note_already_in_diagram": "A nota \"{{title}}\" jĆ” estĆ” no diagrama.", + "enter_title_of_new_note": "Digite o tĆ­tulo da nova nota", + "default_new_note_title": "nova nota", + "click_on_canvas_to_place_new_note": "Clique no quadro para incluir uma nova nota" + }, + "render": { + "note_detail_render_help_1": "Esta nota de ajuda Ć© mostrada porque esta nota do tipo Renderizar HTML nĆ£o possui a relação necessĆ”ria para funcionar corretamente.", + "note_detail_render_help_2": "O tipo de nota Renderizar HTML Ć© usado para automação. Em suma, tem uma nota de código HTML (opcionalmente com algum JavaScript) e esta nota irĆ” renderizĆ”-la. Para fazĆŖ-lo funcionar, deve definir uma relação chamada \"renderNote\" que aponta para a nota HTML a ser renderizada." + }, + "web_view": { + "web_view": "Web View", + "embed_websites": "Nota do tipo Visualização Web permite que incorpore sites no Trilium.", + "create_label": "Para comeƧar, crie uma etiqueta com um endereƧo URL que deseja incorporar, por exemplo, #webViewSrc=\"https://www.google.com\"" + }, + "backend_log": { + "refresh": "Recarregar" + }, + "consistency_checks": { + "title": "VerificaƧƵes de ConsistĆŖncia", + "find_and_fix_button": "Encontrar e corrigir problemas de consistĆŖncia", + "finding_and_fixing_message": "A procurar e corrigir problemas de consistĆŖncia…", + "issues_fixed_message": "Qualquer problema de consistĆŖncia encontrado foi corrigido." + }, + "database_anonymization": { + "title": "Anonimização do Banco de Dados", + "full_anonymization": "Anonimização Completa", + "full_anonymization_description": "Esta ação ira gerar uma cópia anĆ“nima da base de dados (sem conteĆŗdo das notas, apenas estrutura e alguns metadados nĆ£o sensĆ­veis) para partilhar online e depurar, sem expor os seus dados pessoais.", + "save_fully_anonymized_database": "Gravar base de dados totalmente anonimizada", + "light_anonymization": "Anonimização Leve", + "light_anonymization_description": "Esta ação criarĆ” uma nova cópia da base de dados e aplicarĆ” uma anonimização leve — especificamente, apenas o conteĆŗdo de todas as notas serĆ” removido, mas tĆ­tulos e atributos permanecerĆ£o. AlĆ©m disso, notas personalizadas de scripts JS frontend/servidor e widgets personalizados serĆ£o mantidos. Isto fornece mais contexto para depurar os problemas.", + "choose_anonymization": "Pode decidir se deseja fornecer uma base de dados totalmente ou levemente anonimizada. Mesmo a base de dados totalmente anonimizada Ć© muito Ćŗtil; no entanto, em alguns casos, uma base de dados levemente anonimizada pode acelera o processo de identificação e correção de bugs.", + "save_lightly_anonymized_database": "Gravar base de dados levemente anonimizada", + "existing_anonymized_databases": "Bases de dados anonimizada existentes", + "creating_fully_anonymized_database": "A criar base de dados totalmente anonimizada...", + "creating_lightly_anonymized_database": "A criar base de dados levemente anonimizada...", + "error_creating_anonymized_database": "NĆ£o foi possĆ­vel criar a base de dados anonimizada, verifique os logs do servidor para mais pormenores", + "successfully_created_fully_anonymized_database": "Base de dados totalmente anonimizada criada em {{anonymizedFilePath}}", + "successfully_created_lightly_anonymized_database": "Base de dados levemente anonimizada criada em {{anonymizedFilePath}}", + "no_anonymized_database_yet": "Nenhuma base de dados anonimizada no momento." + }, + "database_integrity_check": { + "title": "Verificação de Integridade da Base de Dados", + "description": "Isto verificarĆ” se a base de dados nĆ£o estĆ” corrompida no nĆ­vel SQLite. Pode levar algum tempo, dependendo do tamanho da base de dados.", + "check_button": "Verificar integridade da base de dados", + "checking_integrity": "A verificar integridade da base de dados…", + "integrity_check_succeeded": "Verificação de integridade bem sucedida - nenhum problema encontrado.", + "integrity_check_failed": "Verificação de integridade falhou: {{results}}" + }, + "sync": { + "title": "Sincronizar", + "force_full_sync_button": "ForƧar sincronização completa", + "fill_entity_changes_button": "Preencher registos de alteraƧƵes da entidade", + "full_sync_triggered": "Sincronização completa iniciada", + "filling_entity_changes": "A preencher linhas de alteraƧƵes da entidade...", + "sync_rows_filled_successfully": "Linhas de sincronização preenchidas com sucesso", + "finished-successfully": "Sincronização finalizada com sucesso.", + "failed": "Sincronização falhou: {{message}}" + }, + "vacuum_database": { + "title": "Executar Vacuum no Banco de Dados", + "description": "Isto irĆ” reconstruir a base de dados, o que normalmente irĆ” resultar numa redução do ficheiro da base de dados. Nenhum dado serĆ” alterado.", + "button_text": "Executar Vacuum", + "vacuuming_database": "A executar vacuum na base de dados...", + "database_vacuumed": "Vacuum executado na base de dados" + }, + "fonts": { + "theme_defined": "Tema definido", + "fonts": "Fontes", + "main_font": "Fonte Principal", + "font_family": "FamĆ­lia da fonte", + "size": "Tamanho", + "note_tree_font": "Fonte da Ɓrvore de Notas", + "note_detail_font": "Fonte PadrĆ£o da Nota", + "monospace_font": "Fonte Monospace (código)", + "note_tree_and_detail_font_sizing": "Note que o tamanho da fonte da Ć”rvore e dos pormenores Ć© relativo Ć  configuração principal do tamanho de fonte.", + "not_all_fonts_available": "Nem todas as fontes listadas podem estar disponĆ­veis no seu sistema.", + "apply_font_changes": "Para aplicar as alteraƧƵes de fonte, clique em", + "reload_frontend": "recarregar frontend", + "generic-fonts": "Fontes genĆ©ricas", + "sans-serif-system-fonts": "Fontes sem serifa de sistema", + "serif-system-fonts": "Fontes serifadas de sistema", + "monospace-system-fonts": "Fontes monospace de sistema", + "handwriting-system-fonts": "Fontes de escrita Ć  mĆ£o de sistema", + "serif": "Serifa", + "sans-serif": "Sem Serifa", + "monospace": "MonoespaƧado", + "system-default": "PadrĆ£o do Sistema" + }, + "max_content_width": { + "title": "Largura do ConteĆŗdo", + "default_description": "Por padrĆ£o, o Trilium limita a largura mĆ”xima do conteĆŗdo para melhorar a legibilidade em janelas maximizadas em ecrĆ£s largos.", + "max_width_label": "Largura mĆ”xima do conteĆŗdo", + "max_width_unit": "pixels", + "apply_changes_description": "Para aplicar as alteraƧƵes de largura do conteĆŗdo, clique em", + "reload_button": "recarregar frontend", + "reload_description": "alteraƧƵes de opƧƵes de aparĆŖncia" + }, + "native_title_bar": { + "title": "Barra de TĆ­tulo Nativa (requer recarregar a app)", + "enabled": "ativada", + "disabled": "desativada" + }, + "ribbon": { + "widgets": "Widgets de fita", + "promoted_attributes_message": "A guia de Atributos Promovidos irĆ” abrir automaticamente se existirem atributos promovidos na nota", + "edited_notes_message": "A guia de Notas Editadas serĆ” aberta automaticamente nas notas do dia" + }, + "theme": { + "title": "Tema da Aplicação", + "theme_label": "Tema", + "override_theme_fonts_label": "Sobrepor fontes do tema", + "auto_theme": "Legado (Seguir esquema de cor do sistema)", + "light_theme": "Legado (Claro)", + "dark_theme": "Legado (Escuro)", + "triliumnext": "Trilium (Seguir esquema de cor do sistema)", + "triliumnext-light": "Trilium (Claro)", + "triliumnext-dark": "Trilium (Escuro)", + "layout": "Layout", + "layout-vertical-title": "Vertical", + "layout-horizontal-title": "Horizontal", + "layout-vertical-description": "barra de lanƧamento estĆ” a esquerda (padrĆ£o)", + "layout-horizontal-description": "barra de lanƧamento estĆ” abaixo da barra de guias, a barra de guias agora tem a largura total." + }, + "ui-performance": { + "title": "Desempenho", + "enable-motion": "Ativar transiƧƵes e animaƧƵes", + "enable-shadows": "Ativar sombras", + "enable-backdrop-effects": "Ativar efeitos de fundo para menus, popups e painĆ©is" + }, + "ai_llm": { + "not_started": "NĆ£o iniciado", + "title": "ConfiguraƧƵes de IA", + "processed_notes": "Notas Processadas", + "total_notes": "Total de Notas", + "progress": "Andamento", + "queued_notes": "Notas Enfileiradas", + "failed_notes": "Notas com Falha", + "last_processed": "Últimas Processadas", + "refresh_stats": "Atualizar EstatĆ­sticas", + "enable_ai_features": "Ativar recurso IA/LLM", + "enable_ai_description": "Ativar recursos IA como sumarização de notas, geração de conteĆŗdo e outras capacidades de LLM", + "openai_tab": "OpenAI", + "anthropic_tab": "Anthropic", + "voyage_tab": "Voyage AI", + "ollama_tab": "Ollama", + "enable_ai": "Ativar recursos IA/LLM", + "enable_ai_desc": "Ativar recursos de IA como sumarização de notas, geração de conteĆŗdo e outras capacidades de LLM", + "provider_configuration": "Configuração de Provedor de IA", + "provider_precedence": "Prioridade de provedor", + "provider_precedence_description": "Lista de provedores em ordem de prioridade, separados por vĆ­rgula (por exemplo, 'openai, anthropic, ollama')", + "temperature": "Temperatura", + "temperature_description": "Controla a aleatoriedade em respostas (0 = determinĆ­stica, 2 = aleatoriedade mĆ”xima)", + "system_prompt": "Prompt de Sistema", + "system_prompt_description": "Prompt padrĆ£o de sistema usado para todas as interaƧƵes de IA", + "openai_configuration": "Configuração OpenAI", + "openai_settings": "OpƧƵes OpenAI", + "api_key": "Chave de API", + "url": "URL Base", + "model": "Modelo", + "openai_api_key_description": "A sua API Key da OpenAI para aceder os serviƧos de IA", + "anthropic_api_key_description": "A sua API Key da Anthropic para aceder os modelos Claude", + "default_model": "Modelo PadrĆ£o", + "openai_model_description": "Exemplos: gpt-4o, gpt-4-turbo, gpt-3.5-turbo", + "base_url": "URL Base", + "openai_url_description": "PadrĆ£o: https://api.openai.com/v1", + "anthropic_settings": "ConfiguraƧƵes Anthropic", + "anthropic_url_description": "URL Base da API Anthropic (padrĆ£o: https://api.anthropic.com)", + "anthropic_model_description": "Modelos Claude da Anthropic para completar conversas", + "voyage_settings": "ConfiguraƧƵes Voyage AI", + "ollama_settings": "ConfiguraƧƵes do Ollama", + "ollama_url_description": "URL para a API Ollama (padrĆ£o: http://localhost:11434)", + "ollama_model_description": "Modelo Ollama usado para complementação de chat", + "anthropic_configuration": "Configuração da Anthropic", + "voyage_configuration": "Configuração da Voyage IA", + "voyage_url_description": "PadrĆ£o: https://api.voyageai.com/v1", + "ollama_configuration": "Configuração da Ollama", + "enable_ollama": "Ativar Ollama", + "enable_ollama_description": "Ativar Ollama para uso do modelo local de IA", + "ollama_url": "URL da Ollama", + "ollama_model": "Modelo do Ollama", + "refresh_models": "Atualizar Modelos", + "refreshing_models": "A atualizar…", + "enable_automatic_indexing": "Ativar indexação automĆ”tica", + "rebuild_index": "Reconstruir ƍndice", + "rebuild_index_error": "Ocorreu um erro ao iniciar a reconstrução do Ć­ndice. Verifique os logs para obter pormenores.", + "note_title": "TĆ­tulo da nota", + "error": "Erro", + "last_attempt": "Última Tentativa", + "actions": "AƧƵes", + "retry": "Tentar novamente", + "partial": "{{ percentage }}% concluĆ­do", + "retry_queued": "Nota enfileirada para nova tentativa", + "retry_failed": "Falha ao enfileirar nota para nova tentativa", + "max_notes_per_llm_query": "MĆ”ximo de Notas por Consulta", + "max_notes_per_llm_query_description": "Quantidade mĆ”xima de notas similares para incluir no contexto da IA", + "active_providers": "Provedores Ativos", + "disabled_providers": "Provedores Desativados", + "remove_provider": "Remover provedor da pesquisa", + "restore_provider": "Restaurar provedor na pesquisa", + "similarity_threshold": "TolerĆ¢ncia de Similaridade", + "similarity_threshold_description": "Pontuação mĆ”xima de similaridade (0-1) para notas a serem incluĆ­das no contexto das consultas de LLM", + "reprocess_index": "Reconstruir ƍndice de Pesquisa", + "reprocessing_index": "A reconstruir…", + "reprocess_index_started": "Otimiação do Ć­ndice de pesquisa iniciado em plano de fundo", + "reprocess_index_error": "Erro ao reconstruir Ć­ndice de pesquisa", + "index_rebuild_progress": "Andamento da Reconstrução do ƍndice", + "index_rebuilding": "A otimizar Ć­ndice ({{percentage}}%)", + "index_rebuild_complete": "Otimização de Ć­ndice finalizada", + "index_rebuild_status_error": "Erro ao verificar o estado da reconstrução do Ć­ndice", + "never": "Nunca", + "processing": "A processar ({{percentage}}%)", + "incomplete": "Incompleto ({{percentage}}%)", + "complete": "Completo (100%)", + "refreshing": "A atualizar…", + "auto_refresh_notice": "A atualizar automaticamente a cada {{seconds}} segundos", + "note_queued_for_retry": "Nota enfileirada para nova tentativa", + "failed_to_retry_note": "Falha ao retentar nota", + "all_notes_queued_for_retry": "Todas as notas com falha enfileiradas para nova tentativa", + "failed_to_retry_all": "Falha ao retentar notas", + "ai_settings": "ConfiguraƧƵes IA", + "api_key_tooltip": "Chave de API para aceder o serviƧo", + "empty_key_warning": { + "anthropic": "A chave de API Anthropic estĆ” vazia. Por favor, digite uma chave de API vĆ”lida.", + "openai": "A chave de API OpenAI estĆ” vazia. Por favor, digite uma chave de API vĆ”lida.", + "voyage": "A chave de API da Voyage API estĆ” vazia. Por favor, digite uma chave de API vĆ”lida.", + "ollama": "A chave de API da Ollama API estĆ” vazia. Por favor, digite uma chave de API vĆ”lida." + }, + "agent": { + "processing": "A processar…", + "thinking": "A pensar…", + "loading": "A carregar…", + "generating": "A gerir…" + }, + "name": "IA", + "openai": "OpenAI", + "use_enhanced_context": "Usar contexto aprimorado", + "enhanced_context_description": "Alimentar IA com mais contexto sobre a nota e as suas notas relacionadas para melhores respostas", + "show_thinking": "Exibir pensamento", + "show_thinking_description": "Exibir o processo de linha de raciocĆ­nio da AI", + "enter_message": "Digite a sua mensagem…", + "error_contacting_provider": "Erro ao contactar o provedor de IA. Por favor, verifique as suas configuraƧƵes e a sua conexĆ£o Ć  internet.", + "error_generating_response": "Erro ao gerar resposta da IA", + "index_all_notes": "Indexar Todas as Notas", + "index_status": "Estado do ƍndice", + "indexed_notes": "Notas Indexadas", + "indexing_stopped": "Indexação interrompida", + "indexing_in_progress": "Indexação em andamento…", + "last_indexed": "Última Indexada", + "n_notes_queued_0": "{{ count }} nota enfileirada para indexação", + "n_notes_queued_1": "{{ count }} notas enfileiradas para indexação", + "n_notes_queued_2": "{{ count }} notas enfileiradas para indexação", + "note_chat": "Conversa de Nota", + "notes_indexed_0": "{{ count }} nota indexada", + "notes_indexed_1": "{{ count }} notas indexadas", + "notes_indexed_2": "{{ count }} notas indexadas", + "sources": "Origens", + "start_indexing": "Iniciar Indexação", + "use_advanced_context": "Usar Contexto AvanƧado", + "ollama_no_url": "Ollama nĆ£o estĆ” configurado. Por favor, digite uma URL vĆ”lida.", + "chat": { + "root_note_title": "Conversas IA", + "root_note_content": "Esta nota contĆ©m as suas conversas com IA gravdas.", + "new_chat_title": "Nova Conversa", + "create_new_ai_chat": "Criar Conversa IA" + }, + "create_new_ai_chat": "Criar Conversa IA", + "configuration_warnings": "HĆ” problemas com a sua configuração de IA. Por favor, verifique as suas configuraƧƵes.", + "experimental_warning": "O recurso de LLM atualmente Ć© experimental - vocĆŖ foi avisado.", + "selected_provider": "Provedor Selecionado", + "selected_provider_description": "Escolha o provedor de IA para conversas e recursos de completar", + "select_model": "Selecionar modelo…", + "select_provider": "Selecionar provedor…", + "ai_enabled": "Recursos de IA ativados", + "ai_disabled": "Recursos de IA desativados", + "no_models_found_online": "Nenhum modelo encontrado. Por favor, verifique a sua chave de API e as configuraƧƵes.", + "no_models_found_ollama": "Nenhum modelo Ollama encontrado. Por favor, verifique se o Ollama estĆ” em execução.", + "error_fetching": "Erro ao obter modelos: {{error}}" + }, + "zoom_factor": { + "title": "Fator do Zoom (apenas versĆ£o de Ć”rea de trabalho)", + "description": "O zoom tambĆ©m pode ser controlado com atalhos CTRL+- e CTRL+=." + }, + "code_auto_read_only_size": { + "title": "Tamanho para Somente Leitura AutomĆ”tico", + "description": "O tamanho para nota somente leitura automĆ”tico Ć© o tamanho após o qual as notas serĆ£o exibidas num modo somente leitura (por razƵes de desempenho).", + "label": "Tamanho para somente leitura automĆ”tico (notas de código)", + "unit": "caracteres" + }, + "code-editor-options": { + "title": "Editor" + }, + "code_mime_types": { + "title": "Tipos MIME disponĆ­veis no dropdown" + }, + "vim_key_bindings": { + "use_vim_keybindings_in_code_notes": "AtribuiƧƵes de teclas do Vim", + "enable_vim_keybindings": "Ative as atribuiƧƵes de teclas do Vim em notas de código (sem modo ex)" + }, + "wrap_lines": { + "wrap_lines_in_code_notes": "Quebrar linhas em notas de código", + "enable_line_wrap": "Ativar Quebra de Linha (pode ser necessĆ”rio recarregar o frontend para entrar em vigor)" + }, + "images": { + "images_section_title": "Imagens", + "download_images_automatically": "Descarregar imagens automaticamente para uso offline.", + "download_images_description": "HTML colado pode conter referĆŖncias a imagens on-line, Trilium vai procurar estas referĆŖncias e descarregar as imagens para que estejam disponĆ­veis off-line.", + "enable_image_compression": "Ativar compressĆ£o de imagem", + "max_image_dimensions": "Largura/altura mĆ”xima de uma imagem (a imagem serĆ” redimensionada se exceder este valor).", + "max_image_dimensions_unit": "pixels", + "jpeg_quality_description": "Qualidade JPEG (10 - pior qualidade, 100 - melhor qualidade, 50 - 85 Ć© recomendado)" + }, + "attachment_erasure_timeout": { + "attachment_erasure_timeout": "Tempo Limite para Apagar um Anexo", + "attachment_auto_deletion_description": "Os anexos sĆ£o automaticamente apagados (e apagados) se jĆ” nĆ£o forem referenciados pela sua nota após um tempo definido.", + "erase_attachments_after": "Apagar anexos nĆ£o utilizados após:", + "manual_erasing_description": "TambĆ©m pode ativar a apagar manualmente (sem considerar o timeout definido acima):", + "erase_unused_attachments_now": "Apagar anexos nĆ£o utilizados agora", + "unused_attachments_erased": "Os anexos nĆ£o utilizados foram apagados." + }, + "network_connections": { + "network_connections_title": "ConexƵes de Rede", + "check_for_updates": "Verificar atualizaƧƵes automaticamente" + }, + "note_erasure_timeout": { + "note_erasure_timeout_title": "Tempo Limite para Apagar uma Nota", + "note_erasure_description": "Notas apagadas (e atributos, revisƵes...) inicialmente sĆ£o apenas marcadas como apagadas e Ć© possĆ­vel recuperĆ”-las a partir do diĆ”logo de Notas Recentes. Depois de um tempo, as notas apagadas sĆ£o \"apagadas\", o que significa que o seu conteĆŗdo jĆ” nĆ£o Ć© recuperĆ”vel. Esta configuração permite configurar o perĆ­odo entre apagar e apagar a nota.", + "erase_notes_after": "Apagar notas após:", + "manual_erasing_description": "TambĆ©m pode ativar a apagar manualmente (sem considerar o timeout definido acima):", + "erase_deleted_notes_now": "Apagar as notas apagadas agora", + "deleted_notes_erased": "As notas apagadas foram removidas permanentemente." + }, + "revisions_snapshot_interval": { + "note_revisions_snapshot_interval_title": "Intervalo de Captura de VersĆ£o da Nota", + "note_revisions_snapshot_description": "O intervalo de captura de versĆ£o da nota Ć© o tempo após o qual uma nova revisĆ£o serĆ” criada para a nota. Veja wiki para mais informaƧƵes.", + "snapshot_time_interval_label": "Intervalo de Captura de VersĆ£o da Nota:" + }, + "revisions_snapshot_limit": { + "note_revisions_snapshot_limit_title": "Limite de Capturas das VersƵes da Nota", + "note_revisions_snapshot_limit_description": "O limite de nĆŗmero de captura de versƵes das notas refere-se ao nĆŗmero mĆ”ximo de revisƵes que podem ser gravadas para cada nota. Onde -1 significa nenhum limite, 0 significa apagar todas as revisƵes. Pode definir as revisƵes mĆ”ximas para uma Ćŗnica nota atravĆ©s da etiqueta #versioningLimit.", + "snapshot_number_limit_label": "Quantidade limite de capturas de versĆ£o:", + "snapshot_number_limit_unit": "capturas", + "erase_excess_revision_snapshots": "Apagar capturas de versĆ£o excedentes agora", + "erase_excess_revision_snapshots_prompt": "As capturas de versĆ£o excedentes foram apagadas." + }, + "search_engine": { + "title": "Motor de Pesquisa", + "custom_search_engine_info": "O motor de pesquisa personalizado requer que sejam definidos um nome e uma URL. Se um destes nĆ£o estiver definido, o DuckDuckGo serĆ” usado como o motor de pesquisa padrĆ£o.", + "predefined_templates_label": "Modelos de motor de pesquisa predefinidos", + "bing": "Bing", + "baidu": "Baidu", + "duckduckgo": "DuckDuckGo", + "google": "Google", + "custom_name_label": "Nome do motor de pesquisa personalizado", + "custom_name_placeholder": "Nome personalizado do motor de pesquisa", + "custom_url_label": "A URL do motor de pesquisa personalizado deve incluir {keyword} como um substituto para o termo pesquisado.", + "custom_url_placeholder": "URL personalizada do motor de pesquisa", + "save_button": "Gravar" + }, + "tray": { + "title": "Bandeja do Sistema", + "enable_tray": "Ativar bandeja (O Trilium precisar ser reiniciado para esta mudanƧa entrar em vigor)" + }, + "heading_style": { + "title": "Estilo de TĆ­tulo", + "plain": "Plano", + "underline": "Sublinhado", + "markdown": "Estilo Markdown" + }, + "highlights_list": { + "title": "Lista de Destaques", + "description": "Pode personalizar a lista de destaques exibida no painel da direita:", + "bold": "Texto em negrito", + "italic": "Texto em itĆ”lico", + "underline": "Texto sublinhado", + "color": "Texto colorido", + "bg_color": "Texto com cor de fundo", + "visibility_title": "Visibilidade da Lista de Destaques", + "visibility_description": "Pode esconder o componente de destaques por nota adicionado a etiqueta #hideHighlightWidget.", + "shortcut_info": "Pode configurar um atalhe de teclado para alternar rapidamente o painel da direita (incluindo os Destaques) em OpƧƵes -> Atalhos (nome 'toggleRightPane')." + }, + "table_of_contents": { + "title": "Tabela de ConteĆŗdos", + "description": "A tabela de conteĆŗdos irĆ” aparecer em notas de texto que possuam mais que um nĆŗmero definido de tĆ­tulos. Pode personalizar este nĆŗmero:", + "unit": "tĆ­tulos", + "disable_info": "TambĆ©m pode usar esta opção para desativar a Tabela de ConteĆŗdos por configurar um nĆŗmero muito alto.", + "shortcut_info": "Pode configurar um atalhe de teclado para alternar rapidamente o painel da direita (incluindo a Tabela de ConteĆŗdos) em OpƧƵes -> Atalhos (nome 'toggleRightPane')." + }, + "text_auto_read_only_size": { + "title": "Tamanho para Somente Leitura AutomĆ”tico", + "description": "O tamanho para nota somente leitura automĆ”tico Ć© o tamanho a partir do qual as notas serĆ£o exibidas em modo somente leitura (por razƵes de desempenho).", + "label": "Tamanho automĆ”tico para somente leitura (notas de texto)", + "unit": "caracteres" + }, + "custom_date_time_format": { + "title": "Formato Personalizado de Data/Hora", + "description": "Personaliza o formato de data e hora inseridos via ou barra de ferramentas. Veja a documentação do Day.js para os tokens de formatos disponĆ­veis.", + "format_string": "Cadeia de formato:", + "formatted_time": "Data/hora formatada:" + }, + "i18n": { + "title": "Localização", + "language": "Idioma", + "first-day-of-the-week": "Primeiro dia da semana", + "sunday": "Domingo", + "monday": "Segunda-feira", + "first-week-of-the-year": "Primeiro dia do ano", + "first-week-contains-first-day": "Primeira semana que contenha o primeiro dia do ano", + "first-week-contains-first-thursday": "Primeira semana que contenha a primeira quinta-feira do ano", + "first-week-has-minimum-days": "Primeira semana que contenha um mĆ­nimo de dias", + "min-days-in-first-week": "MĆ­nimo de dias da primeira semana", + "first-week-info": "Primeira semana que contenha a primeira Quinta-feira do ano Ć© baseado na ISO 8601.", + "first-week-warning": "Alterar as opƧƵes de primeira semana pode causar duplicidade nas Notas Semanais existentes e estas Notas nĆ£o serĆ£o atualizadas de acordo.", + "formatting-locale": "Formato de data e nĆŗmero" + }, + "backup": { + "automatic_backup": "Backup automĆ”tico", + "automatic_backup_description": "O Trilium pode fazer o backup da base de dados automaticamente:", + "enable_daily_backup": "Ativar backup diĆ”rio", + "enable_weekly_backup": "Ativar backup semanal", + "enable_monthly_backup": "Ativar backup mensal", + "backup_recommendation": "Ɖ recomendado manter o backup ativado, mas isto pode fazer com que a inicialização da aplicação seja lenta com grandes bases de dados e/ou dispositivos de armazenamento lentos.", + "backup_now": "Realizar backup agora", + "backup_database_now": "Realizar backup da base de dados agora", + "existing_backups": "Backups existentes", + "date-and-time": "Data & hora", + "path": "Caminho", + "database_backed_up_to": "Backup da base de dados criado em {{backupFilePath}}", + "no_backup_yet": "ainda nĆ£o existe nenhum backup" + }, + "etapi": { + "title": "ETAPI", + "description": "ETAPI Ć© uma API REST usada para aceder a instĆ¢ncia do Trilium programaticamente, sem interface grĆ”fica.", + "see_more": "Veja mais pormenores no {{- link_to_wiki}}, na {{- link_to_openapi_spec}} ou na {{- link_to_swagger_ui}}.", + "wiki": "wiki", + "openapi_spec": "Especificação OpenAPI do ETAPI", + "swagger_ui": "ETAPI Swagger UI", + "create_token": "Criar token ETAPI", + "existing_tokens": "Tokens existentes", + "no_tokens_yet": "Ainda nĆ£o existem tokens. Clique no botĆ£o acima para criar um.", + "token_name": "Nome do token", + "created": "Criado", + "actions": "AƧƵes", + "new_token_title": "Novo token ETAPI", + "new_token_message": "Por favor, insira o nome do novo token", + "default_token_name": "novo token", + "error_empty_name": "O nome do token nĆ£o pode ser vazio", + "token_created_title": "Token ETAPI criado", + "token_created_message": "Copie o token criado para a Ć”rea de transferĆŖncia. O Trilium armazena o token em hash e esta Ć© a Ćŗltima vez que poderĆ” visualizĆ”-lo.", + "rename_token": "Renomear este token", + "delete_token": "Apagar / desativar este token", + "rename_token_title": "Renomear token", + "rename_token_message": "Por favor, insira o nome do novo token", + "delete_token_confirmation": "Tem certeza que deseja apagar o token ETAPI \"{{name}}\"?" + }, + "options_widget": { + "options_status": "Estado das opƧƵes", + "options_change_saved": "As alteraƧƵes nas opƧƵes foram gravadas." + }, + "password": { + "heading": "Palavra-passe", + "alert_message": "Por favor, certifique-se de se lembrar da sua palavra-passe nova. A palavra-passe Ć© usada para aceder a interface web e para criptografar notas protegidas. Sese esquecer da sua palavra-passe, todas as suas notas protegidas serĆ£o permanentemente perdidas.", + "reset_link": "Clique aqui para redefinĆ­-la.", + "old_password": "Palavra-passe antiga", + "new_password": "Nova palavra-passe", + "new_password_confirmation": "Confirmação da nova palavra-passe", + "change_password": "Alterar palavra-passe", + "protected_session_timeout": "Tempo Limite da SessĆ£o Protegida", + "protected_session_timeout_description": "O tempo limite da sessĆ£o protegida Ć© o perĆ­odo após o qual a sessĆ£o protegida Ć© apagada da memória do navegador. Este tempo Ć© contado a partir da Ćŗltima interação com notas protegidas. Veja", + "wiki": "wiki", + "for_more_info": "para mais informaƧƵes.", + "protected_session_timeout_label": "Tempo limite da sessĆ£o protegida:", + "reset_confirmation": "Ao redefinir a palavra-passe, perderĆ” o acesso a todas as suas notas protegidas existentes para sempre. Tem certeza que deseja redefinir a palavra-passe?", + "reset_success_message": "A palavra-passe foi redefinida. Por favor, defina uma nova palavra-passe", + "change_password_heading": "Alterar Palavra-passe", + "set_password_heading": "Definir Palavra-passe", + "set_password": "Definir Palavra-passe", + "password_mismatch": "As novas palavras-passe nĆ£o sĆ£o iguais.", + "password_changed_success": "A palavra-passe foi alterada. O Trilium serĆ” recarregado após pressionar OK." + }, + "multi_factor_authentication": { + "title": "Autenticação Multifator", + "description": "A Autenticação Multifator (MFA) adiciona uma camada extra de seguranƧa Ć  sua conta. Em vez de apenas digitar uma palavra-passe para fazer login, a MFA exige que forneƧa uma ou mais evidĆŖncias adicionais para verificar a sua identidade. Dessa forma, mesmo que alguĆ©m obtenha a sua palavra-passe, ainda nĆ£o poderĆ” aceder a sua conta sem a segunda informação. Ɖ como adicionar uma fechadura extra Ć  sua porta, a fazer invadir muito mais difĆ­cil para qualquer outra pessoa.

Siga as instruções abaixo para ativar a MFA. Se a configuração não for feita corretamente, o login voltarÔ a usar apenas a palavra-passe.", + "mfa_enabled": "Ativar a Autenticação Multifator", + "mfa_method": "Método MFA", + "electron_disabled": "A Autenticação Multifator não é suportada na versão desktop atualmente.", + "totp_title": "Palavra-passe Única TemporÔria baseada em Tempo (TOTP)", + "totp_description": "\"TOTP (Palavra-passe Única TemporÔria baseada em Tempo) é um recurso de segurança que gera um código único e temporÔrio, que muda a cada 30 segundos. Utiliza este código junto com a sua palavra-passe para fazer login na conta, fazer acessar-la muito mais difícil para qualquer outra pessoa.", + "totp_secret_title": "Gerar segredo TOTP", + "totp_secret_generate": "Gerar segredo TOTP", + "totp_secret_regenerate": "Regenerar segredo TOTP", + "no_totp_secret_warning": "Para ativar o TOTP, primeiro deve gerar um segredo TOTP.", + "totp_secret_description_warning": "Após gerar um novo segredo TOTP, serÔ necessÔrio fazer login novamente com o novo segredo TOTP.", + "totp_secret_generated": "Segredo TOTP gerado", + "totp_secret_warning": "Por favor, grave o segredo gerado num local seguro. Ele não serÔ exibido novamente.", + "totp_secret_regenerate_confirm": "Tem certeza que deseja regenerar o segredo TOTP? Isto invalidarÔ o segredo TOTP anterior e todos os códigos de recuperação existentes.", + "recovery_keys_title": "Chaves de Recuperação do Single Sign-On", + "recovery_keys_description": "As chaves de recuperação do Single Sign-On são usadas para fazer login caso você não consiga aceder os seus códigos do Authenticator.", + "recovery_keys_description_warning": "As chaves de recuperação não serão exibidas novamente após sair da pÔgina. Mantenha-as num local seguro.
Após o uso, uma chave de recuperação nĆ£o poderĆ” ser usada novamente.", + "recovery_keys_error": "Erro ao gerar códigos de recuperação", + "recovery_keys_no_key_set": "Nenhum código de recuperação definido", + "recovery_keys_generate": "Gerar Códigos de Recuperação", + "recovery_keys_regenerate": "Regenerar Códigos de Recuperação", + "recovery_keys_used": "Usado: {{date}}", + "recovery_keys_unused": "Código de recuperação {{index}} nĆ£o utilizado", + "oauth_title": "OAuth/OpenID", + "oauth_description": "OpenID Ć© uma forma padronizada de permitir que faƧa login em sites usando uma conta de outro serviƧo, como o Google, para verificar a sua identidade. O emissor padrĆ£o Ć© o Google, mas pode alterĆ”-lo para qualquer outro provedor OpenID. Consulte aqui para mais informaƧƵes. Siga estas instruƧƵes para configurar um serviƧo OpenID atravĆ©s do Google.", + "oauth_description_warning": "Para ativar o OAuth/OpenID, precisa definir a URL base do OAuth/OpenID, o client ID e o client secret no ficheiro config.ini e reiniciar a aplicação. Se quiser configurar via variĆ”veis de ambiente, defina TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID e TRILIUM_OAUTH_CLIENT_SECRET.", + "oauth_user_account": "Conta do Utilizador: ", + "oauth_user_email": "E-mail do Utilizador: ", + "oauth_user_not_logged_in": "NĆ£o estĆ” logado!" + }, + "shortcuts": { + "keyboard_shortcuts": "Atalhos de Teclado", + "multiple_shortcuts": "Atalhos mĆŗltiplos para a mesma ação podem ser separados por vĆ­rgula.", + "electron_documentation": "Consulte a documentação do Electron para ver os modificadores e códigos de teclas disponĆ­veis.", + "type_text_to_filter": "Digite para filtrar atalhos...", + "action_name": "Nome da ação", + "shortcuts": "Atalhos", + "default_shortcuts": "Atalhos padrĆ£o", + "description": "Descrição", + "reload_app": "Recarregar aplicação para aplicar alteraƧƵes", + "set_all_to_default": "Redefinir todos os atalhos para o padrĆ£o", + "confirm_reset": "Tem certeza que deseja redefinir todos os atalhos de teclado para o padrĆ£o?" + }, + "spellcheck": { + "title": "Verificação OrtogrĆ”fica", + "description": "Estas opƧƵes aplicam-se apenas Ć s versƵes desktop; os navegadores usarĆ£o a sua própria verificação ortogrĆ”fica nativa.", + "enable": "Ativar verificação ortogrĆ”fica", + "language_code_label": "Código(s) de idioma", + "language_code_placeholder": "por exemplo \"en-US\", \"de-AT\", \"pt-BR\"", + "multiple_languages_info": "MĆŗltiplos idiomas podem ser separados por vĆ­rgula, por exemplo: \"en-US, de-DE, pt-BR, cs\". ", + "available_language_codes_label": "Códigos de idioma disponĆ­veis:", + "restart-required": "As alteraƧƵes nas opƧƵes de verificação ortogrĆ”fica terĆ£o efeito após reiniciar a aplicação." + }, + "sync_2": { + "config_title": "Configuração da Sincronização", + "server_address": "EndereƧo da instĆ¢ncia do Servidor", + "timeout": "Tempo limite da sincronização", + "timeout_unit": "milisegundos", + "proxy_label": "Servidor proxy para sincronização (opcional)", + "note": "Nota", + "note_description": "Se deixar a configuração de proxy em branco, o proxy do sistema serĆ” usado (aplica-se apenas Ć  versĆ£o desktop/Electron).", + "special_value_description": "Outro valor especial Ć© noproxy, que forƧa a ignorar atĆ© mesmo o proxy do sistema e respeita NODE_TLS_REJECT_UNAUTHORIZED.", + "save": "Gravar", + "help": "Ajuda", + "test_title": "Teste de Sincronização", + "test_description": "Isto testarĆ” a conexĆ£o e o handshake com o servidor de sincronização. Se o servidor de sincronização nĆ£o estiver inicializado, isto irĆ” configurĆ”-lo para sincronizar com o documento local.", + "test_button": "Testar sincronização", + "handshake_failed": "Falha no handshake com o servidor de sincronização, erro: {{message}}" + }, + "api_log": { + "close": "Fechar" + }, + "attachment_detail_2": { + "will_be_deleted_in": "Este anexo serĆ” apagado automaticamente em {{time}}", + "will_be_deleted_soon": "Este anexo serĆ” apagado automaticamente em breve", + "deletion_reason": ", porque o anexo nĆ£o estĆ” associado ao conteĆŗdo da nota. Para evitar de apagar, adicione o anexo novamente ao conteĆŗdo ou converta o anexo numa nota.", + "role_and_size": "Regra: {{role}}, Tamanho: {{size}}", + "link_copied": "Ligação do anexo copiada para a Ć”rea de transferĆŖncia.", + "unrecognized_role": "Regra desconhecida de anexo '{{role}}'." + }, + "bookmark_switch": { + "bookmark": "Favorito", + "bookmark_this_note": "Favoritar esta nota no painel da esquerda", + "remove_bookmark": "Remover favorito" + }, + "editability_select": { + "auto": "Auto", + "read_only": "Somente leitura", + "always_editable": "Sempre EditĆ”vel", + "note_is_editable": "A nota Ć© editĆ”vel se nĆ£o for muito longa.", + "note_is_read_only": "A nota Ć© somente leitura, mas pode ser editada com um clique no botĆ£o.", + "note_is_always_editable": "A nota Ć© sempre editĆ”vel, independentemente do seu tamanho." + }, + "note-map": { + "button-link-map": "Mapa de LigaƧƵes", + "button-tree-map": "Mapa em Ɓrvore" + }, + "tree-context-menu": { + "open-in-a-new-tab": "Abrir numa nova guia", + "open-in-a-new-split": "Abrir num novo painel dividido", + "insert-note-after": "Inserir nota após", + "insert-child-note": "Inserir nota filha", + "delete": "Apagar", + "search-in-subtree": "Pesquisar na subĆ”rvore", + "hoist-note": "Fixar nota", + "unhoist-note": "Desafixar nota", + "edit-branch-prefix": "Editar prefixo da ramificação", + "advanced": "AvanƧado", + "expand-subtree": "Expandir subĆ”rvore", + "collapse-subtree": "Recolher subĆ”rvore", + "sort-by": "Ordenar por...", + "recent-changes-in-subtree": "AlteraƧƵes recentes na subĆ”rvore", + "convert-to-attachment": "Converter para anexo", + "copy-note-path-to-clipboard": "Copiar caminho da nota para a Ć”rea de transferĆŖncia", + "protect-subtree": "Proteger subĆ”rvore", + "unprotect-subtree": "Desproteger subĆ”rvore", + "copy-clone": "Copiar / clonar", + "clone-to": "Clonar para...", + "cut": "Recortar", + "move-to": "Mover para...", + "paste-into": "Colar em", + "paste-after": "Colar depois", + "duplicate": "Duplicar", + "export": "Exportar", + "import-into-note": "Importar na nota", + "apply-bulk-actions": "Aplicar aƧƵes em massa", + "converted-to-attachments": "{{count}} notas foram convertidas em anexos.", + "convert-to-attachment-confirm": "Tem certeza que deseja converter as notas selecionadas em anexos das suas notas-pai?", + "open-in-popup": "Edição rĆ”pida" + }, + "shared_info": { + "shared_publicly": "Esta nota Ć© partilhada publicamente em {{- link}}.", + "shared_locally": "Esta nota Ć© partilhada localmente em {{- link}}.", + "help_link": "Para ajuda, visite a wiki." + }, + "note_types": { + "text": "Texto", + "code": "Código", + "saved-search": "Pesquisa Gravada", + "relation-map": "Map de Relação", + "note-map": "Map de Notas", + "render-note": "Nota de Renderização", + "book": "Coleção", + "mermaid-diagram": "Diagrama Mermaid", + "canvas": "Quadros", + "web-view": "Visualização Web", + "mind-map": "Mapa Mental", + "file": "Ficheiro", + "image": "Imagem", + "launcher": "LanƧador", + "doc": "Documento", + "widget": "Widget", + "confirm-change": "NĆ£o Ć© recomentado alterar o tipo da nota quando o conteĆŗdo da nota nĆ£o estĆ” vazio. Quer continuar assim mesmo?", + "geo-map": "Mapa geogrĆ”fico", + "beta-feature": "Beta", + "ai-chat": "Chat IA", + "task-list": "Lista de Tarefas", + "new-feature": "Novo", + "collections": "ColeƧƵes" + }, + "protect_note": { + "toggle-on": "Proteger a nota", + "toggle-off": "Desproteger a nota", + "toggle-on-hint": "A nota nĆ£o estĆ” protegida, clique para protegĆŖ-la", + "toggle-off-hint": "A nota estĆ” protegida, clique para desprotegĆŖ-la" + }, + "shared_switch": { + "shared": "Partilhado", + "toggle-on-title": "Partilhar a nota", + "toggle-off-title": "Parar de partilhar a nota", + "shared-branch": "Esta nota só existe como uma nota partilhada, depois parar de partilhar irĆ” apagĆ”-la. Deseja continuar e apagar esta nota?", + "inherited": "NĆ£o foi possĆ­vel deixar de partilhar a nota porque ela Ć© partilhada atravĆ©s da heranƧa de uma nota superior." + }, + "template_switch": { + "template": "Modelo", + "toggle-on-hint": "Transformar a nota num modelo", + "toggle-off-hint": "Deixar de usar a nota como um modelo" + }, + "open-help-page": "Abrir pĆ”gina de ajuda", + "find": { + "case_sensitive": "Diferencia maiĆŗsculas de minĆŗsculas", + "match_words": "Corresponder palavras", + "find_placeholder": "Procurar no texto...", + "replace_placeholder": "Substituir por...", + "replace": "Substituir", + "replace_all": "Substituir tudo" + }, + "highlights_list_2": { + "title": "Lista de Destaques", + "options": "OpƧƵes" + }, + "quick-search": { + "placeholder": "Pesquisa rĆ”pida", + "searching": "A pesquisar...", + "no-results": "Nenhum resultado encontrado", + "more-results": "... e mais {{number}} resultados.", + "show-in-full-search": "Exibir na pesquisa completa" + }, + "note_tree": { + "collapse-title": "Recolher Ć”rvore de notas", + "scroll-active-title": "Ir atĆ© a nota ativa", + "tree-settings-title": "ConfiguraƧƵes da Ć”rvore", + "hide-archived-notes": "Ocultar notas arquivadas", + "automatically-collapse-notes": "Recolher notas automaticamente", + "automatically-collapse-notes-title": "As notas serĆ£o recolhidas após um tempo de inatividade para simplificar a Ć”rvore.", + "save-changes": "Gravar e aplicar alteraƧƵes", + "auto-collapsing-notes-after-inactivity": "A recolher notas automaticamente após inatividade...", + "saved-search-note-refreshed": "A nota de pesquisa gravada foi atualizada.", + "hoist-this-note-workspace": "Fixar esta nota (workspace)", + "refresh-saved-search-results": "Atualizar resultados de pesquisa gravados", + "create-child-note": "Criar nota filha", + "unhoist": "Desafixar", + "toggle-sidebar": "Alternar barra lateral" + }, + "title_bar_buttons": { + "window-on-top": "Manter Janela no Topo" + }, + "note_detail": { + "could_not_find_typewidget": "NĆ£o foi possĆ­vel encontrar typeWidget para o tipo '{{type}}'" + }, + "note_title": { + "placeholder": "digite o tĆ­tulo da nota aqui..." + }, + "search_result": { + "no_notes_found": "Nenhuma nota encontrada para os parĆ¢metros de pesquisa digitados.", + "search_not_executed": "A pesquisa ainda nĆ£o foi executada. Clique no botĆ£o \"Pesquisar\" acima para ver os resultados." + }, + "spacer": { + "configure_launchbar": "Configurar Barra de LanƧamento" + }, + "sql_result": { + "no_rows": "Esta consulta nĆ£o retornou nenhuma linha" + }, + "sql_table_schemas": { + "tables": "Tabelas" + }, + "tab_row": { + "close_tab": "Fechar guia", + "add_new_tab": "Adicionar nova guia", + "close": "Fechar", + "close_other_tabs": "Fechar as outras guias", + "close_right_tabs": "Fechar as guias Ć  direita", + "close_all_tabs": "Fechar todas as guias", + "reopen_last_tab": "Reabrir a Ćŗltima guia fechada", + "move_tab_to_new_window": "Mover esta guia para uma nova janela", + "copy_tab_to_new_window": "Copiar esta guia para uma nova janela", + "new_tab": "Nova guia" + }, + "toc": { + "table_of_contents": "Tabela de ConteĆŗdos", + "options": "OpƧƵes" + }, + "watched_file_update_status": { + "file_last_modified": "O ficheiro foi modificado pela Ćŗltima vez em .", + "upload_modified_file": "Enviar ficheiro modificado", + "ignore_this_change": "Ignorar esta alteração" + }, + "app_context": { + "please_wait_for_save": "Por favor aguarde alguns segundos para finalizar a gravação e depois tente novamente." + }, + "note_create": { + "duplicated": "A nota \"{{title}}\" foi duplicada." + }, + "image": { + "copied-to-clipboard": "Uma referĆŖncia para esta imagem foi copiada para a Ć”rea de transferĆŖncia. Isto pode ser colado em qualquer nota de texto.", + "cannot-copy": "NĆ£o foi possĆ­vel copiar a referĆŖncia da imagem para a Ć”rea de transferĆŖncia." + }, + "clipboard": { + "cut": "Nota(s) recortadas(s) para a Ć”rea de transferĆŖncia.", + "copied": "Not(s) copiada(s) para a Ć”rea de transferĆŖncia.", + "copy_failed": "NĆ£o foi possĆ­vel copiar para a Ć”rea de transferĆŖncia por problemas de permissĆ£o.", + "copy_success": "Copiado para a Ć”rea de transferĆŖncia." + }, + "entrypoints": { + "note-revision-created": "A revisĆ£o da nota foi criada.", + "note-executed": "Nota executada.", + "sql-error": "Ocorreu um erro durante a execução da consulta SQL: {{message}}" + }, + "branches": { + "cannot-move-notes-here": "NĆ£o Ć© possĆ­vel mover notas para cĆ”.", + "delete-status": "Apagar estado", + "delete-notes-in-progress": "Apagar notas em andamento: {{count}}", + "delete-finished-successfully": "Apagar concluĆ­do com sucesso.", + "undeleting-notes-in-progress": "Restauração de notas em andamento: {{count}}", + "undeleting-notes-finished-successfully": "Restauração de notas concluĆ­da com sucesso." + }, + "frontend_script_api": { + "async_warning": "EstĆ” a passar uma função assĆ­ncrona para `api.runOnBackend()`, o que provavelmente nĆ£o irĆ” funcionar como esperado.\\nTorne a função sĆ­ncrona (a remover a palavra-chave `async`), ou use `api.runAsyncOnBackendWithManualTransactionHandling()`.", + "sync_warning": "EstĆ” a passar uma função sĆ­ncrona para `api.runAsyncOnBackendWithManualTransactionHandling()`,\\nquando deveria usar `api.runOnBackend()` no lugar." + }, + "ws": { + "sync-check-failed": "A verificação de sincronização falhou!", + "consistency-checks-failed": "A verificação de consistĆŖncia falhou! Veja os logs para pormenores.", + "encountered-error": "Encontrado o erro \"{{message}}\", verifique o console." + }, + "hoisted_note": { + "confirm_unhoisting": "A nota solicitada '{{requestedNote}}' estĆ” fora da Ć”rvore da nota fixada '{{hoistedNote}}' e precisa desafixar para aceder a nota. Quer prosseguir e desafixar?" + }, + "launcher_context_menu": { + "reset_launcher_confirm": "Deseja realmente reiniciar \"{{title}}\"? Todos os dados / configuraƧƵes desta nota (e as suas filhas) serĆ£o perdidos o lanƧador irĆ” retornar para a sua localização original.", + "add-note-launcher": "Adicionar um lanƧador de nota", + "add-script-launcher": "Adicionar um lanƧador de script", + "add-custom-widget": "Adicionar um componente personalizado", + "add-spacer": "Adicionar um espaƧador", + "delete": "Apagar ", + "reset": "Reiniciar", + "move-to-visible-launchers": "Mover para lanƧadores visĆ­veis", + "move-to-available-launchers": "Mover para lanƧadores disponĆ­veis", + "duplicate-launcher": "Duplicar o lanƧador " + }, + "editable-text": { + "auto-detect-language": "Detetado automaticamente" + }, + "highlighting": { + "title": "Blocos de Código", + "description": "Controla o destaque de sintaxe para blocos de código dentro de notas de texto, notas de código nĆ£o serĆ£o afetadas.", + "color-scheme": "Esquema de Cor" + }, + "code_block": { + "word_wrapping": "Quebra automĆ”tica de linhas", + "theme_none": "Sem destaque de sintaxe", + "theme_group_light": "Temas claros", + "theme_group_dark": "Temas escuros", + "copy_title": "Copiar para a Ć”rea de transferĆŖncia" + }, + "classic_editor_toolbar": { + "title": "Formatação" + }, + "editor": { + "title": "Editor" + }, + "editing": { + "editor_type": { + "label": "Barra de formatação", + "floating": { + "title": "A flutuar", + "description": "ferramentas de edição aparecem perto do cursor;" + }, + "fixed": { + "title": "Fixado", + "description": "ferramentas de edição aparecem na guia de faixa \"Formatação\"." + }, + "multiline-toolbar": "Exibir a barra de ferramentas em mĆŗltiplas linhas se nĆ£o couber." + } + }, + "electron_context_menu": { + "add-term-to-dictionary": "Adicionar \"{{term}}\" ao dicionĆ”rio", + "cut": "Cortar", + "copy": "Copiar", + "copy-link": "Copiar ligação", + "paste": "Colar", + "paste-as-plain-text": "Colar como texto sem formatação", + "search_online": "Pesquisar por \"{{term}}\" com {{searchEngine}}" + }, + "image_context_menu": { + "copy_reference_to_clipboard": "Copiar referĆŖncia para a Ć”rea de transferĆŖncia", + "copy_image_to_clipboard": "Copiar imagem para a Ć”rea de transferĆŖncia" + }, + "link_context_menu": { + "open_note_in_new_tab": "Abrir nota em nova guia", + "open_note_in_new_split": "Abrir nota em nova divisĆ£o", + "open_note_in_new_window": "Abrir nota em nova janela", + "open_note_in_popup": "Edição rĆ”pida" + }, + "electron_integration": { + "desktop-application": "Aplicação Desktop", + "native-title-bar": "Barra de tĆ­tulo nativa", + "native-title-bar-description": "Para Windows e macOS, manter a barra de tĆ­tulo nativa desativada faz a aplicação parecer mais compacta. No Linux, manter a barra de tĆ­tulo nativa ativada faz a aplicação se integrar melhor com o restante do sistema.", + "background-effects": "Ativar efeitos de fundo (apenas Windows 11)", + "restart-app-button": "Reiniciar a aplicação para ver as alteraƧƵes", + "zoom-factor": "Fator de Zoom" + }, + "note_autocomplete": { + "search-for": "Pesquisar por \"{{term}}\"", + "create-note": "Criar conectar nota filha \"{{term}}\"", + "insert-external-link": "Inserir ligação externa para \"{{term}}\"", + "clear-text-field": "Limpar campo de texto", + "show-recent-notes": "Exibir notas recentes", + "full-text-search": "Pesquisa por texto completo" + }, + "note_tooltip": { + "note-has-been-deleted": "A nota foi apagada.", + "quick-edit": "Edição rĆ”pida" + }, + "geo-map": { + "create-child-note-title": "Criar uma nova nota filha e adicionĆ”-la ao mapa", + "create-child-note-instruction": "Clique no mapa para criar uma nova nota naquele local ou tecle Esc para dispensar.", + "unable-to-load-map": "NĆ£o foi possĆ­vel carregar o mapa." + }, + "geo-map-context": { + "open-location": "Abrir local", + "remove-from-map": "Remover do mapa", + "add-note": "Adicionar um marcador neste local" + }, + "help-button": { + "title": "Abrir a pĆ”gina de ajuda relevante" + }, + "duration": { + "seconds": "Segundos", + "minutes": "Minutos", + "hours": "Horas", + "days": "Dias" + }, + "share": { + "title": "ConfiguraƧƵes de Compartilhamento", + "redirect_bare_domain": "Redirecionar domĆ­nio puro para pĆ”gina Partilhar", + "redirect_bare_domain_description": "Redirecionar utilizadores anĆ“nimos para a pĆ”gina Partilhar ao invĆ©s de exibir o Login", + "show_login_link": "Exibir ligação para o Login no tema de Partilhar", + "show_login_link_description": "Adicionar uma ligação de login no rodapĆ© da pĆ”gina Partilhar", + "check_share_root": "Verificar Estado da Raiz do Partilhar", + "share_root_found": "Partilhar nota raiz '{{noteTitle}}' estĆ” pronto", + "share_root_not_found": "Nenhuma nota encontrada com a etiqueta #shareRoot", + "share_root_not_shared": "A nota '{{noteTitle}}' possui a etiqueta #shareRoot mas nĆ£o Ć© partilhada" + }, + "time_selector": { + "invalid_input": "O valor de tempo digitado nĆ£o Ć© um nĆŗmero vĆ”lido.", + "minimum_input": "O valor de tempo digitado deve ser de pelo menos {{minimumSeconds}} segundos." + }, + "tasks": { + "due": { + "today": "Hoje", + "tomorrow": "AmanhĆ£", + "yesterday": "Ontem" + } + }, + "content_widget": { + "unknown_widget": "Componente desconhecido para \"{{id}}\"." + }, + "note_language": { + "not_set": "NĆ£o atribuĆ­do", + "configure-languages": "Configurar idiomas..." + }, + "content_language": { + "title": "Idiomas do conteĆŗdo", + "description": "Escolha um ou mais idiomas que devem aparecer na seleção de idioma na sessĆ£o de Propriedades BĆ”sicas de uma nota de texto somente leitura ou editĆ”vel. Isto irĆ” permitir recursos como verificação ortogrĆ”fica ou apoio direta-para-esquerda." + }, + "switch_layout_button": { + "title_vertical": "Mover painel de edição para baixo", + "title_horizontal": "Mover painel de edição para a esquerda" + }, + "toggle_read_only_button": { + "unlock-editing": "Desbloquear edição", + "lock-editing": "Bloquear edição" + }, + "png_export_button": { + "button_title": "Exportar diagrama como PNG" + }, + "svg": { + "export_to_png": "O diagrama nĆ£o pĆ“de ser exportado como PNG." + }, + "code_theme": { + "title": "AparĆŖncia", + "word_wrapping": "Quebra automĆ”tica de linha", + "color-scheme": "Esquema de cor" + }, + "cpu_arch_warning": { + "title": "Por favor, descarregue a versĆ£o ARM64", + "message_macos": "O TriliumNext estĆ” a executar atravĆ©s de uma tradução Rosetta 2, o que significa que usa a versĆ£o Intel (x64) no Apple Silicon Mac. Isto afetarĆ” significativamente o desempenho e a duração da pilha.", + "message_windows": "O TriliumNext estĆ” a executar atravĆ©s de emulação, o que significa que usa a versĆ£o Intel (x64) no Windows num dispositivo ARM. Isto afetarĆ” significativamente o desempenho e a duração da pilha.", + "recommendation": "Para uma melhor experiĆŖncia, por favor, descarregue a versĆ£o nativa ARM64 do TriliumNext na nossa pĆ”gina de releases.", + "download_link": "Descarregar VersĆ£o Nativa", + "continue_anyway": "Continuar Assim Mesmo", + "dont_show_again": "NĆ£o exibir este alerta novamente" + }, + "editorfeatures": { + "title": "Recursos", + "emoji_completion_enabled": "Ativar auto-completar de Emoji", + "note_completion_enabled": "Ativar auto-completar de notas" + }, + "table_view": { + "new-row": "Nova linha", + "new-column": "Nova coluna", + "sort-column-by": "Ordenar por \"{{title}}\"", + "sort-column-ascending": "Crescente", + "sort-column-descending": "Decrescente", + "sort-column-clear": "Limpar ordenação", + "hide-column": "Ocultar coluna \"{{title}}\"", + "show-hide-columns": "Exibir/ocultar colunas", + "row-insert-above": "Inserir linha acima", + "row-insert-below": "Inserir linha abaixo", + "row-insert-child": "Inserir nota filha", + "add-column-to-the-left": "Adicionar coluna Ć  esquerda", + "add-column-to-the-right": "Adicionar coluna Ć  direita", + "edit-column": "Editar coluna", + "delete_column_confirmation": "Tem certeza que deseja apagar esta coluna? O atributo correspondente serĆ” removido de todas as notas.", + "delete-column": "Apagar coluna", + "new-column-label": "Etiqueta", + "new-column-relation": "Relação" + }, + "book_properties_config": { + "hide-weekends": "Ocultar fins de semana", + "display-week-numbers": "Exibir nĆŗmeros de semana", + "map-style": "Estilo do mapa:", + "max-nesting-depth": "Profundidade mĆ”xima de aninhamento:", + "raster": "Raster", + "vector_light": "Vetor (Claro)", + "vector_dark": "Vetor (Escuro)", + "show-scale": "Exibir escala" + }, + "table_context_menu": { + "delete_row": "Apagar linha" + }, + "board_view": { + "move-to": "Mover para", + "insert-above": "Inserir acima", + "insert-below": "Inserir abaixo", + "delete-column": "Apagar coluna", + "delete-column-confirmation": "Tem certeza que deseja apagar esta coluna? O atributo correspondente tambĆ©m serĆ” apagado de todas as notas abaixo desta coluna.", + "new-item": "Novo elemento", + "add-column": "Adicionar Coluna" + }, + "command_palette": { + "tree-action-name": "Ɓrvore: {{name}}", + "export_note_title": "Exportar Nota", + "export_note_description": "Exportar a nota atual", + "show_attachments_title": "Exibir Anexos", + "show_attachments_description": "Exibir anexos da nota", + "search_notes_title": "Pesquisar Notas", + "search_notes_description": "Abrir pesquisa avanƧada", + "search_subtree_title": "Pesquisar na SubĆ”rvore", + "search_subtree_description": "Pesquisar dentro da subĆ”rvore atual", + "search_history_title": "Exibir Histórico de Pesquisa", + "search_history_description": "Visualizar pesquisas anteriores", + "configure_launch_bar_title": "Configurar Barra de Execução", + "configure_launch_bar_description": "Abrir a configuração da barra de lanƧamento, para adicionar ou remover elementos." + }, + "content_renderer": { + "open_externally": "Abrir externamente" + }, + "modal": { + "close": "Fechar", + "help_title": "Exibir mais informaƧƵes sobre este ecrĆ£" + }, + "call_to_action": { + "next_theme_title": "Testar no novo tema do Trilium", + "next_theme_message": "EstĆ” a usar o tema legado, deseja experimentar o novo tema?", + "next_theme_button": "Experimentar o novo tema", + "background_effects_title": "Efeitos de fundo estĆ£o estĆ”veis agora", + "background_effects_message": "Em dispositivos Windows, efeitos de fundo estĆ£o estĆ”veis agora. Os efeitos de fundo adicionam um toque de cor Ć  interface do utilizador borrando o plano de fundo atrĆ”s dela. Esta tĆ©cnica tambĆ©m Ć© usada noutras aplicaƧƵes como o Windows Explorer.", + "background_effects_button": "Ativar os efeitos de fundo", + "dismiss": "Dispensar" + }, + "settings": { + "related_settings": "ConfiguraƧƵes relacionadas" + }, + "settings_appearance": { + "related_code_blocks": "Esquema de cores para blocos de código em notas de texto", + "related_code_notes": "Esquema de cores para notas de código" + }, + "units": { + "percentage": "%" + } +} diff --git a/apps/client/src/translations/pt_br/translation.json b/apps/client/src/translations/pt_br/translation.json index feba4898f..7c51d7c2a 100644 --- a/apps/client/src/translations/pt_br/translation.json +++ b/apps/client/src/translations/pt_br/translation.json @@ -432,7 +432,12 @@ "mime": "MIME: ", "file_size": "Tamanho do arquivo:", "preview": "Visualizar:", - "preview_not_available": "A visualização nĆ£o estĆ” disponĆ­vel para este tipo de nota." + "preview_not_available": "A visualização nĆ£o estĆ” disponĆ­vel para este tipo de nota.", + "diff_on": "Exibir diferenƧa", + "diff_off": "Exibir conteĆŗdo", + "diff_on_hint": "Clique para exibir a diferenƧa de fonte da nota", + "diff_off_hint": "Clique para exibir o conteĆŗdo da nota", + "diff_not_available": "A diferenƧa nĆ£o estĆ” disponĆ­vel." }, "sort_child_notes": { "sort_children_by": "Ordenar notas filhas por...", @@ -744,7 +749,7 @@ "button-tree-map": "Mapa em Ɓrvore" }, "tree-context-menu": { - "open-in-a-new-tab": "Abrir em uma nova aba Ctrl+Click", + "open-in-a-new-tab": "Abrir em uma nova aba", "open-in-a-new-split": "Abrir em um novo painel dividido", "insert-note-after": "Inserir nota após", "insert-child-note": "Inserir nota filha", @@ -774,7 +779,9 @@ "apply-bulk-actions": "Aplicar aƧƵes em massa", "converted-to-attachments": "{{count}} notas foram convertidas em anexos.", "convert-to-attachment-confirm": "Tem certeza de que deseja converter as notas selecionadas em anexos de suas notas-pai?", - "open-in-popup": "Edição rĆ”pida" + "open-in-popup": "Edição rĆ”pida", + "archive": "Ficheiro", + "unarchive": "Desarquivar" }, "command_palette": { "search_subtree_title": "Buscar na SubĆ”rvore", @@ -833,7 +840,7 @@ "cannot_find_day_note": "Nota do dia nĆ£o encontrada", "cannot_find_week_note": "Nota semanal nĆ£o encontrada", "january": "Janeiro", - "febuary": "Fevereiro", + "february": "Fevereiro", "march": "MarƧo", "april": "Abril", "may": "Maio", @@ -843,7 +850,18 @@ "september": "Setembro", "october": "Outubro", "november": "Novembro", - "december": "Dezembro" + "december": "Dezembro", + "week": "Semana", + "week_previous": "Semana passada", + "week_next": "Próxima semana", + "month": "MĆŖs", + "month_previous": "MĆŖs passado", + "month_next": "Próximo mĆŖs", + "year": "Ano", + "year_previous": "Ano passado", + "year_next": "Próximo ano", + "list": "Lista", + "today": "Hoje" }, "close_pane_button": { "close_this_pane": "Fechar este painel" @@ -994,8 +1012,9 @@ "invalid_view_type": "Tipo de visualização invĆ”lido '{{type}}'", "calendar": "CalendĆ”rio", "table": "Tabela", - "geo-map": "Geo Map", - "board": "Quadro" + "geo-map": "Mapa geogrĆ”fico", + "board": "Quadro", + "include_archived_notes": "Exibir notas arquivadas" }, "edited_notes": { "no_edited_notes_found": "Ainda nĆ£o hĆ” nenhuma nota editada neste dia…", @@ -1278,7 +1297,7 @@ "handwriting-system-fonts": "Fontes de escrita Ć  mĆ£o de sistema", "serif": "Serifa", "sans-serif": "Sem Serifa", - "monospace": "Monospace", + "monospace": "MonoespaƧado", "system-default": "PadrĆ£o do Sistema", "note_tree_and_detail_font_sizing": "Note que o tamanho da fonte da Ć”rvore e dos detalhes Ć© relativo Ć  configuração principal do tamanho de fonte." }, @@ -1350,7 +1369,9 @@ "title": "Desempenho", "enable-motion": "Habilitar transiƧƵes e animaƧƵes", "enable-shadows": "Habilitar sombras", - "enable-backdrop-effects": "Habilitar efeitos de fundo para menus, popups e painĆ©is" + "enable-backdrop-effects": "Habilitar efeitos de fundo para menus, popups e painĆ©is", + "enable-smooth-scroll": "Habilitar rolagem suave", + "app-restart-required": "(Ć© necessĆ”rio reiniciar o programa para que a mudanƧa tenha efeito)" }, "zoom_factor": { "title": "Fator do Zoom (apenas versĆ£o de Ć”rea de trabalho)", @@ -1518,7 +1539,7 @@ "doc": "Documento", "widget": "Widget", "confirm-change": "NĆ£o Ć© recomentado alterar o tipo da nota quando o conteĆŗdo da nota nĆ£o estĆ” vazio. Quer continuar assim mesmo?", - "geo-map": "Geo Map", + "geo-map": "Mapa geogrĆ”fico", "beta-feature": "Beta", "ai-chat": "Chat IA", "task-list": "Lista de Tarefas", @@ -1579,7 +1600,8 @@ "hoist-this-note-workspace": "Fixar esta nota (workspace)", "refresh-saved-search-results": "Atualizar resultados de pesquisa salvos", "create-child-note": "Criar nota filha", - "unhoist": "Desafixar" + "unhoist": "Desafixar", + "toggle-sidebar": "Alternar barra lateral" }, "title_bar_buttons": { "window-on-top": "Manter Janela no Topo" @@ -1729,7 +1751,7 @@ "native-title-bar": "Barra de tĆ­tulo nativa", "native-title-bar-description": "Para Windows e macOS, manter a barra de tĆ­tulo nativa desabilitada faz a aplicação parecer mais compacta. No Linux, manter a barra de tĆ­tulo nativa habilitada faz a aplicação se integrar melhor com o restante do sistema.", "background-effects": "Habilitar efeitos de fundo (apenas Windows 11)", - "background-effects-description": "O efeito Mica adicionar um fundo borrado e estilizado Ć s janelas da aplicação, criando profundidade e um visual moderno.", + "background-effects-description": "O efeito Mica adiciona um fundo borrado e estilizado Ć s janelas da aplicação, criando profundidade e um visual moderno. \"Barra de tĆ­tulo nativa\" precisa ser desativada.", "restart-app-button": "Reiniciar a aplicação para ver as alteraƧƵes", "zoom-factor": "Fator de Zoom" }, @@ -1864,14 +1886,21 @@ "delete_row": "Excluir linha" }, "board_view": { - "delete-note": "Excluir Nota", + "delete-note": "Deletar nota...", "move-to": "Mover para", "insert-above": "Inserir acima", "insert-below": "Inserir abaixo", "delete-column": "Excluir coluna", "delete-column-confirmation": "Tem certeza de que deseja excluir esta coluna? O atributo correspondente tambĆ©m serĆ” removido de todas as notas abaixo desta coluna.", "new-item": "Novo item", - "add-column": "Adicionar Coluna" + "add-column": "Adicionar Coluna", + "remove-from-board": "Remover do quadro", + "archive-note": "Arquivar nota", + "unarchive-note": "Desarquivar nota", + "new-item-placeholder": "Escreva o tĆ­tulo da nota...", + "add-column-placeholder": "Escreva o nome da coluna...", + "edit-note-title": "Clique para editar o tĆ­tulo da nota", + "edit-column-title": "Clique para editar o tĆ­tulo da coluna" }, "call_to_action": { "next_theme_title": "Testar no novo tema do Trilium", @@ -1893,7 +1922,9 @@ "percentage": "%" }, "book": { - "no_children_help": "Esta coleção nĆ£o possui nenhum nota filha, entĆ£o nĆ£o hĆ” nada para exibir. Veja wiki para detalhes." + "no_children_help": "Esta coleção nĆ£o possui nenhum nota filha, entĆ£o nĆ£o hĆ” nada para exibir. Veja wiki para detalhes.", + "drag_locked_title": "Bloqueado para edição", + "drag_locked_message": "Arrastar nĆ£o Ć© permitido pois a coleção estĆ” bloqueada para edição." }, "render": { "note_detail_render_help_1": "Esta nota de ajuda Ć© mostrada porque esta nota do tipo Renderizar HTML nĆ£o possui a relação necessĆ”ria para funcionar corretamente.", @@ -1977,7 +2008,7 @@ "oauth_title": "OAuth/OpenID", "oauth_description": "OpenID Ć© uma forma padronizada de permitir que vocĆŖ faƧa login em sites usando uma conta de outro serviƧo, como o Google, para verificar sua identidade. O emissor padrĆ£o Ć© o Google, mas vocĆŖ pode alterĆ”-lo para qualquer outro provedor OpenID. Consulte aqui para mais informaƧƵes. Siga estas instruƧƵes para configurar um serviƧo OpenID atravĆ©s do Google.", "oauth_description_warning": "Para habilitar o OAuth/OpenID, vocĆŖ precisa definir a URL base do OAuth/OpenID, o client ID e o client secret no arquivo config.ini e reiniciar a aplicação. Se quiser configurar via variĆ”veis de ambiente, defina TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID e TRILIUM_OAUTH_CLIENT_SECRET.", - "oauth_missing_vars": "ConfiguraƧƵes ausentes: {{variables}}", + "oauth_missing_vars": "ConfiguraƧƵes ausentes: {{-variables}}", "oauth_user_account": "Conta do UsuĆ”rio: ", "oauth_user_email": "E-mail do UsuĆ”rio: ", "oauth_user_not_logged_in": "NĆ£o estĆ” logado!" @@ -2022,8 +2053,15 @@ "handshake_failed": "Falha no handshake com o servidor de sincronização, erro: {{message}}" }, "shared_info": { - "shared_publicly": "Esta nota Ć© compartilhada publicamente", - "shared_locally": "Esta nota Ć© compartilhada localmente", - "help_link": "Para ajuda, visite a wiki." + "help_link": "Para ajuda, visite a wiki.", + "shared_publicly": "Esta nota Ć© compartilhada publicamente em {{- link}}.", + "shared_locally": "Esta nota Ć© compartilhada localmente em {{- link}}." + }, + "pagination": { + "page_title": "PĆ”gina de {{startIndex}} - {{endIndex}}", + "total_notes": "{{count}} notas" + }, + "collections": { + "rendering_error": "NĆ£o foi possĆ­vel exibir o conteĆŗdo devido a um erro." } } diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index 02c7834dc..f35d2ce89 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -267,10 +267,13 @@ "basic_properties": "Proprietăți de bază", "editable": "Editabil", "note_type": "Tipul notiței", - "language": "Limbă" + "language": "Limbă", + "configure_code_notes": "Configurează notițele de tip cod..." }, "book": { - "no_children_help": "Această notiță de tip Carte nu are nicio subnotiță așadar nu este nimic de afișat. Vedeți wiki pentru detalii." + "no_children_help": "Această notiță de tip Carte nu are nicio subnotiță așadar nu este nimic de afișat. Vedeți wiki pentru detalii.", + "drag_locked_title": "Blocat pentru editare", + "drag_locked_message": "Glisarea notițelor nu este permisă deoarece colecția este blocată pentru editare." }, "book_properties": { "collapse": "Minimizează", @@ -285,7 +288,9 @@ "book_properties": "Proprietăți colecție", "table": "Tabel", "geo-map": "Hartă geografică", - "board": "Tablă Kanban" + "board": "Tablă Kanban", + "include_archived_notes": "Afișează notițele arhivate", + "presentation": "Prezentare" }, "bookmark_switch": { "bookmark": "Semn de carte", @@ -318,7 +323,7 @@ "august": "August", "cannot_find_day_note": "Nu se poate găsi notița acelei zile", "december": "Decembrie", - "febuary": "Februarie", + "february": "Februarie", "fri": "Vin", "january": "Ianuarie", "july": "Iulie", @@ -334,7 +339,18 @@ "thu": "Joi", "tue": "Mar", "wed": "Mie", - "cannot_find_week_note": "Nu s-a putut găsi notița săptămĆ¢nală" + "cannot_find_week_note": "Nu s-a putut găsi notița săptămĆ¢nală", + "week": "SăptămĆ¢nă", + "week_previous": "SăptămĆ¢na trecută", + "week_next": "Următoarea săptămĆ¢nă", + "month": "Lună", + "month_previous": "Luna anterioară", + "month_next": "Următoarea lună", + "year": "An", + "year_previous": "Anul trecut", + "year_next": "Anul următor", + "list": "Agendă", + "today": "Astăzi" }, "clone_to": { "clone_notes_to": "Clonează notițele către...", @@ -596,7 +612,9 @@ "zoom_in": "Mărește", "zoom_out": "Micșorează", "show-cheatsheet": "Afișează ghidul rapid", - "toggle-zen-mode": "Mod zen" + "toggle-zen-mode": "Mod zen", + "new-version-available": "Actualizare nouă disponibilă", + "download-update": "Obțineți versiunea {{latestVersion}}" }, "heading_style": { "markdown": "Stil Markdown", @@ -686,7 +704,13 @@ "first-week-has-minimum-days": "Prima săptămĆ¢nă are numărul minim de zile", "min-days-in-first-week": "Numărul minim de zile pentru prima săptămĆ¢nă", "first-week-info": "Opțiunea de prima săptămĆ¢nă conține prima zi de joi din an este bazată pe standardul ISO 8601.", - "first-week-warning": "Schimbarea opțiunii primei săptămĆ¢ni poate cauza duplicate cu notițele săptămĆ¢nale existente deoarece acestea nu vor fi actualizate retroactiv." + "first-week-warning": "Schimbarea opțiunii primei săptămĆ¢ni poate cauza duplicate cu notițele săptămĆ¢nale existente deoarece acestea nu vor fi actualizate retroactiv.", + "tuesday": "Marți", + "wednesday": "Miercuri", + "thursday": "Joi", + "friday": "Vineri", + "saturday": "SĆ¢mbătă", + "formatting-locale-auto": "Ǝn funcție de limba aplicației" }, "image_properties": { "copy_reference_to_clipboard": "Copiază referință Ć®n clipboard", @@ -788,7 +812,8 @@ "delete_this_note": "Șterge această notiță", "error_cannot_get_branch_id": "Nu s-a putut obține branchId-ul pentru calea ā€ž{{notePath}}ā€", "error_unrecognized_command": "Comandă nerecunoscută ā€ž{{command}}ā€", - "insert_child_note": "Inserează subnotiță" + "insert_child_note": "Inserează subnotiță", + "note_revisions": "Revizuiri ale notițelor" }, "move_note": { "clone_note_new_parent": "clonează notița la noul părinte dacă notița are mai multe clone/ramuri (cĆ¢nd nu este clar care ramură trebuie ștearsă)", @@ -1070,7 +1095,12 @@ "revisions_deleted": "Notița reviziei a fost ștearsă.", "maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.", "settings": "Setări revizii ale notițelor", - "snapshot_interval": "Intervalul de creare a reviziilor pentru notițe: {{seconds}}s." + "snapshot_interval": "Intervalul de creare a reviziilor pentru notițe: {{seconds}}s.", + "diff_on": "Evidențiază diferențele", + "diff_off": "Afișează conținutul", + "diff_on_hint": "Clic pentru a afișa diferențele față de revizia anterioară, la nivel de cod sursă", + "diff_off_hint": "Clic pentru a afișa Ć®ntregul conținut al reviziei", + "diff_not_available": "Diferențele nu pot fi evidențiate." }, "revisions_button": { "note_revisions": "Revizii ale notiței" @@ -1357,7 +1387,7 @@ "insert-note-after": "Inserează după notiță", "move-to": "Mutare la...", "open-in-a-new-split": "Deschide Ć®n lateral", - "open-in-a-new-tab": "Deschide Ć®n tab nou Ctrl+Clic", + "open-in-a-new-tab": "Deschide Ć®n tab nou", "paste-after": "Lipește după notiță", "paste-into": "Lipește Ć®n notiță", "protect-subtree": "Protejează ierarhia", @@ -1369,12 +1399,14 @@ "unhoist-note": "Defocalizează notița", "converted-to-attachments": "{{count}} notițe au fost convertite Ć®n atașamente.", "convert-to-attachment-confirm": "Doriți convertirea notițelor selectate Ć®n atașamente ale notiței părinte?", - "open-in-popup": "Editare rapidă" + "open-in-popup": "Editare rapidă", + "archive": "Arhivează", + "unarchive": "Dezarhivează" }, "shared_info": { "help_link": "Pentru informații vizitați wiki-ul.", - "shared_locally": "Această notiță este partajată local la", - "shared_publicly": "Această notiță este partajată public la" + "shared_locally": "Această notiță este partajată local la {{- link}}.", + "shared_publicly": "Această notiță este partajată public la {{- link}}." }, "note_types": { "book": "Colecție", @@ -1472,7 +1504,8 @@ "create-child-note": "Crează subnotiță", "hoist-this-note-workspace": "Focalizează spațiul de lucru", "refresh-saved-search-results": "ReĆ®mprospătează căutarea salvată", - "unhoist": "Defocalizează notița" + "unhoist": "Defocalizează notița", + "toggle-sidebar": "Comută bara laterală" }, "title_bar_buttons": { "window-on-top": "Menține fereastra mereu vizibilă" @@ -1564,7 +1597,9 @@ "ws": { "consistency-checks-failed": "Au fost identificate erori de consistență! Vedeți mai multe detalii Ć®n loguri.", "encountered-error": "A fost Ć®ntĆ¢mpinată o eroare: ā€ž{{message}}ā€. Vedeți Ć®n loguri pentru mai multe detalii.", - "sync-check-failed": "Verificările de sincronizare au eșuat!" + "sync-check-failed": "Verificările de sincronizare au eșuat!", + "lost-websocket-connection-title": "S-a pierdut conexiunea la server", + "lost-websocket-connection-message": "Verificați configurația reverse proxy-ului (e.g. nginx sau Apache) astfel Ć®ncĆ¢t să permită comunicarea prin WebSocket." }, "hoisted_note": { "confirm_unhoisting": "Notița dorită ā€ž{{requestedNote}}ā€ este Ć®n afara ierarhiei notiței focalizate ā€ž{{hoistedNote}}ā€. Doriți defocalizarea pentru a accesa notița?" @@ -1645,7 +1680,7 @@ }, "electron_integration": { "background-effects": "Activează efectele de fundal (doar pentru Windows 11)", - "background-effects-description": "Efectul Mica adaugă un fundal estompat și elegant ferestrelor aplicațiilor, creĆ¢nd profunzime și un aspect modern.", + "background-effects-description": "Efectul Mica adaugă un fundal estompat și elegant ferestrelor aplicațiilor, creĆ¢nd profunzime și un aspect modern. Opțiunea ā€žBară de titlu nativÄƒā€ trebuie să fie dezactivată.", "desktop-application": "Aplicația desktop", "native-title-bar": "Bară de titlu nativă", "native-title-bar-description": "Pentru Windows și macOS, dezactivarea bării de titlu native face aplicația să pară mai compactă. Pe Linux, păstrarea bării integrează mai bine aplicația cu restul sistemului de operare.", @@ -1908,7 +1943,7 @@ "oauth_title": "OAuth/OpenID", "oauth_description": "OpenID este o cale standardizată ce permite autentificarea Ć®ntr-un site folosind un cont dintr-un alt serviciu, precum Google, pentru a verifica identitatea. Ǝn mod implicit furnizorul este Google, dar se poate schimba cu orice furnizor OpenID. Pentru mai multe informații, consultați ghidul. Urmați aceste instrucțiuni pentru a putea configura OpenID prin Google.", "oauth_description_warning": "Pentru a activa OAuth sau OpenID, trebuie să configurați URL-ul de bază, ID-ul de client și secretul de client Ć®n fișierul config.ini și să reporniți aplicația. Dacă doriți să utilizați variabile de environment, puteți seta TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID și TRILIUM_OAUTH_CLIENT_SECRET.", - "oauth_missing_vars": "Setări lipsă: {{variables}}", + "oauth_missing_vars": "Setări lipsă: {{-variables}}", "oauth_user_account": "Cont: ", "oauth_user_email": "Email: ", "oauth_user_not_logged_in": "Neautentificat!" @@ -1933,7 +1968,11 @@ "editorfeatures": { "title": "Funcții", "emoji_completion_enabled": "Activează auto-completarea pentru emoji-uri", - "note_completion_enabled": "Activează auto-completarea pentru notițe" + "note_completion_enabled": "Activează auto-completarea pentru notițe", + "emoji_completion_description": "Dacă această funcție este pornită, emoji-urile pot fi inserate rapid prin tastarea caracterului ā€ž:ā€, urmat de denumirea emoji-ului.", + "note_completion_description": "Dacă această funcție este pornită, se pot crea ușor legături către notițe prin tastarea ā€ž@ā€, urmată de titlul notiței dorite.", + "slash_commands_enabled": "Activează comenzi rapide prin tasta slash", + "slash_commands_description": "Dacă această funcție este pornită, se poate folosi tasta ā€ž/ā€ pentru a rula rapid comenzi de editare precum inserarea de Ć®ntreruperi de pagină sau titluri." }, "table_view": { "new-row": "RĆ¢nd nou", @@ -1969,14 +2008,21 @@ "delete_row": "Șterge rĆ¢ndul" }, "board_view": { - "delete-note": "Șterge notița", + "delete-note": "Șterge notița...", "move-to": "Mută la", "insert-above": "Inserează deasupra", "insert-below": "Inserează dedesubt", "delete-column": "Șterge coloana", "delete-column-confirmation": "Doriți ștergerea acestei coloane? Atributul corespunzător va fi șters din notițele din acest tabel.", "new-item": "Intrare nouă", - "add-column": "Adaugă coloană" + "add-column": "Adaugă coloană", + "remove-from-board": "Ǝnlătură de pe tablă", + "archive-note": "Arhivează notița", + "unarchive-note": "Dezarhivează notița", + "new-item-placeholder": "Introduceți titlul notiței...", + "add-column-placeholder": "Introduceți denumirea coloanei...", + "edit-note-title": "Clic pentru a edita titlul notiței", + "edit-column-title": "Clic pentru a edita titlul coloanei" }, "command_palette": { "tree-action-name": "Listă de notițe: {{name}}", @@ -2013,7 +2059,9 @@ "title": "Setări de performanță", "enable-motion": "Activează tranzițiile și animațiile", "enable-shadows": "Activează umbrirea elementelor", - "enable-backdrop-effects": "Activează efectele de fundal pentru meniuri, popup-uri și panouri" + "enable-backdrop-effects": "Activează efectele de fundal pentru meniuri, popup-uri și panouri", + "enable-smooth-scroll": "Activează derularea lină", + "app-restart-required": "(este necesară repornirea aplicației pentru ca modificarea să aibă efect)" }, "settings": { "related_settings": "Setări similare" @@ -2024,5 +2072,17 @@ }, "units": { "percentage": "%" + }, + "pagination": { + "page_title": "Pagina pentru {{startIndex}} - {{endIndex}}", + "total_notes": "{{count}} notițe" + }, + "collections": { + "rendering_error": "Nu a putut fi afișat conținutul din cauza unei erori." + }, + "presentation_view": { + "edit-slide": "Editați acest slide", + "start-presentation": "Ǝncepeți prezentarea", + "slide-overview": "Afișați o imagine de ansamblu a slide-urilor" } } diff --git a/apps/client/src/translations/ru/translation.json b/apps/client/src/translations/ru/translation.json index ab71bf7dc..2dc068850 100644 --- a/apps/client/src/translations/ru/translation.json +++ b/apps/client/src/translations/ru/translation.json @@ -282,13 +282,13 @@ "editBranchPrefix": "ŠøŠ·Š¼ŠµŠ½ŠøŃ‚ŃŒ префикс клона активной заметки", "multiSelectNote": "множественный выбор заметки Š²Ń‹ŃˆŠµ/ниже", "selectNote": "Š²Ń‹Š±Ń€Š°Ń‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ", - "copyNotes": "ŃŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š°ŠŗŃ‚ŠøŠ²Š½ŃƒŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ (или выГеление) в Š±ŃƒŃ„ер обмер (ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š“Š»Ń ŠŗŠ»Š¾Š½ŠøŃ€Š¾Š²Š°Š½ŠøŃ)", + "copyNotes": "ŃŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š°ŠŗŃ‚ŠøŠ²Š½ŃƒŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ (или выГеление) в Š±ŃƒŃ„ер обмена (ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š“Š»Ń ŠŗŠ»Š¾Š½ŠøŃ€Š¾Š²Š°Š½ŠøŃ)", "createEditLink": "ŃŠ¾Š·Š“Š°Ń‚ŃŒ/Ń€ŠµŠ“Š°ŠŗŃ‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š²Š½ŠµŃˆŠ½ŃŽŃŽ ŃŃŃ‹Š»ŠŗŃƒ", "headings": "##, ###, #### Šø т. Š“., за которыми ŃŠ»ŠµŠ“ŃƒŠµŃ‚ пробел Š“Š»Ń заголовков", "bulletList": "* или - с ŠæŠ¾ŃŠ»ŠµŠ“ŃƒŃŽŃ‰ŠøŠ¼ пробелом Š“Š»Ń маркированного списка", "numberedList": "1. или 1) с ŠæŠ¾ŃŠ»ŠµŠ“ŃƒŃŽŃ‰ŠøŠ¼ пробелом Š“Š»Ń Š½ŃƒŠ¼ŠµŃ€Š¾Š²Š°Š½Š½Š¾Š³Š¾ списка", "blockQuote": "начните ŃŃ‚Ń€Š¾ŠŗŃƒ с >, а затем пробела Š“Š»Ń блока цитаты", - "quickSearch": "ŃŃ„Š¾ŠŗŃƒŃŠøŃ€Š¾Š²Š°Ń‚ŃŒŃŃ на полее ввоГа быстрого поиска", + "quickSearch": "ŃŃ„Š¾ŠŗŃƒŃŠøŃ€Š¾Š²Š°Ń‚ŃŒŃŃ на поле ввоГа быстрого поиска", "editNoteTitle": "в области Герева ŠæŠµŃ€ŠµŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŃ с области Герева на заголовок заметки. Дочетание клавиш Enter ŠøŠ· области заголовка заметки ŠæŠµŃ€ŠµŠŗŠ»ŃŽŃ‡ŠøŃ‚ Ń„Š¾ŠŗŃƒŃ на текстовый реГактор. Ctrl+. ŠæŠµŃ€ŠµŠŗŠ»ŃŽŃ‡ŠøŃ‚ обратно с реГактора на Š¾Š±Š»Š°ŃŃ‚ŃŒ Герева.", "title": "Дправка" }, @@ -301,7 +301,7 @@ "chooseImportFile": "Выберите файл импорта", "safeImport": "Безопасный импорт", "shrinkImages": "Š£Š¼ŠµŠ½ŃŒŃˆŠøŃ‚ŃŒ ŠøŠ·Š¾Š±Ń€Š°Š¶ŠµŠ½ŠøŃ", - "textImportedAsText": "Š˜Š¼ŠæŠ¾Ń€Ń‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ HTML, Markdown Šø TXT как текстовые заметки, если ŠøŠ· метаГанные не ŠæŠ¾Š·Š²Š¾Š»ŃŃŽŃ‚ Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŠøŃ‚ŃŒ тип заметки", + "textImportedAsText": "Š˜Š¼ŠæŠ¾Ń€Ń‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ HTML, Markdown Šø TXT как текстовые заметки, если ŠøŃ… метаГанные не ŠæŠ¾Š·Š²Š¾Š»ŃŃŽŃ‚ Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŠøŃ‚ŃŒ тип заметки", "replaceUnderscoresWithSpaces": "Š—Š°Š¼ŠµŠ½ŠøŃ‚ŃŒ ŠæŠ¾Š“Ń‡ŠµŃ€ŠŗŠøŠ²Š°Š½ŠøŃ пробелами в Š½Š°Š·Š²Š°Š½ŠøŃŃ… импортированных заметок", "import": "Š˜Š¼ŠæŠ¾Ń€Ń‚", "failed": "Дбой при импорте: {{message}}.", @@ -370,7 +370,7 @@ "confirm_delete": "Š’Ń‹ хотите ŃƒŠ“Š°Š»ŠøŃ‚ŃŒ эту Š²ŠµŃ€ŃŠøŃŽ?", "revisions_deleted": "Версии заметки были ŃƒŠ“Š°Š»ŠµŠ½Ń‹.", "revision_restored": "Š’ŠµŃ€ŃŠøŃ заметки была восстановлена.", - "revision_deleted": "Š’ŠµŃ€ŃŠøŃ заметки были ŃƒŠ“Š°Š»ŠµŠ½Ń‹.", + "revision_deleted": "Š’ŠµŃ€ŃŠøŃ заметки была уГалена.", "download_button": "Š”ŠŗŠ°Ń‡Š°Ń‚ŃŒ", "file_size": "Размер файла:", "preview": "ŠŸŃ€ŠµŠ“ŠæŃ€Š¾ŃŠ¼Š¾Ń‚Ń€:", @@ -379,7 +379,12 @@ "settings": "ŠŠ°ŃŃ‚Ń€Š¾Š¹ŠŗŠ° Š²ŠµŃ€ŃŠøŠ¾Š½ŠøŃ€Š¾Š²Š°Š½ŠøŃ заметок", "no_revisions": "Š£ ŃŃ‚Š¾Š¹ заметки еще нет версий...", "snapshot_interval": "Š˜Š½Ń‚ŠµŃ€Š²Š°Š» ŃŠ¾Š·Š“Š°Š½ŠøŃ версии заметки: {{seconds}} с.", - "maximum_revisions": "Максимальное количество версий заметки: {{number}}." + "maximum_revisions": "Максимальное количество версий заметки: {{number}}.", + "diff_on": "Š”Ń€Š°Š²Š½ŠøŃ‚ŃŒ", + "diff_off": "ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ соГержимое", + "diff_on_hint": "ŠžŃ‚Š¾Š±Ń€Š°Š·ŠøŃ‚ŃŒ сравнение исхоГного коГа заметки", + "diff_off_hint": "ŠžŃ‚Š¾Š±Ń€Š°Š·ŠøŃ‚ŃŒ контент заметки", + "diff_not_available": "Дравнение Š½ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½Š¾." }, "sort_child_notes": { "sort_children_by": "Š”Š¾Ń€Ń‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ Гочерние заметки по...", @@ -458,7 +463,7 @@ "run_at_hour": "Š’ какой час ŃŃ‚Š¾ Голжно Š²Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒŃŃ? Š”Š»ŠµŠ“ŃƒŠµŃ‚ ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ вместе с #run=hourly. Можно Š·Š°Š“Š°Ń‚ŃŒ несколько раз Š“Š»Ń большего количества запусков в течение Š“Š½Ń.", "disable_inclusion": "скрипты с ŃŃ‚Š¾Š¹ меткой не Š±ŃƒŠ“ŃƒŃ‚ Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½Ń‹ в выполнение Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠ¾Š³Š¾ скрипта.", "sorted": "ŃŠ¾Ń…Ń€Š°Š½ŃŠµŃ‚ Š°Š»Ń„Š°Š²ŠøŃ‚Š½ŃƒŃŽ ŃŠ¾Ń€Ń‚ŠøŃ€Š¾Š²ŠŗŃƒ Гочерних заметок", - "sort_direction": "ASC (по возрастани, по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ) или DESC (по ŃƒŠ±Ń‹Š²Š°Š½ŠøŃŽ)", + "sort_direction": "ASC (по Š²Š¾Š·Ń€Š°ŃŃ‚Š°Š½ŠøŃŽ, по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ) или DESC (по ŃƒŠ±Ń‹Š²Š°Š½ŠøŃŽ)", "sort_folders_first": "Папки (заметки, Š²ŠŗŠ»ŃŽŃ‡Š°Ń Гочерние) Голжны Š±Ń‹Ń‚ŃŒ отсортированы вверх", "top": "Š·Š°ŠŗŃ€ŠµŠæŠøŃ‚ŃŒ Š·Š°Š“Š°Š½Š½ŃƒŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ Š½Š°Š²ŠµŃ€Ń…Ńƒ в ее роГителе (ŠæŃ€ŠøŠ¼ŠµŠ½ŃŠµŃ‚ŃŃ Ń‚Š¾Š»ŃŒŠŗŠ¾ Šŗ отсортированным Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠøŠ¼ заметкам)", "hide_promoted_attributes": "Š”ŠŗŃ€Ń‹Ń‚ŃŒ проГвигаемых Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Ń‹ в ŃŃ‚Š¾Š¹ заметке", @@ -474,7 +479,7 @@ "workspace_search_home": "новые заметки поиска Š±ŃƒŠ“ŃƒŃ‚ созГаны как Гочерние записи ŃŃ‚Š¾Š¹ заметки при перемещении ŠøŃ… Šŗ какому-либо ŠæŃ€ŠµŠ“ŠŗŃƒ ŃŃ‚Š¾Š¹ заметки рабочей области", "workspace_calendar_root": "ŠžŠæŃ€ŠµŠ“ŠµŠ»ŃŠµŃ‚ ŠŗŠ¾Ń€ŠµŠ½ŃŒ ŠŗŠ°Š»ŠµŠ½Š“Š°Ń€Ń Š“Š»Ń кажГого рабочего пространства", "hide_highlight_widget": "Š”ŠŗŃ€Ń‹Ń‚ŃŒ виГжет «ВыГеленное»", - "is_owned_by_note": "принаГлежит записке", + "is_owned_by_note": "принаГлежит заметке", "and_more": "... Šø ещё {{count}}.", "app_theme": "отмечает заметки CSS, которые ŃŠ²Š»ŃŃŽŃ‚ŃŃ полноценными темами Trilium Šø, таким образом, Š“Š¾ŃŃ‚ŃƒŠæŠ½Ń‹ в Š¾ŠæŃ†ŠøŃŃ… Trilium.", "title_template": "Заголовок по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ Š“Š»Ń заметок, созГаваемых как Гочерние ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹ Ганной заметки. Значение Š²Ń‹Ń‡ŠøŃŠ»ŃŠµŃ‚ся как строка JavaScript\n Šø, таким образом, может Š±Ń‹Ń‚ŃŒ Гополнено Гинамическим контентом с ŠæŠ¾Š¼Š¾Ń‰ŃŒŃŽ внеГренных переменных now Šø parentNote. ŠŸŃ€ŠøŠ¼ŠµŃ€Ń‹:\n \n
    \n
  • Š›ŠøŃ‚ŠµŃ€Š°Ń‚ŃƒŃ€Š½Ń‹Šµ ŠæŃ€Š¾ŠøŠ·Š²ŠµŠ“ŠµŠ½ŠøŃ ${parentNote.getLabelValue('authorName')}
  • \n
  • Лог Š“Š»Ń ${now.format('YYYY-MM-DD HH:mm:ss')}
  • \n
\n \n ŠŸŠ¾Š“Ń€Š¾Š±Š½Š¾ŃŃ‚Šø см. в вики, Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†ŠøŠø API Š“Š»Ń parentNote Šø now.", @@ -523,7 +528,7 @@ "run_on_note_deletion": "Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŃ‚ŃŃ при уГалении заметки", "run_on_branch_creation": "Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŃ‚ŃŃ при созГании ветви. Š’ŠµŃ‚Š²ŃŒ — ŃŃ‚Š¾ ŃŠ²ŃŠ·ŃƒŃŽŃ‰ŠµŠµ звено межГу Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠ¾Š¹ Šø Гочерней заметками Šø ŃŠ¾Š·Š“Š°Ń‘Ń‚ŃŃ, например, при клонировании или перемещении заметки.", "run_on_branch_change": "Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŃ‚ŃŃ при обновлении ветки.", - "run_on_attribute_creation": "Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŃ‚ŃŃ, когГа ŃŠ¾Š·Š“Š°ŠµŃ‚ŃŃ новый Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚ Š“Š»Ń заметка, Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŃŃŽŃ‰ŠµŠ¹ ŃŃ‚Š¾ Š¾Ń‚Š½Š¾ŃˆŠµŠ½ŠøŠµ", + "run_on_attribute_creation": "Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŃ‚ŃŃ, когГа ŃŠ¾Š·Š“Š°ŠµŃ‚ŃŃ новый Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚ Š“Š»Ń заметки, Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŃŃŽŃ‰ŠµŠ¹ ŃŃ‚Š¾ Š¾Ń‚Š½Š¾ŃˆŠµŠ½ŠøŠµ", "run_on_attribute_change": " Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŃ‚ŃŃ при изменении Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Š° заметки, Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŃŃŽŃ‰ŠµŠ¹ ŃŃ‚Š¾ Š¾Ń‚Š½Š¾ŃˆŠµŠ½ŠøŠµ. Также срабатывает при уГалении Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Š°", "relation_template": "Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Ń‹ заметки Š±ŃƒŠ“ŃƒŃ‚ ŃƒŠ½Š°ŃŠ»ŠµŠ“Š¾Š²Š°Š½Ń‹ Гаже без Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠ¾-Гочерних Š¾Ń‚Š½Š¾ŃˆŠµŠ½ŠøŠ¹. ДоГержимое заметки Šø её поГГерево Š±ŃƒŠ“ŃƒŃ‚ Гобавлены Šŗ ŃŠŗŠ·ŠµŠ¼ŠæŠ»ŃŃ€Ńƒ заметки, если оно ŠæŃƒŃŃ‚ое. ŠŸŠ¾Š“Ń€Š¾Š±Š½Š¾ŃŃ‚Šø см. в Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†ŠøŠø.", "inherit": "Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Ń‹ заметки Š±ŃƒŠ“ŃƒŃ‚ ŃƒŠ½Š°ŃŠ»ŠµŠ“Š¾Š²Š°Š½Ń‹ Гаже без Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠ¾-Гочерних Š¾Ń‚Š½Š¾ŃˆŠµŠ½ŠøŠ¹. Дм. описание ŃˆŠ°Š±Š»Š¾Š½Š½Ń‹Ń… Š¾Ń‚Š½Š¾ŃˆŠµŠ½ŠøŠ¹ Š“Š»Ń ŠæŠ¾Š»ŃƒŃ‡ŠµŠ½ŠøŃ аналогичной информации. Дм. разГел Ā«ŠŠ°ŃŠ»ŠµŠ“Š¾Š²Š°Š½ŠøŠµ Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Š¾Š²Ā» в Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†ŠøŠø.", @@ -555,7 +560,14 @@ "insert-below": "Š’ŃŃ‚Š°Š²ŠøŃ‚ŃŒ ниже", "insert-above": "Š’ŃŃ‚Š°Š²ŠøŃ‚ŃŒ Š²Ń‹ŃˆŠµ", "move-to": "ŠŸŠµŃ€ŠµŠ¼ŠµŃŃ‚ŠøŃ‚ŃŒ", - "delete-note": "Š£Š“Š°Š»ŠøŃ‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ" + "delete-note": "Š£Š“Š°Š»ŠøŃ‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ...", + "remove-from-board": "Š£Š“Š°Š»ŠøŃ‚ŃŒ ŠøŠ· Госки", + "archive-note": "ŠŃ€Ń…ŠøŠ²ŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ", + "unarchive-note": "Š Š°Š·Š°Ń€Ń…ŠøŠ²ŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ", + "edit-column-title": "ŠŠ°Š¶Š¼ŠøŃ‚Šµ, чтобы ŠøŠ·Š¼ŠµŠ½ŠøŃ‚ŃŒ заголовок столбца", + "edit-note-title": "ŠŠ°Š¶Š¼ŠøŃ‚Šµ, чтобы ŠøŠ·Š¼ŠµŠ½ŠøŃ‚ŃŒ название заметки", + "add-column-placeholder": "ВвеГите ŠøŠ¼Ń столбца...", + "new-item-placeholder": "ВвеГите название заметки..." }, "table_context_menu": { "delete_row": "Š£Š“Š°Š»ŠøŃ‚ŃŒ ŃŃ‚Ń€Š¾ŠŗŃƒ" @@ -573,7 +585,11 @@ "editorfeatures": { "note_completion_enabled": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ автоГополнение", "emoji_completion_enabled": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ автоГополнение ŃŠ¼Š¾Š“Š·Šø", - "title": "ŠžŃŠ¾Š±ŠµŠ½Š½Š¾ŃŃ‚Šø" + "title": "ŠžŃŠ¾Š±ŠµŠ½Š½Š¾ŃŃ‚Šø", + "slash_commands_description": "Если ŃŃ‚Š° Š¾ŠæŃ†ŠøŃ Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°, команГы Ń€ŠµŠ“Š°ŠŗŃ‚ŠøŃ€Š¾Š²Š°Š½ŠøŃ, такие как вставка переносов строк или заголовков, можно ŠæŠµŃ€ŠµŠŗŠ»ŃŽŃ‡Š°Ń‚ŃŒ, Š²Š²Š¾Š“Ń `/`.", + "slash_commands_enabled": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ ŃŠ»ŃŃˆ-команГы", + "note_completion_description": "Если ŃŃ‚Š° Š¾ŠæŃ†ŠøŃ Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°, ссылки на заметки можно ŃŠ¾Š·Š“Š°Š²Š°Ń‚ŃŒ, Š²Š²Š¾Š“Ń `@`, а затем название заметки.", + "emoji_completion_description": "Если ŃŃ‚Š° Ń„ŃƒŠ½ŠŗŃ†ŠøŃ Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°, ŃŠ¼Š¾Š“Š·Šø можно легко Š²ŃŃ‚Š°Š²Š»ŃŃ‚ŃŒ в текст, набрав `:`, а затем название ŃŠ¼Š¾Š“Š·Šø." }, "cpu_arch_warning": { "dont_show_again": "Š‘Š¾Š»ŃŒŃˆŠµ не ŠæŠ¾ŠŗŠ°Š·Ń‹Š²Š°Ń‚ŃŒ ŃŃ‚Š¾ ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ", @@ -653,10 +669,10 @@ "electron_integration": { "zoom-factor": "ŠšŠ¾ŃŃ„Ń„ŠøŃ†ŠøŠµŠ½Ń‚ Š¼Š°ŃŃˆŃ‚Š°Š±ŠøŃ€Š¾Š²Š°Š½ŠøŃ", "restart-app-button": "ŠŸŃ€ŠøŠ¼ŠµŠ½ŠøŃ‚ŃŒ ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ Šø ŠæŠµŃ€ŠµŠ·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ приложение", - "background-effects-description": "Эффект Mica Š“Š¾Š±Š°Š²Š»ŃŠµŃ‚ размытый, ŃŃ‚ŠøŠ»ŃŒŠ½Ń‹Š¹ фон окнам приложений, ŃŠ¾Š·Š“Š°Š²Š°Ń глубину Šø современный виГ.", + "background-effects-description": "Эффект Mica Š“Š¾Š±Š°Š²Š»ŃŠµŃ‚ размытый, ŃŃ‚ŠøŠ»ŃŒŠ½Ń‹Š¹ фон окнам приложений, ŃŠ¾Š·Š“Š°Š²Š°Ń глубину Šø современный виГ. ŠžŠæŃ†ŠøŃ \"Š”ŠøŃŃ‚ŠµŠ¼Š½Š°Ń строка заголовка\" Голжна Š±Ń‹Ń‚ŃŒ Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°.", "background-effects": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ фоновые ŃŃ„Ń„ŠµŠŗŃ‚Ń‹ (Ń‚Š¾Š»ŃŒŠŗŠ¾ Windows 11)", - "native-title-bar-description": "Š’ Windows Šø macOS Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠµ нативной строки заголовка Гелает приложение более компактным. Š’ Linux Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠµ нативной строки заголовка ŃƒŠ»ŃƒŃ‡ŃˆŠ°ŠµŃ‚ ŠøŠ½Ń‚ŠµŠ³Ń€Š°Ń†ŠøŃŽ с Š¾ŃŃ‚Š°Š»ŃŒŠ½Š¾Š¹ Ń‡Š°ŃŃ‚ŃŒŃŽ системы.", - "native-title-bar": "ŠŠ°Ń‚ŠøŠ²Š½Š°Ń панель заголовка", + "native-title-bar-description": "Š’ Windows Šø macOS Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠµ системной строки заголовка Гелает приложение более компактным. Š’ Linux Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠµ системной строки заголовка ŃƒŠ»ŃƒŃ‡ŃˆŠ°ŠµŃ‚ ŠøŠ½Ń‚ŠµŠ³Ń€Š°Ń†ŠøŃŽ с Š¾ŃŃ‚Š°Š»ŃŒŠ½Š¾Š¹ Ń‡Š°ŃŃ‚ŃŒŃŽ системы.", + "native-title-bar": "Š”ŠøŃŃ‚ŠµŠ¼Š½Š°Ń панель заголовка", "desktop-application": "Десктопное приложение" }, "link_context_menu": { @@ -700,7 +716,7 @@ }, "code_block": { "copy_title": "ŠšŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ в Š±ŃƒŃ„ер обмена", - "theme_group_dark": "Темныце темы", + "theme_group_dark": "Темные темы", "theme_group_light": "Дветлые темы", "theme_none": "ŠŠµŃ‚ поГсветки синтаксиса", "word_wrapping": "ŠŸŠµŃ€ŠµŠ½Š¾Ń слов" @@ -742,7 +758,8 @@ "save-changes": "Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Šø ŠæŃ€ŠøŠ¼ŠµŠ½ŠøŃ‚ŃŒ ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ", "saved-search-note-refreshed": "Š”Š¾Ń…Ń€Š°Š½ŠµŠ½Š½Š°Ń ŠæŠ¾ŠøŃŠŗŠ¾Š²Š°Ń заметка обновлена.", "refresh-saved-search-results": "ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ сохраненные Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚Ń‹ поиска", - "automatically-collapse-notes-title": "Заметки Š±ŃƒŠ“ŃƒŃ‚ ŃŠ²ŠµŃ€Š½ŃƒŃ‚Ń‹ после опреГеленного периоГа Š±ŠµŠ·Š“ŠµŠ¹ŃŃ‚Š²ŠøŃ, чтобы навести ŠæŠ¾Ń€ŃŠ“Š¾Šŗ в Гереве." + "automatically-collapse-notes-title": "Заметки Š±ŃƒŠ“ŃƒŃ‚ ŃŠ²ŠµŃ€Š½ŃƒŃ‚Ń‹ после опреГеленного периоГа Š±ŠµŠ·Š“ŠµŠ¹ŃŃ‚Š²ŠøŃ, чтобы навести ŠæŠ¾Ń€ŃŠ“Š¾Šŗ в Гереве.", + "toggle-sidebar": "ŠŸŠµŃ€ŠµŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ Š±Š¾ŠŗŠ¾Š²ŃƒŃŽ панель" }, "quick-search": { "no-results": "Š ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚Ń‹ не найГены", @@ -770,7 +787,7 @@ "beta-feature": "Бета", "widget": "ВиГжет", "image": "Š˜Š·Š¾Š±Ń€Š°Š¶ŠµŠ½ŠøŠµ", - "file": "ФайГ", + "file": "Файл", "canvas": "Єолст", "mermaid-diagram": "Диаграмма Mermaid", "book": "ŠšŠ¾Š»Š»ŠµŠŗŃ†ŠøŃ", @@ -796,9 +813,9 @@ "cut": "Š’Ń‹Ń€ŠµŠ·Š°Ń‚ŃŒ", "duplicate": "Š”Š¾Š·Š“Š°Ń‚ŃŒ Š“ŃƒŠ±Š»ŠøŠŗŠ°Ń‚", "export": "Экспорт", - "open-in-a-new-tab": "ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ в новой вклаГке Ctrl+Click", + "open-in-a-new-tab": "ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ в новой вклаГке", "open-in-a-new-split": "ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ в новой панели", - "unhoist-note": "ŠžŃ‚Ń€ŠµŠæŠøŃ‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ", + "unhoist-note": "ŠžŃ‚ŠŗŃ€ŠµŠæŠøŃ‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ", "hoist-note": "Š—Š°ŠŗŃ€ŠµŠæŠøŃ‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ", "protect-subtree": "Š—Š°Ń‰ŠøŃ‚ŠøŃ‚ŃŒ поГГерево", "unprotect-subtree": "Š”Š½ŃŃ‚ŃŒ Š·Š°Ń‰ŠøŃ‚Ńƒ с поГГерева", @@ -811,7 +828,7 @@ "expand-subtree": "Š Š°Š·Š²ŠµŃ€Š½ŃƒŃ‚ŃŒ поГГерево", "collapse-subtree": "Š”Š²ŠµŃ€Š½ŃƒŃ‚ŃŒ поГГерево", "sort-by": "Š”Š¾Ń€Ń‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ по...", - "insert-note-after": "Š’ŃŃ‚Š°Š²ŠøŃ‚ŃŒ Š·Š°Š¼Ń‚ŠŗŃƒ после", + "insert-note-after": "Š’ŃŃ‚Š°Š²ŠøŃ‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ после", "insert-child-note": "Š’ŃŃ‚Š°Š²ŠøŃ‚ŃŒ Š“Š¾Ń‡ŠµŃ€Š½ŃŽŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ", "search-in-subtree": "Поиск в поГГереве", "edit-branch-prefix": "Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ префикс ветки", @@ -820,7 +837,9 @@ "recent-changes-in-subtree": "ПослеГние ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ в поГГереве", "copy-note-path-to-clipboard": "ŠšŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ ŠæŃƒŃ‚ŃŒ Šŗ заметке в Š±ŃƒŃ„ер обмена", "convert-to-attachment-confirm": "Š’Ń‹ ŃƒŠ²ŠµŃ€ŠµŠ½Ń‹, что хотите ŠæŃ€ŠµŠ¾Š±Ń€Š°Š·Š¾Š²Š°Ń‚ŃŒ выбранные заметки во Š²Š»Š¾Š¶ŠµŠ½ŠøŃ ŠøŃ… Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠøŃ… заметок?", - "converted-to-attachments": "{{count}} заметок были преобразованы во Š²Š»Š¾Š¶ŠµŠ½ŠøŃ." + "converted-to-attachments": "{{count}} заметок были преобразованы во Š²Š»Š¾Š¶ŠµŠ½ŠøŃ.", + "archive": "ŠŃ€Ń…ŠøŠ²ŠøŃ€Š¾Š²Š°Ń‚ŃŒ", + "unarchive": "Š Š°Š·Š°Ń€Ń…ŠøŠ²ŠøŃ€Š¾Š²Š°Ń‚ŃŒ" }, "info": { "closeButton": "Š—Š°ŠŗŃ€Ń‹Ń‚ŃŒ", @@ -849,7 +868,7 @@ "to": "в", "move_note": "ŠŸŠµŃ€ŠµŠ¼ŠµŃŃ‚ŠøŃ‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ", "target_parent_note": "Ń†ŠµŠ»ŠµŠ²Š°Ń версии заметки", - "on_all_matched_notes": "ŠŠ° всех ŃŠ¾Š²ŠæŠ°Š“Š°ŃŽŃ‰ŠøŃ… нотах", + "on_all_matched_notes": "ŠŠ° всех ŃŠ¾Š²ŠæŠ°Š“Š°ŃŽŃ‰ŠøŃ… заметках", "move_note_new_parent": "ŠæŠµŃ€ŠµŠ¼ŠµŃŃ‚ŠøŃ‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ в новый Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠøŠ¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚, если у заметки ŠµŃŃ‚ŃŒ Ń‚Š¾Š»ŃŒŠŗŠ¾ оГин Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠøŠ¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ (т. е. ŃŃ‚Š°Ń€Š°Ń Š²ŠµŃ‚Š²ŃŒ ŃƒŠ“Š°Š»ŃŠµŃ‚ŃŃ Šø ŃŠ¾Š·Š“Š°ŠµŃ‚ŃŃ Š½Š¾Š²Š°Ń Š²ŠµŃ‚Š²ŃŒ в новом Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠ¾Š¼ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Šµ)", "clone_note_new_parent": "ŠŗŠ»Š¾Š½ŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ в новый Ń€Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŃŠŗŠøŠ¹ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚, если у заметки ŠµŃŃ‚ŃŒ несколько клонов/ветвей (Š½ŠµŃŃŠ½Š¾, ŠŗŠ°ŠŗŃƒŃŽ Š²ŠµŃ‚Š²ŃŒ ŃŠ»ŠµŠ“ŃƒŠµŃ‚ ŃƒŠ“Š°Š»ŠøŃ‚ŃŒ)", "nothing_will_happen": "ничего не произойГет, если эту Š·Š°Š¼ŠµŃ‚ŠŗŃƒ невозможно ŠæŠµŃ€ŠµŠ¼ŠµŃŃ‚ŠøŃ‚ŃŒ в Ń†ŠµŠ»ŠµŠ²ŃƒŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ (т.е. ŃŃ‚Š¾ созГаст цикл Герева)" @@ -887,7 +906,7 @@ "delete_attachment": "Š£Š“Š°Š»ŠøŃ‚ŃŒ вложение", "upload_new_revision": "Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ Š½Š¾Š²ŃƒŃŽ Š²ŠµŃ€ŃŠøŃŽ", "open_custom": "ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ как...", - "open_custom_client_only": "Иной способ открытие вложений возможен Ń‚Š¾Š»ŃŒŠŗŠ¾ ŠøŠ· Гесктопного ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ.", + "open_custom_client_only": "ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŠøŠµ вложений Š“Ń€ŃƒŠ³ŠøŠ¼ способом возможно Ń‚Š¾Š»ŃŒŠŗŠ¾ в Гесктопном приложении.", "open_externally_detail_page": "ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŠøŠµ Š²Š»Š¾Š¶ŠµŠ½ŠøŃ извне Š“Š¾ŃŃ‚ŃƒŠæŠ½Š¾ Ń‚Š¾Š»ŃŒŠŗŠ¾ ŠøŠ· Š“ŠµŃ‚Š°Š»ŃŒŠ½Š¾Š¹ страницы. Š”Š»Ń ŃŃ‚Š¾Š³Š¾ сначала нажмите на ŃŠ²ŠµŠ“ŠµŠ½ŠøŃ о вложении Šø повторите Гействие.", "open_custom_title": "Файл Š±ŃƒŠ“ет открыт во внешнем приложении Šø Š¾Ń‚ŃŠ»ŠµŠ¶ŠøŠ²Š°Ń‚ŃŒŃŃ на наличие изменений. После ŃŃ‚Š¾Š³Š¾ вы сможете Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŠøŠ·Š¼ŠµŠ½Ń‘Š½Š½ŃƒŃŽ Š²ŠµŃ€ŃŠøŃŽ обратно в Trilium.", "open_externally_title": "Файл Š±ŃƒŠ“ет открыт во внешнем приложении Šø Š¾Ń‚ŃŠ»ŠµŠ¶ŠøŠ²Š°Ń‚ŃŒŃŃ на наличие изменений. После ŃŃ‚Š¾Š³Š¾ вы сможете Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŠøŠ·Š¼ŠµŠ½Ń‘Š½Š½ŃƒŃŽ Š²ŠµŃ€ŃŠøŃŽ обратно в Trilium.", @@ -910,7 +929,7 @@ "sat": "Дбт", "sun": "Вс", "january": "ŠÆŠ½Š²Š°Ń€ŃŒ", - "febuary": "Š¤ŠµŠ²Ń€Š°Š»ŃŒ", + "february": "Š¤ŠµŠ²Ń€Š°Š»ŃŒ", "march": "ŠœŠ°Ń€Ń‚", "april": "ŠŠæŃ€ŠµŠ»ŃŒ", "may": "Май", @@ -922,7 +941,18 @@ "november": "ŠŠ¾ŃŠ±Ń€ŃŒ", "december": "Š”ŠµŠŗŠ°Š±Ń€ŃŒ", "cannot_find_week_note": "ŠŠµ уГалось найти Š·Š°Š¼ŠµŃ‚ŠŗŃƒ неГели", - "cannot_find_day_note": "ŠŠµ уГалось найти Š·Š°Š¼ŠµŃ‚ŠŗŃƒ Š“Š½Ń" + "cannot_find_day_note": "ŠŠµ уГалось найти Š·Š°Š¼ŠµŃ‚ŠŗŃƒ Š“Š½Ń", + "week": "ŠŠµŠ“ŠµŠ»Ń", + "week_previous": "ŠŸŃ€Š¾ŃˆŠ»Š°Ń Š½ŠµŠ“ŠµŠ»Ń", + "week_next": "Š”Š»ŠµŠ“ŃƒŃŽŃ‰Š°Ń Š½ŠµŠ“ŠµŠ»Ń", + "month": "ŠœŠµŃŃŃ†", + "month_previous": "ŠŸŃ€ŠµŠ“Ń‹Š“ŃƒŃ‰ŠøŠ¹ Š¼ŠµŃŃŃ†", + "month_next": "Š”Š»ŠµŠ“ŃƒŃŽŃ‰ŠøŠ¹ Š¼ŠµŃŃŃ†", + "year": "ГоГ", + "year_previous": "ŠŸŃ€ŠµŠ“Ń‹Š“ŃƒŃ‰ŠøŠ¹ гоГ", + "year_next": "Š”Š»ŠµŠ“ŃƒŃŽŃ‰ŠøŠ¹ гоГ", + "list": "Дписок", + "today": "Š”ŠµŠ³Š¾Š“Š½Ń" }, "global_menu": { "menu": "ŠœŠµŠ½ŃŽ", @@ -983,7 +1013,8 @@ "geo-map": "ŠšŠ°Ń€Ń‚Š°", "invalid_view_type": "ŠŠµŠ“Š¾ŠæŃƒŃŃ‚ŠøŠ¼Ń‹Š¹ тип ŠæŃ€ŠµŠ“ŃŃ‚Š°Š²Š»ŠµŠ½ŠøŃ '{{type}}'", "expand_all_children": "Š Š°Š·Š²ŠµŃ€Š½ŃƒŃ‚ŃŒ все Гочерние ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹", - "collapse_all_notes": "Š”Š²ŠµŃ€Š½ŃƒŃ‚ŃŒ все заметки" + "collapse_all_notes": "Š”Š²ŠµŃ€Š½ŃƒŃ‚ŃŒ все заметки", + "include_archived_notes": "ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ заархивированные заметки" }, "edited_notes": { "deleted": "(уГалено)", @@ -993,8 +1024,8 @@ "file_properties": { "download": "Š”ŠŗŠ°Ń‡Š°Ń‚ŃŒ", "open": "ŠžŃ‚ŠŗŃ€Ń‹Ń‚ŃŒ", - "title": "ФайГ", - "upload_success": "Š—Š°Š³Ń€ŃƒŠ·ŠŗŠ° новой версии файла не уГалась.", + "title": "Файл", + "upload_success": "ŠŠ¾Š²Š°Ń Š²ŠµŃ€ŃŠøŃ файла успешно Š·Š°Š³Ń€ŃƒŠ¶ŠµŠ½Š°.", "upload_new_revision": "Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ Š½Š¾Š²ŃƒŃŽ Š²ŠµŃ€ŃŠøŃŽ", "file_size": "Размер файла", "file_type": "Тип файла", @@ -1126,7 +1157,7 @@ "label_abc": "возвращает заметки с меткой abc", "label_year": "ищет заметки с меткой year, ŠøŠ¼ŠµŃŽŃ‰ŠµŠ¹ значение 2019", "label_rock_pop": "ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŠµŃ‚ заметкам с метками как rock, так Šø pop", - "label_rock_or_pop": "Голжна ŠæŃ€ŠøŃŃƒŃ‚ŃŃ‚Š²Š¾Š²Š°Ń‚ŃŒ Ń‚Š¾Š»ŃŒŠŗŠ¾ оГна ŠøŠ· vtnjr", + "label_rock_or_pop": "Голжна ŠæŃ€ŠøŃŃƒŃ‚ŃŃ‚Š²Š¾Š²Š°Ń‚ŃŒ Ń‚Š¾Š»ŃŒŠŗŠ¾ оГна ŠøŠ· меток", "label_year_comparison": "числовое сравнение (также >, >=, <).", "label_date_created": "заметки, созГанные за послеГний Š¼ŠµŃŃŃ†", "error": "ŠžŃˆŠøŠ±ŠŗŠ° поиска: {{error}}", @@ -1180,7 +1211,7 @@ "native_title_bar": { "enabled": "Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½Š¾", "disabled": "Š²Ń‹ŠŗŠ»ŃŽŃ‡ŠµŠ½Š¾", - "title": "ŠŠ°Ń‚ŠøŠ²Š½Š°Ń панель заголовка (Ń‚Ń€ŠµŠ±ŃƒŠµŃ‚ ŠæŠµŃ€ŠµŠ·Š°ŠæŃƒŃŠŗŠ° ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ)" + "title": "Š”ŠøŃŃ‚ŠµŠ¼Š½Š°Ń панель заголовка (Ń‚Ń€ŠµŠ±ŃƒŠµŃ‚ ŠæŠµŃ€ŠµŠ·Š°ŠæŃƒŃŠŗŠ° ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ)" }, "ai_llm": { "progress": "ŠŸŃ€Š¾Š³Ń€ŠµŃŃ", @@ -1386,7 +1417,7 @@ "first-week-contains-first-day": "ŠŸŠµŃ€Š²Š°Ń Š½ŠµŠ“ŠµŠ»Ń соГержит первый Гень гоГа", "first-week-contains-first-thursday": "ŠŸŠµŃ€Š²Š°Ń Š½ŠµŠ“ŠµŠ»Ń соГержит первый четверг гоГа", "first-week-has-minimum-days": "ŠŸŠµŃ€Š²Š°Ń Š½ŠµŠ“ŠµŠ»Ń имеет минимальное количество Гней", - "min-days-in-first-week": "Минимальное количество Гней в ŠæŠµŃ€Š²ŃƒŃŽ Š½ŠµŠ“ŠµŠ»ŃŽ", + "min-days-in-first-week": "Минимальное количество Гней в первой неГеле", "first-week-info": "ŠŸŠµŃ€Š²Š°Ń Š½ŠµŠ“ŠµŠ»Ń соГержит первый четверг гоГа в соответствии со станГартом ISO 8601.", "first-week-warning": "Изменение параметров первой неГели может привести Šŗ Š“ŃƒŠ±Š»ŠøŃ€Š¾Š²Š°Š½ŠøŃŽ ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŃŽŃ‰ŠøŃ… Š½ŠµŠ“ŠµŠ»ŃŒŠ½Ń‹Ń… заметок, Šø ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŃŽŃ‰ŠøŠµ Š½ŠµŠ“ŠµŠ»ŃŒŠ½Ń‹Šµ заметки не Š±ŃƒŠ“ŃƒŃ‚ обновлены ŃŠ¾Š¾Ń‚Š²ŠµŃ‚ŃŃ‚Š²ŃƒŃŽŃ‰ŠøŠ¼ образом.", "formatting-locale": "Формат Гаты Šø числа" @@ -1448,7 +1479,7 @@ "totp_secret_generated": "ДозГан секрет TOTP", "recovery_keys_generate": "Š“ŠµŠ½ŠµŃ€Š°Ń†ŠøŃ коГов Š²Š¾ŃŃŃ‚Š°Š½Š¾Š²Š»ŠµŠ½ŠøŃ", "recovery_keys_regenerate": "Š ŠµŠ³ŠµŠ½ŠµŃ€Š°Ń†ŠøŃ коГов Š²Š¾ŃŃŃ‚Š°Š½Š¾Š²Š»ŠµŠ½ŠøŃ", - "oauth_missing_vars": "ŠžŃ‚ŃŃƒŃ‚ŃŃ‚Š²ŃƒŃŽŃ‚ настройки: {{variables}}", + "oauth_missing_vars": "ŠžŃ‚ŃŃƒŃ‚ŃŃ‚Š²ŃƒŃŽŃ‚ настройки: {{-variables}}", "oauth_user_not_logged_in": "ŠŠµ выполнен вхоГ!", "totp_title": "ŠžŠ“Š½Š¾Ń€Š°Š·Š¾Š²Ń‹Š¹ ŠæŠ°Ń€Š¾Š»ŃŒ с ограничением по времени (TOTP)", "recovery_keys_title": "ŠšŠ»ŃŽŃ‡Šø Š²Š¾ŃŃŃ‚Š°Š½Š¾Š²Š»ŠµŠ½ŠøŃ еГиного вхоГа", @@ -1692,7 +1723,7 @@ "database_vacuumed": "База Ганных была сжата" }, "vim_key_bindings": { - "use_vim_keybindings_in_code_notes": "РасклаГка клавиш VIM", + "use_vim_keybindings_in_code_notes": "Š”Š¾Ń‡ŠµŃ‚Š°Š½ŠøŃ клавиш Vim", "enable_vim_keybindings": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ ŃŠ¾Ń‡ŠµŃ‚Š°Š½ŠøŃ клавиш Vim в заметках коГа (без режима ex)" }, "network_connections": { @@ -1775,7 +1806,7 @@ "button_title": "Š­ŠŗŃŠæŠ¾Ń€Ń‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š“ŠøŠ°Š³Ń€Š°Š¼Š¼Ńƒ как SVG" }, "copy_image_reference_button": { - "button_title": "Š”ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ ŃŃŃ‹Š»ŠŗŃƒ на изображение в Š±ŃƒŃ„ер обмена, можент Š±Ń‹Ń‚ŃŒ вставлена в Ń‚ŠµŠŗŃŃ‚Š¾Š²ŃƒŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ." + "button_title": "Š”ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ ŃŃŃ‹Š»ŠŗŃƒ на изображение в Š±ŃƒŃ„ер обмена, может Š±Ń‹Ń‚ŃŒ вставлена в Ń‚ŠµŠŗŃŃ‚Š¾Š²ŃƒŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ." }, "note_launcher": { "this_launcher_doesnt_define_target_note": "Этот Š»Š°ŃƒŠ½Ń‡ŠµŃ€ не Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŃŠµŃ‚ Ń†ŠµŠ»ŠµŠ²ŃƒŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ." @@ -1946,7 +1977,9 @@ "ws": { "sync-check-failed": "ŠŸŃ€Š¾Š²ŠµŃ€ŠŗŠ° синхронизации не уГалась!", "encountered-error": "ŠžŠ±Š½Š°Ń€ŃƒŠ¶ŠµŠ½Š° ошибка \"{{message}}\", ŠæŃ€Š¾Š²ŠµŃ€ŃŒŃ‚Šµ консоль.", - "consistency-checks-failed": "ŠŸŃ€Š¾Š²ŠµŃ€ŠŗŠ° целостности не пройГена! ŠŸŠ¾Š“Ń€Š¾Š±Š½Š¾ŃŃ‚Šø смотрите в логах." + "consistency-checks-failed": "ŠŸŃ€Š¾Š²ŠµŃ€ŠŗŠ° целостности не пройГена! ŠŸŠ¾Š“Ń€Š¾Š±Š½Š¾ŃŃ‚Šø смотрите в логах.", + "lost-websocket-connection-title": "ŠŸŠ¾Ń‚ŠµŃ€ŃŠ½Š¾ соеГинение с сервером", + "lost-websocket-connection-message": "ŠŸŃ€Š¾Š²ŠµŃ€ŃŒŃ‚Šµ ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŃŽ обратного прокси (например, nginx или Apache), чтобы ŃƒŠ±ŠµŠ“ŠøŃ‚ŃŒŃŃ, что ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ WebSocket Голжным образом Ń€Š°Š·Ń€ŠµŃˆŠµŠ½Ń‹ Šø не заблокированы." }, "attachment_detail_2": { "role_and_size": "Роль: {{role}}, Размер: {{size}}", @@ -1974,8 +2007,8 @@ }, "shared_info": { "help_link": "Š”Š»Ń ŠæŠ¾Š»ŃƒŃ‡ŠµŠ½ŠøŃ справки посетите вики.", - "shared_locally": "Заметка Š¾Š±Ń‰ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½Š° локально в", - "shared_publicly": "Заметка Š¾Š±Ń‰ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½Š° ŠæŃƒŠ±Š»ŠøŃ‡Š½Š¾ в" + "shared_locally": "Заметка Š¾Š±Ń‰ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½Š° локально в {{- link}}.", + "shared_publicly": "Заметка Š¾Š±Ń‰ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½Š° ŠæŃƒŠ±Š»ŠøŃ‡Š½Š¾ в {{- link}}." }, "note_create": { "duplicated": "ДозГан Губль заметки \"{{title}}\"." @@ -2018,12 +2051,23 @@ "could_not_find_typewidget": "ŠŠµ уГалось найти typeWidget Š“Š»Ń типа '{{type}}'" }, "book": { - "no_children_help": "Š’ ŃŃ‚Š¾Š¹ коллекции нет Гочерних заметок, ŠæŠ¾ŃŃ‚Š¾Š¼Ńƒ Š¾Ń‚Š¾Š±Ń€Š°Š¶Š°Ń‚ŃŒ нечего. ŠŸŠ¾Š“Ń€Š¾Š±Š½Š¾ŃŃ‚Šø см. на wiki." + "no_children_help": "Š’ ŃŃ‚Š¾Š¹ коллекции нет Гочерних заметок, ŠæŠ¾ŃŃ‚Š¾Š¼Ńƒ Š¾Ń‚Š¾Š±Ń€Š°Š¶Š°Ń‚ŃŒ нечего. ŠŸŠ¾Š“Ń€Š¾Š±Š½Š¾ŃŃ‚Šø см. в wiki.", + "drag_locked_title": "Защищено от ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ", + "drag_locked_message": "ŠŸŠµŃ€ŠµŃ‚Š°ŃŠŗŠøŠ²Š°Š½ŠøŠµ не Š“Š¾ŠæŃƒŃŠŗŠ°ŠµŃ‚ŃŃ, так как ŠŗŠ¾Š»Š»ŠµŠŗŃ†ŠøŃ защищена от Ń€ŠµŠ“Š°ŠŗŃ‚ŠøŃ€Š¾Š²Š°Š½ŠøŃ." }, "ui-performance": { "title": "ŠŸŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ", "enable-motion": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ Š²ŠøŠ·ŃƒŠ°Š»ŃŒŠ½Ń‹Šµ ŃŃ„Ń„ŠµŠŗŃ‚Ń‹ Šø анимации", "enable-shadows": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ тени", - "enable-backdrop-effects": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ ŃŃ„Ń„ŠµŠŗŃ‚Ń‹ Ń€Š°Š·Š¼Ń‹Ń‚ŠøŃ фона Š¼ŠµŠ½ŃŽ, Š²ŃŠæŠ»Ń‹Š²Š°ŃŽŃ‰ŠøŃ… окон Šø панелей" + "enable-backdrop-effects": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ ŃŃ„Ń„ŠµŠŗŃ‚Ń‹ Ń€Š°Š·Š¼Ń‹Ń‚ŠøŃ фона Š¼ŠµŠ½ŃŽ, Š²ŃŠæŠ»Ń‹Š²Š°ŃŽŃ‰ŠøŃ… окон Šø панелей", + "enable-smooth-scroll": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ ŠæŠ»Š°Š²Š½ŃƒŃŽ ŠæŃ€Š¾ŠŗŃ€ŃƒŃ‚ŠŗŃƒ", + "app-restart-required": "(Š“Š»Ń Š²ŃŃ‚ŃƒŠæŠ»ŠµŠ½ŠøŃ изменений в силу Ń‚Ń€ŠµŠ±ŃƒŠµŃ‚ŃŃ ŠæŠµŃ€ŠµŠ·Š°ŠæŃƒŃŠŗ ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ)" + }, + "collections": { + "rendering_error": "ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ Š¾Ń‚Š¾Š±Ń€Š°Š·ŠøŃ‚ŃŒ соГержимое ŠøŠ·-за ошибки." + }, + "pagination": { + "total_notes": "{{count}} заметок", + "page_title": "Дтраница {{startIndex}} - {{endIndex}}" } } diff --git a/apps/client/src/translations/sv/translation.json b/apps/client/src/translations/sv/translation.json new file mode 100644 index 000000000..c5ec9a096 --- /dev/null +++ b/apps/client/src/translations/sv/translation.json @@ -0,0 +1,8 @@ +{ + "about": { + "title": "Om Trilium Notes", + "homepage": "Hemsida:", + "app_version": "App version:", + "db_version": "DB version:" + } +} diff --git a/apps/client/src/translations/tr/translation.json b/apps/client/src/translations/tr/translation.json index 5aff8ed84..d03e85496 100644 --- a/apps/client/src/translations/tr/translation.json +++ b/apps/client/src/translations/tr/translation.json @@ -1,26 +1,96 @@ { - "about": { - "homepage": "Giriş sayfası:", - "app_version": "Uygulama versiyonu:", - "db_version": "Veritabanı versiyonu:" + "about": { + "homepage": "Anasayfa:", + "app_version": "Uygulama versiyonu:", + "db_version": "Veritabanı versiyonu:", + "title": "Trilium Notes Hakkında", + "sync_version": "Eşleştirme versiyonu:", + "data_directory": "Veri dizini:" + }, + "branch_prefix": { + "save": "Kaydet", + "edit_branch_prefix": "Dalın ƶnekini düzenle", + "prefix": "Ɩnek: ", + "branch_prefix_saved": "Dal ƶneki kaydedildi." + }, + "delete_notes": { + "close": "Kapat", + "delete_notes_preview": "Not ƶnizlemesini sil", + "delete_all_clones_description": "Tüm klonları da sil (son değişikliklerden geri alınabilir)" + }, + "export": { + "close": "Kapat" + }, + "import": { + "chooseImportFile": "İƧe aktarım dosyası", + "importDescription": "SeƧilen dosya(lar) alt not olarak iƧe aktarılacaktır" + }, + "info": { + "closeButton": "Kapat" + }, + "protected_session_password": { + "close_label": "Kapat" + }, + "toast": { + "critical-error": { + "title": "Kritik hata", + "message": "İstemci uygulamasının başlatılmasını engelleyen kritik bir hata meydana geldi\n\n{{message}}\n\nBu muhtemelen bir betiğin beklenmedik şekilde başarısız olmasından kaynaklanıyor. Uygulamayı güvenli modda başlatarak sorunu ele almayı deneyin." }, - "branch_prefix": { - "save": "Kaydet" + "widget-error": { + "title": "Bir widget başlatılamadı", + "message-unknown": "Bilinmeyen widget aşağıdaki sebeple başlatılamadı\n\n{{message}}" }, - "delete_notes": { - "close": "Kapat" - }, - "export": { - "close": "Kapat" - }, - "import": { - "chooseImportFile": "İƧe aktarım dosyası", - "importDescription": "SeƧilen dosya(lar) alt not olarak iƧe aktarılacaktır" - }, - "info": { - "closeButton": "Kapat" - }, - "protected_session_password": { - "close_label": "Kapat" + "bundle-error": { + "title": "Ɩzel bir betik yüklenemedi" } + }, + "add_link": { + "add_link": "Bağlantı ekle", + "help_on_links": "Bağlantılar konusunda yardım", + "note": "Not", + "search_note": "isimle not ara", + "link_title_mirrors": "bağlantı adı notun şu anki adıyla aynı", + "link_title_arbitrary": "bağlantı adı isteğe bağlı olarak değiştirilebilir", + "link_title": "Bağlantı adı", + "button_add_link": "Bağlantı ekle" + }, + "bulk_actions": { + "bulk_actions": "Toplu eylemler", + "affected_notes": "Etkilenen notlar", + "include_descendants": "SeƧili notların alt notlarını da ekle", + "available_actions": "Mevcut eylemler", + "chosen_actions": "SeƧili eylemler", + "execute_bulk_actions": "Toplu eylemleri uygula", + "bulk_actions_executed": "Toplu eylemler başarıyla uygulandı.", + "none_yet": "Henüz yok... yukarıda mevcut eylemler arasından birine tıklayarak eylem ekle.", + "labels": "Etiketler", + "relations": "İlişkiler", + "notes": "Notlar", + "other": "Diğer" + }, + "clone_to": { + "clone_notes_to": "Notları klonla...", + "help_on_links": "Bağlantılar konusunda yardım", + "notes_to_clone": "Klonlanacak notlar", + "target_parent_note": "Hedef üst not", + "search_for_note_by_its_name": "isme gƶre not ara", + "cloned_note_prefix_title": "Klonlanan not, not ağacında belirtilen ƶnek ile gƶsterilecektir", + "prefix_optional": "ƶnek (opsiyonel)", + "clone_to_selected_note": "SeƧili nota klonla", + "no_path_to_clone_to": "Klonlanacak bir yol yok.", + "note_cloned": "\"{{clonedTitle}}\" notu \"{{targetTitle}}\"'a klonlandı" + }, + "confirm": { + "confirmation": "Onay", + "cancel": "İptal", + "ok": "OK", + "are_you_sure_remove_note": "\"{{title}}\" notunu ilişki haritasından kaldırmak istediğinize emin misiniz?. ", + "also_delete_note": "Notu da sil" + }, + "ai_llm": { + "n_notes_queued": "{{ count }} not dizinleme iƧin sıraya alındı", + "n_notes_queued_plural": "{{ count }} not dizinleme iƧin sıraya alındı", + "notes_indexed": "{{ count }} not dizinlendi", + "notes_indexed_plural": "{{ count }} not dizinlendi" + } } diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 4b11d9e6a..ea0e021e5 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -184,7 +184,8 @@ }, "import-status": "åŒÆå…„ē‹€ę…‹", "in-progress": "ę­£åœØåŒÆå…„ļ¼š{{progress}}", - "successful": "åŒÆå…„ęˆåŠŸć€‚" + "successful": "åŒÆå…„ęˆåŠŸć€‚", + "importZipRecommendation": "åŒÆå…„ ZIP ęŖ”ę”ˆę™‚ļ¼Œē­†čØ˜å±¤ē“šå°‡åę˜ å£“ēø®ęŖ”å…§ēš„å­ē›®éŒ„ēµę§‹ć€‚" }, "include_note": { "dialog_title": "å…§åµŒē­†čØ˜", @@ -276,7 +277,12 @@ "preview": "預覽:", "preview_not_available": "ē„”ę³•é č¦½ę­¤é”žåž‹ēš„ē­†čØ˜ć€‚", "restore_button": "還原", - "delete_button": "åˆŖé™¤" + "delete_button": "åˆŖé™¤", + "diff_on": "锯示差異", + "diff_off": "锯示內容", + "diff_on_hint": "é»žę“Šä»„é”Æē¤ŗē­†čØ˜åŽŸå§‹ē¢¼å·®ē•°", + "diff_off_hint": "é»žę“Šä»„é”Æē¤ŗē­†čØ˜å…§å®¹", + "diff_not_available": "å·®ē•°äøåÆē”Øć€‚" }, "sort_child_notes": { "sort_children_by": "ä¾ā€¦ęŽ’åŗå­ē­†čØ˜", @@ -576,7 +582,7 @@ "sun": "ę—„", "cannot_find_day_note": "ē„”ę³•ę‰¾åˆ°ę—„čØ˜", "january": "äø€ęœˆ", - "febuary": "二月", + "february": "二月", "march": "äø‰ęœˆ", "april": "å››ęœˆ", "may": "äŗ”ęœˆ", @@ -587,7 +593,18 @@ "october": "åęœˆ", "november": "åäø€ęœˆ", "december": "åäŗŒęœˆ", - "cannot_find_week_note": "ē„”ę³•ę‰¾åˆ°é€±čØ˜" + "cannot_find_week_note": "ē„”ę³•ę‰¾åˆ°é€±čØ˜", + "week": "週", + "week_previous": "äøŠé€±", + "week_next": "下週", + "month": "月", + "month_previous": "äøŠå€‹ęœˆ", + "month_next": "äø‹å€‹ęœˆ", + "year": "幓", + "year_previous": "å‰äø€å¹“", + "year_next": "å¾Œäø€å¹“", + "list": "åˆ—č”Ø", + "today": "今天" }, "close_pane_button": { "close_this_pane": "é—œé–‰ę­¤é¢ęæ" @@ -630,7 +647,9 @@ "about": "é—œę–¼ TriliumNext ē­†čØ˜", "logout": "登出", "show-cheatsheet": "é”Æē¤ŗåæ«ę·éµčŖŖę˜Ž", - "toggle-zen-mode": "ē¦ŖęØ”å¼" + "toggle-zen-mode": "ē¦ŖęØ”å¼", + "new-version-available": "ē™¼ē¾ę–°ę›“ę–°", + "download-update": "å–å¾—ē‰ˆęœ¬ {{latestVersion}}" }, "sync_status": { "unknown": "

åŒę­„ē‹€ę…‹å°‡åœØäø‹äø€ę¬”åŒę­„å˜—č©¦é–‹å§‹å¾Œé”Æē¤ŗć€‚

é»žę“Šä»„ē«‹å³č§øē™¼åŒę­„ć€‚

", @@ -717,7 +736,8 @@ "insert_child_note": "ę’å…„å­ē­†čØ˜", "delete_this_note": "åˆŖé™¤ę­¤ē­†čØ˜", "error_cannot_get_branch_id": "ē„”ę³•ē²å– notePath '{{notePath}}' ēš„ branchId", - "error_unrecognized_command": "ē„”ę³•č­˜åˆ„ēš„å‘½ä»¤ {{command}}" + "error_unrecognized_command": "ē„”ę³•č­˜åˆ„ēš„å‘½ä»¤ {{command}}", + "note_revisions": "ē­†čØ˜ę­·å²ē‰ˆęœ¬" }, "note_icon": { "change_note_icon": "ę›“ę”¹ē­†čØ˜åœ–ęØ™", @@ -729,7 +749,8 @@ "note_type": "ē­†čØ˜é”žåž‹", "editable": "åÆē·Øč¼Æ", "basic_properties": "åŸŗęœ¬å±¬ę€§", - "language": "čŖžčØ€" + "language": "čŖžčØ€", + "configure_code_notes": "čØ­å®šēØ‹å¼ē¢¼ē­†čØ˜ā€¦" }, "book_properties": { "view_type": "č¦–åœ–é”žåž‹", @@ -744,7 +765,9 @@ "calendar": "ꗄꛆ", "table": "蔨格", "geo-map": "åœ°ē†åœ°åœ–", - "board": "ēœ‹ęæ" + "board": "ēœ‹ęæ", + "include_archived_notes": "é”Æē¤ŗå·²å°å­˜ē­†čØ˜", + "presentation": "簔報" }, "edited_notes": { "no_edited_notes_found": "ä»Šå¤©é‚„ę²’ęœ‰ē·Øč¼ÆéŽēš„ē­†čØ˜...", @@ -945,7 +968,9 @@ "no_attachments": "ę­¤ē­†čØ˜ę²’ęœ‰é™„ä»¶ć€‚" }, "book": { - "no_children_help": "ę­¤é”žåž‹ē‚ŗę›øē±ēš„ē­†čØ˜ę²’ęœ‰ä»»ä½•å­ē­†čØ˜ļ¼Œå› ę­¤ę²’ęœ‰å…§å®¹åÆé”Æē¤ŗć€‚č«‹åƒé–± wiki ä»„äŗ†č§£č©³ęƒ…ć€‚" + "no_children_help": "ę­¤é”žåž‹ē‚ŗę›øē±ēš„ē­†čØ˜ę²’ęœ‰ä»»ä½•å­ē­†čØ˜ļ¼Œå› ę­¤ę²’ęœ‰å…§å®¹åÆé”Æē¤ŗć€‚č«‹åƒé–± wiki ä»„äŗ†č§£č©³ęƒ…ć€‚", + "drag_locked_title": "éŽ–å®šē·Øč¼Æ", + "drag_locked_message": "ē„”ę³•ę‹–ę›³ļ¼Œå› ē‚ŗę­¤é›†åˆå·²č¢«éŽ–å®šē·Øč¼Æć€‚" }, "editable_code": { "placeholder": "åœØé€™č£”č¼øå…„ę‚Øēš„ēØ‹å¼ē¢¼ē­†čØ˜å…§å®¹ā€¦" @@ -1230,7 +1255,13 @@ "min-days-in-first-week": "ē¬¬äø€é€±ēš„ęœ€å°‘å¤©ę•ø", "first-week-info": "å¹“åŗ¦ē¬¬äø€é€±åŒ…å«ē¬¬äø€å€‹é€±å››ę˜ÆåŸŗę–¼ ISO 8601 標準。", "first-week-warning": "č®Šę›“ē¬¬äø€é€±éøé …åÆčƒ½å°Žč‡“čˆ‡ē¾ęœ‰ēš„ć€Œé€±ē­†čØ˜ć€é‡č¤‡ļ¼Œē¾ęœ‰ēš„ć€Œé€±ē­†čØ˜ć€å°‡äøęœƒē›øę‡‰ę›“ę–°ć€‚", - "formatting-locale": "ę—„ęœŸå’Œę•øå­—ę ¼å¼" + "formatting-locale": "ę—„ęœŸå’Œę•øå­—ę ¼å¼", + "tuesday": "é€±äŗŒ", + "wednesday": "週三", + "thursday": "週四", + "friday": "週五", + "saturday": "週六", + "formatting-locale-auto": "ę ¹ę“šę‡‰ē”ØēØ‹å¼ēš„čŖžčØ€čØ­å®š" }, "backup": { "automatic_backup": "自動備份", @@ -1365,7 +1396,7 @@ "button-tree-map": "ęØ¹ē‹€åœ°åœ–" }, "tree-context-menu": { - "open-in-a-new-tab": "åœØę–°åˆ†é äø­ę‰“é–‹ Ctrl+Click", + "open-in-a-new-tab": "åœØę–°åˆ†é äø­ę‰“é–‹", "open-in-a-new-split": "åœØę–°é é¢åˆ†å‰²äø­ę‰“é–‹", "insert-note-after": "åœØå¾Œé¢ę’å…„ē­†čØ˜", "insert-child-note": "ę’å…„å­ē­†čØ˜", @@ -1395,12 +1426,14 @@ "converted-to-attachments": "{{count}} å€‹ē­†čØ˜å·²č¢«č½‰ę›ē‚ŗé™„ä»¶ć€‚", "convert-to-attachment-confirm": "ē¢ŗå®šč¦å°‡ę‰€éøēš„ē­†čØ˜č½‰ę›ē‚ŗå…¶ēˆ¶ē“šē­†čØ˜ēš„é™„ä»¶å—Žļ¼Ÿ", "duplicate": "č¤‡č£½å‰Æęœ¬", - "open-in-popup": "åæ«é€Ÿē·Øč¼Æ" + "open-in-popup": "åæ«é€Ÿē·Øč¼Æ", + "archive": "封存", + "unarchive": "č§£é™¤å°å­˜" }, "shared_info": { - "shared_publicly": "ę­¤ē­†čØ˜å·²å…¬é–‹åˆ†äŗ«åœØ", - "shared_locally": "ę­¤ē­†čØ˜å·²åœØęœ¬åœ°åˆ†äŗ«åœØ", - "help_link": "å¦‚éœ€å¹«åŠ©ļ¼Œč«‹čØŖå• wiki怂" + "help_link": "å¦‚éœ€å¹«åŠ©ļ¼Œč«‹čØŖå• wiki怂", + "shared_publicly": "ę­¤ē­†čØ˜å·²å…¬é–‹åˆ†äŗ«ę–¼ {{- link}}怂", + "shared_locally": "ę­¤ē­†čØ˜å·²ę–¼ęœ¬åœ°åˆ†äŗ«č‡³ {{- link}}怂" }, "note_types": { "text": "文字", @@ -1409,7 +1442,7 @@ "relation-map": "é—œčÆåœ–", "note-map": "ē­†čØ˜åœ°åœ–", "render-note": "ęø²ęŸ“ē­†čØ˜", - "mermaid-diagram": "ē¾Žäŗŗé­šåœ–ļ¼ˆMermaid)", + "mermaid-diagram": "ē¾Žäŗŗé­šåœ–", "canvas": "ē•«åøƒ", "web-view": "網頁锯示", "mind-map": "åæƒę™ŗåœ–", @@ -1478,13 +1511,16 @@ "hoist-this-note-workspace": "čšē„¦ę­¤ē­†čØ˜ļ¼ˆå·„ä½œå€ļ¼‰", "refresh-saved-search-results": "é‡ę–°ę•“ē†å„²å­˜ēš„ęœå°‹ēµęžœ", "create-child-note": "å»ŗē«‹å­ē­†čØ˜", - "unhoist": "å–ę¶ˆčšē„¦" + "unhoist": "å–ę¶ˆčšē„¦", + "toggle-sidebar": "åˆ‡ę›å“é‚Šę¬„" }, "title_bar_buttons": { "window-on-top": "äæęŒę­¤č¦–ēŖ—ē½®é ‚" }, "note_detail": { - "could_not_find_typewidget": "ę‰¾äøåˆ°é”žåž‹ē‚ŗ '{{type}}' ēš„ typeWidget" + "could_not_find_typewidget": "ę‰¾äøåˆ°é”žåž‹ē‚ŗ '{{type}}' ēš„ typeWidget", + "printing": "ę­£åœØåˆ—å°ā€¦", + "printing_pdf": "ę­£åœØåŒÆå‡ŗē‚ŗ PDF…" }, "note_title": { "placeholder": "č«‹č¼øå…„ē­†čØ˜ęØ™é”Œ..." @@ -1559,7 +1595,9 @@ "ws": { "sync-check-failed": "åŒę­„ęŖ¢ęŸ„å¤±ę•—ļ¼", "consistency-checks-failed": "äø€č‡“ę€§ęŖ¢ęŸ„å¤±ę•—ļ¼č«‹ęŸ„ēœ‹ę—„čŖŒä»„äŗ†č§£č©³ē“°č³‡čØŠć€‚", - "encountered-error": "é‡åˆ°éŒÆčŖ¤ \"{{message}}\"ļ¼Œč«‹ęŸ„ēœ‹ęŽ§åˆ¶å°ć€‚" + "encountered-error": "é‡åˆ°éŒÆčŖ¤ \"{{message}}\"ļ¼Œč«‹ęŸ„ēœ‹ęŽ§åˆ¶å°ć€‚", + "lost-websocket-connection-title": "čˆ‡ä¼ŗęœå™Øēš„é€£ē·šäø­ę–·", + "lost-websocket-connection-message": "ęŖ¢ęŸ„ę‚Øēš„åå‘ä»£ē†ļ¼ˆå¦‚ nginx ꈖ Apacheļ¼‰čØ­å®šä»„ē¢ŗäæ Websocket é€£ē·šę²’ęœ‰č¢«é˜»ę“‹ć€‚" }, "hoisted_note": { "confirm_unhoisting": "č«‹ę±‚ēš„ē­†čØ˜ '{{requestedNote}}' ä½ę–¼čšē„¦ēš„ē­†čØ˜ '{{hoistedNote}}' ēš„å­éšŽå±¤ä¹‹å¤–ļ¼Œę‚Øåæ…é ˆå–ę¶ˆčšē„¦ę‰čƒ½čØŖå•č©²ē­†čØ˜ć€‚ę˜Æå¦ē¹¼ēŗŒå–ę¶ˆčšē„¦ļ¼Ÿ" @@ -1602,7 +1640,7 @@ "label": "ę ¼å¼å·„å…·ę¬„", "floating": { "title": "浮動", - "description": "ē·Øč¼Æå·„å…·å‡ŗē¾åœØéŠęØ™é™„čæ‘;" + "description": "ē·Øč¼Æå·„å…·å‡ŗē¾åœØęøøęØ™é™„čæ‘ļ¼›" }, "fixed": { "title": "å›ŗå®š", @@ -1820,7 +1858,7 @@ "oauth_title": "OAuth / OpenID é©—č­‰", "oauth_description": "OpenID ę˜Æäø€ēØ®ęØ™ęŗ–åŒ–ēš„ę–¹å¼ļ¼ŒåÆč®“ę‚Øä½æē”Øå…¶ä»–ęœå‹™ļ¼ˆå¦‚ Googleļ¼‰ēš„åø³č™Ÿē™»å…„ē¶²ē«™ļ¼Œä»„é©—č­‰ę‚Øēš„čŗ«ä»½ć€‚é čØ­ēš„ęä¾›č€…ę˜Æ Googleļ¼Œä½†ę‚ØåÆä»„å°‡å…¶č®Šę›“ē‚ŗä»»ä½•å…¶ä»– OpenID ęä¾›č€…ć€‚ęŸ„ēœ‹ę­¤č™•ä»„ēž­č§£ę›“å¤šč³‡čØŠć€‚ä¾ē…§é€™äŗ› ęŒ‡ē¤ŗä»„é€éŽ Google 設定 OpenID ęœå‹™ć€‚", "oauth_description_warning": "č¦å•Ÿē”Ø OAuth / OpenIDļ¼Œę‚Øéœ€č¦čØ­å®š config.ini ę–‡ä»¶äø­ēš„ OAuth / OpenID åŸŗē¤Ž URLć€å®¢ęˆ¶ē«Æ ID å’Œå®¢ęˆ¶ē«Æé‡‘é‘°ļ¼Œäø¦é‡ę–°å•Ÿå‹•ę‡‰ē”ØēØ‹å¼ć€‚å¦‚ęžœč¦å¾žē’°å¢ƒč®Šę•øčØ­ē½®ļ¼Œč«‹čØ­å®š TRILIUM_OAUTH_BASE_URL态TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET ē’°å¢ƒč®Šę•øć€‚", - "oauth_missing_vars": "ē¼ŗå°‘ä»„äø‹čØ­å®šļ¼š{{variables}}", + "oauth_missing_vars": "ē¼ŗå°‘ä»„äø‹čØ­å®šļ¼š{{-variables}}", "oauth_user_account": "ē”Øęˆ¶åø³č™Ÿļ¼š ", "oauth_user_email": "ē”Øęˆ¶äæ”ē®±ļ¼š ", "oauth_user_not_logged_in": "å°šęœŖē™»å…„ļ¼" @@ -1830,7 +1868,7 @@ "native-title-bar": "åŽŸē”ŸęØ™é”Œåˆ—", "native-title-bar-description": "å°ę–¼ Windows 和 macOSļ¼Œé—œé–‰åŽŸē”ŸęØ™é”Œåˆ—ęœƒč®“ę‡‰ē”ØēØ‹å¼ēœ‹čµ·ä¾†ę›“ē·Šę¹Šć€‚åœØ Linux äøŠļ¼Œé–‹å•ŸåŽŸē”ŸęØ™é”Œåˆ—åÆä»„čˆ‡ē³»ēµ±ēš„å…¶ä»–éƒØåˆ†ę•“åˆå¾—ę›“å„½ć€‚", "background-effects": "å•Ÿē”ØčƒŒę™Æę•ˆęžœļ¼ˆåƒ…é©ē”Øę–¼ Windows 11)", - "background-effects-description": "Mica ę•ˆęžœē‚ŗēØ‹å¼č¦–ēŖ—ę–°å¢žęØ”ē³Šäø”ę™‚å°šēš„čƒŒę™Æļ¼Œē‡Ÿé€ å‡ŗę·±åŗ¦ę„Ÿå’Œē¾ä»£åŒ–å¤–č§€ć€‚", + "background-effects-description": "Mica ę•ˆęžœē‚ŗēØ‹å¼č¦–ēŖ—ę–°å¢žęØ”ē³Šäø”ę™‚å°šēš„čƒŒę™Æļ¼Œē‡Ÿé€ å‡ŗę·±åŗ¦ę„Ÿå’Œē¾ä»£åŒ–å¤–č§€ć€‚ć€ŒåŽŸē”ŸęØ™é”Œåˆ—ć€åæ…é ˆč¢«ē¦ē”Øć€‚", "restart-app-button": "é‡ę–°å•Ÿå‹•ę‡‰ē”ØēØ‹å¼ä»„ęŸ„ēœ‹ę›“ę”¹", "zoom-factor": "縮放係數" }, @@ -1929,7 +1967,11 @@ "editorfeatures": { "title": "功能", "emoji_completion_enabled": "å•Ÿē”Ø Emoji č‡Ŗå‹•å®Œęˆ", - "note_completion_enabled": "å•Ÿē”Øē­†čØ˜č‡Ŗå‹•å®Œęˆ" + "note_completion_enabled": "å•Ÿē”Øē­†čØ˜č‡Ŗå‹•å®Œęˆ", + "emoji_completion_description": "å¦‚ęžœå•Ÿē”Øļ¼Œemoji åÆä»„č¼•ę˜“åœ°ē¶“ē”±č¼øå…„ `:` 加上 emoji åēØ±ä¾†ę’å…„ć€‚", + "note_completion_description": "å¦‚ęžœå•Ÿē”Øļ¼Œå°Žå‘ē­†čØ˜ēš„é€£ēµåÆä»„ē¶“ē”±č¼øå…„ `@` åŠ äøŠē­†čØ˜ęØ™é”Œä¾†å»ŗē«‹ć€‚", + "slash_commands_enabled": "å•Ÿē”Øę–œē·šå‘½ä»¤", + "slash_commands_description": "å¦‚ęžœå•Ÿē”Øļ¼ŒåÆä»„ē¶“ē”±č¼øå…„ `/` ä¾†č§øē™¼å‘½ä»¤ļ¼Œå¦‚ę’å…„ę›č”Œē¬¦ęˆ–ęØ™é”Œć€‚" }, "table_view": { "new-row": "ę–°å¢žåˆ—", @@ -1965,14 +2007,21 @@ "delete_row": "åˆŖé™¤åˆ—" }, "board_view": { - "delete-note": "åˆŖé™¤ē­†čØ˜", + "delete-note": "åˆŖé™¤ē­†čØ˜ā€¦", "move-to": "移動至", "insert-above": "åœØäøŠę–¹ę’å…„", "insert-below": "åœØäø‹ę–¹ę’å…„", "delete-column": "åˆŖé™¤č”Œ", "delete-column-confirmation": "ę‚Øē¢ŗå®šč¦åˆŖé™¤ę­¤č”Œå—Žļ¼Ÿę­¤č”Œäø­ę‰€ęœ‰ē­†čØ˜å°ę‡‰ēš„å±¬ę€§ä¹Ÿå°‡č¢«ē§»é™¤ć€‚", "new-item": "ę–°å¢žé …ē›®", - "add-column": "ę–°å¢žč”Œ" + "add-column": "ę–°å¢žč”Œ", + "remove-from-board": "å¾žēœ‹ęæäøŠē§»é™¤", + "archive-note": "å°å­˜ē­†čØ˜", + "unarchive-note": "č§£é™¤å°å­˜ē­†čØ˜", + "new-item-placeholder": "č¼øå…„ē­†čØ˜ęØ™é”Œā€¦", + "add-column-placeholder": "č¼øå…„č”Œåā€¦", + "edit-note-title": "é»žę“Šä»„ē·Øč¼Æē­†čØ˜ęØ™é”Œ", + "edit-column-title": "é»žę“Šä»„ē·Øč¼Æč”ŒęØ™é”Œ" }, "command_palette": { "tree-action-name": "樹:{{name}}", @@ -2019,6 +2068,20 @@ "title": "ę•ˆčƒ½", "enable-motion": "å•Ÿē”Øč½‰å “čˆ‡å‹•ē•«", "enable-shadows": "å•Ÿē”Øé™°å½±", - "enable-backdrop-effects": "å•Ÿē”Øéøå–®ć€å½ˆå‡ŗč¦–ēŖ—å’Œé¢ęæēš„čƒŒę™Æē‰¹ę•ˆ" + "enable-backdrop-effects": "å•Ÿē”Øéøå–®ć€å½ˆå‡ŗč¦–ēŖ—å’Œé¢ęæēš„čƒŒę™Æē‰¹ę•ˆ", + "enable-smooth-scroll": "å•Ÿē”Øå¹³ę»‘ę»¾å‹•", + "app-restart-required": "ļ¼ˆéœ€č¦é‡å•ŸēØ‹å¼ä»„å„—ē”Øę›“ę”¹ļ¼‰" + }, + "pagination": { + "page_title": "第 {{startIndex}} - {{endIndex}} 頁", + "total_notes": "{{count}} ē­†čØ˜" + }, + "collections": { + "rendering_error": "ē™¼ē¾éŒÆčŖ¤ļ¼Œē„”ę³•é”Æē¤ŗå…§å®¹ć€‚" + }, + "presentation_view": { + "edit-slide": "ē·Øč¼Æę­¤ęŠ•å½±ē‰‡", + "start-presentation": "開始簔報", + "slide-overview": "åˆ‡ę›ęŠ•å½±ē‰‡ę¦‚č¦½" } } diff --git a/apps/client/src/translations/uk/translation.json b/apps/client/src/translations/uk/translation.json index 907828d91..b35c6c826 100644 --- a/apps/client/src/translations/uk/translation.json +++ b/apps/client/src/translations/uk/translation.json @@ -326,7 +326,12 @@ "mime": "ŠœŠ†ŠœŠ•: ", "file_size": "Розмір Ń„Š°Š¹Š»Ńƒ:", "preview": "ŠŸŠ¾ŠæŠµŃ€ŠµŠ“Š½Ń–Š¹ ŠæŠµŃ€ŠµŠ³Š»ŃŠ“:", - "preview_not_available": "ŠŸŠ¾ŠæŠµŃ€ŠµŠ“Š½Ń–Š¹ ŠæŠµŃ€ŠµŠ³Š»ŃŠ“ Š½ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½ŠøŠ¹ Š“Š»Ń Ń†ŃŒŠ¾Š³Š¾ Ń‚ŠøŠæŃƒ нотатки." + "preview_not_available": "ŠŸŠ¾ŠæŠµŃ€ŠµŠ“Š½Ń–Š¹ ŠæŠµŃ€ŠµŠ³Š»ŃŠ“ Š½ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½ŠøŠ¹ Š“Š»Ń Ń†ŃŒŠ¾Š³Š¾ Ń‚ŠøŠæŃƒ нотатки.", + "diff_on": "ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚Šø Ń€Ń–Š·Š½ŠøŃ†ŃŽ", + "diff_off": "ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚Šø вміст", + "diff_on_hint": "ŠŠ°Ń‚ŠøŃŠ½Ń–Ń‚ŃŒ, щоб показати Ń€Ń–Š·Š½ŠøŃ†ŃŽ в Гжерелі нотатки", + "diff_off_hint": "ŠŠ°Ń‚ŠøŃŠ½Ń–Ń‚ŃŒ, щоб показати вміст нотатки", + "diff_not_available": "Š Ń–Š·Š½ŠøŃ†Ń Š½ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½Š°." }, "include_note": { "dialog_title": "Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚Šø Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ", @@ -555,7 +560,7 @@ "oauth_title": "OAuth/OpenID", "oauth_description": "OpenID – це станГартизований спосіб Š²Ń…Š¾Š“Ńƒ на веб-сайти за Š“Š¾ŠæŠ¾Š¼Š¾Š³Š¾ŃŽ облікового запису Š· Ń–Š½ŃˆŠ¾Š³Š¾ ŃŠµŃ€Š²Ń–ŃŃƒ, такого ŃŠŗ Google, Š“Š»Ń ŠæŃ–Š“Ń‚Š²ŠµŃ€Š“Š¶ŠµŠ½Š½Ń Š²Š°ŃˆŠ¾Ń— особи. Емітентом за Š·Š°Š¼Š¾Š²Ń‡ŃƒŠ²Š°Š½Š½ŃŠ¼ є Google, але ви можете змінити його на буГь-ŃŠŗŠ¾Š³Š¾ Ń–Š½ŃˆŠ¾Š³Š¾ ŠæŠ¾ŃŃ‚Š°Ń‡Š°Š»ŃŒŠ½ŠøŠŗŠ° OpenID. ŠŸŠµŃ€ŠµŠ³Š»ŃŠ½ŃŒŃ‚Šµ тут Š“Š»Ń Š¾Ń‚Ń€ŠøŠ¼Š°Š½Š½Ń ГоГаткової інформації. Š”Š¾Ń‚Ń€ŠøŠ¼ŃƒŠ¹Ń‚ŠµŃŃŒ цих Ń–Š½ŃŃ‚Ń€ŃƒŠŗŃ†Ń–Š¹, щоб Š½Š°Š»Š°ŃˆŃ‚ŃƒŠ²Š°Ń‚Šø сервіс OpenID через Google.", "oauth_description_warning": "Щоб ŃƒŠ²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø OAuth/OpenID, потрібно встановити базову URL-Š°Š“Ń€ŠµŃŃƒ OAuth/OpenID, іГентифікатор клієнта та секрет клієнта у файлі config.ini та ŠæŠµŃ€ŠµŠ·Š°ŠæŃƒŃŃ‚ŠøŃ‚Šø ŠæŃ€Š¾Š³Ń€Š°Š¼Ńƒ. Якщо ви хочете встановити Š·Ń– змінних сереГовища, Š²ŃŃ‚Š°Š½Š¾Š²Ń–Ń‚ŃŒ TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID та TRILIUM_OAUTH_CLIENT_SECRET.", - "oauth_missing_vars": "Š’Ń–Š“ŃŃƒŃ‚Š½Ń– Š½Š°Š»Š°ŃˆŃ‚ŃƒŠ²Š°Š½Š½Ń: {{variables}}", + "oauth_missing_vars": "Š’Ń–Š“ŃŃƒŃ‚Š½Ń– Š½Š°Š»Š°ŃˆŃ‚ŃƒŠ²Š°Š½Š½Ń: {{-variables}}", "oauth_user_account": "ŠžŠ±Š»Ń–ŠŗŠ¾Š²ŠøŠ¹ запис ŠŗŠ¾Ń€ŠøŃŃ‚ŃƒŠ²Š°Ń‡Š°: ", "oauth_user_email": "Електронна ŠæŠ¾ŃˆŃ‚Š° ŠŗŠ¾Ń€ŠøŃŃ‚ŃƒŠ²Š°Ń‡Š°: ", "oauth_user_not_logged_in": "Š’Šø не Š²Š²Ń–Š¹ŃˆŠ»Šø в ŃŠøŃŃ‚ŠµŠ¼Ńƒ!" @@ -717,7 +722,7 @@ "cannot_find_day_note": "ŠŠµ Š²Š“Š°Ń”Ń‚ŃŒŃŃ знайти Генну Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ", "cannot_find_week_note": "ŠŠµ Š²Š“Š°Ń”Ń‚ŃŒŃŃ знайти Ń‚ŠøŠ¶Š½ŠµŠ²Ńƒ Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ", "january": "Š”Ń–Ń‡ŠµŠ½ŃŒ", - "febuary": "Š›ŃŽŃ‚ŠøŠ¹", + "february": "Š›ŃŽŃ‚ŠøŠ¹", "march": "Š‘ŠµŃ€ŠµŠ·ŠµŠ½ŃŒ", "april": "ŠšŠ²Ń–Ń‚ŠµŠ½ŃŒ", "may": "Š¢Ń€Š°Š²ŠµŠ½ŃŒ", @@ -727,7 +732,18 @@ "september": "Š’ŠµŃ€ŠµŃŠµŠ½ŃŒ", "october": "Š–Š¾Š²Ń‚ŠµŠ½ŃŒ", "november": "ЛистопаГ", - "december": "Š“Ń€ŃƒŠ“ŠµŠ½ŃŒ" + "december": "Š“Ń€ŃƒŠ“ŠµŠ½ŃŒ", + "week": "ТижГень", + "week_previous": "ŠŸŠ¾ŠæŠµŃ€ŠµŠ“Š½Ń–Š¹ Ń‚ŠøŠ¶Š“ŠµŠ½ŃŒ", + "week_next": "ŠŠ°ŃŃ‚ŃƒŠæŠ½ŠøŠ¹ Ń‚ŠøŠ¶Š“ŠµŠ½ŃŒ", + "month": "ŠœŃ–ŃŃŃ†ŃŒ", + "month_previous": "ŠŸŠ¾ŠæŠµŃ€ŠµŠ“Š½Ń–Š¹ Š¼Ń–ŃŃŃ†ŃŒ", + "month_next": "ŠŠ°ŃŃ‚ŃƒŠæŠ½ŠøŠ¹ Š¼Ń–ŃŃŃ†ŃŒ", + "year": "Š Ń–Šŗ", + "year_previous": "ŠŸŠ¾ŠæŠµŃ€ŠµŠ“Š½Ń–Š¹ рік", + "year_next": "ŠŠ°ŃŃ‚ŃƒŠæŠ½ŠøŠ¹ рік", + "list": "Дписок", + "today": "Š”ŃŒŠ¾Š³Š¾Š“Š½Ń–" }, "close_pane_button": { "close_this_pane": "Закрити цю панель" @@ -844,7 +860,8 @@ "note_type": "Тип нотатки", "editable": "РеГагув.", "basic_properties": "ŠžŃŠ½Š¾Š²Š½Ń– Властивості", - "language": "Мова" + "language": "Мова", + "configure_code_notes": "ŠšŠ¾Š½Ń„Ń–Š³ŃƒŃ€Š°Ń†Ń–Ń нотатки Š· коГом..." }, "book_properties": { "view_type": "Тип ŠæŠµŃ€ŠµŠ³Š»ŃŠ“Ńƒ", @@ -859,7 +876,8 @@ "calendar": "ŠšŠ°Š»ŠµŠ½Š“Š°Ń€", "table": "Š¢Š°Š±Š»ŠøŃ†Ń", "geo-map": "Географічна карта", - "board": "Š”Š¾ŃˆŠŗŠ°" + "board": "Š”Š¾ŃˆŠŗŠ°", + "include_archived_notes": "ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚Šø архівовані нотатки" }, "edited_notes": { "no_edited_notes_found": "Цього Š“Š½Ń ще немає реГагованих нотаток...", @@ -1051,7 +1069,9 @@ "no_attachments": "Š¦Ń нотатка не має вклаГень." }, "book": { - "no_children_help": "Š¦Ń ŠŗŠ¾Š»ŠµŠŗŃ†Ń–Ń не має Гочірніх нотаток, Ń‚Š¾Š¼Ńƒ нічого віГображати. Див. вікі Š“Š»Ń Š¾Ń‚Ń€ŠøŠ¼Š°Š½Š½Ń Š“ŠµŃ‚Š°Š»ŃŒŠ½Š¾Ń— інформації." + "no_children_help": "Š¦Ń ŠŗŠ¾Š»ŠµŠŗŃ†Ń–Ń не має Гочірніх нотаток, Ń‚Š¾Š¼Ńƒ нічого віГображати. Див. вікі Š“Š»Ń Š¾Ń‚Ń€ŠøŠ¼Š°Š½Š½Ń Š“ŠµŃ‚Š°Š»ŃŒŠ½Š¾Ń— інформації.", + "drag_locked_title": "Заблоковано Š“Š»Ń Ń€ŠµŠ“Š°Š³ŃƒŠ²Š°Š½Š½Ń", + "drag_locked_message": "ŠŸŠµŃ€ŠµŃ‚ŃŠ³ŃƒŠ²Š°Š½Š½Ń заборонено, Š¾ŃŠŗŃ–Š»ŃŒŠŗŠø ŠŗŠ¾Š»ŠµŠŗŃ†Ń–ŃŽ заблоковано Š“Š»Ń Ń€ŠµŠ“Š°Š³ŃƒŠ²Š°Š½Š½Ń." }, "editable_code": { "placeholder": "Š’Š²ŠµŠ“Ń–Ń‚ŃŒ тут вміст Š²Š°ŃˆŠ¾Ń— нотатки Š· коГом..." @@ -1586,7 +1606,8 @@ "hoist-this-note-workspace": "Закріпити цю Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ (робочий простір)", "refresh-saved-search-results": "ŠžŠ½Š¾Š²ŠøŃ‚Šø збережені Ń€ŠµŠ·ŃƒŠ»ŃŒŃ‚Š°Ń‚Šø пошуку", "create-child-note": "Дтворити Š“Š¾Ń‡Ń–Ń€Š½ŃŽ Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ", - "unhoist": "ВіГкріпити" + "unhoist": "ВіГкріпити", + "toggle-sidebar": "ŠŸŠµŃ€ŠµŠ¼ŠøŠŗŠ°Š½Š½Ń бічної панелі" }, "title_bar_buttons": { "window-on-top": "Тримати вікно Š·Š²ŠµŃ€Ń…Ńƒ" @@ -1648,7 +1669,9 @@ "ws": { "sync-check-failed": "ŠŸŠµŃ€ŠµŠ²Ń–Ń€ŠŗŠ° синхронізації не Š²Š“Š°Š»Š°ŃŃ!", "consistency-checks-failed": "ŠŸŠµŃ€ŠµŠ²Ń–Ń€ŠŗŠ° ŃƒŠ·Š³Š¾Š“Š¶ŠµŠ½Š¾ŃŃ‚Ń– не Š²Š“Š°Š»Š°ŃŃ! Див. logs Š“Š»Ń Š¾Ń‚Ń€ŠøŠ¼Š°Š½Š½Ń інформації.", - "encountered-error": "Виникла помилка \"{{message}}\", перевірте консоль." + "encountered-error": "Виникла помилка \"{{message}}\", перевірте консоль.", + "lost-websocket-connection-title": "Втрачено Š·'Ń”Š“Š½Š°Š½Š½Ń Ń–Š· сервером", + "lost-websocket-connection-message": "ŠŸŠµŃ€ŠµŠ²Ń–Ń€Ń‚Šµ ŠŗŠ¾Š½Ń„Ń–Š³ŃƒŃ€Š°Ń†Ń–ŃŽ вашого зворотного проксі-сервера (наприклаГ, nginx або Apache), щоб ŠæŠµŃ€ŠµŠŗŠ¾Š½Š°Ń‚ŠøŃŃ, що Š·ā€™Ń”Š“Š½Š°Š½Š½Ń WebSocket належним чином Гозволені та не Š±Š»Š¾ŠŗŃƒŃŽŃ‚ŃŒŃŃ." }, "hoisted_note": { "confirm_unhoisting": "Запитана нотатка '{{requestedNote}}' Š·Š½Š°Ń…Š¾Š“ŠøŃ‚ŃŒŃŃ поза піГГеревом закріплених нотаток '{{hoistedNote}}', і вам потрібно віГкріпити Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ, щоб отримати Го неї Š“Š¾ŃŃ‚ŃƒŠæ. Š’Šø хочете проГовжити Š²Ń–Š“ŠŗŃ€Ń–ŠæŠ»ŠµŠ½Š½Ń?" @@ -1677,7 +1700,7 @@ "native-title-bar": "ŠŠ°Ń‚ŠøŠ²Š½ŠøŠ¹ Ń€ŃŠ“Š¾Šŗ заголовка", "native-title-bar-description": "Š£ Windows та macOS Š²ŠøŠ¼ŠŗŠ½ŠµŠ½Š½Ń Ń€ŃŠ“ŠŗŠ° заголовка Ń€Š¾Š±ŠøŃ‚ŃŒ ŠæŃ€Š¾Š³Ń€Š°Š¼Ńƒ ŠŗŠ¾Š¼ŠæŠ°ŠŗŃ‚Š½Ń–ŃˆŠ¾ŃŽ. Š£ Linux ŃƒŠ²Ń–Š¼ŠŗŠ½ŠµŠ½Š½Ń Ń€ŃŠ“ŠŗŠ° заголовка краще Ń–Š½Ń‚ŠµŠ³Ń€ŃƒŃ”Ń‚ŃŒŃŃ Š· Ń€ŠµŃˆŃ‚Š¾ŃŽ системи.", "background-effects": "Š£Š²Ń–Š¼ŠŗŠ½ŠµŠ½Š½Ń фонових ефектів (лише Š“Š»Ń Windows 11)", - "background-effects-description": "Ефект ŃŠ»ŃŽŠ“Šø ГоГає розмитий, ŃŃ‚ŠøŠ»ŃŒŠ½ŠøŠ¹ фон вікнам програм, ŃŃ‚Š²Š¾Ń€ŃŽŃŽŃ‡Šø глибину та ŃŃƒŃ‡Š°ŃŠ½ŠøŠ¹ Š²ŠøŠ³Š»ŃŠ“.", + "background-effects-description": "Ефект ŃŠ»ŃŽŠ“Šø ГоГає розмитий, ŃŃ‚ŠøŠ»ŃŒŠ½ŠøŠ¹ фон вікнам програм, ŃŃ‚Š²Š¾Ń€ŃŽŃŽŃ‡Šø глибину та ŃŃƒŃ‡Š°ŃŠ½ŠøŠ¹ Š²ŠøŠ³Š»ŃŠ“. \"ŠŠ°Ń‚ŠøŠ²Š½ŠøŠ¹ Ń€ŃŠ“Š¾Šŗ заголовка\" має Š±ŃƒŃ‚Šø вимкнено.", "restart-app-button": "ŠŸŠµŃ€ŠµŠ·Š°ŠæŃƒŃŃ‚Ń–Ń‚ŃŒ ŠæŃ€Š¾Š³Ń€Š°Š¼Ńƒ, щоб ŠæŠµŃ€ŠµŠ³Š»ŃŠ½ŃƒŃ‚Šø зміни", "zoom-factor": "ŠšŠ¾ŠµŃ„Ń–Ń†Ń–Ń”Š½Ń‚ Š¼Š°ŃŃˆŃ‚Š°Š±ŃƒŠ²Š°Š½Š½Ń" }, @@ -1776,7 +1799,11 @@ "editorfeatures": { "title": "ŠžŃŠ¾Š±Š»ŠøŠ²Š¾ŃŃ‚Ń–", "emoji_completion_enabled": "Š£Š²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø Š°Š²Ń‚Š¾Š·Š°ŠæŠ¾Š²Š½ŠµŠ½Š½Ń емоГзі", - "note_completion_enabled": "Š£Š²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø Š°Š²Ń‚Š¾Š·Š°ŠæŠ¾Š²Š½ŠµŠ½Š½Ń нотаток" + "note_completion_enabled": "Š£Š²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø Š°Š²Ń‚Š¾Š·Š°ŠæŠ¾Š²Š½ŠµŠ½Š½Ń нотаток", + "emoji_completion_description": "Якщо цю Ń„ŃƒŠ½ŠŗŃ†Ń–ŃŽ ввімкнено, емоГзі можна легко Š²ŃŃ‚Š°Š²Š»ŃŃ‚Šø в текст, Š²Š²Ń–Š²ŃˆŠø `:`, а потім назву емоГзі.", + "note_completion_description": "Якщо ввімкнено, ŠæŠ¾ŃŠøŠ»Š°Š½Š½Ń на нотатки можна ŃŃ‚Š²Š¾Ń€ŃŽŠ²Š°Ń‚Šø, Š²Š²Š¾Š“ŃŃ‡Šø `@`, а потім назву нотатки.", + "slash_commands_enabled": "Š£Š²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø команГи Š·Ń– слеш", + "slash_commands_description": "Якщо ввімкнено, команГи Ń€ŠµŠ“Š°Š³ŃƒŠ²Š°Š½Š½Ń, такі ŃŠŗ вставка розривів Ń€ŃŠ“ŠŗŃ–Š² або заголовків, можна перемикати, Š½Š°Ń‚ŠøŃŠŗŠ°ŃŽŃ‡Šø `/`." }, "table_view": { "new-row": "ŠŠ¾Š²ŠøŠ¹ Ń€ŃŠ“Š¾Šŗ", @@ -1876,7 +1903,7 @@ "button-tree-map": "ŠšŠ°Ń€Ń‚Š° Герева" }, "tree-context-menu": { - "open-in-a-new-tab": "ВіГкрити в новій вклаГці Ctrl+ŠšŠ»Ń–Šŗ", + "open-in-a-new-tab": "ВіГкрити в новій вклаГці", "open-in-a-new-split": "ВіГкрити в новому розГілі", "insert-note-after": "Вставити Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ ŠæŃ–ŃŠ»Ń", "insert-child-note": "Вставити Š“Š¾Ń‡Ń–Ń€Š½ŃŽ Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ", @@ -1906,11 +1933,13 @@ "apply-bulk-actions": "Š—Š°ŃŃ‚Š¾ŃŃƒŠ²Š°Ń‚Šø масові Гії", "converted-to-attachments": "({{count}}) нотаток перетворено на Š²ŠŗŠ»Š°Š“ŠµŠ½Š½Ń.", "convert-to-attachment-confirm": "Š’Šø впевнені, що хочете ŠŗŠ¾Š½Š²ŠµŃ€Ń‚ŃƒŠ²Š°Ń‚Šø вибрані нотатки у Š²ŠŗŠ»Š°Š“ŠµŠ½Š½Ń Го їхніх Š±Š°Ń‚ŃŒŠŗŃ–Š²ŃŃŒŠŗŠøŃ… нотаток?", - "open-in-popup": "ШвиГке Ń€ŠµŠ“Š°Š³ŃƒŠ²Š°Š½Š½Ń" + "open-in-popup": "ШвиГке Ń€ŠµŠ“Š°Š³ŃƒŠ²Š°Š½Š½Ń", + "archive": "ŠŃ€Ń…Ń–Š²ŃƒŠ²Š°Ń‚Šø", + "unarchive": "Š Š¾Š·Š°Ń€Ń…Ń–Š²ŃƒŠ²Š°Ń‚Šø" }, "shared_info": { - "shared_publicly": "Š¦Ń нотатка Š¾ŠæŃƒŠ±Š»Ń–кована на", - "shared_locally": "Š¦ŃŽ Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ Š¾ŠæŃƒŠ±Š»Ń–ŠŗŠ¾Š²Š°Š½Š¾ локально на", + "shared_publicly": "Š¦Ń нотатка Š¾ŠæŃƒŠ±Š»Ń–кована на {{- link}}.", + "shared_locally": "Š¦ŃŽ Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ Š¾ŠæŃƒŠ±Š»Ń–ŠŗŠ¾Š²Š°Š½Š¾ локально на {{- link}}.", "help_link": "Щоб отримати Гопомогу, віГвіГайте вікі." }, "note_types": { @@ -1973,14 +2002,21 @@ "delete_row": "ВиГалити Ń€ŃŠ“Š¾Šŗ" }, "board_view": { - "delete-note": "ВиГалити Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ", + "delete-note": "ВиГалити Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ...", "move-to": "ŠŸŠµŃ€ŠµŠ¼Ń–ŃŃ‚ŠøŃ‚Šø Го", "insert-above": "Вставити вище", "insert-below": "Вставити нижче", "delete-column": "ВиГалити ŃŃ‚Š¾Š²ŠæŠµŃ†ŃŒ", "delete-column-confirmation": "Š’Šø впевнені, що хочете виГалити цей ŃŃ‚Š¾Š²ŠæŠµŃ†ŃŒ? ВіГповіГний Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚ також буГе виГалено в нотатках піГ цим стовпцем.", "new-item": "ŠŠ¾Š²ŠøŠ¹ елемент", - "add-column": "ДоГати ŃŃ‚Š¾Š²ŠæŠµŃ†ŃŒ" + "add-column": "ДоГати ŃŃ‚Š¾Š²ŠæŠµŃ†ŃŒ", + "remove-from-board": "ВиГалити Š· Гошки", + "archive-note": "ŠŃ€Ń…Ń–Š²ŃƒŠ²Š°Ń‚Šø нотатка", + "unarchive-note": "Š Š¾Š·Š°Ń€Ń…Ń–Š²ŃƒŠ²Š°Ń‚Šø Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ", + "new-item-placeholder": "Š’Š²ŠµŠ“Ń–Ń‚ŃŒ заголовок нотатки...", + "add-column-placeholder": "Š’Š²ŠµŠ“Ń–Ń‚ŃŒ назву ŃŃ‚Š¾Š²ŠæŃ†Ń...", + "edit-note-title": "ŠŠ°Ń‚ŠøŃŠ½Ń–Ń‚ŃŒ, щоб Ń€ŠµŠ“Š°Š³ŃƒŠ²Š°Ń‚Šø заголовок нотатки", + "edit-column-title": "ŠŠ°Ń‚ŠøŃŠ½Ń–Ń‚ŃŒ, щоб Ń€ŠµŠ“Š°Š³ŃƒŠ²Š°Ń‚Šø заголовок ŃŃ‚Š¾Š²ŠæŃ†Ń" }, "command_palette": { "tree-action-name": "Дерево: {{name}}", @@ -2018,5 +2054,20 @@ }, "units": { "percentage": "%" + }, + "ui-performance": { + "title": "ŠŸŃ€Š¾Š“ŃƒŠŗŃ‚ŠøŠ²Š½Ń–ŃŃ‚ŃŒ", + "enable-motion": "Š£Š²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø перехоГи та Š°Š½Ń–Š¼Š°Ń†Ń–ŃŽ", + "enable-shadows": "Š£Š²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø тіні", + "enable-backdrop-effects": "Š£Š²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø фонові ефекти Š“Š»Ń Š¼ŠµŠ½ŃŽ, ŃŠæŠ»ŠøŠ²Š°ŃŽŃ‡ŠøŃ… вікон та панелей", + "enable-smooth-scroll": "Š£Š²Ń–Š¼ŠŗŠ½ŃƒŃ‚Šø плавне ŠæŃ€Š¾ŠŗŃ€ŃƒŃ‡ŃƒŠ²Š°Š½Š½Ń", + "app-restart-required": "(щоб зміни набули чинності, потрібен ŠæŠµŃ€ŠµŠ·Š°ŠæŃƒŃŠŗ програми)" + }, + "pagination": { + "page_title": "Дторінка {{startIndex}} - {{endIndex}}", + "total_notes": "{{count}} нотаток" + }, + "collections": { + "rendering_error": "ŠŠµ Š²Š“Š°Š»Š¾ŃŃ показати вміст через помилку." } } diff --git a/apps/client/src/translations/vi/translation.json b/apps/client/src/translations/vi/translation.json index a8eeaedb9..77f455067 100644 --- a/apps/client/src/translations/vi/translation.json +++ b/apps/client/src/translations/vi/translation.json @@ -1,11 +1,18 @@ { "about": { "homepage": "Trang chį»§:", - "title": "Về Trilium Notes" + "title": "Về Trilium Notes", + "app_version": "PhiĆŖn bįŗ£n:", + "db_version": "PhiĆŖn bįŗ£n DB:", + "sync_version": "PhiĆŖn bįŗ£n liĆŖn kįŗæt:", + "build_date": "NgĆ y build:", + "build_revision": "XĆ¢y dį»±ng bįŗ£n sį»­a đổi:", + "data_directory": "ÄĘ°į»ng dįŗ«n dữ liệu:" }, "add_link": { "add_link": "ThĆŖm liĆŖn kįŗæt", - "button_add_link": "ThĆŖm liĆŖn kįŗæt" + "button_add_link": "ThĆŖm liĆŖn kįŗæt", + "help_on_links": "Trợ giĆŗp về cĆ”c liĆŖn kįŗæt" }, "bulk_actions": { "other": "KhĆ”c" @@ -26,11 +33,22 @@ "close": "Đóng" }, "help": { - "other": "KhĆ”c" + "other": "KhĆ”c", + "notSet": "chʰa được đặt" }, "toast": { "critical-error": { - "title": "Lį»—i nghiĆŖm trį»ng" + "title": "Lį»—i nghiĆŖm trį»ng", + "message": "Đã xįŗ£y ra lį»—i nghiĆŖm trį»ng ngăn ứng dỄng client khởi động\n\n{{message}}\n\nĐiều nĆ y có khįŗ£ năng bị gĆ¢y ra bởi mį»™t script hoįŗ”t động khĆ“ng nhʰ mong đợi. HĆ£y thį»­ khởi động ứng dỄng ở chįŗæ độ an toĆ n vĆ  giįŗ£i quyįŗæt vįŗ„n đề." + }, + "widget-error": { + "title": "Khởi tįŗ”o widget thįŗ„t bįŗ”i", + "message-custom": "Tiện Ć­ch tùy chỉnh từ ghi chĆŗ vį»›i ID \"{{id}}\", tiĆŖu đề \"{{title}}\" khĆ“ng thể khởi tįŗ”o vƬ:\n\n{{message}}", + "message-unknown": "Tiện Ć­ch chʰa biįŗæt khĆ“ng thể được khởi tįŗ”o vƬ:\n\n{{message}}" + }, + "bundle-error": { + "title": "Tįŗ£i script tùy chį»n thįŗ„t bįŗ”i", + "message": "Script từ ghi chĆŗ ID \"{{id}}\", tiĆŖu đề \"{{title}}\" khĆ“ng thể chįŗ”y được vƬ:\n\n{{message}}" } }, "import": { @@ -69,12 +87,16 @@ "add_label": { "add_label": "ThĆŖm nhĆ£n", "label_name_placeholder": "tĆŖn nhĆ£n", - "help_text_item2": "hoįŗ·c thay đổi giĆ” trị cį»§a nhĆ£n có sįŗµn" + "help_text_item2": "hoįŗ·c thay đổi giĆ” trị cį»§a nhĆ£n có sįŗµn", + "new_value_placeholder": "giĆ” trị mį»›i" }, "rename_label": { "rename_label": "Đặt lįŗ”i tĆŖn nhĆ£n" }, "call_to_action": { "dismiss": "Bį» qua" + }, + "abstract_search_option": { + "remove_this_search_option": "XoĆ” lį»±a chį»n tƬm kiįŗæm nĆ y" } } diff --git a/apps/client/src/types-fancytree.d.ts b/apps/client/src/types-fancytree.d.ts index 38a4b0295..e82cb895f 100644 --- a/apps/client/src/types-fancytree.d.ts +++ b/apps/client/src/types-fancytree.d.ts @@ -113,7 +113,7 @@ declare namespace Fancytree { generateFormElements(selected?: boolean, active?: boolean): void; /** Return the currently active node or null. */ - getActiveNode(): FancytreeNode; + getActiveNode(): FancytreeNode | null; /** Return the first top level node if any (not the invisible root node). */ getFirstChild(): FancytreeNode; diff --git a/apps/client/src/types-lib.d.ts b/apps/client/src/types-lib.d.ts index 0c4474e94..14403b743 100644 --- a/apps/client/src/types-lib.d.ts +++ b/apps/client/src/types-lib.d.ts @@ -51,3 +51,12 @@ declare module "leaflet" { markers?: GPXMarker | undefined; } } + +declare global { + interface Navigator { + /** Returns a boolean indicating whether the browser is running in standalone mode. Available on Apple's iOS Safari only. */ + standalone?: boolean; + /** Returns the WindowControlsOverlay interface which exposes information about the geometry of the title bar in desktop Progressive Web Apps, and an event to know whenever it changes. */ + windowControlsOverlay?: unknown; + } +} diff --git a/apps/client/src/types.d.ts b/apps/client/src/types.d.ts index fedad1662..c5a93bd0a 100644 --- a/apps/client/src/types.d.ts +++ b/apps/client/src/types.d.ts @@ -16,7 +16,7 @@ interface ElectronProcess { interface CustomGlobals { isDesktop: typeof utils.isDesktop; isMobile: typeof utils.isMobile; - device: "mobile" | "desktop"; + device: "mobile" | "desktop" | "print"; getComponentByEl: typeof appContext.getComponentByEl; getHeaders: typeof server.getHeaders; getReferenceLinkTitle: (href: string) => Promise; @@ -46,6 +46,7 @@ interface CustomGlobals { platform?: typeof process.platform; linter: typeof lint; hasNativeTitleBar: boolean; + isRtl: boolean; } type RequireMethod = (moduleName: string) => any; @@ -58,6 +59,9 @@ declare global { process?: ElectronProcess; glob?: CustomGlobals; + /** On the printing endpoint, set to true when the note has fully loaded and is ready to be printed/exported as PDF. */ + _noteReady?: boolean; + EXCALIDRAW_ASSET_PATH?: string; } diff --git a/apps/client/src/utils/css-var.ts b/apps/client/src/utils/css-var.ts new file mode 100644 index 000000000..886247881 --- /dev/null +++ b/apps/client/src/utils/css-var.ts @@ -0,0 +1,45 @@ +export function readCssVar(element: HTMLElement, varName: string) { + return new CssVarReader(getComputedStyle(element).getPropertyValue("--" + varName)); +} + +export class CssVarReader { + protected value: string; + + constructor(rawValue: string) { + this.value = rawValue; + } + + asString(defaultValue?: string) { + return (this.value) ? this.value : defaultValue; + } + + asNumber(defaultValue?: number) { + let number: Number = NaN; + + if (this.value) { + number = parseFloat(this.value); + } + + return (!isNaN(number.valueOf()) ? number.valueOf() : defaultValue) + } + + asEnum(enumType: T, defaultValue?: T[keyof T]): T[keyof T] | undefined { + let result: T[keyof T] | undefined; + + result = enumType[this.value as keyof T]; + + if (result === undefined) { + result = defaultValue; + } + + return result; + } + + asArray(delimiter: string = " "): CssVarReader[] { + // Note: ignoring delimiters inside quotation marks is currently unsupported + let values = this.value.split(delimiter); + + return values.map((v) => new CssVarReader(v)); + } + +} \ No newline at end of file diff --git a/apps/client/src/utils/formatters.spec.ts b/apps/client/src/utils/formatters.spec.ts new file mode 100644 index 000000000..821207d9f --- /dev/null +++ b/apps/client/src/utils/formatters.spec.ts @@ -0,0 +1,19 @@ +import { describe, expect, it } from "vitest"; +import options from "../services/options"; +import { formatDateTime, normalizeLocale } from "./formatters"; + +describe("formatters", () => { + it("tolerates incorrect locale", () => { + options.set("formattingLocale", "cn_TW"); + + expect(formatDateTime(new Date())).toBeTruthy(); + expect(formatDateTime(new Date(), "full", "none")).toBeTruthy(); + expect(formatDateTime(new Date(), "none", "full")).toBeTruthy(); + }); + + it("normalizes locale", () => { + expect(normalizeLocale("zh_CN")).toBe("zh-CN"); + expect(normalizeLocale("cn")).toBe("zh-CN"); + expect(normalizeLocale("tw")).toBe("zh-TW"); + }); +}); diff --git a/apps/client/src/utils/formatters.ts b/apps/client/src/utils/formatters.ts index d3209be7b..a7c9cceed 100644 --- a/apps/client/src/utils/formatters.ts +++ b/apps/client/src/utils/formatters.ts @@ -1,3 +1,5 @@ +import options from "../services/options"; + type DateTimeStyle = "full" | "long" | "medium" | "short" | "none" | undefined; /** @@ -8,7 +10,7 @@ export function formatDateTime(date: string | Date | number | null | undefined, return ""; } - const locale = navigator.language; + const locale = normalizeLocale(options.get("formattingLocale") || options.get("locale") || navigator.language); let parsedDate; if (typeof date === "string" || typeof date === "number") { @@ -24,15 +26,37 @@ export function formatDateTime(date: string | Date | number | null | undefined, if (timeStyle !== "none" && dateStyle !== "none") { // Format the date and time - const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle, timeStyle }); - return formatter.format(parsedDate); + try { + const formatter = new Intl.DateTimeFormat(locale, { dateStyle, timeStyle }); + return formatter.format(parsedDate); + } catch (e) { + const formatter = new Intl.DateTimeFormat(undefined, { dateStyle, timeStyle }); + return formatter.format(parsedDate); + } } else if (timeStyle === "none" && dateStyle !== "none") { // Format only the date - return parsedDate.toLocaleDateString(locale, { dateStyle }); + try { + return parsedDate.toLocaleDateString(locale, { dateStyle }); + } catch (e) { + return parsedDate.toLocaleDateString(undefined, { dateStyle }); + } } else if (dateStyle === "none" && timeStyle !== "none") { // Format only the time - return parsedDate.toLocaleTimeString(locale, { timeStyle }); + try { + return parsedDate.toLocaleTimeString(locale, { timeStyle }); + } catch (e) { + return parsedDate.toLocaleTimeString(undefined, { timeStyle }); + } } throw new Error("Incorrect state."); } + +export function normalizeLocale(locale: string) { + locale = locale.replaceAll("_", "-"); + switch (locale) { + case "cn": return "zh-CN"; + case "tw": return "zh-TW"; + default: return locale; + } +} diff --git a/apps/client/src/widgets/FloatingButtons.css b/apps/client/src/widgets/FloatingButtons.css index 41afefed9..88257cd67 100644 --- a/apps/client/src/widgets/FloatingButtons.css +++ b/apps/client/src/widgets/FloatingButtons.css @@ -6,8 +6,8 @@ .floating-buttons-children, .show-floating-buttons { position: absolute; - top: 10px; - right: 10px; + top: var(--floating-buttons-vert-offset, 10px); + inset-inline-end: var(--floating-buttons-horiz-offset, 10px); display: flex; flex-direction: row; z-index: 100; @@ -15,8 +15,7 @@ .note-split.rtl .floating-buttons-children, .note-split.rtl .show-floating-buttons { - right: unset; - left: 10px; + inset-inline-end: 10px; } .note-split.rtl .close-floating-buttons { @@ -28,8 +27,8 @@ transform: rotate(180deg); } -.type-canvas .floating-buttons-children { - top: 70px; +.type-canvas { + --floating-buttons-vert-offset: 70px; } .type-canvas .floating-buttons-children > * { @@ -74,7 +73,7 @@ .show-floating-buttons { /* display: none;*/ - margin-left: 5px !important; + margin-inline-start: 5px !important; } .show-floating-buttons-button { @@ -97,7 +96,7 @@ /* #region Close floating buttons */ .close-floating-buttons { - margin-left: 5px !important; + margin-inline-start: 5px !important; } .close-floating-buttons:first-child { @@ -140,7 +139,7 @@ z-index: 10; position: absolute; top: 50px; - right: 10px; + inset-inline-end: 10px; width: 400px; border-radius: 10px; background-color: var(--accented-background-color); @@ -150,8 +149,8 @@ } .backlink-excerpt { - border-left: 2px solid var(--main-border-color); - padding-left: 10px; + border-inline-start: 2px solid var(--main-border-color); + padding-inline-start: 10px; opacity: 80%; font-size: 90%; } diff --git a/apps/client/src/widgets/FloatingButtons.tsx b/apps/client/src/widgets/FloatingButtons.tsx index ab62428ab..42d5ee349 100644 --- a/apps/client/src/widgets/FloatingButtons.tsx +++ b/apps/client/src/widgets/FloatingButtons.tsx @@ -6,7 +6,7 @@ import { ParentComponent } from "./react/react_utils"; import { EventData, EventNames } from "../components/app_context"; import { type FloatingButtonsList, type FloatingButtonContext } from "./FloatingButtonsDefinitions"; import ActionButton from "./react/ActionButton"; -import { ViewTypeOptions } from "../services/note_list_renderer"; +import { ViewTypeOptions } from "./collections/interface"; interface FloatingButtonsProps { items: FloatingButtonsList; diff --git a/apps/client/src/widgets/FloatingButtonsDefinitions.tsx b/apps/client/src/widgets/FloatingButtonsDefinitions.tsx index e03e6b637..8f4288eff 100644 --- a/apps/client/src/widgets/FloatingButtonsDefinitions.tsx +++ b/apps/client/src/widgets/FloatingButtonsDefinitions.tsx @@ -19,7 +19,7 @@ import { getHelpUrlForNote } from "../services/in_app_help"; import froca from "../services/froca"; import NoteLink from "./react/NoteLink"; import RawHtml from "./react/RawHtml"; -import { ViewTypeOptions } from "../services/note_list_renderer"; +import { ViewTypeOptions } from "./collections/interface"; export interface FloatingButtonContext { parentComponent: Component; @@ -218,8 +218,8 @@ function SaveToNoteButton({ note }: FloatingButtonContext) { /> } -function RelationMapButtons({ note, triggerEvent }: FloatingButtonContext) { - const isEnabled = (note.type === "relationMap"); +function RelationMapButtons({ note, isDefaultViewMode, triggerEvent }: FloatingButtonContext) { + const isEnabled = (note.type === "relationMap" && isDefaultViewMode); return isEnabled && ( <> - - -
- -
-`; - -export default class ApiLogWidget extends NoteContextAwareWidget { - - private $logContainer!: JQuery; - private $closeButton!: JQuery; - - isEnabled() { - return !!this.note && this.note.mime.startsWith("application/javascript;env=") && super.isEnabled(); - } - - doRender() { - this.$widget = $(TPL); - this.toggle(false); - - this.$logContainer = this.$widget.find(".api-log-container"); - this.$closeButton = this.$widget.find(".close-api-log-button"); - this.$closeButton.on("click", () => this.toggle(false)); - } - - async refreshWithNote(note: FNote) { - this.$logContainer.empty(); - } - - apiLogMessagesEvent({ messages, noteId }: EventData<"apiLogMessages">) { - if (!this.isNote(noteId)) { - return; - } - - this.toggle(true); - - for (const message of messages) { - this.$logContainer.append(message).append($("
")); - } - } - - toggle(show: boolean) { - this.$widget.toggleClass("hidden-api-log", !show); - } -} diff --git a/apps/client/src/widgets/api_log.tsx b/apps/client/src/widgets/api_log.tsx new file mode 100644 index 000000000..ba0f8e095 --- /dev/null +++ b/apps/client/src/widgets/api_log.tsx @@ -0,0 +1,41 @@ +import { useEffect, useState } from "preact/hooks"; +import "./api_log.css"; +import { useNoteContext, useTriliumEvent } from "./react/hooks"; +import ActionButton from "./react/ActionButton"; +import { t } from "../services/i18n"; + +/** + * Displays the messages that are logged by the current note via `api.log`, for frontend and backend scripts. + */ +export default function ApiLog() { + const { note, noteId } = useNoteContext(); + const [ messages, setMessages ] = useState(); + + useTriliumEvent("apiLogMessages", ({ messages, noteId: eventNoteId }) => { + if (eventNoteId !== noteId) return; + setMessages(messages); + }); + + // Clear when navigating away. + useEffect(() => setMessages(undefined), [ note ]); + + const isEnabled = note?.mime.startsWith("application/javascript;env=") && messages?.length; + return ( +
+ {isEnabled && ( + <> + setMessages(undefined)} + /> + +
+ {messages.join("\n")} +
+ + )} +
+ ) +} diff --git a/apps/client/src/widgets/attachment_detail.ts b/apps/client/src/widgets/attachment_detail.ts index 1d2eab902..31be61536 100644 --- a/apps/client/src/widgets/attachment_detail.ts +++ b/apps/client/src/widgets/attachment_detail.ts @@ -30,7 +30,7 @@ const TPL = /*html*/` } .attachment-details { - margin-left: 10px; + margin-inline-start: 10px; } .attachment-content-wrapper { diff --git a/apps/client/src/widgets/attribute_widgets/attribute_detail.ts b/apps/client/src/widgets/attribute_widgets/attribute_detail.ts index cdb7c7b43..2a7a55aef 100644 --- a/apps/client/src/widgets/attribute_widgets/attribute_detail.ts +++ b/apps/client/src/widgets/attribute_widgets/attribute_detail.ts @@ -36,7 +36,7 @@ const TPL = /*html*/` } .related-notes-list { - padding-left: 20px; + padding-inline-start: 20px; margin-top: 10px; margin-bottom: 10px; } @@ -46,7 +46,7 @@ const TPL = /*html*/` } .attr-edit-table th { - text-align: left; + text-align: start; } .attr-edit-table td input[not(type="checkbox")] { @@ -150,7 +150,7 @@ const TPL = /*html*/` ${t("attribute_detail.precision")}
- + ${t("attribute_detail.digits")}
@@ -176,7 +176,7 @@ const TPL = /*html*/`
); -}); \ No newline at end of file +}); diff --git a/apps/client/src/widgets/buttons/abstract_button.ts b/apps/client/src/widgets/buttons/abstract_button.ts index 7e0923b41..308009fa6 100644 --- a/apps/client/src/widgets/buttons/abstract_button.ts +++ b/apps/client/src/widgets/buttons/abstract_button.ts @@ -1,5 +1,6 @@ import { Tooltip } from "bootstrap"; import NoteContextAwareWidget from "../note_context_aware_widget.js"; +import { handleRightToLeftPlacement } from "../../services/utils.js"; const TPL = /*html*/` - - - -`; - -export default class GlobalMenuWidget extends BasicWidget { - private updateAvailableWidget: UpdateAvailableWidget; - private isHorizontalLayout: boolean; - private tooltip!: Tooltip; - private dropdown!: Dropdown; - - private $updateToLatestVersionButton!: JQuery; - private $zoomState!: JQuery; - private $toggleZenMode!: JQuery; - - constructor(isHorizontalLayout: boolean) { - super(); - - this.updateAvailableWidget = new UpdateAvailableWidget(); - this.isHorizontalLayout = isHorizontalLayout; - } - - doRender() { - this.$widget = $(TPL); - - if (!this.isHorizontalLayout) { - this.$widget.addClass("dropend"); - } - - const $globalMenuButton = this.$widget.find(".global-menu-button"); - if (!this.isHorizontalLayout) { - $globalMenuButton.prepend( - $(`\ - - - - - - - - - - - - - - - `) - ); - - this.tooltip = new Tooltip(this.$widget.find("[data-bs-toggle='tooltip']")[0], { trigger: "hover" }); - } else { - $globalMenuButton.toggleClass("bx bx-menu"); - } - - this.dropdown = Dropdown.getOrCreateInstance(this.$widget.find("[data-bs-toggle='dropdown']")[0], { - popperConfig: { - placement: "bottom" - } - }); - - this.$widget.find(".show-about-dialog-button").on("click", () => this.triggerCommand("openAboutDialog")); - - const isElectron = utils.isElectron(); - - this.$widget.find(".toggle-pin").toggle(isElectron); - if (isElectron) { - this.$widget.on("click", ".toggle-pin", (e) => { - const $el = $(e.target); - const remote = utils.dynamicRequire("@electron/remote"); - const focusedWindow = remote.BrowserWindow.getFocusedWindow(); - const isAlwaysOnTop = focusedWindow.isAlwaysOnTop(); - if (isAlwaysOnTop) { - focusedWindow.setAlwaysOnTop(false); - $el.removeClass("active"); - } else { - focusedWindow.setAlwaysOnTop(true); - $el.addClass("active"); - } - }); - } - - this.$widget.find(".logout-button").toggle(!isElectron); - this.$widget.find(".logout-button-separator").toggle(!isElectron); - - this.$widget.find(".open-dev-tools-button").toggle(isElectron); - this.$widget.find(".switch-to-mobile-version-button").toggle(!isElectron && utils.isDesktop()); - this.$widget.find(".switch-to-desktop-version-button").toggle(!isElectron && utils.isMobile()); - - this.$widget.on("click", ".dropdown-item", (e) => { - if ($(e.target).parent(".zoom-buttons")) { - return; - } - - this.dropdown.toggle(); - }); - if (utils.isMobile()) { - this.$widget.on("click", ".dropdown-submenu .dropdown-toggle", (e) => { - const $submenu = $(e.target).closest(".dropdown-item"); - $submenu.toggleClass("submenu-open"); - $submenu.find("ul.dropdown-menu").toggleClass("show"); - e.stopPropagation(); - return; - }); - } - this.$widget.on("click", ".dropdown-submenu", (e) => { - if ($(e.target).children(".dropdown-menu").length === 1 || $(e.target).hasClass("dropdown-toggle")) { - e.stopPropagation(); - } - }); - - this.$widget.find(".global-menu-button-update-available").append(this.updateAvailableWidget.render()); - - this.$updateToLatestVersionButton = this.$widget.find(".update-to-latest-version-button"); - - if (!utils.isElectron()) { - this.$widget.find(".zoom-container").hide(); - } - - this.$zoomState = this.$widget.find(".zoom-state"); - this.$toggleZenMode = this.$widget.find('[data-trigger-command="toggleZenMode"'); - this.$widget.on("show.bs.dropdown", () => this.#onShown()); - if (this.tooltip) { - this.$widget.on("hide.bs.dropdown", () => this.tooltip.enable()); - } - - this.$widget.find(".zoom-buttons").on( - "click", - // delay to wait for the actual zoom change - () => setTimeout(() => this.updateZoomState(), 300) - ); - - this.updateVersionStatus(); - - setInterval(() => this.updateVersionStatus(), 8 * 60 * 60 * 1000); - } - - #onShown() { - this.$toggleZenMode.toggleClass("active", $("body").hasClass("zen")); - this.updateZoomState(); - if (this.tooltip) { - this.tooltip.hide(); - this.tooltip.disable(); - } - } - - updateZoomState() { - if (!utils.isElectron()) { - return; - } - - const zoomFactor = utils.dynamicRequire("electron").webFrame.getZoomFactor(); - const zoomPercent = Math.round(zoomFactor * 100); - - this.$zoomState.text(`${zoomPercent}%`); - } - - async updateVersionStatus() { - await options.initializedPromise; - - if (options.get("checkForUpdates") !== "true") { - return; - } - - const latestVersion = await this.fetchLatestVersion(); - this.updateAvailableWidget.updateVersionStatus(latestVersion); - // Show "click to download" button in options menu if there's a new version available - this.$updateToLatestVersionButton.toggle(utils.isUpdateAvailable(latestVersion, glob.triliumVersion)); - this.$updateToLatestVersionButton.find(".version-text").text(`Version ${latestVersion} is available, click to download.`); - } - - async fetchLatestVersion() { - const RELEASES_API_URL = "https://api.github.com/repos/TriliumNext/Trilium/releases/latest"; - - const resp = await fetch(RELEASES_API_URL); - const data = await resp.json(); - - return data?.tag_name?.substring(1); - } - - downloadLatestVersionCommand() { - window.open("https://github.com/TriliumNext/Trilium/releases/latest"); - } - - activeContextChangedEvent() { - this.dropdown.hide(); - } - - noteSwitchedEvent() { - this.dropdown.hide(); - } -} diff --git a/apps/client/src/widgets/buttons/global_menu.tsx b/apps/client/src/widgets/buttons/global_menu.tsx new file mode 100644 index 000000000..9b36d83a5 --- /dev/null +++ b/apps/client/src/widgets/buttons/global_menu.tsx @@ -0,0 +1,243 @@ +import Dropdown from "../react/Dropdown"; +import "./global_menu.css"; +import { useStaticTooltip, useStaticTooltipWithKeyboardShortcut, useTriliumOption, useTriliumOptionBool, useTriliumOptionInt } from "../react/hooks"; +import { useContext, useEffect, useRef, useState } from "preact/hooks"; +import { t } from "../../services/i18n"; +import { FormDropdownDivider, FormDropdownSubmenu, FormListHeader, FormListItem } from "../react/FormList"; +import { CommandNames } from "../../components/app_context"; +import KeyboardShortcut from "../react/KeyboardShortcut"; +import { KeyboardActionNames } from "@triliumnext/commons"; +import { ComponentChildren } from "preact"; +import Component from "../../components/component"; +import { ParentComponent } from "../react/react_utils"; +import utils, { dynamicRequire, isElectron, isMobile } from "../../services/utils"; + +interface MenuItemProps { + icon: string, + text: ComponentChildren, + title?: string, + command: T, + disabled?: boolean + active?: boolean; + outsideChildren?: ComponentChildren; +} + +export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout: boolean }) { + const isVerticalLayout = !isHorizontalLayout; + const parentComponent = useContext(ParentComponent); + const { isUpdateAvailable, latestVersion } = useTriliumUpdateStatus(); + + return ( + + {isVerticalLayout && } + {isUpdateAvailable && } + } + noDropdownListStyle + > + + + + + + + + + + + + + + + + + + + + + {isUpdateAvailable && <> + + window.open("https://github.com/TriliumNext/Trilium/releases/latest")} + icon="bx bx-download" + text={t("global_menu.download-update", {latestVersion})} /> + } + + {!isElectron() && } + + ) +} + +function AdvancedMenu() { + return ( + + + + + + + + + + + {isElectron() && } + + + ) +} + +function BrowserOnlyOptions() { + return <> + + + ; +} + +function SwitchToOptions() { + if (isElectron()) { + return; + } else if (!isMobile()) { + return + } else { + return + } +} + +function MenuItem({ icon, text, title, command, disabled, active }: MenuItemProps void)>) { + return {text} +} + +function KeyboardActionMenuItem({ text, command, ...props }: MenuItemProps) { + return {text} } + /> +} + +function VerticalLayoutIcon() { + const logoRef = useRef(null); + useStaticTooltip(logoRef); + + return ( + + + + + + + + + + + + + + + + ) +} + +function ZoomControls({ parentComponent }: { parentComponent?: Component | null }) { + const [ zoomLevel ] = useTriliumOption("zoomFactor"); + + function ZoomControlButton({ command, title, icon, children, dismiss }: { command: KeyboardActionNames, title: string, icon?: string, children?: ComponentChildren, dismiss?: boolean }) { + const linkRef = useRef(null); + useStaticTooltipWithKeyboardShortcut(linkRef, title, command, { + placement: "bottom", + fallbackPlacements: [ "bottom" ] + }); + return ( + { + parentComponent?.triggerCommand(command); + if (!dismiss) { + e.stopPropagation(); + } + }} + className={`dropdown-item-button ${icon}`} + >{children} + ) + } + + return isElectron() ? ( + e.stopPropagation()} + > + {t("global_menu.zoom")} + <> +
+ +   + + {(parseFloat(zoomLevel) * 100).toFixed(0)}{t("units.percentage")} + +
+ +
+ ) : ( + + ); +} + +function ToggleWindowOnTop() { + const focusedWindow = isElectron() ? dynamicRequire("@electron/remote").BrowserWindow.getFocusedWindow() : null; + const [ isAlwaysOnTop, setIsAlwaysOnTop ] = useState(focusedWindow?.isAlwaysOnTop()); + + return (isElectron() && + { + const newState = !isAlwaysOnTop; + focusedWindow?.setAlwaysOnTop(newState); + setIsAlwaysOnTop(newState); + }} + /> + ) +} + +function useTriliumUpdateStatus() { + const [ latestVersion, setLatestVersion ] = useState(); + const [ checkForUpdates ] = useTriliumOptionBool("checkForUpdates"); + const isUpdateAvailable = utils.isUpdateAvailable(latestVersion, glob.triliumVersion); + + async function updateVersionStatus() { + const RELEASES_API_URL = "https://api.github.com/repos/TriliumNext/Trilium/releases/latest"; + + const resp = await fetch(RELEASES_API_URL); + const data = await resp.json(); + const latestVersion = data?.tag_name?.substring(1); + setLatestVersion(latestVersion); + } + + useEffect(() => { + if (!checkForUpdates) { + setLatestVersion(undefined); + return; + } + + updateVersionStatus(); + + const interval = setInterval(() => updateVersionStatus(), 8 * 60 * 60 * 1000); + return () => clearInterval(interval); + }, [ checkForUpdates ]); + + return { isUpdateAvailable, latestVersion }; +} diff --git a/apps/client/src/widgets/buttons/history_navigation.ts b/apps/client/src/widgets/buttons/history_navigation.ts index 9fa54c60a..74eaf6acc 100644 --- a/apps/client/src/widgets/buttons/history_navigation.ts +++ b/apps/client/src/widgets/buttons/history_navigation.ts @@ -1,24 +1,11 @@ import utils from "../../services/utils.js"; -import contextMenu from "../../menus/context_menu.js"; +import contextMenu, { MenuCommandItem } from "../../menus/context_menu.js"; import treeService from "../../services/tree.js"; import ButtonFromNoteWidget from "./button_from_note.js"; import type FNote from "../../entities/fnote.js"; import type { CommandNames } from "../../components/app_context.js"; - -interface WebContents { - history: string[]; - getActiveIndex(): number; - clearHistory(): void; - canGoBack(): boolean; - canGoForward(): boolean; - goToIndex(index: string): void; -} - -interface ContextMenuItem { - title: string; - idx: string; - uiIcon: string; -} +import type { WebContents } from "electron"; +import link from "../../services/link.js"; export default class HistoryNavigationButton extends ButtonFromNoteWidget { private webContents?: WebContents; @@ -51,28 +38,24 @@ export default class HistoryNavigationButton extends ButtonFromNoteWidget { async showContextMenu(e: JQuery.ContextMenuEvent) { e.preventDefault(); - if (!this.webContents || this.webContents.history.length < 2) { + if (!this.webContents || this.webContents.navigationHistory.length() < 2) { return; } - let items: ContextMenuItem[] = []; + let items: MenuCommandItem[] = []; - const activeIndex = this.webContents.getActiveIndex(); - const history = this.webContents.history; + const history = this.webContents.navigationHistory.getAllEntries(); + const activeIndex = this.webContents.navigationHistory.getActiveIndex(); for (const idx in history) { - const url = history[idx]; - const parts = url.split("#"); - if (parts.length < 2) continue; - - const notePathWithTab = parts[1]; - const notePath = notePathWithTab.split("-")[0]; + const { notePath } = link.parseNavigationStateFromUrl(history[idx].url); + if (!notePath) continue; const title = await treeService.getNotePathTitle(notePath); items.push({ title, - idx, + command: idx, uiIcon: parseInt(idx) === activeIndex ? "bx bx-radio-circle-marked" // compare with type coercion! @@ -92,9 +75,10 @@ export default class HistoryNavigationButton extends ButtonFromNoteWidget { x: e.pageX, y: e.pageY, items, - selectMenuItemHandler: (item: any) => { - if (item && item.idx && this.webContents) { - this.webContents.goToIndex(item.idx); + selectMenuItemHandler: (item: MenuCommandItem) => { + if (item && item.command && this.webContents) { + const idx = parseInt(item.command, 10); + this.webContents.navigationHistory.goToIndex(idx); } } }); diff --git a/apps/client/src/widgets/buttons/left_pane_toggle.css b/apps/client/src/widgets/buttons/left_pane_toggle.css new file mode 100644 index 000000000..e1ef90c8a --- /dev/null +++ b/apps/client/src/widgets/buttons/left_pane_toggle.css @@ -0,0 +1,29 @@ +@keyframes left-pane-toggle-button-expand { + from { + rotate: 0deg; + } to { + rotate: 180deg; + } +} + +@keyframes left-pane-toggle-button-collapse { + from { + rotate: 180deg; + } to { + rotate: 360deg; + } +} + +.layout-vertical .left-pane-toggle-button::before { + display: block; +} + +.layout-vertical .left-pane-toggle-button.action-collapse::before { + rotate: 360deg; + animation: left-pane-toggle-button-collapse 600ms ease-in-out; +} + +.layout-vertical .left-pane-toggle-button.action-expand::before { + rotate: 180deg; + animation: left-pane-toggle-button-expand 600ms ease-in-out; +} \ No newline at end of file diff --git a/apps/client/src/widgets/buttons/left_pane_toggle.ts b/apps/client/src/widgets/buttons/left_pane_toggle.ts deleted file mode 100644 index 22a902622..000000000 --- a/apps/client/src/widgets/buttons/left_pane_toggle.ts +++ /dev/null @@ -1,43 +0,0 @@ -import options from "../../services/options.js"; -import splitService from "../../services/resizer.js"; -import CommandButtonWidget from "./command_button.js"; -import { t } from "../../services/i18n.js"; -import type { EventData } from "../../components/app_context.js"; - -export default class LeftPaneToggleWidget extends CommandButtonWidget { - private currentLeftPaneVisible: boolean; - - constructor(isHorizontalLayout: boolean) { - super(); - - this.currentLeftPaneVisible = options.is("leftPaneVisible"); - - this.class(isHorizontalLayout ? "toggle-button" : "launcher-button"); - - this.settings.icon = () => { - if (options.get("layoutOrientation") === "horizontal") { - return "bx-sidebar"; - } - - return this.currentLeftPaneVisible ? "bx-chevrons-left" : "bx-chevrons-right"; - }; - - this.settings.title = () => (this.currentLeftPaneVisible ? t("left_pane_toggle.hide_panel") : t("left_pane_toggle.show_panel")); - - this.settings.command = () => (this.currentLeftPaneVisible ? "hideLeftPane" : "showLeftPane"); - - if (isHorizontalLayout) { - this.settings.titlePlacement = "bottom"; - } - } - - refreshIcon() { - super.refreshIcon(); - splitService.setupLeftPaneResizer(this.currentLeftPaneVisible); - } - - setLeftPaneVisibilityEvent({ leftPaneVisible }: EventData<"setLeftPaneVisibility">) { - this.currentLeftPaneVisible = leftPaneVisible ?? !this.currentLeftPaneVisible; - this.refreshIcon(); - } -} diff --git a/apps/client/src/widgets/buttons/left_pane_toggle.tsx b/apps/client/src/widgets/buttons/left_pane_toggle.tsx new file mode 100644 index 000000000..106c4be00 --- /dev/null +++ b/apps/client/src/widgets/buttons/left_pane_toggle.tsx @@ -0,0 +1,28 @@ +import "./left_pane_toggle.css"; +import { useEffect, useState } from "preact/hooks"; +import ActionButton from "../react/ActionButton"; +import options from "../../services/options"; +import { t } from "../../services/i18n"; +import { useTriliumEvent } from "../react/hooks"; +import resizer from "../../services/resizer"; + +export default function LeftPaneToggle({ isHorizontalLayout }: { isHorizontalLayout: boolean }) { + const [ currentLeftPaneVisible, setCurrentLeftPaneVisible ] = useState(options.is("leftPaneVisible")); + + useTriliumEvent("setLeftPaneVisibility", ({ leftPaneVisible }) => { + setCurrentLeftPaneVisible(leftPaneVisible ?? !currentLeftPaneVisible); + }); + + useEffect(() => { + resizer.setupLeftPaneResizer(currentLeftPaneVisible); + }, [ currentLeftPaneVisible ]); + + return ( + + ) +} \ No newline at end of file diff --git a/apps/client/src/widgets/buttons/move_pane_button.ts b/apps/client/src/widgets/buttons/move_pane_button.ts deleted file mode 100644 index b1df66991..000000000 --- a/apps/client/src/widgets/buttons/move_pane_button.ts +++ /dev/null @@ -1,55 +0,0 @@ -import OnClickButtonWidget from "./onclick_button.js"; -import appContext from "../../components/app_context.js"; -import { t } from "../../services/i18n.js"; - -export default class MovePaneButton extends OnClickButtonWidget { - - private isMovingLeft: boolean; - - constructor(isMovingLeft: boolean) { - super(); - - this.isMovingLeft = isMovingLeft; - - this.icon(isMovingLeft ? "bx-chevron-left" : "bx-chevron-right") - .title(isMovingLeft ? t("move_pane_button.move_left") : t("move_pane_button.move_right")) - .titlePlacement("bottom") - .onClick(async (widget, e) => { - e.stopPropagation(); - widget.triggerCommand("moveThisNoteSplit", { ntxId: widget.getClosestNtxId(), isMovingLeft: this.isMovingLeft }); - }) - .class("icon-action"); - } - - isEnabled() { - if (!super.isEnabled()) { - return false; - } - - if (this.isMovingLeft) { - // movable if the current context is not a main context, i.e. non-null mainNtxId - return !!this.noteContext?.mainNtxId; - } else { - const currentIndex = appContext.tabManager.noteContexts.findIndex((c) => c.ntxId === this.ntxId); - const nextContext = appContext.tabManager.noteContexts[currentIndex + 1]; - // movable if the next context is not null and not a main context, i.e. non-null mainNtxId - return !!nextContext?.mainNtxId; - } - } - - async noteContextRemovedEvent() { - this.refresh(); - } - - async newNoteContextCreatedEvent() { - this.refresh(); - } - - async noteContextReorderEvent() { - this.refresh(); - } - - async contextsReopenedEvent() { - this.refresh(); - } -} diff --git a/apps/client/src/widgets/buttons/move_pane_button.tsx b/apps/client/src/widgets/buttons/move_pane_button.tsx new file mode 100644 index 000000000..0cbfe5e55 --- /dev/null +++ b/apps/client/src/widgets/buttons/move_pane_button.tsx @@ -0,0 +1,42 @@ +import { useContext, useState } from "preact/hooks"; +import { t } from "../../services/i18n"; +import ActionButton from "../react/ActionButton"; +import { ParentComponent } from "../react/react_utils"; +import BasicWidget from "../basic_widget"; +import { useNoteContext, useTriliumEvents } from "../react/hooks"; +import appContext from "../../components/app_context"; + +interface MovePaneButtonProps { + direction: "left" | "right"; +} + +export default function MovePaneButton({ direction }: MovePaneButtonProps) { + const parentWidget = useContext(ParentComponent) as BasicWidget | undefined; + const { noteContext, ntxId } = useNoteContext(); + const [ refreshCounter, setRefreshCounter ] = useState(0); + + function isEnabled() { + if (direction === "left") { + // movable if the current context is not a main context, i.e. non-null mainNtxId + return !!noteContext?.mainNtxId; + } else { + const currentIndex = appContext.tabManager.noteContexts.findIndex((c) => c.ntxId === ntxId); + const nextContext = appContext.tabManager.noteContexts[currentIndex + 1]; + // movable if the next context is not null and not a main context, i.e. non-null mainNtxId + return !!nextContext?.mainNtxId; + } + } + + useTriliumEvents([ "noteContextRemoved", "newNoteContextCreated", "noteContextReorder", "contextsReopened" ], () => { + setRefreshCounter(refreshCounter + 1); + }); + + return ( + parentWidget?.triggerCommand("moveThisNoteSplit", { ntxId: parentWidget.getClosestNtxId(), isMovingLeft: direction === "left" }))} + className={!isEnabled() ? "hidden-ext" : ""} + /> + ); +} diff --git a/apps/client/src/widgets/buttons/right_dropdown_button.ts b/apps/client/src/widgets/buttons/right_dropdown_button.ts index 7442ebdfd..7c43f14af 100644 --- a/apps/client/src/widgets/buttons/right_dropdown_button.ts +++ b/apps/client/src/widgets/buttons/right_dropdown_button.ts @@ -1,3 +1,4 @@ +import { handleRightToLeftPlacement } from "../../services/utils.js"; import BasicWidget from "../basic_widget.js"; import { Tooltip, Dropdown } from "bootstrap"; type PopoverPlacement = Tooltip.PopoverPlacement; @@ -46,18 +47,17 @@ export default class RightDropdownButtonWidget extends BasicWidget { } }); - this.$tooltip = this.$widget.find(".tooltip-trigger").attr("title", this.title); - this.tooltip = new Tooltip(this.$tooltip[0], { - placement: this.settings.titlePlacement, - fallbackPlacements: [this.settings.titlePlacement] + this.$widget.attr("title", this.title); + this.tooltip = Tooltip.getOrCreateInstance(this.$widget[0], { + trigger: "hover", + placement: handleRightToLeftPlacement(this.settings.titlePlacement), + fallbackPlacements: [ handleRightToLeftPlacement(this.settings.titlePlacement) ] }); this.$widget .find(".right-dropdown-button") .addClass(this.iconClass) - .on("click", () => this.tooltip.hide()) - .on("mouseenter", () => this.tooltip.show()) - .on("mouseleave", () => this.tooltip.hide()); + .on("click", () => this.tooltip.hide()); this.$widget.on("show.bs.dropdown", async () => { await this.dropdownShown(); diff --git a/apps/client/src/widgets/buttons/update_available.ts b/apps/client/src/widgets/buttons/update_available.ts deleted file mode 100644 index 2f2535cc0..000000000 --- a/apps/client/src/widgets/buttons/update_available.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { t } from "../../services/i18n.js"; -import BasicWidget from "../basic_widget.js"; -import utils from "../../services/utils.js"; - -const TPL = /*html*/` -
- - - -
-`; - -export default class UpdateAvailableWidget extends BasicWidget { - doRender() { - this.$widget = $(TPL); - } - - updateVersionStatus(latestVersion: string) { - this.$widget.toggle(utils.isUpdateAvailable(latestVersion, glob.triliumVersion)); - } -} diff --git a/apps/client/src/widgets/close_zen_button.css b/apps/client/src/widgets/close_zen_button.css new file mode 100644 index 000000000..52bbbc086 --- /dev/null +++ b/apps/client/src/widgets/close_zen_button.css @@ -0,0 +1,26 @@ +:root { + --zen-button-size: 32px; +} + +.close-zen-container { + width: var(--zen-button-size); + height: var(--zen-button-size); +} + +body.zen .close-zen-container { + display: block; + position: fixed; + top: 2px; + inset-inline-end: 2px; + z-index: 9999; + -webkit-app-region: no-drag; +} + +body.zen.mobile .close-zen-container { + top: -2px; +} + +body.zen.electron:not(.platform-darwin):not(.native-titlebar) .close-zen-container { + inset-inline-start: calc(env(titlebar-area-width) - var(--zen-button-size) - 2px); + inset-inline-end: unset; +} \ No newline at end of file diff --git a/apps/client/src/widgets/close_zen_button.ts b/apps/client/src/widgets/close_zen_button.ts deleted file mode 100644 index 7ee4fcc28..000000000 --- a/apps/client/src/widgets/close_zen_button.ts +++ /dev/null @@ -1,54 +0,0 @@ -import BasicWidget from "./basic_widget.js"; -import { t } from "../services/i18n.js"; -import utils from "../services/utils.js"; - -const TPL = /*html*/`\ -
-
-`; - -export default class CloseZenButton extends BasicWidget { - - doRender(): void { - this.$widget = $(TPL); - } - - zenChangedEvent() { - this.toggleInt(true); - } - -} diff --git a/apps/client/src/widgets/close_zen_button.tsx b/apps/client/src/widgets/close_zen_button.tsx new file mode 100644 index 000000000..21b364da4 --- /dev/null +++ b/apps/client/src/widgets/close_zen_button.tsx @@ -0,0 +1,25 @@ +import { useState } from "preact/hooks"; +import { t } from "../services/i18n"; +import ActionButton from "./react/ActionButton"; +import { useTriliumEvent } from "./react/hooks"; +import "./close_zen_button.css"; + +export default function CloseZenModeButton() { + const [ zenModeEnabled, setZenModeEnabled ] = useState(false); + + useTriliumEvent("zenModeChanged", ({ isEnabled }) => { + setZenModeEnabled(isEnabled); + }); + + return ( +
+ {zenModeEnabled && ( + + )} +
+ ) +} diff --git a/apps/client/src/widgets/collections/NoteList.css b/apps/client/src/widgets/collections/NoteList.css new file mode 100644 index 000000000..08fab236c --- /dev/null +++ b/apps/client/src/widgets/collections/NoteList.css @@ -0,0 +1,25 @@ +.note-list-widget { + min-height: 0; + overflow: auto; + contain: none !important; +} + +.note-list-widget .note-list { + padding: 10px; +} + +.note-list-widget.full-height, +.note-list-widget.full-height .note-list-widget-content { + height: 100%; +} + +.note-list-widget video { + height: 100%; +} + +/* #region Pagination */ +.note-list-pager span.current-page { + text-decoration: underline; + font-weight: bold; +} +/* #endregion */ \ No newline at end of file diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx new file mode 100644 index 000000000..c39b4e7e8 --- /dev/null +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -0,0 +1,211 @@ +import { allViewTypes, ViewModeMedia, ViewModeProps, ViewTypeOptions } from "./interface"; +import { useNoteContext, useNoteLabel, useNoteLabelBoolean, useTriliumEvent } from "../react/hooks"; +import FNote from "../../entities/fnote"; +import "./NoteList.css"; +import { ListView, GridView } from "./legacy/ListOrGridView"; +import { useEffect, useRef, useState } from "preact/hooks"; +import GeoView from "./geomap"; +import ViewModeStorage from "./view_mode_storage"; +import CalendarView from "./calendar"; +import TableView from "./table"; +import BoardView from "./board"; +import { subscribeToMessages, unsubscribeToMessage as unsubscribeFromMessage } from "../../services/ws"; +import { WebSocketMessage } from "@triliumnext/commons"; +import froca from "../../services/froca"; +import PresentationView from "./presentation"; + +interface NoteListProps { + note: FNote | null | undefined; + notePath: string | null | undefined; + highlightedTokens?: string[] | null; + /** if set to `true` then only collection-type views are displayed such as geo-map and the calendar. The original book types grid and list will be ignored. */ + displayOnlyCollections?: boolean; + isEnabled: boolean; + ntxId: string | null | undefined; + media: ViewModeMedia; + onReady?: () => void; +} + +export default function NoteList(props: Pick) { + const { note, noteContext, notePath, ntxId } = useNoteContext(); + const isEnabled = noteContext?.hasNoteList(); + return +} + +export function SearchNoteList(props: Omit) { + return +} + +export function CustomNoteList({ note, isEnabled: shouldEnable, notePath, highlightedTokens, displayOnlyCollections, ntxId, onReady, ...restProps }: NoteListProps) { + const widgetRef = useRef(null); + const viewType = useNoteViewType(note); + const noteIds = useNoteIds(shouldEnable ? note : null, viewType, ntxId); + const isFullHeight = (viewType && viewType !== "list" && viewType !== "grid"); + const [ isIntersecting, setIsIntersecting ] = useState(false); + const shouldRender = (isFullHeight || isIntersecting || note?.type === "book"); + const isEnabled = (note && shouldEnable && !!viewType && shouldRender); + + useEffect(() => { + if (isFullHeight || displayOnlyCollections || note?.type === "book") { + // Double role: no need to check if the note list is visible if the view is full-height or book, but also prevent legacy views if `displayOnlyCollections` is true. + return; + } + + const observer = new IntersectionObserver( + (entries) => { + if (!isIntersecting) { + setIsIntersecting(entries[0].isIntersecting); + observer.disconnect(); + } + }, + { + rootMargin: "50px", + threshold: 0.1 + } + ); + + // there seems to be a race condition on Firefox which triggers the observer only before the widget is visible + // (intersection is false). https://github.com/zadam/trilium/issues/4165 + setTimeout(() => widgetRef.current && observer.observe(widgetRef.current), 10); + return () => observer.disconnect(); + }, [ widgetRef, isFullHeight, displayOnlyCollections, note ]); + + // Preload the configuration. + let props: ViewModeProps | undefined | null = null; + const viewModeConfig = useViewModeConfig(note, viewType); + if (note && notePath && viewModeConfig) { + props = { + note, noteIds, notePath, + highlightedTokens, + viewConfig: viewModeConfig[0], + saveConfig: viewModeConfig[1], + onReady: onReady ?? (() => {}), + ...restProps + } + } + + return ( +
+ {props && isEnabled && ( +
+ {getComponentByViewType(viewType, props)} +
+ )} +
+ ); +} + +function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps) { + switch (viewType) { + case "list": + return ; + case "grid": + return ; + case "geoMap": + return ; + case "calendar": + return + case "table": + return + case "board": + return + case "presentation": + return + } +} + +function useNoteViewType(note?: FNote | null): ViewTypeOptions | undefined { + const [ viewType ] = useNoteLabel(note, "viewType"); + + if (!note) { + return undefined; + } else if (!(allViewTypes as readonly string[]).includes(viewType || "")) { + // when not explicitly set, decide based on the note type + return note.type === "search" ? "list" : "grid"; + } else { + return viewType as ViewTypeOptions; + } +} + +export function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOptions | undefined, ntxId: string | null | undefined) { + const [ noteIds, setNoteIds ] = useState([]); + const [ includeArchived ] = useNoteLabelBoolean(note, "includeArchived"); + + async function refreshNoteIds() { + if (!note) { + setNoteIds([]); + } else { + setNoteIds(await getNoteIds(note)); + } + } + + async function getNoteIds(note: FNote) { + if (viewType === "list" || viewType === "grid" || viewType === "table" || note.type === "search") { + return note.getChildNoteIds(); + } else { + return await note.getSubtreeNoteIds(includeArchived); + } + } + + // Refresh on note switch. + useEffect(() => { refreshNoteIds() }, [ note, includeArchived ]); + + // Refresh on alterations to the note subtree. + useTriliumEvent("entitiesReloaded", ({ loadResults }) => { + if (note && loadResults.getBranchRows().some(branch => + branch.parentNoteId === note.noteId + || noteIds.includes(branch.parentNoteId ?? "")) + || loadResults.getAttributeRows().some(attr => attr.name === "archived" && attr.noteId && noteIds.includes(attr.noteId)) + ) { + refreshNoteIds(); + } + }) + + // Refresh on search. + useTriliumEvent("searchRefreshed", ({ ntxId: eventNtxId }) => { + if (eventNtxId !== ntxId) return; + refreshNoteIds(); + }); + + // Refresh on import. + useEffect(() => { + async function onImport(message: WebSocketMessage) { + if (!("taskType" in message) || message.taskType !== "importNotes" || message.type !== "taskSucceeded") return; + const { parentNoteId, importedNoteId } = message.result; + if (!parentNoteId || !importedNoteId) return; + if (importedNoteId && (parentNoteId === note?.noteId || noteIds.includes(parentNoteId))) { + const importedNote = await froca.getNote(importedNoteId); + if (!importedNote) return; + setNoteIds([ + ...noteIds, + ...await getNoteIds(importedNote), + importedNoteId + ]) + } + } + + subscribeToMessages(onImport); + return () => unsubscribeFromMessage(onImport); + }, [ note, noteIds, setNoteIds ]) + + return noteIds; +} + +export function useViewModeConfig(note: FNote | null | undefined, viewType: ViewTypeOptions | undefined) { + const [ viewConfig, setViewConfig ] = useState<[T | undefined, (data: T) => void]>(); + + useEffect(() => { + if (!note || !viewType) return; + setViewConfig(undefined); + const viewStorage = new ViewModeStorage(note, viewType); + viewStorage.restore().then(config => { + const storeFn = (config: T) => { + setViewConfig([ config, storeFn ]); + viewStorage.store(config); + }; + setViewConfig([ config, storeFn ]); + }); + }, [ note, viewType ]); + + return viewConfig; +} diff --git a/apps/client/src/widgets/collections/Pagination.tsx b/apps/client/src/widgets/collections/Pagination.tsx new file mode 100644 index 000000000..6b74964a6 --- /dev/null +++ b/apps/client/src/widgets/collections/Pagination.tsx @@ -0,0 +1,85 @@ +import { ComponentChildren } from "preact"; +import { Dispatch, StateUpdater, useEffect, useState } from "preact/hooks"; +import FNote from "../../entities/fnote"; +import froca from "../../services/froca"; +import { useNoteLabelInt } from "../react/hooks"; +import { t } from "../../services/i18n"; + +interface PaginationContext { + page: number; + setPage: Dispatch>; + pageNotes?: FNote[]; + pageCount: number; + pageSize: number; + totalNotes: number; +} + +export function Pager({ page, pageSize, setPage, pageCount, totalNotes }: Omit) { + if (pageCount < 2) return; + + let lastPrinted = false; + let children: ComponentChildren[] = []; + for (let i = 1; i <= pageCount; i++) { + if (pageCount < 20 || i <= 5 || pageCount - i <= 5 || Math.abs(page - i) <= 2) { + lastPrinted = true; + + const startIndex = (i - 1) * pageSize + 1; + const endIndex = Math.min(totalNotes, i * pageSize); + + if (i !== page) { + children.push(( + setPage(i)} + > + {i} + + )) + } else { + // Current page + children.push({i}) + } + + children.push(<>{" "} {" "}); + } else if (lastPrinted) { + children.push(<>{"... "} {" "}); + lastPrinted = false; + } + } + + return ( +
+ {children} + + ({t("pagination.total_notes", { count: totalNotes })}) +
+ ) +} + +export function usePagination(note: FNote, noteIds: string[]): PaginationContext { + const [ page, setPage ] = useState(1); + const [ pageNotes, setPageNotes ] = useState(); + + // Parse page size. + const [ pageSize ] = useNoteLabelInt(note, "pageSize"); + const normalizedPageSize = (pageSize && pageSize > 0 ? pageSize : 20); + + // Calculate start/end index. + const startIdx = (page - 1) * normalizedPageSize; + const endIdx = startIdx + normalizedPageSize; + const pageCount = Math.ceil(noteIds.length / normalizedPageSize); + + // Obtain notes within the range. + const pageNoteIds = noteIds.slice(startIdx, Math.min(endIdx, noteIds.length)); + + useEffect(() => { + froca.getNotes(pageNoteIds).then(setPageNotes); + }, [ note, noteIds, page, pageSize ]); + + return { + page, setPage, pageNotes, pageCount, + pageSize: normalizedPageSize, + totalNotes: noteIds.length + }; +} diff --git a/apps/client/src/widgets/collections/board/api.ts b/apps/client/src/widgets/collections/board/api.ts new file mode 100644 index 000000000..90d41d7c4 --- /dev/null +++ b/apps/client/src/widgets/collections/board/api.ts @@ -0,0 +1,210 @@ +import { BoardViewData } from "."; +import appContext from "../../../components/app_context"; +import FNote from "../../../entities/fnote"; +import attributes from "../../../services/attributes"; +import branches from "../../../services/branches"; +import { executeBulkActions } from "../../../services/bulk_action"; +import froca from "../../../services/froca"; +import { t } from "../../../services/i18n"; +import note_create from "../../../services/note_create"; +import server from "../../../services/server"; +import { ColumnMap } from "./data"; + +export default class BoardApi { + + constructor( + private byColumn: ColumnMap | undefined, + public columns: string[], + private parentNote: FNote, + private statusAttribute: string, + private viewConfig: BoardViewData, + private saveConfig: (newConfig: BoardViewData) => void, + private setBranchIdToEdit: (branchId: string | undefined) => void + ) {}; + + async createNewItem(column: string, title: string) { + try { + // Get the parent note path + const parentNotePath = this.parentNote.noteId; + + // Create a new note as a child of the parent note + const { note: newNote, branch: newBranch } = await note_create.createNote(parentNotePath, { + activate: false, + title + }); + + if (newNote && newBranch) { + await this.changeColumn(newNote.noteId, column); + } + } catch (error) { + console.error("Failed to create new item:", error); + } + } + + async changeColumn(noteId: string, newColumn: string) { + await attributes.setLabel(noteId, this.statusAttribute, newColumn); + } + + async addNewColumn(columnName: string) { + if (!columnName.trim()) { + return; + } + + if (!this.viewConfig) { + this.viewConfig = {}; + } + + if (!this.viewConfig.columns) { + this.viewConfig.columns = []; + } + + // Add the new column to persisted data if it doesn't exist + const existingColumn = this.viewConfig.columns.find(col => col.value === columnName); + if (!existingColumn) { + this.viewConfig.columns.push({ value: columnName }); + this.saveConfig(this.viewConfig); + } + } + + async removeColumn(column: string) { + // Remove the value from the notes. + const noteIds = this.byColumn?.get(column)?.map(item => item.note.noteId) || []; + await executeBulkActions(noteIds, [ + { + name: "deleteLabel", + labelName: this.statusAttribute + } + ]); + + this.viewConfig.columns = (this.viewConfig.columns ?? []).filter(col => col.value !== column); + this.saveConfig(this.viewConfig); + } + + async renameColumn(oldValue: string, newValue: string) { + const noteIds = this.byColumn?.get(oldValue)?.map(item => item.note.noteId) || []; + + // Change the value in the notes. + await executeBulkActions(noteIds, [ + { + name: "updateLabelValue", + labelName: this.statusAttribute, + labelValue: newValue + } + ]); + + // Rename the column in the persisted data. + for (const column of this.viewConfig.columns || []) { + if (column.value === oldValue) { + column.value = newValue; + } + } + this.saveConfig(this.viewConfig); + } + + reorderColumn(fromIndex: number, toIndex: number) { + if (!this.columns || fromIndex === toIndex) return; + + const newColumns = [...this.columns]; + const [movedColumn] = newColumns.splice(fromIndex, 1); + + // Adjust toIndex after removing the element + // When moving forward (right), the removal shifts indices left + let adjustedToIndex = toIndex; + if (fromIndex < toIndex) { + adjustedToIndex = toIndex - 1; + } + + newColumns.splice(adjustedToIndex, 0, movedColumn); + + // Update view config with new column order + const newViewConfig = { + ...this.viewConfig, + columns: newColumns.map(col => ({ value: col })) + }; + + this.saveConfig(newViewConfig); + return newColumns; + } + + async insertRowAtPosition( + column: string, + relativeToBranchId: string, + direction: "before" | "after") { + const { note, branch } = await note_create.createNote(this.parentNote.noteId, { + activate: false, + targetBranchId: relativeToBranchId, + target: direction, + title: t("board_view.new-item") + }); + + if (!note || !branch) { + throw new Error("Failed to create note"); + } + + const { noteId } = note; + await this.changeColumn(noteId, column); + this.startEditing(branch.branchId); + + return note; + } + + openNote(noteId: string) { + appContext.triggerCommand("openInPopup", { noteIdOrPath: noteId }); + } + + startEditing(branchId: string) { + this.setBranchIdToEdit(branchId); + } + + dismissEditingTitle() { + this.setBranchIdToEdit(undefined); + } + + renameCard(noteId: string, newTitle: string) { + return server.put(`notes/${noteId}/title`, { title: newTitle.trim() }); + } + + removeFromBoard(noteId: string) { + const note = froca.getNoteFromCache(noteId); + if (!note) return; + return attributes.removeOwnedLabelByName(note, this.statusAttribute); + } + + async moveWithinBoard(noteId: string, sourceBranchId: string, sourceIndex: number, targetIndex: number, sourceColumn: string, targetColumn: string) { + const targetItems = this.byColumn?.get(targetColumn) ?? []; + + const note = froca.getNoteFromCache(noteId); + if (!note) return; + + if (sourceColumn !== targetColumn) { + // Moving to a different column + await this.changeColumn(noteId, targetColumn); + + // If there are items in the target column, reorder + if (targetItems.length > 0 && targetIndex < targetItems.length) { + const targetBranch = targetItems[targetIndex].branch; + await branches.moveBeforeBranch([ sourceBranchId ], targetBranch.branchId); + } + } else if (sourceIndex !== targetIndex) { + // Reordering within the same column + let targetBranchId: string | null = null; + + if (targetIndex < targetItems.length) { + // Moving before an existing item + const adjustedIndex = sourceIndex < targetIndex ? targetIndex : targetIndex; + if (adjustedIndex < targetItems.length) { + targetBranchId = targetItems[adjustedIndex].branch.branchId; + if (targetBranchId) { + await branches.moveBeforeBranch([ sourceBranchId ], targetBranchId); + } + } + } else if (targetIndex > 0) { + // Moving to the end - place after the last item + const lastItem = targetItems[targetItems.length - 1]; + await branches.moveAfterBranch([ sourceBranchId ], lastItem.branch.branchId); + } + } + } + +} + diff --git a/apps/client/src/widgets/collections/board/card.tsx b/apps/client/src/widgets/collections/board/card.tsx new file mode 100644 index 000000000..2879f3a43 --- /dev/null +++ b/apps/client/src/widgets/collections/board/card.tsx @@ -0,0 +1,125 @@ +import { useCallback, useContext, useEffect, useRef, useState } from "preact/hooks"; +import FBranch from "../../../entities/fbranch"; +import FNote from "../../../entities/fnote"; +import BoardApi from "./api"; +import { BoardViewContext, TitleEditor } from "."; +import { ContextMenuEvent } from "../../../menus/context_menu"; +import { openNoteContextMenu } from "./context_menu"; +import { t } from "../../../services/i18n"; + +export const CARD_CLIPBOARD_TYPE = "trilium/board-card"; + +export interface CardDragData { + noteId: string; + branchId: string; + index: number; + fromColumn: string; +} + +export default function Card({ + api, + note, + branch, + column, + index, + isDragging +}: { + api: BoardApi, + note: FNote, + branch: FBranch, + column: string, + index: number, + isDragging: boolean +}) { + const { branchIdToEdit, setBranchIdToEdit, setDraggedCard } = useContext(BoardViewContext)!; + const isEditing = branch.branchId === branchIdToEdit; + const colorClass = note.getColorClass() || ''; + const editorRef = useRef(null); + const isArchived = note.isArchived; + const [ isVisible, setVisible ] = useState(true); + const [ title, setTitle ] = useState(note.title); + + const handleDragStart = useCallback((e: DragEvent) => { + e.dataTransfer!.effectAllowed = 'move'; + const data: CardDragData = { noteId: note.noteId, branchId: branch.branchId, fromColumn: column, index }; + setDraggedCard(data); + e.dataTransfer!.setData(CARD_CLIPBOARD_TYPE, JSON.stringify(data)); + }, [note.noteId, branch.branchId, column, index]); + + const handleDragEnd = useCallback((e: DragEvent) => { + setDraggedCard(null); + }, [setDraggedCard]); + + const handleContextMenu = useCallback((e: ContextMenuEvent) => { + openNoteContextMenu(api, e, note, branch.branchId, column); + }, [ api, note, branch, column ]); + + const handleOpen = useCallback(() => { + api.openNote(note.noteId); + }, [ api, note ]); + + const handleEdit = useCallback((e: MouseEvent) => { + e.stopPropagation(); // don't also open the note + setBranchIdToEdit?.(branch.branchId); + }, [ setBranchIdToEdit, branch ]); + + const handleKeyDown = useCallback((e: KeyboardEvent) => { + if (e.key === "Enter") { + api.openNote(note.noteId); + } else if (e.key === "F2") { + setBranchIdToEdit?.(branch.branchId); + } + }, [ setBranchIdToEdit, note ]); + + useEffect(() => { + editorRef.current?.focus(); + }, [ isEditing ]); + + useEffect(() => { + setTitle(note.title); + }, [ note ]); + + useEffect(() => { + setVisible(!isDragging); + }, [ isDragging ]); + + return ( +
+ {!isEditing ? ( + <> + + + {title} + + + + ) : ( + { + api.renameCard(note.noteId, newTitle); + setTitle(newTitle); + }} + dismiss={() => api.dismissEditingTitle()} + multiline + /> + )} +
+ ) +} diff --git a/apps/client/src/widgets/collections/board/column.tsx b/apps/client/src/widgets/collections/board/column.tsx new file mode 100644 index 000000000..a6779f30d --- /dev/null +++ b/apps/client/src/widgets/collections/board/column.tsx @@ -0,0 +1,293 @@ +import { useCallback, useContext, useEffect, useRef, useState } from "preact/hooks"; +import FBranch from "../../../entities/fbranch"; +import FNote from "../../../entities/fnote"; +import { BoardViewContext, TitleEditor } from "."; +import branches from "../../../services/branches"; +import { openColumnContextMenu } from "./context_menu"; +import { ContextMenuEvent } from "../../../menus/context_menu"; +import Icon from "../../react/Icon"; +import { t } from "../../../services/i18n"; +import BoardApi from "./api"; +import Card, { CARD_CLIPBOARD_TYPE, CardDragData } from "./card"; +import { JSX } from "preact/jsx-runtime"; +import froca from "../../../services/froca"; +import { DragData, TREE_CLIPBOARD_TYPE } from "../../note_tree"; + +interface DragContext { + column: string; + columnIndex: number, + columnItems?: { note: FNote, branch: FBranch }[]; +} + +export default function Column({ + column, + columnIndex, + isDraggingColumn, + columnItems, + api, + onColumnHover, + isAnyColumnDragging, +}: { + columnItems?: { note: FNote, branch: FBranch }[]; + isDraggingColumn: boolean, + api: BoardApi, + onColumnHover?: (index: number, mouseX: number, rect: DOMRect) => void, + isAnyColumnDragging?: boolean +} & DragContext) { + const [ isVisible, setVisible ] = useState(true); + const { columnNameToEdit, setColumnNameToEdit, dropTarget, draggedCard, dropPosition } = useContext(BoardViewContext)!; + const isEditing = (columnNameToEdit === column); + const editorRef = useRef(null); + const { handleColumnDragStart, handleColumnDragEnd, handleDragOver, handleDragLeave, handleDrop } = useDragging({ + column, columnIndex, columnItems, isEditing + }); + + const handleEdit = useCallback(() => { + setColumnNameToEdit?.(column); + }, [column]); + + const handleContextMenu = useCallback((e: ContextMenuEvent) => { + openColumnContextMenu(api, e, column); + }, [ api, column ]); + + const handleTitleKeyDown = useCallback((e: KeyboardEvent) => { + if (e.key === "F2") { + setColumnNameToEdit?.(column); + } + }, [ column ]); + + /** Allow using mouse wheel to scroll inside card, while also maintaining column horizontal scrolling. */ + const handleScroll = useCallback((event: JSX.TargetedWheelEvent) => { + const el = event.currentTarget; + if (!el) return; + + const needsScroll = el.scrollHeight > el.clientHeight; + if (needsScroll) { + event.stopPropagation(); + } + }, []); + + useEffect(() => { + editorRef.current?.focus(); + }, [ isEditing ]); + + useEffect(() => { + setVisible(!isDraggingColumn); + }, [ isDraggingColumn ]); + + const handleColumnDragOver = useCallback((e: DragEvent) => { + if (!isAnyColumnDragging || !onColumnHover) return; + e.preventDefault(); + const rect = (e.currentTarget as HTMLElement).getBoundingClientRect(); + onColumnHover(columnIndex, e.clientX, rect); + }, [isAnyColumnDragging, onColumnHover, columnIndex]); + + return ( +
+

+ {!isEditing ? ( + <> + {column} + + + ) : ( + api.renameColumn(column, newTitle)} + dismiss={() => setColumnNameToEdit?.(undefined)} + /> + )} +

+ +
+ {(columnItems ?? []).map(({ note, branch }, index) => { + const showIndicatorBefore = dropPosition?.column === column && + dropPosition.index === index && + draggedCard?.noteId !== note.noteId; + + return ( + <> + {showIndicatorBefore && ( +
+ )} + + + ); + })} + {dropPosition?.column === column && dropPosition.index === (columnItems?.length ?? 0) && ( +
+ )} + + +
+
+ ) +} + +function AddNewItem({ column, api }: { column: string, api: BoardApi }) { + const [ isCreatingNewItem, setIsCreatingNewItem ] = useState(false); + const addItemCallback = useCallback(() => setIsCreatingNewItem(true), []); + const handleKeyDown = useCallback((e: KeyboardEvent) => { + if (!isCreatingNewItem && e.key === "Enter") { + setIsCreatingNewItem(true); + } + }, []); + + return ( +
+ {!isCreatingNewItem ? ( + <> + {" "} + {t("board_view.new-item")} + + ) : ( + api.createNewItem(column, title)} + dismiss={() => setIsCreatingNewItem(false)} + multiline isNewItem + /> + )} +
+ ); +} + +function useDragging({ column, columnIndex, columnItems, isEditing }: DragContext & { isEditing: boolean }) { + const { api, parentNote, draggedColumn, setDraggedColumn, setDropTarget, setDropPosition, dropPosition } = useContext(BoardViewContext)!; + /** Needed to track if current column is dragged in real-time, since {@link draggedColumn} is populated one render cycle later. */ + const isDraggingRef = useRef(false); + + const handleColumnDragStart = useCallback((e: DragEvent) => { + if (isEditing) return; + + isDraggingRef.current = true; + e.dataTransfer!.effectAllowed = 'move'; + e.dataTransfer!.setData('text/plain', column); + setDraggedColumn({ column, index: columnIndex }); + e.stopPropagation(); // Prevent card drag from interfering + }, [column, columnIndex, setDraggedColumn, isEditing]); + + const handleColumnDragEnd = useCallback(() => { + isDraggingRef.current = false; + setDraggedColumn(null); + }, [setDraggedColumn]); + + const handleDragOver = useCallback((e: DragEvent) => { + if (isEditing || draggedColumn || isDraggingRef.current) return; // Don't handle card drops when dragging columns + if (!e.dataTransfer?.types.includes(CARD_CLIPBOARD_TYPE) && !e.dataTransfer?.types.includes(TREE_CLIPBOARD_TYPE)) return; + + e.preventDefault(); + setDropTarget(column); + + // Calculate drop position based on mouse position + const cards = Array.from((e.currentTarget as HTMLElement)?.querySelectorAll('.board-note')); + const mouseY = e.clientY; + + let newIndex = cards.length; + for (let i = 0; i < cards.length; i++) { + const card = cards[i] as HTMLElement; + const rect = card.getBoundingClientRect(); + const cardMiddle = rect.top + rect.height / 2; + + if (mouseY < cardMiddle) { + newIndex = i; + break; + } + } + + if (!(dropPosition?.column === column && dropPosition.index === newIndex)) { + setDropPosition({ column, index: newIndex }); + } + }, [column, setDropTarget, dropPosition, setDropPosition, isEditing]); + + const handleDragLeave = useCallback((e: DragEvent) => { + const relatedTarget = e.relatedTarget as HTMLElement; + const currentTarget = e.currentTarget as HTMLElement; + + if (!currentTarget.contains(relatedTarget)) { + setDropTarget(null); + setDropPosition(null); + } + }, [setDropTarget, setDropPosition]); + + const handleDrop = useCallback(async (e: DragEvent) => { + if (draggedColumn) return; // Don't handle card drops when dragging columns + e.preventDefault(); + setDropTarget(null); + setDropPosition(null); + + const data = e.dataTransfer?.getData(CARD_CLIPBOARD_TYPE) || e.dataTransfer?.getData("text"); + if (!data) return; + + let draggedCard: CardDragData | DragData[]; + try { + draggedCard = JSON.parse(data); + } catch (e) { + return; + } + + if (Array.isArray(draggedCard)) { + // From note tree. + const { noteId, branchId } = draggedCard[0]; + const targetNote = await froca.getNote(noteId, true); + const parentNoteId = parentNote?.noteId; + if (!parentNoteId || !dropPosition) return; + + const targetIndex = dropPosition.index - 1; + const targetItems = columnItems || []; + const targetBranch = targetIndex >= 0 ? targetItems[targetIndex].branch : null; + + await api?.changeColumn(noteId, column); + + const parents = targetNote?.getParentNoteIds(); + if (!parents?.includes(parentNoteId)) { + if (!targetBranch) { + // First. + await branches.cloneNoteToParentNote(noteId, parentNoteId); + } else { + await branches.cloneNoteAfter(noteId, targetBranch.branchId); + } + } else if (targetBranch) { + await branches.moveAfterBranch([ branchId ], targetBranch.branchId); + } + } else if (draggedCard && dropPosition) { + api?.moveWithinBoard(draggedCard.noteId, draggedCard.branchId, draggedCard.index, dropPosition.index, draggedCard.fromColumn, column); + } + + }, [ api, draggedColumn, dropPosition, columnItems, column, setDropTarget, setDropPosition ]); + + return { handleColumnDragStart, handleColumnDragEnd, handleDragOver, handleDragLeave, handleDrop }; +} diff --git a/apps/client/src/widgets/collections/board/context_menu.ts b/apps/client/src/widgets/collections/board/context_menu.ts new file mode 100644 index 000000000..0c818a111 --- /dev/null +++ b/apps/client/src/widgets/collections/board/context_menu.ts @@ -0,0 +1,98 @@ +import FNote from "../../../entities/fnote"; +import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; +import link_context_menu from "../../../menus/link_context_menu"; +import attributes from "../../../services/attributes"; +import branches from "../../../services/branches"; +import dialog from "../../../services/dialog"; +import { t } from "../../../services/i18n"; +import Api from "./api"; + +export function openColumnContextMenu(api: Api, event: ContextMenuEvent, column: string) { + event.preventDefault(); + event.stopPropagation(); + + contextMenu.show({ + x: event.pageX, + y: event.pageY, + items: [ + { + title: t("board_view.delete-column"), + uiIcon: "bx bx-trash", + async handler() { + const confirmed = await dialog.confirm(t("board_view.delete-column-confirmation")); + if (!confirmed) { + return; + } + + await api.removeColumn(column); + } + } + ], + selectMenuItemHandler() {} + }); +} + +export function openNoteContextMenu(api: Api, event: ContextMenuEvent, note: FNote, branchId: string, column: string) { + event.preventDefault(); + event.stopPropagation(); + + contextMenu.show({ + x: event.pageX, + y: event.pageY, + items: [ + ...link_context_menu.getItems(), + { kind: "separator" }, + { + title: t("board_view.move-to"), + uiIcon: "bx bx-transfer", + items: api.columns.map(columnToMoveTo => ({ + title: columnToMoveTo, + enabled: columnToMoveTo !== column, + handler: () => api.changeColumn(note.noteId, columnToMoveTo) + })), + }, + getArchiveMenuItem(note), + { kind: "separator" }, + { + title: t("board_view.insert-above"), + uiIcon: "bx bx-list-plus", + handler: () => api.insertRowAtPosition(column, branchId, "before") + }, + { + title: t("board_view.insert-below"), + uiIcon: "bx bx-empty", + handler: () => api.insertRowAtPosition(column, branchId, "after") + }, + { kind: "separator" }, + { + title: t("board_view.remove-from-board"), + uiIcon: "bx bx-task-x", + handler: () => api.removeFromBoard(note.noteId) + }, + { + title: t("board_view.delete-note"), + uiIcon: "bx bx-trash", + handler: () => branches.deleteNotes([ branchId ], false, false) + }, + ], + selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, note.noteId), + }); +} + +function getArchiveMenuItem(note: FNote) { + if (!note.isArchived) { + return { + title: t("board_view.archive-note"), + uiIcon: "bx bx-archive", + handler: () => attributes.addLabel(note.noteId, "archived") + } + } else { + return { + title: t("board_view.unarchive-note"), + uiIcon: "bx bx-archive-out", + handler: async () => { + attributes.removeOwnedLabelByName(note, "archived") + } + } + } +} diff --git a/apps/client/src/widgets/view_widgets/board_view/data.ts b/apps/client/src/widgets/collections/board/data.ts similarity index 86% rename from apps/client/src/widgets/view_widgets/board_view/data.ts rename to apps/client/src/widgets/collections/board/data.ts index f468f2292..db315564a 100644 --- a/apps/client/src/widgets/view_widgets/board_view/data.ts +++ b/apps/client/src/widgets/collections/board/data.ts @@ -1,17 +1,17 @@ import FBranch from "../../../entities/fbranch"; import FNote from "../../../entities/fnote"; -import { BoardData } from "./config"; +import { BoardViewData } from "./index"; export type ColumnMap = Map; -export async function getBoardData(parentNote: FNote, groupByColumn: string, persistedData: BoardData) { +export async function getBoardData(parentNote: FNote, groupByColumn: string, persistedData: BoardViewData, includeArchived: boolean) { const byColumn: ColumnMap = new Map(); // First, scan all notes to find what columns actually exist - await recursiveGroupBy(parentNote.getChildBranches(), byColumn, groupByColumn); + await recursiveGroupBy(parentNote.getChildBranches(), byColumn, groupByColumn, includeArchived); // Get all columns that exist in the notes const columnsFromNotes = [...byColumn.keys()]; @@ -43,7 +43,7 @@ export async function getBoardData(parentNote: FNote, groupByColumn: string, per } // Return updated persisted data only if there were changes - let newPersistedData: BoardData | undefined; + let newPersistedData: BoardViewData | undefined; const hasChanges = newColumnValues.length > 0 || existingPersistedColumns.length !== deduplicatedColumns.length || !existingPersistedColumns.every((col, idx) => deduplicatedColumns[idx]?.value === col.value); @@ -61,15 +61,13 @@ export async function getBoardData(parentNote: FNote, groupByColumn: string, per }; } -async function recursiveGroupBy(branches: FBranch[], byColumn: ColumnMap, groupByColumn: string) { +async function recursiveGroupBy(branches: FBranch[], byColumn: ColumnMap, groupByColumn: string, includeArchived: boolean) { for (const branch of branches) { const note = await branch.getNote(); - if (!note) { - continue; - } + if (!note || (!includeArchived && note.isArchived)) continue; - if (note.hasChildren()) { - await recursiveGroupBy(note.getChildBranches(), byColumn, groupByColumn); + if (note.type !== "search" && note.hasChildren()) { + await recursiveGroupBy(note.getChildBranches(), byColumn, groupByColumn, includeArchived); } const group = note.getLabelValue(groupByColumn); diff --git a/apps/client/src/widgets/collections/board/index.css b/apps/client/src/widgets/collections/board/index.css new file mode 100644 index 000000000..581408cf6 --- /dev/null +++ b/apps/client/src/widgets/collections/board/index.css @@ -0,0 +1,329 @@ +.board-view { + overflow-x: auto; + position: relative; + height: 100%; + user-select: none; + + --card-font-size: 0.9em; + --card-line-height: 1.2; + --card-padding: 0.6em; +} + +.board-view-container { + height: 100%; + display: flex; + gap: 1em; + padding: 1em; + padding-bottom: 0; + align-items: flex-start; +} + +.board-view-container .board-column { + width: 250px; + flex-shrink: 0; + border: 2px solid transparent; + border-radius: 8px; + background-color: var(--accented-background-color); + transition: border-color 0.2s ease; + overflow-y: auto; + max-height: 100%; + display: flex; + flex-direction: column; +} + +.board-view-container .board-column.drag-over { + border-color: var(--main-text-color); + background-color: var(--hover-item-background-color); +} + +.board-view-container .board-column h3 { + font-size: 1em; + margin: 0; + padding: 0.5em 0.5em 0.5em 0.5em; + border-bottom: 1px solid var(--main-border-color); + cursor: grab; + position: relative; + transition: background-color 0.2s ease, border-radius 0.2s ease; + box-sizing: border-box; + background-color: transparent; +} + +.board-view-container .board-column h3 { + display: flex; + align-items: center; +} + +.board-view-container .board-column h3 > .title { + flex-grow: 1; +} + +.board-view-container .board-column h3:active { + cursor: grabbing; +} + +.board-view-container .board-column h3.editing { + cursor: default; +} + +.board-view-container .board-column h3.editing input { + padding: 0; +} + +.board-view-container .board-column h3:hover { + background-color: var(--hover-item-background-color); + border-radius: 4px; +} + +.board-view-container .board-column h3.editing { + background-color: var(--main-background-color); + border: 1px solid var(--main-text-color); + border-radius: 4px; +} + +.board-view-container .board-column h3 input { + background: transparent; + border: none; + outline: none; + font-size: inherit; + font-weight: inherit; + color: inherit; + width: 100%; + font-family: inherit; +} + +.board-view-container .board-column .edit-icon { + opacity: 0; + margin-inline-start: 0.5em; + transition: opacity 0.2s ease; + color: var(--muted-text-color); + cursor: pointer; +} + +.board-view-container .board-column > .board-column-content { + flex-grow: 1; + overflow: scroll; + padding: 0.5em; +} + +.board-view-container .board-column h3:hover .edit-icon, +.board-view-container .board-note:hover .edit-icon { + opacity: 1; +} + + +.board-view-container .board-note, +.board-view-container .board-new-item.editing { + box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.1); + margin: 0.65em 0; + padding: var(--card-padding); + border-radius: 5px; + cursor: move; + position: relative; + background-color: var(--main-background-color); + border: 1px solid var(--main-border-color); + opacity: 1; + line-height: var(--card-line-height); + overflow-wrap: break-word; + overflow: hidden; + font-size: var(--card-font-size); +} + +.board-view-container .board-note:first-of-type { + margin-top: 0; +} + +.board-view-container :focus { + outline: 3px solid var(--input-focus-outline-color); + outline-offset: 0; +} + +.board-view-container .board-note { + transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.15s ease, margin-top 0.2s ease; +} + +.board-view-container .board-note.archived { + opacity: 0.5; +} + +.board-view-container .board-note .icon { + margin-inline-end: 0.25em; + display: inline; +} + +.board-view-container .board-note > .edit-icon { + position: absolute; + top: 8px; + inset-inline-end: 4px; + padding: 2px; + background-color: var(--main-background-color); +} + +.board-view-container .board-note:hover { + box-shadow: 2px 4px 8px rgba(0, 0, 0, 0.1); +} + +.board-view-container .board-note:hover > .edit-icon { + position: absolute; + top: 8px; + inset-inline-end: 4px; + color: var(--main-text-color); + background-color: var(--main-background-color); + padding-inline-start: 6px; +} + +.board-view-container .board-note.fade-in { + animation: fadeIn 0.15s ease-in; +} + +.board-view-container .board-note.fade-out { + animation: fadeOut 0.15s ease-out forwards; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(-10px); } + to { opacity: 1; transform: translateY(0); } +} + +@keyframes fadeOut { + from { opacity: 1; transform: translateY(0); } + to { opacity: 0; transform: translateY(-10px); } +} + +.board-view-container .board-note.dragging { + opacity: 0.5; + transform: rotate(5deg); + z-index: 1000; + box-shadow: 4px 8px 16px rgba(0, 0, 0, 0.5); +} + +.board-view-container .board-note.editing, +.board-view-container .board-new-item.editing { + box-shadow: 2px 4px 8px rgba(0, 0, 0, 0.2); + border-color: var(--main-text-color); + display: flex; + align-items: center; + padding: 0; +} + +.board-view-container .board-note.editing textarea, +.board-view-container .board-new-item textarea.form-control { + background: transparent; + border: none; + outline: none; + font-family: inherit; + font-size: inherit; + color: var(--main-text-color); + width: 100%; + padding: var(--card-padding); + line-height: var(--card-line-height); + height: auto; + field-sizing: content; + resize: none; +} + +.board-drop-placeholder { + height: 40px; + margin: 0.65em 0; + padding: 0.5em; + border-radius: 5px; + background-color: rgba(0, 0, 0, 0.15); + opacity: 0; + transition: opacity 0.15s ease, height 0.2s ease; + box-sizing: border-box; +} + +.board-drop-placeholder.show { + opacity: 0.6; +} + +.column-drop-placeholder { + width: 250px; + flex-shrink: 0; + height: 200px; + border-radius: 8px; + background-color: rgba(0, 0, 0, 0.1); + opacity: 0; + transition: opacity 0.15s ease; + margin: 0 0.5em; +} + +.column-drop-placeholder.show { + opacity: 0.6; +} + +.board-new-item { + margin-top: 0.5em; + padding: 0.25em 0.5em; + border-radius: 5px; + color: var(--muted-text-color); + cursor: pointer; + transition: all 0.2s ease; + background-color: transparent; + font-size: var(--card-font-size); +} + +.board-new-item:hover { + border-color: var(--main-text-color); + color: var(--main-text-color); + background-color: var(--hover-item-background-color); +} + +.board-new-item .icon { + margin-inline-end: 0.25em; +} + +.board-add-column { + width: 180px; + flex-shrink: 0; + height: 60px; + border-radius: 8px; + padding: 0.5em; + background-color: var(--accented-background-color); + transition: all 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: var(--muted-text-color); + font-size: 0.9em; + align-self: flex-start; +} + +.board-add-column:hover { + border-color: var(--main-text-color); + color: var(--main-text-color); + background-color: var(--hover-item-background-color); +} + +.board-add-column .icon { + margin-inline-end: 0.5em; + font-size: 1.2em; +} + +.board-add-column input { + background: var(--main-background-color); + border: 1px solid var(--main-text-color); + border-radius: 4px; + padding: 0.5em; + color: var(--main-text-color); + font-family: inherit; + font-size: inherit; + width: 100%; + text-align: center; +} + +.board-drag-preview { + position: fixed; + z-index: 10000; + pointer-events: none; + opacity: 0.8; + transform: rotate(5deg); + box-shadow: 4px 8px 16px rgba(0, 0, 0, 0.5); + background-color: var(--main-background-color); + border: 1px solid var(--main-border-color); + border-radius: 5px; + padding: 0.5em; + font-size: 0.9em; + max-width: 200px; + word-wrap: break-word; +} \ No newline at end of file diff --git a/apps/client/src/widgets/collections/board/index.tsx b/apps/client/src/widgets/collections/board/index.tsx new file mode 100644 index 000000000..26757229d --- /dev/null +++ b/apps/client/src/widgets/collections/board/index.tsx @@ -0,0 +1,276 @@ +import { Dispatch, StateUpdater, useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks"; +import { ViewModeProps } from "../interface"; +import "./index.css"; +import { ColumnMap, getBoardData } from "./data"; +import { useNoteLabelBoolean, useNoteLabelWithDefault, useTriliumEvent } from "../../react/hooks"; +import Icon from "../../react/Icon"; +import { t } from "../../../services/i18n"; +import Api from "./api"; +import FormTextBox from "../../react/FormTextBox"; +import { createContext, TargetedKeyboardEvent } from "preact"; +import { onWheelHorizontalScroll } from "../../widget_utils"; +import Column from "./column"; +import BoardApi from "./api"; +import FormTextArea from "../../react/FormTextArea"; +import FNote from "../../../entities/fnote"; + +export interface BoardViewData { + columns?: BoardColumnData[]; +} + +export interface BoardColumnData { + value: string; +} + +interface BoardViewContextData { + api?: BoardApi; + parentNote?: FNote; + branchIdToEdit?: string; + columnNameToEdit?: string; + setColumnNameToEdit?: Dispatch>; + setBranchIdToEdit?: Dispatch>; + draggedColumn: { column: string, index: number } | null; + setDraggedColumn: (column: { column: string, index: number } | null) => void; + dropPosition: { column: string, index: number } | null; + setDropPosition: (position: { column: string, index: number } | null) => void; + setDropTarget: (target: string | null) => void, + dropTarget: string | null; + draggedCard: { noteId: string, branchId: string, fromColumn: string, index: number } | null; + setDraggedCard: Dispatch>; +} + +export const BoardViewContext = createContext(undefined); + +export default function BoardView({ note: parentNote, noteIds, viewConfig, saveConfig }: ViewModeProps) { + const [ statusAttribute ] = useNoteLabelWithDefault(parentNote, "board:groupBy", "status"); + const [ includeArchived ] = useNoteLabelBoolean(parentNote, "includeArchived"); + const [ byColumn, setByColumn ] = useState(); + const [ columns, setColumns ] = useState(); + const [ draggedCard, setDraggedCard ] = useState<{ noteId: string, branchId: string, fromColumn: string, index: number } | null>(null); + const [ dropTarget, setDropTarget ] = useState(null); + const [ dropPosition, setDropPosition ] = useState<{ column: string, index: number } | null>(null); + const [ draggedColumn, setDraggedColumn ] = useState<{ column: string, index: number } | null>(null); + const [ columnDropPosition, setColumnDropPosition ] = useState(null); + const [ columnHoverIndex, setColumnHoverIndex ] = useState(null); + const [ branchIdToEdit, setBranchIdToEdit ] = useState(); + const [ columnNameToEdit, setColumnNameToEdit ] = useState(); + const api = useMemo(() => { + return new Api(byColumn, columns ?? [], parentNote, statusAttribute, viewConfig ?? {}, saveConfig, setBranchIdToEdit ); + }, [ byColumn, columns, parentNote, statusAttribute, viewConfig, saveConfig, setBranchIdToEdit ]); + const boardViewContext = useMemo(() => ({ + api, + parentNote, + branchIdToEdit, setBranchIdToEdit, + columnNameToEdit, setColumnNameToEdit, + draggedColumn, setDraggedColumn, + dropPosition, setDropPosition, + draggedCard, setDraggedCard, + dropTarget, setDropTarget + }), [ + api, + parentNote, + branchIdToEdit, setBranchIdToEdit, + columnNameToEdit, setColumnNameToEdit, + draggedColumn, setDraggedColumn, + dropPosition, setDropPosition, + draggedCard, setDraggedCard, + dropTarget, setDropTarget + ]); + + function refresh() { + getBoardData(parentNote, statusAttribute, viewConfig ?? {}, includeArchived).then(({ byColumn, newPersistedData }) => { + setByColumn(byColumn); + + if (newPersistedData) { + viewConfig = { ...newPersistedData }; + saveConfig(newPersistedData); + } + + // Use the order from persistedData.columns, then add any new columns found + const orderedColumns = viewConfig?.columns?.map(col => col.value) || []; + const allColumns = Array.from(byColumn.keys()); + const newColumns = allColumns.filter(col => !orderedColumns.includes(col)); + setColumns([...orderedColumns, ...newColumns]); + }); + } + + useEffect(refresh, [ parentNote, noteIds, viewConfig ]); + + const handleColumnDrop = useCallback((fromIndex: number, toIndex: number) => { + const newColumns = api.reorderColumn(fromIndex, toIndex); + if (newColumns) { + setColumns(newColumns); + } + setDraggedColumn(null); + setDraggedCard(null); + setColumnDropPosition(null); + }, [api]); + + useTriliumEvent("entitiesReloaded", ({ loadResults }) => { + // Check if any changes affect our board + const hasRelevantChanges = + // React to changes in status attribute for notes in this board + loadResults.getAttributeRows().some(attr => attr.name === statusAttribute && noteIds.includes(attr.noteId!)) || + // React to changes in note title + loadResults.getNoteIds().some(noteId => noteIds.includes(noteId)) || + // React to changes in branches for subchildren (e.g., moved, added, or removed notes) + loadResults.getBranchRows().some(branch => noteIds.includes(branch.noteId!)) || + // React to changes in note icon or color. + loadResults.getAttributeRows().some(attr => [ "iconClass", "color" ].includes(attr.name ?? "") && noteIds.includes(attr.noteId ?? "")) || + // React to attachment change + loadResults.getAttachmentRows().some(att => att.ownerId === parentNote.noteId && att.title === "board.json") || + // React to changes in "groupBy" + loadResults.getAttributeRows().some(attr => attr.name === "board:groupBy" && attr.noteId === parentNote.noteId); + + if (hasRelevantChanges) { + refresh(); + } + }); + + const handleColumnDragOver = useCallback((e: DragEvent) => { + if (!draggedColumn) return; + e.preventDefault(); + }, [draggedColumn]); + + const handleColumnHover = useCallback((index: number, mouseX: number, columnRect: DOMRect) => { + if (!draggedColumn) return; + + const columnMiddle = columnRect.left + columnRect.width / 2; + + // Determine if we should insert before or after this column + const insertBefore = mouseX < columnMiddle; + + // Calculate the target position + let targetIndex = insertBefore ? index : index + 1; + + setColumnDropPosition(targetIndex); + }, [draggedColumn]); + + const handleContainerDrop = useCallback((e: DragEvent) => { + e.preventDefault(); + if (draggedColumn && columnDropPosition !== null) { + handleColumnDrop(draggedColumn.index, columnDropPosition); + } + setColumnHoverIndex(null); + }, [draggedColumn, columnDropPosition, handleColumnDrop]); + + return ( +
+ +
+ {byColumn && columns?.map((column, index) => ( + <> + {columnDropPosition === index && ( +
+ )} + + + ))} + {columnDropPosition === columns?.length && draggedColumn && ( +
+ )} + + +
+ +
+ ) +} + +function AddNewColumn({ api }: { api: BoardApi }) { + const [ isCreatingNewColumn, setIsCreatingNewColumn ] = useState(false); + + const addColumnCallback = useCallback(() => { + setIsCreatingNewColumn(true); + }, []); + + return ( +
+ {!isCreatingNewColumn + ? <> + {" "} + {t("board_view.add-column")} + + : ( + api.addNewColumn(columnName)} + dismiss={() => setIsCreatingNewColumn(false)} + isNewItem + /> + )} +
+ ) +} + +export function TitleEditor({ currentValue, placeholder, save, dismiss, multiline, isNewItem }: { + currentValue?: string; + placeholder?: string; + save: (newValue: string) => void; + dismiss: () => void; + multiline?: boolean; + isNewItem?: boolean; +}) { + const inputRef = useRef(null); + const focusElRef = useRef(null); + const dismissOnNextRefreshRef = useRef(false); + const shouldDismiss = useRef(false); + + useEffect(() => { + focusElRef.current = document.activeElement; + inputRef.current?.focus(); + inputRef.current?.select(); + }, [ inputRef ]); + + const Element = multiline ? FormTextArea : FormTextBox; + + useEffect(() => { + if (dismissOnNextRefreshRef.current) { + dismiss(); + dismissOnNextRefreshRef.current = false; + } + }); + + return ( + ) => { + if (e.key === "Enter" || e.key === "Escape") { + e.preventDefault(); + e.stopPropagation(); + shouldDismiss.current = (e.key === "Escape"); + if (focusElRef.current instanceof HTMLElement) { + focusElRef.current.focus(); + } + } + }} + onBlur={(newValue) => { + if (!shouldDismiss.current && newValue.trim() && (newValue !== currentValue || isNewItem)) { + save(newValue); + dismissOnNextRefreshRef.current = true; + } else { + dismiss(); + } + }} + /> + ); +} diff --git a/apps/client/src/widgets/collections/calendar/api.ts b/apps/client/src/widgets/collections/calendar/api.ts new file mode 100644 index 000000000..934edcb2e --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/api.ts @@ -0,0 +1,65 @@ +import { CreateChildrenResponse } from "@triliumnext/commons"; +import server from "../../../services/server"; +import FNote from "../../../entities/fnote"; +import { setAttribute, setLabel } from "../../../services/attributes"; +import froca from "../../../services/froca"; + +interface NewEventOpts { + title: string; + startDate: string; + endDate?: string | null; + startTime?: string | null; + endTime?: string | null; +} + +interface ChangeEventOpts { + startDate: string; + endDate?: string | null; + startTime?: string | null; + endTime?: string | null; +} + +export async function newEvent(parentNote: FNote, { title, startDate, endDate, startTime, endTime }: NewEventOpts) { + // Create the note. + const { note } = await server.post(`notes/${parentNote.noteId}/children?target=into`, { + title, + content: "", + type: "text" + }); + + // Set the attributes. + setLabel(note.noteId, "startDate", startDate); + if (endDate) { + setLabel(note.noteId, "endDate", endDate); + } + if (startTime) { + setLabel(note.noteId, "startTime", startTime); + } + if (endTime) { + setLabel(note.noteId, "endTime", endTime); + } +} + +export async function changeEvent(note: FNote, { startDate, endDate, startTime, endTime }: ChangeEventOpts) { + // Don't store the end date if it's empty. + if (endDate === startDate) { + endDate = undefined; + } + + // Since they can be customized via calendar:startDate=$foo and calendar:endDate=$bar we need to determine the + // attributes to be effectively updated + let startAttribute = note.getAttributes("label").filter(attr => attr.name == "calendar:startDate").shift()?.value||"startDate"; + let endAttribute = note.getAttributes("label").filter(attr => attr.name == "calendar:endDate").shift()?.value||"endDate"; + + const noteId = note.noteId; + setLabel(noteId, startAttribute, startDate); + setAttribute(note, "label", endAttribute, endDate); + + startAttribute = note.getAttributes("label").filter(attr => attr.name == "calendar:startTime").shift()?.value||"startTime"; + endAttribute = note.getAttributes("label").filter(attr => attr.name == "calendar:endTime").shift()?.value||"endTime"; + + if (startTime && endTime) { + setAttribute(note, "label", startAttribute, startTime); + setAttribute(note, "label", endAttribute, endTime); + } +} diff --git a/apps/client/src/widgets/collections/calendar/calendar.tsx b/apps/client/src/widgets/collections/calendar/calendar.tsx new file mode 100644 index 000000000..92968bbb2 --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/calendar.tsx @@ -0,0 +1,32 @@ +import { useEffect, useLayoutEffect, useRef } from "preact/hooks"; +import { CalendarOptions, Calendar as FullCalendar, PluginDef } from "@fullcalendar/core"; +import { RefObject } from "preact"; + +interface CalendarProps extends CalendarOptions { + calendarRef?: RefObject; +} + +export default function Calendar({ calendarRef, ...options }: CalendarProps) { + const containerRef = useRef(null); + + useLayoutEffect(() => { + if (!containerRef.current) return; + + const calendar = new FullCalendar(containerRef.current, options); + calendar.render(); + + if (calendarRef) { + calendarRef.current = calendar; + } + + return () => calendar.destroy(); + }, [ ]); + + useEffect(() => { + calendarRef?.current?.resetOptions(options); + }, [ options ]); + + return ( +
+ ); +} diff --git a/apps/client/src/widgets/view_widgets/calendar_view.spec.ts b/apps/client/src/widgets/collections/calendar/event_builder.spec.ts similarity index 87% rename from apps/client/src/widgets/view_widgets/calendar_view.spec.ts rename to apps/client/src/widgets/collections/calendar/event_builder.spec.ts index ad6c38b02..2c872a14e 100644 --- a/apps/client/src/widgets/view_widgets/calendar_view.spec.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vitest"; -import { buildNote, buildNotes } from "../../test/easy-froca.js"; -import CalendarView, { getFullCalendarLocale } from "./calendar_view.js"; +import { buildNote, buildNotes } from "../../../test/easy-froca.js"; +import { buildEvent, buildEvents } from "./event_builder.js"; +import { LOCALE_MAPPINGS } from "./index.js"; import { LOCALES } from "@triliumnext/commons"; describe("Building events", () => { @@ -9,7 +10,7 @@ describe("Building events", () => { { title: "Note 1", "#startDate": "2025-05-05" }, { title: "Note 2", "#startDate": "2025-05-07" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(2); expect(events[0]).toMatchObject({ title: "Note 1", start: "2025-05-05", end: "2025-05-06" }); @@ -21,7 +22,7 @@ describe("Building events", () => { { title: "Note 1", "#endDate": "2025-05-05" }, { title: "Note 2", "#endDateDate": "2025-05-07" } ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(0); }); @@ -31,7 +32,7 @@ describe("Building events", () => { { title: "Note 1", "#startDate": "2025-05-05", "#endDate": "2025-05-05" }, { title: "Note 2", "#startDate": "2025-05-07", "#endDate": "2025-05-08" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(2); expect(events[0]).toMatchObject({ title: "Note 1", start: "2025-05-05", end: "2025-05-06" }); @@ -43,7 +44,7 @@ describe("Building events", () => { { title: "Note 1", "#myStartDate": "2025-05-05", "#calendar:startDate": "myStartDate" }, { title: "Note 2", "#startDate": "2025-05-07", "#calendar:startDate": "myStartDate" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(2); expect(events[0]).toMatchObject({ @@ -65,7 +66,7 @@ describe("Building events", () => { { title: "Note 3", "#startDate": "2025-05-05", "#myEndDate": "2025-05-05", "#calendar:startDate": "myStartDate", "#calendar:endDate": "myEndDate" }, { title: "Note 4", "#startDate": "2025-05-07", "#myEndDate": "2025-05-08", "#calendar:startDate": "myStartDate", "#calendar:endDate": "myEndDate" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(4); expect(events[0]).toMatchObject({ title: "Note 1", start: "2025-05-05", end: "2025-05-06" }); @@ -79,7 +80,7 @@ describe("Building events", () => { { title: "Note 1", "#myTitle": "My Custom Title 1", "#startDate": "2025-05-05", "#calendar:title": "myTitle" }, { title: "Note 2", "#startDate": "2025-05-07", "#calendar:title": "myTitle" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(2); expect(events[0]).toMatchObject({ title: "My Custom Title 1", start: "2025-05-05" }); @@ -92,7 +93,7 @@ describe("Building events", () => { { title: "Note 1", "~myTitle": "mySharedTitle", "#startDate": "2025-05-05", "#calendar:title": "myTitle" }, { title: "Note 2", "#startDate": "2025-05-07", "#calendar:title": "myTitle" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(2); expect(events[0]).toMatchObject({ title: "My shared title", start: "2025-05-05" }); @@ -105,7 +106,7 @@ describe("Building events", () => { { title: "Note 1", "~myTitle": "mySharedTitle", "#startDate": "2025-05-05", "#calendar:title": "myTitle" }, { title: "Note 2", "#startDate": "2025-05-07", "#calendar:title": "myTitle" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(2); expect(events[0]).toMatchObject({ title: "My shared custom title", start: "2025-05-05" }); @@ -125,7 +126,7 @@ describe("Promoted attributes", () => { "#calendar:displayedAttributes": "weight,mood" }); - const event = await CalendarView.buildEvent(note, { startDate: "2025-04-04" }); + const event = await buildEvent(note, { startDate: "2025-04-04" }); expect(event).toHaveLength(1); expect(event[0]?.promotedAttributes).toMatchObject([ [ "weight", "75" ], @@ -143,7 +144,7 @@ describe("Promoted attributes", () => { "#relation:assignee": "promoted,alias=Assignee,single,text", }); - const event = await CalendarView.buildEvent(note, { startDate: "2025-04-04" }); + const event = await buildEvent(note, { startDate: "2025-04-04" }); expect(event).toHaveLength(1); expect(event[0]?.promotedAttributes).toMatchObject([ [ "assignee", "Target note" ] @@ -155,7 +156,7 @@ describe("Promoted attributes", () => { { title: "Note 1", "#startDate": "2025-05-05", "#startTime": "13:36", "#endTime": "14:56" }, { title: "Note 2", "#startDate": "2025-05-07", "#endDate": "2025-05-08", "#startTime": "13:36", "#endTime": "14:56" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(2); expect(events[0]).toMatchObject({ title: "Note 1", start: "2025-05-05T13:36:00", end: "2025-05-05T14:56:00" }); @@ -167,7 +168,7 @@ describe("Promoted attributes", () => { { title: "Note 1", "#startDate": "2025-05-05", "#startTime": "13:30" }, { title: "Note 2", "#startDate": "2025-05-07", "#endDate": "2025-05-08", "#startTime": "13:36" }, ]); - const events = await CalendarView.buildEvents(noteIds); + const events = await buildEvents(noteIds); expect(events).toHaveLength(2); expect(events[0]).toMatchObject({ title: "Note 1", start: "2025-05-05T13:30:00" }); @@ -183,12 +184,12 @@ describe("Building locales", () => { continue; } - const fullCalendarLocale = await getFullCalendarLocale(id); + const fullCalendarLocale = LOCALE_MAPPINGS[id]; if (id !== "en") { expect(fullCalendarLocale, `For locale ${id}`).toBeDefined(); } else { - expect(fullCalendarLocale).toBeUndefined(); + expect(fullCalendarLocale).toBeNull(); } } }); diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts new file mode 100644 index 000000000..8687dc6d9 --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -0,0 +1,160 @@ +import { EventInput, EventSourceFuncArg, EventSourceInput } from "@fullcalendar/core/index.js"; +import froca from "../../../services/froca"; +import { formatDateToLocalISO, getCustomisableLabel, getMonthsInDateRange, offsetDate } from "./utils"; +import FNote from "../../../entities/fnote"; +import server from "../../../services/server"; + +interface Event { + startDate: string, + endDate?: string | null, + startTime?: string | null, + endTime?: string | null, + isArchived?: boolean; +} + +export async function buildEvents(noteIds: string[]) { + const notes = await froca.getNotes(noteIds); + const events: EventSourceInput = []; + + for (const note of notes) { + const startDate = getCustomisableLabel(note, "startDate", "calendar:startDate"); + + if (!startDate) { + continue; + } + + const endDate = getCustomisableLabel(note, "endDate", "calendar:endDate"); + const startTime = getCustomisableLabel(note, "startTime", "calendar:startTime"); + const endTime = getCustomisableLabel(note, "endTime", "calendar:endTime"); + const isArchived = note.hasLabel("archived"); + events.push(await buildEvent(note, { startDate, endDate, startTime, endTime, isArchived })); + } + + return events.flat(); +} + +export async function buildEventsForCalendar(note: FNote, e: EventSourceFuncArg) { + const events: EventInput[] = []; + + // Gather all the required date note IDs. + const dateRange = getMonthsInDateRange(e.startStr, e.endStr); + let allDateNoteIds: string[] = []; + for (const month of dateRange) { + // TODO: Deduplicate get type. + const dateNotesForMonth = await server.get>(`special-notes/notes-for-month/${month}?calendarRoot=${note.noteId}`); + const dateNoteIds = Object.values(dateNotesForMonth); + allDateNoteIds = [...allDateNoteIds, ...dateNoteIds]; + } + + // Request all the date notes. + const dateNotes = await froca.getNotes(allDateNoteIds); + const childNoteToDateMapping: Record = {}; + for (const dateNote of dateNotes) { + const startDate = dateNote.getLabelValue("dateNote"); + if (!startDate) { + continue; + } + + events.push(await buildEvent(dateNote, { startDate })); + + if (dateNote.hasChildren()) { + const childNoteIds = await dateNote.getSubtreeNoteIds(); + for (const childNoteId of childNoteIds) { + childNoteToDateMapping[childNoteId] = startDate; + } + } + } + + // Request all child notes of date notes in a single run. + const childNoteIds = Object.keys(childNoteToDateMapping); + const childNotes = await froca.getNotes(childNoteIds); + for (const childNote of childNotes) { + const startDate = childNoteToDateMapping[childNote.noteId]; + const event = await buildEvent(childNote, { startDate }); + events.push(event); + } + + return events.flat(); +} + +export async function buildEvent(note: FNote, { startDate, endDate, startTime, endTime, isArchived }: Event) { + const customTitleAttributeName = note.getLabelValue("calendar:title"); + const titles = await parseCustomTitle(customTitleAttributeName, note); + const color = note.getLabelValue("calendar:color") ?? note.getLabelValue("color"); + const events: EventInput[] = []; + + const calendarDisplayedAttributes = note.getLabelValue("calendar:displayedAttributes")?.split(","); + let displayedAttributesData: Array<[string, string]> | null = null; + if (calendarDisplayedAttributes) { + displayedAttributesData = await buildDisplayedAttributes(note, calendarDisplayedAttributes); + } + + for (const title of titles) { + if (startTime && endTime && !endDate) { + endDate = startDate; + } + + startDate = (startTime ? `${startDate}T${startTime}:00` : startDate); + if (!startTime) { + const endDateOffset = offsetDate(endDate ?? startDate, 1); + if (endDateOffset) { + endDate = formatDateToLocalISO(endDateOffset); + } + } + + endDate = (endTime ? `${endDate}T${endTime}:00` : endDate); + const eventData: EventInput = { + title: title, + start: startDate, + url: `#${note.noteId}?popup`, + noteId: note.noteId, + color: color ?? undefined, + iconClass: note.getLabelValue("iconClass"), + promotedAttributes: displayedAttributesData, + className: isArchived ? "archived" : "" + }; + if (endDate) { + eventData.end = endDate; + } + events.push(eventData); + } + return events; +} + +async function parseCustomTitle(customTitlettributeName: string | null, note: FNote, allowRelations = true): Promise { + if (customTitlettributeName) { + const labelValue = note.getAttributeValue("label", customTitlettributeName); + if (labelValue) return [labelValue]; + + if (allowRelations) { + const relations = note.getRelations(customTitlettributeName); + if (relations.length > 0) { + const noteIds = relations.map((r) => r.targetNoteId); + const notesFromRelation = await froca.getNotes(noteIds); + const titles: string[][] = []; + + for (const targetNote of notesFromRelation) { + const targetCustomTitleValue = targetNote.getAttributeValue("label", "calendar:title"); + const targetTitles = await parseCustomTitle(targetCustomTitleValue, targetNote, false); + titles.push(targetTitles.flat()); + } + + return titles.flat(); + } + } + } + + return [note.title]; +} + +async function buildDisplayedAttributes(note: FNote, calendarDisplayedAttributes: string[]) { + const filteredDisplayedAttributes = note.getAttributes().filter((attr): boolean => calendarDisplayedAttributes.includes(attr.name)) + const result: Array<[string, string]> = []; + + for (const attribute of filteredDisplayedAttributes) { + if (attribute.type === "label") result.push([attribute.name, attribute.value]); + else result.push([attribute.name, (await attribute.getTargetNote())?.title || ""]) + } + + return result; +} diff --git a/apps/client/src/widgets/collections/calendar/index.css b/apps/client/src/widgets/collections/calendar/index.css new file mode 100644 index 000000000..e6649e53f --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/index.css @@ -0,0 +1,76 @@ +.calendar-view { + overflow: hidden; + position: relative; + height: 100%; + user-select: none; + padding: 10px; +} + +.calendar-view a { + color: unset; +} + +.search-result-widget-content .calendar-view { + position: absolute; + top: 0; + inset-inline-start: 0; + inset-inline-end: 0; + bottom: 0; +} + +.calendar-container { + height: 100%; + --fc-page-bg-color: var(--main-background-color); + --fc-border-color: var(--main-border-color); + --fc-neutral-bg-color: var(--launcher-pane-background-color); + --fc-list-event-hover-bg-color: var(--left-pane-item-hover-background); +} + +.calendar-container .fc-list-sticky .fc-list-day > * { + z-index: 50; +} + +.calendar-container a.fc-event { + text-decoration: none; +} + +.calendar-container a.fc-event.archived { + opacity: 0.5; +} + +.calendar-container .fc-button { + padding: 0.2em 0.5em; +} + +.calendar-container .promoted-attribute { + font-size: 0.85em; + opacity: 0.85; + overflow: hidden; +} + +/* #region Header */ +.calendar-view .calendar-header { + margin-bottom: 10px; + display: flex; + align-items: center; + gap: 10px; +} + +.calendar-view .calendar-header .btn { + min-width: unset !important; +} + +.calendar-view .calendar-header > .title { + flex-grow: 1; + font-size: 1.3rem; + font-weight: normal; +} + +body.desktop:not(.zen) .calendar-view .calendar-header { + padding-inline-end: 5em; +} + +.search-result-widget-content .calendar-view .calendar-header { + padding-inline-end: unset !important; +} +/* #endregion */ \ No newline at end of file diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx new file mode 100644 index 000000000..3c3925bae --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -0,0 +1,358 @@ +import { DateSelectArg, EventChangeArg, EventMountArg, EventSourceFuncArg, LocaleInput, PluginDef } from "@fullcalendar/core/index.js"; +import { ViewModeProps } from "../interface"; +import Calendar from "./calendar"; +import { useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks"; +import "./index.css"; +import { useNoteLabel, useNoteLabelBoolean, useResizeObserver, useSpacedUpdate, useTriliumEvent, useTriliumOption, useTriliumOptionInt } from "../../react/hooks"; +import { DISPLAYABLE_LOCALE_IDS, LOCALE_IDS } from "@triliumnext/commons"; +import { Calendar as FullCalendar } from "@fullcalendar/core"; +import { parseStartEndDateFromEvent, parseStartEndTimeFromEvent } from "./utils"; +import dialog from "../../../services/dialog"; +import { t } from "../../../services/i18n"; +import { buildEvents, buildEventsForCalendar } from "./event_builder"; +import { changeEvent, newEvent } from "./api"; +import froca from "../../../services/froca"; +import date_notes from "../../../services/date_notes"; +import appContext from "../../../components/app_context"; +import { DateClickArg } from "@fullcalendar/interaction"; +import FNote from "../../../entities/fnote"; +import Button, { ButtonGroup } from "../../react/Button"; +import ActionButton from "../../react/ActionButton"; +import { RefObject } from "preact"; +import TouchBar, { TouchBarButton, TouchBarLabel, TouchBarSegmentedControl, TouchBarSpacer } from "../../react/TouchBar"; + +interface CalendarViewData { + +} + +interface CalendarViewData { + type: string; + name: string; + previousText: string; + nextText: string; +} + +const CALENDAR_VIEWS = [ + { + type: "timeGridWeek", + name: t("calendar.week"), + previousText: t("calendar.week_previous"), + nextText: t("calendar.week_next") + }, + { + type: "dayGridMonth", + name: t("calendar.month"), + previousText: t("calendar.month_previous"), + nextText: t("calendar.month_next") + }, + { + type: "multiMonthYear", + name: t("calendar.year"), + previousText: t("calendar.year_previous"), + nextText: t("calendar.year_next") + }, + { + type: "listMonth", + name: t("calendar.list"), + previousText: t("calendar.month_previous"), + nextText: t("calendar.month_next") + } +] + +const SUPPORTED_CALENDAR_VIEW_TYPE = CALENDAR_VIEWS.map(v => v.type); + +// Here we hard-code the imports in order to ensure that they are embedded by webpack without having to load all the languages. +export const LOCALE_MAPPINGS: Record Promise<{ default: LocaleInput }>) | null> = { + de: () => import("@fullcalendar/core/locales/de"), + es: () => import("@fullcalendar/core/locales/es"), + fr: () => import("@fullcalendar/core/locales/fr"), + it: () => import("@fullcalendar/core/locales/it"), + cn: () => import("@fullcalendar/core/locales/zh-cn"), + tw: () => import("@fullcalendar/core/locales/zh-tw"), + ro: () => import("@fullcalendar/core/locales/ro"), + ru: () => import("@fullcalendar/core/locales/ru"), + ja: () => import("@fullcalendar/core/locales/ja"), + pt: () => import("@fullcalendar/core/locales/pt"), + "pt_br": () => import("@fullcalendar/core/locales/pt-br"), + uk: () => import("@fullcalendar/core/locales/uk"), + en: null, + "en_rtl": null, + ar: () => import("@fullcalendar/core/locales/ar") +}; + +export default function CalendarView({ note, noteIds }: ViewModeProps) { + const containerRef = useRef(null); + const calendarRef = useRef(null); + + const [ calendarRoot ] = useNoteLabelBoolean(note, "calendarRoot"); + const [ workspaceCalendarRoot ] = useNoteLabelBoolean(note, "workspaceCalendarRoot"); + const [ firstDayOfWeek ] = useTriliumOptionInt("firstDayOfWeek"); + const [ hideWeekends ] = useNoteLabelBoolean(note, "calendar:hideWeekends"); + const [ weekNumbers ] = useNoteLabelBoolean(note, "calendar:weekNumbers"); + const [ calendarView, setCalendarView ] = useNoteLabel(note, "calendar:view"); + const initialView = useRef(calendarView); + const viewSpacedUpdate = useSpacedUpdate(() => setCalendarView(initialView.current)); + useResizeObserver(containerRef, () => calendarRef.current?.updateSize()); + const isCalendarRoot = (calendarRoot || workspaceCalendarRoot); + const isEditable = !isCalendarRoot; + const eventBuilder = useMemo(() => { + if (!isCalendarRoot) { + return async () => await buildEvents(noteIds); + } else { + return async (e: EventSourceFuncArg) => await buildEventsForCalendar(note, e); + } + }, [isCalendarRoot, noteIds]); + + const plugins = usePlugins(isEditable, isCalendarRoot); + const locale = useLocale(); + + const { eventDidMount } = useEventDisplayCustomization(); + const editingProps = useEditing(note, isEditable, isCalendarRoot); + + // React to changes. + useTriliumEvent("entitiesReloaded", ({ loadResults }) => { + if (loadResults.getNoteIds().some(noteId => noteIds.includes(noteId)) // note title change. + || loadResults.getAttributeRows().some((a) => noteIds.includes(a.noteId ?? ""))) // subnote change. + { + calendarRef.current?.refetchEvents(); + } + }); + + return (plugins && +
+ + { + if (initialView.current !== view.type) { + initialView.current = view.type; + viewSpacedUpdate.scheduleUpdate(); + } + }} + /> + +
+ ); +} + +function CalendarHeader({ calendarRef }: { calendarRef: RefObject }) { + const { title, viewType: currentViewType } = useOnDatesSet(calendarRef); + const currentViewData = CALENDAR_VIEWS.find(v => calendarRef.current && v.type === currentViewType); + + return ( +
+ {title} + + {CALENDAR_VIEWS.map(viewData => ( +
+ ) +} + +function usePlugins(isEditable: boolean, isCalendarRoot: boolean) { + const [ plugins, setPlugins ] = useState(); + + useEffect(() => { + async function loadPlugins() { + const plugins: PluginDef[] = []; + plugins.push((await import("@fullcalendar/daygrid")).default); + plugins.push((await import("@fullcalendar/timegrid")).default); + plugins.push((await import("@fullcalendar/list")).default); + plugins.push((await import("@fullcalendar/multimonth")).default); + if (isEditable || isCalendarRoot) { + plugins.push((await import("@fullcalendar/interaction")).default); + } + setPlugins(plugins); + } + + loadPlugins(); + }, [ isEditable, isCalendarRoot ]); + + return plugins; +} + +function useLocale() { + const [ locale ] = useTriliumOption("locale"); + const [ calendarLocale, setCalendarLocale ] = useState(); + + useEffect(() => { + const correspondingLocale = LOCALE_MAPPINGS[locale]; + if (correspondingLocale) { + correspondingLocale().then((locale) => setCalendarLocale(locale.default)); + } else { + setCalendarLocale(undefined); + } + }); + + return calendarLocale; +} + +function useEditing(note: FNote, isEditable: boolean, isCalendarRoot: boolean) { + const onCalendarSelection = useCallback(async (e: DateSelectArg) => { + const { startDate, endDate } = parseStartEndDateFromEvent(e); + if (!startDate) return; + const { startTime, endTime } = parseStartEndTimeFromEvent(e); + + // Ask for the title + const title = await dialog.prompt({ message: t("relation_map.enter_title_of_new_note"), defaultValue: t("relation_map.default_new_note_title") }); + if (!title?.trim()) { + return; + } + + newEvent(note, { title, startDate, endDate, startTime, endTime }); + }, [ note ]); + + const onEventChange = useCallback(async (e: EventChangeArg) => { + const { startDate, endDate } = parseStartEndDateFromEvent(e.event); + if (!startDate) return; + + const { startTime, endTime } = parseStartEndTimeFromEvent(e.event); + const note = await froca.getNote(e.event.extendedProps.noteId); + if (!note) return; + changeEvent(note, { startDate, endDate, startTime, endTime }); + }, []); + + // Called upon when clicking the day number in the calendar, opens or creates the day note but only if in a calendar root. + const onDateClick = useCallback(async (e: DateClickArg) => { + const eventNote = await date_notes.getDayNote(e.dateStr); + if (eventNote) { + appContext.triggerCommand("openInPopup", { noteIdOrPath: eventNote.noteId }); + } + }, []); + + return { + select: onCalendarSelection, + eventChange: onEventChange, + dateClick: isCalendarRoot ? onDateClick : undefined, + editable: isEditable, + selectable: isEditable + }; +} + +function useEventDisplayCustomization() { + const eventDidMount = useCallback((e: EventMountArg) => { + const { iconClass, promotedAttributes } = e.event.extendedProps; + + // Prepend the icon to the title, if any. + if (iconClass) { + let titleContainer; + switch (e.view.type) { + case "timeGridWeek": + case "dayGridMonth": + titleContainer = e.el.querySelector(".fc-event-title"); + break; + case "multiMonthYear": + break; + case "listMonth": + titleContainer = e.el.querySelector(".fc-list-event-title a"); + break; + } + + if (titleContainer) { + const icon = /*html*/` `; + titleContainer.insertAdjacentHTML("afterbegin", icon); + } + } + + // Append promoted attributes to the end of the event container. + if (promotedAttributes) { + let promotedAttributesHtml = ""; + for (const [name, value] of promotedAttributes) { + promotedAttributesHtml = promotedAttributesHtml + /*html*/`\ + `; + } + + let mainContainer; + switch (e.view.type) { + case "timeGridWeek": + case "dayGridMonth": + mainContainer = e.el.querySelector(".fc-event-main"); + break; + case "multiMonthYear": + break; + case "listMonth": + mainContainer = e.el.querySelector(".fc-list-event-title"); + break; + } + $(mainContainer ?? e.el).append($(promotedAttributesHtml)); + } + }, []); + return { eventDidMount }; +} + +function CalendarTouchBar({ calendarRef }: { calendarRef: RefObject }) { + const { title, viewType } = useOnDatesSet(calendarRef); + + return ( + + ({ + label: name, + }))} + selectedIndex={CALENDAR_VIEWS.findIndex(v => v.type === viewType) ?? 0} + onChange={(selectedIndex) => calendarRef.current?.changeView(CALENDAR_VIEWS[selectedIndex].type)} + /> + + + + + + calendarRef.current?.today()} + /> + calendarRef.current?.prev()} + /> + calendarRef.current?.next()} + /> + + ); +} + +function useOnDatesSet(calendarRef: RefObject) { + const [ title, setTitle ] = useState(); + const [ viewType ,setViewType ] = useState(); + useEffect(() => { + const api = calendarRef.current; + if (!api) return; + const handler = () => { + setTitle(api.view.title); + setViewType(api.view.type); + }; + handler(); + api.on("datesSet", handler); + return () => api.off("datesSet", handler); + }, [calendarRef]); + return { title, viewType }; +} diff --git a/apps/client/src/widgets/collections/calendar/utils.ts b/apps/client/src/widgets/collections/calendar/utils.ts new file mode 100644 index 000000000..992e1a1a0 --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/utils.ts @@ -0,0 +1,103 @@ +import { DateSelectArg } from "@fullcalendar/core/index.js"; +import { EventImpl } from "@fullcalendar/core/internal"; +import FNote from "../../../entities/fnote"; + +export function parseStartEndDateFromEvent(e: DateSelectArg | EventImpl) { + const startDate = formatDateToLocalISO(e.start); + if (!startDate) { + return { startDate: null, endDate: null }; + } + let endDate; + if (e.allDay) { + endDate = formatDateToLocalISO(offsetDate(e.end, -1)); + } else { + endDate = formatDateToLocalISO(e.end); + } + return { startDate, endDate }; +} + +export function parseStartEndTimeFromEvent(e: DateSelectArg | EventImpl) { + let startTime: string | undefined | null = null; + let endTime: string | undefined | null = null; + if (!e.allDay) { + startTime = formatTimeToLocalISO(e.start); + endTime = formatTimeToLocalISO(e.end); + } + + return { startTime, endTime }; +} + +export function formatDateToLocalISO(date: Date | null | undefined) { + if (!date) { + return undefined; + } + + const offset = date.getTimezoneOffset(); + const localDate = new Date(date.getTime() - offset * 60 * 1000); + return localDate.toISOString().split("T")[0]; +} + +export function offsetDate(date: Date | string | null | undefined, offset: number) { + if (!date) { + return undefined; + } + + const newDate = new Date(date); + newDate.setDate(newDate.getDate() + offset); + return newDate; +} + +export function formatTimeToLocalISO(date: Date | null | undefined) { + if (!date) { + return undefined; + } + + const offset = date.getTimezoneOffset(); + const localDate = new Date(date.getTime() - offset * 60 * 1000); + return localDate.toISOString() + .split("T")[1] + .substring(0, 5); +} + +/** + * Allows the user to customize the attribute from which to obtain a particular value. For example, if `customLabelNameAttribute` is `calendar:startDate` + * and `defaultLabelName` is `startDate` and the note at hand has `#calendar:startDate=myStartDate #myStartDate=2025-02-26` then the value returned will + * be `2025-02-26`. If there is no custom attribute value, then the value of the default attribute is returned instead (e.g. `#startDate`). + * + * @param note the note from which to read the values. + * @param defaultLabelName the name of the label in case a custom value is not found. + * @param customLabelNameAttribute the name of the label to look for a custom value. + * @returns the value of either the custom label or the default label. + */ +export function getCustomisableLabel(note: FNote, defaultLabelName: string, customLabelNameAttribute: string) { + const customAttributeName = note.getLabelValue(customLabelNameAttribute); + if (customAttributeName) { + const customValue = note.getLabelValue(customAttributeName); + if (customValue) { + return customValue; + } + } + + return note.getLabelValue(defaultLabelName); +} + +// Source: https://stackoverflow.com/a/30465299/4898894 +export function getMonthsInDateRange(startDate: string, endDate: string) { + const start = startDate.split("-"); + const end = endDate.split("-"); + const startYear = parseInt(start[0]); + const endYear = parseInt(end[0]); + const dates: string[] = []; + + for (let i = startYear; i <= endYear; i++) { + const endMonth = i != endYear ? 11 : parseInt(end[1]) - 1; + const startMon = i === startYear ? parseInt(start[1]) - 1 : 0; + + for (let j = startMon; j <= endMonth; j = j > 12 ? j % 12 || 11 : j + 1) { + const month = j + 1; + const displayMonth = month < 10 ? "0" + month : month; + dates.push([i, displayMonth].join("-")); + } + } + return dates; +} diff --git a/apps/client/src/widgets/collections/geomap/api.ts b/apps/client/src/widgets/collections/geomap/api.ts new file mode 100644 index 000000000..5f7341560 --- /dev/null +++ b/apps/client/src/widgets/collections/geomap/api.ts @@ -0,0 +1,28 @@ +import type { LatLng, LeafletMouseEvent } from "leaflet"; +import { LOCATION_ATTRIBUTE } from "."; +import attributes from "../../../services/attributes"; +import { prompt } from "../../../services/dialog"; +import server from "../../../services/server"; +import { t } from "../../../services/i18n"; +import { CreateChildrenResponse } from "@triliumnext/commons"; + +const CHILD_NOTE_ICON = "bx bx-pin"; + +export async function moveMarker(noteId: string, latLng: LatLng | null) { + const value = latLng ? [latLng.lat, latLng.lng].join(",") : ""; + await attributes.setLabel(noteId, LOCATION_ATTRIBUTE, value); +} + +export async function createNewNote(noteId: string, e: LeafletMouseEvent) { + const title = await prompt({ message: t("relation_map.enter_title_of_new_note"), defaultValue: t("relation_map.default_new_note_title") }); + + if (title?.trim()) { + const { note } = await server.post(`notes/${noteId}/children?target=into`, { + title, + content: "", + type: "text" + }); + attributes.setLabel(note.noteId, "iconClass", CHILD_NOTE_ICON); + moveMarker(note.noteId, e.latlng); + } +} diff --git a/apps/client/src/widgets/view_widgets/geo_view/context_menu.ts b/apps/client/src/widgets/collections/geomap/context_menu.ts similarity index 94% rename from apps/client/src/widgets/view_widgets/geo_view/context_menu.ts rename to apps/client/src/widgets/collections/geomap/context_menu.ts index 26d91df27..dd583e266 100644 --- a/apps/client/src/widgets/view_widgets/geo_view/context_menu.ts +++ b/apps/client/src/widgets/collections/geomap/context_menu.ts @@ -3,21 +3,21 @@ import appContext, { type CommandMappings } from "../../../components/app_contex import contextMenu, { type MenuItem } from "../../../menus/context_menu.js"; import linkContextMenu from "../../../menus/link_context_menu.js"; import { t } from "../../../services/i18n.js"; -import { createNewNote } from "./editing.js"; +import { createNewNote } from "./api.js"; import { copyTextWithToast } from "../../../services/clipboard_ext.js"; import link from "../../../services/link.js"; export default function openContextMenu(noteId: string, e: LeafletMouseEvent, isEditable: boolean) { let items: MenuItem[] = [ ...buildGeoLocationItem(e), - { title: "----" }, + { kind: "separator" }, ...linkContextMenu.getItems(), ]; if (isEditable) { items = [ ...items, - { title: "----" }, + { kind: "separator" }, { title: t("geo-map-context.remove-from-map"), command: "deleteFromMap", uiIcon: "bx bx-trash" } ]; } @@ -46,7 +46,7 @@ export function openMapContextMenu(noteId: string, e: LeafletMouseEvent, isEdita if (isEditable) { items = [ ...items, - { title: "----" }, + { kind: "separator" }, { title: t("geo-map-context.add-note"), handler: () => createNewNote(noteId, e), diff --git a/apps/client/src/widgets/collections/geomap/index.css b/apps/client/src/widgets/collections/geomap/index.css new file mode 100644 index 000000000..9fc5dee63 --- /dev/null +++ b/apps/client/src/widgets/collections/geomap/index.css @@ -0,0 +1,82 @@ +.geo-view { + overflow: hidden; + position: relative; + height: 100%; +} + +.geo-map-container { + height: 100%; + overflow: hidden; +} + +.leaflet-pane { + z-index: 1; +} + +.leaflet-top, +.leaflet-bottom { + z-index: 997; +} + +.geo-view.placing-note .geo-map-container { + cursor: crosshair; +} + +.geo-map-container .marker-pin { + position: relative; +} + +.geo-map-container .leaflet-div-icon { + position: relative; + background: transparent; + border: 0; + overflow: visible; +} + +.geo-map-container .leaflet-div-icon .icon-shadow { + position: absolute; + top: 0; + inset-inline-start: 0; + z-index: -1; +} + +.geo-map-container .leaflet-div-icon .bx { + position: absolute; + top: 3px; + inset-inline-start: 2px; + background-color: white; + color: black; + padding: 2px; + border-radius: 50%; + font-size: 17px; +} + +.geo-map-container .leaflet-div-icon .title-label { + display: block; + position: absolute; + top: 100%; + inset-inline-start: 50%; + transform: translateX(-50%); + font-size: 0.75rem; + height: 1rem; + color: black; + width: 100px; + text-align: center; + text-overflow: ellipsis; + text-shadow: -1px -1px 0 white, 1px -1px 0 white, -1px 1px 0 white, 1px 1px 0 white; + white-space: no-wrap; + overflow: hidden; +} + +body[dir=rtl] .geo-map-container .leaflet-div-icon .title-label { + transform: translateX(50%); +} + +.geo-map-container .leaflet-div-icon .archived { + opacity: 0.5; +} + +.geo-map-container.dark .leaflet-div-icon .title-label { + color: white; + text-shadow: -1px -1px 0 black, 1px -1px 0 black, -1px 1px 0 black, 1px 1px 0 black; +} \ No newline at end of file diff --git a/apps/client/src/widgets/collections/geomap/index.tsx b/apps/client/src/widgets/collections/geomap/index.tsx new file mode 100644 index 000000000..ccc1330d1 --- /dev/null +++ b/apps/client/src/widgets/collections/geomap/index.tsx @@ -0,0 +1,296 @@ +import Map from "./map"; +import "./index.css"; +import { ViewModeProps } from "../interface"; +import { useNoteBlob, useNoteLabel, useNoteLabelBoolean, useNoteProperty, useNoteTreeDrag, useSpacedUpdate, useTouchBar, useTriliumEvent } from "../../react/hooks"; +import { DEFAULT_MAP_LAYER_NAME } from "./map_layer"; +import { divIcon, GPXOptions, LatLng, LeafletMouseEvent } from "leaflet"; +import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "preact/hooks"; +import Marker, { GpxTrack } from "./marker"; +import froca from "../../../services/froca"; +import FNote from "../../../entities/fnote"; +import markerIcon from "leaflet/dist/images/marker-icon.png"; +import markerIconShadow from "leaflet/dist/images/marker-shadow.png"; +import appContext from "../../../components/app_context"; +import { createNewNote, moveMarker } from "./api"; +import openContextMenu, { openMapContextMenu } from "./context_menu"; +import toast from "../../../services/toast"; +import { t } from "../../../services/i18n"; +import server from "../../../services/server"; +import branches from "../../../services/branches"; +import TouchBar, { TouchBarButton, TouchBarLabel, TouchBarSlider } from "../../react/TouchBar"; +import { ParentComponent } from "../../react/react_utils"; + +const DEFAULT_COORDINATES: [number, number] = [3.878638227135724, 446.6630455551659]; +const DEFAULT_ZOOM = 2; +export const LOCATION_ATTRIBUTE = "geolocation"; + +interface MapData { + view?: { + center?: LatLng | [number, number]; + zoom?: number; + }; +} + +enum State { + Normal, + NewNote +} + +export default function GeoView({ note, noteIds, viewConfig, saveConfig }: ViewModeProps) { + const [ state, setState ] = useState(State.Normal); + const [ coordinates, setCoordinates ] = useState(viewConfig?.view?.center); + const [ zoom, setZoom ] = useState(viewConfig?.view?.zoom); + const [ layerName ] = useNoteLabel(note, "map:style"); + const [ hasScale ] = useNoteLabelBoolean(note, "map:scale"); + const [ isReadOnly ] = useNoteLabelBoolean(note, "readOnly"); + const [ notes, setNotes ] = useState([]); + const spacedUpdate = useSpacedUpdate(() => { + if (viewConfig) { + saveConfig(viewConfig); + } + }, 5000); + + useEffect(() => { froca.getNotes(noteIds).then(setNotes) }, [ noteIds ]); + + useEffect(() => { + if (!note) return; + setCoordinates(viewConfig?.view?.center ?? DEFAULT_COORDINATES); + setZoom(viewConfig?.view?.zoom ?? DEFAULT_ZOOM); + }, [ note, viewConfig ]); + + // Note creation. + useTriliumEvent("geoMapCreateChildNote", () => { + toast.showPersistent({ + icon: "plus", + id: "geo-new-note", + title: "New note", + message: t("geo-map.create-child-note-instruction") + }); + + setState(State.NewNote); + + const globalKeyListener: (this: Window, ev: KeyboardEvent) => any = (e) => { + if (e.key === "Escape") { + setState(State.Normal); + + window.removeEventListener("keydown", globalKeyListener); + toast.closePersistent("geo-new-note"); + } + }; + window.addEventListener("keydown", globalKeyListener); + }); + + useTriliumEvent("deleteFromMap", ({ noteId }) => { + moveMarker(noteId, null); + }); + + const onClick = useCallback(async (e: LeafletMouseEvent) => { + if (state === State.NewNote) { + toast.closePersistent("geo-new-note"); + await createNewNote(note.noteId, e); + setState(State.Normal); + } + }, [ state ]); + + const onContextMenu = useCallback((e: LeafletMouseEvent) => { + openMapContextMenu(note.noteId, e, !isReadOnly); + }, [ note.noteId, isReadOnly ]); + + // Dragging + const containerRef = useRef(null); + const apiRef = useRef(null); + useNoteTreeDrag(containerRef, { + dragEnabled: !isReadOnly, + dragNotEnabledMessage: { + icon: "bx bx-lock-alt", + title: t("book.drag_locked_title"), + message: t("book.drag_locked_message") + }, + async callback(treeData, e) { + const api = apiRef.current; + if (!note || !api || isReadOnly) return; + + const { noteId } = treeData[0]; + + const offset = containerRef.current?.getBoundingClientRect(); + const x = e.clientX - (offset?.left ?? 0); + const y = e.clientY - (offset?.top ?? 0); + const latlng = api.containerPointToLatLng([ x, y ]); + + const targetNote = await froca.getNote(noteId, true); + const parents = targetNote?.getParentNoteIds(); + if (parents?.includes(note.noteId)) { + await moveMarker(noteId, latlng); + } else { + await branches.cloneNoteToParentNote(noteId, noteId); + await moveMarker(noteId, latlng); + } + } + }); + + return ( +
+ { coordinates && zoom && { + if (!viewConfig) viewConfig = {}; + viewConfig.view = { center: coordinates, zoom }; + spacedUpdate.scheduleUpdate(); + }} + onClick={onClick} + onContextMenu={onContextMenu} + scale={hasScale} + > + {notes.map(note => )} + } + +
+ ); +} + +function NoteWrapper({ note, isReadOnly }: { note: FNote, isReadOnly: boolean }) { + const mime = useNoteProperty(note, "mime"); + const [ location ] = useNoteLabel(note, LOCATION_ATTRIBUTE); + + if (mime === "application/gpx+xml") { + return ; + } + + if (location) { + const latLng = location?.split(",", 2).map((el) => parseFloat(el)) as [ number, number ] | undefined; + if (!latLng) return; + return ; + } +} + +function NoteMarker({ note, editable, latLng }: { note: FNote, editable: boolean, latLng: [number, number] }) { + // React to changes + const [ color ] = useNoteLabel(note, "color"); + const [ iconClass ] = useNoteLabel(note, "iconClass"); + const [ archived ] = useNoteLabelBoolean(note, "archived"); + + const title = useNoteProperty(note, "title"); + const icon = useMemo(() => { + return buildIcon(note.getIcon(), note.getColorClass() ?? undefined, title, note.noteId, archived); + }, [ iconClass, color, title, note.noteId, archived]); + + const onClick = useCallback(() => { + appContext.triggerCommand("openInPopup", { noteIdOrPath: note.noteId }); + }, [ note.noteId ]); + + // Middle click to open in new tab + const onMouseDown = useCallback((e: MouseEvent) => { + if (e.button === 1) { + const hoistedNoteId = appContext.tabManager.getActiveContext()?.hoistedNoteId; + appContext.tabManager.openInNewTab(note.noteId, hoistedNoteId); + return true; + } + }, [ note.noteId ]); + + const onDragged = useCallback((newCoordinates: LatLng) => { + moveMarker(note.noteId, newCoordinates); + }, [ note.noteId ]); + + const onContextMenu = useCallback((e: LeafletMouseEvent) => openContextMenu(note.noteId, e, editable), [ note.noteId, editable ]); + + return latLng && +} + +function NoteGpxTrack({ note }: { note: FNote }) { + const [ xmlString, setXmlString ] = useState(); + const blob = useNoteBlob(note); + + useEffect(() => { + if (!blob) return; + server.get(`notes/${note.noteId}/open`, undefined, true).then(xmlResponse => { + if (xmlResponse instanceof Uint8Array) { + setXmlString(new TextDecoder().decode(xmlResponse)); + } else { + setXmlString(xmlResponse); + } + }); + }, [ blob ]); + + // React to changes + const color = useNoteLabel(note, "color"); + const iconClass = useNoteLabel(note, "iconClass"); + + const options = useMemo(() => ({ + markers: { + startIcon: buildIcon(note.getIcon(), note.getColorClass(), note.title), + endIcon: buildIcon("bxs-flag-checkered"), + wptIcons: { + "": buildIcon("bx bx-pin") + } + }, + polyline_options: { + color: note.getLabelValue("color") ?? "blue" + } + }), [ color, iconClass ]); + return xmlString && +} + +function buildIcon(bxIconClass: string, colorClass?: string, title?: string, noteIdLink?: string, archived?: boolean) { + let html = /*html*/`\ + + + + ${title ?? ""}`; + + if (noteIdLink) { + html = `
${html}
`; + } + + return divIcon({ + html, + iconSize: [25, 41], + iconAnchor: [12, 41] + }); +} + +function GeoMapTouchBar({ state, map }: { state: State, map: L.Map | null | undefined }) { + const [ currentZoom, setCurrentZoom ] = useState(); + const parentComponent = useContext(ParentComponent); + + useEffect(() => { + if (!map) return; + + function onZoomChanged() { + setCurrentZoom(map?.getZoom()); + } + + map.on("zoom", onZoomChanged); + return () => map.off("zoom", onZoomChanged); + }, [ map ]); + + return map && currentZoom && ( + + { + setCurrentZoom(newValue); + map.setZoom(newValue); + }} + /> + parentComponent?.triggerCommand("geoMapCreateChildNote")} + enabled={state === State.Normal} + /> + + ) +} diff --git a/apps/client/src/widgets/collections/geomap/map.tsx b/apps/client/src/widgets/collections/geomap/map.tsx new file mode 100644 index 000000000..da9c2173b --- /dev/null +++ b/apps/client/src/widgets/collections/geomap/map.tsx @@ -0,0 +1,143 @@ +import { useEffect, useImperativeHandle, useRef, useState } from "preact/hooks"; +import L, { control, LatLng, Layer, LeafletMouseEvent } from "leaflet"; +import "leaflet/dist/leaflet.css"; +import { MAP_LAYERS } from "./map_layer"; +import { ComponentChildren, createContext, RefObject } from "preact"; +import { useElementSize, useSyncedRef } from "../../react/hooks"; + +export const ParentMap = createContext(null); + +interface MapProps { + apiRef?: RefObject; + containerRef?: RefObject; + coordinates: LatLng | [number, number]; + zoom: number; + layerName: string; + viewportChanged: (coordinates: LatLng, zoom: number) => void; + children: ComponentChildren; + onClick?: (e: LeafletMouseEvent) => void; + onContextMenu?: (e: LeafletMouseEvent) => void; + onZoom?: () => void; + scale: boolean; +} + +export default function Map({ coordinates, zoom, layerName, viewportChanged, children, onClick, onContextMenu, scale, apiRef, containerRef: _containerRef, onZoom }: MapProps) { + const mapRef = useRef(null); + const containerRef = useSyncedRef(_containerRef); + + useImperativeHandle(apiRef ?? null, () => mapRef.current); + + useEffect(() => { + if (!containerRef.current) return; + const mapInstance = L.map(containerRef.current, { + worldCopyJump: true + }); + + mapRef.current = mapInstance; + return () => { + mapInstance.off(); + mapInstance.remove(); + }; + }, []); + + // Load the layer asynchronously. + const [ layer, setLayer ] = useState(); + useEffect(() => { + async function load() { + const layerData = MAP_LAYERS[layerName]; + + if (layerData.type === "vector") { + const style = (typeof layerData.style === "string" ? layerData.style : await layerData.style()); + await import("@maplibre/maplibre-gl-leaflet"); + + setLayer(L.maplibreGL({ + style: style as any + })); + } else { + setLayer(L.tileLayer(layerData.url, { + attribution: layerData.attribution, + detectRetina: true + })); + } + } + + load(); + }, [ layerName ]); + + // Attach layer to the map. + useEffect(() => { + const map = mapRef.current; + const layerToAdd = layer; + if (!map || !layerToAdd) return; + layerToAdd.addTo(map); + return () => layerToAdd.removeFrom(map); + }, [ mapRef, layer ]); + + // React to coordinate changes. + useEffect(() => { + if (!mapRef.current) return; + mapRef.current.setView(coordinates, zoom); + }, [ mapRef, coordinates, zoom ]); + + // Viewport callback. + useEffect(() => { + const map = mapRef.current; + if (!map) return; + + const updateFn = () => viewportChanged(map.getBounds().getCenter(), map.getZoom()); + map.on("moveend", updateFn); + map.on("zoomend", updateFn); + + return () => { + map.off("moveend", updateFn); + map.off("zoomend", updateFn); + }; + }, [ mapRef, viewportChanged ]); + + useEffect(() => { + if (onClick && mapRef.current) { + mapRef.current.on("click", onClick); + return () => mapRef.current?.off("click", onClick); + } + }, [ mapRef, onClick ]); + + useEffect(() => { + if (onContextMenu && mapRef.current) { + mapRef.current.on("contextmenu", onContextMenu); + return () => mapRef.current?.off("contextmenu", onContextMenu); + } + }, [ mapRef, onContextMenu ]); + + useEffect(() => { + if (onZoom && mapRef.current) { + mapRef.current.on("zoom", onZoom); + return () => mapRef.current?.off("zoom", onZoom); + } + }, [ mapRef, onZoom ]); + + // Scale + useEffect(() => { + const map = mapRef.current; + if (!scale || !map) return; + const scaleControl = control.scale(); + scaleControl.addTo(map); + return () => scaleControl.remove(); + }, [ mapRef, scale ]); + + // Adapt to container size changes. + const size = useElementSize(containerRef); + useEffect(() => { + mapRef.current?.invalidateSize(); + }, [ size?.width, size?.height ]); + + return ( +
+ + {children} + +
+ ); +} diff --git a/apps/client/src/widgets/view_widgets/geo_view/map_layer.ts b/apps/client/src/widgets/collections/geomap/map_layer.ts similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/map_layer.ts rename to apps/client/src/widgets/collections/geomap/map_layer.ts diff --git a/apps/client/src/widgets/collections/geomap/marker.tsx b/apps/client/src/widgets/collections/geomap/marker.tsx new file mode 100644 index 000000000..8b6cb1371 --- /dev/null +++ b/apps/client/src/widgets/collections/geomap/marker.tsx @@ -0,0 +1,71 @@ +import { useContext, useEffect } from "preact/hooks"; +import { ParentMap } from "./map"; +import { DivIcon, GPX, GPXOptions, Icon, LatLng, Marker as LeafletMarker, LeafletMouseEvent, marker, MarkerOptions } from "leaflet"; +import "leaflet-gpx"; + +export interface MarkerProps { + coordinates: [ number, number ]; + icon?: Icon | DivIcon; + onClick?: () => void; + onMouseDown?: (e: MouseEvent) => void; + onDragged?: ((newCoordinates: LatLng) => void); + onContextMenu: (e: LeafletMouseEvent) => void; + draggable?: boolean; +} + +export default function Marker({ coordinates, icon, draggable, onClick, onDragged, onMouseDown, onContextMenu }: MarkerProps) { + const parentMap = useContext(ParentMap); + + useEffect(() => { + if (!parentMap) return; + + const options: MarkerOptions = { icon }; + if (draggable) { + options.draggable = true; + options.autoPan = true; + options.autoPanSpeed = 5; + } + + const newMarker = marker(coordinates, options); + + if (onClick) { + newMarker.on("click", () => onClick()); + } + + if (onMouseDown) { + newMarker.on("mousedown", e => onMouseDown(e.originalEvent)); + } + + if (onDragged) { + newMarker.on("moveend", e => { + const coordinates = (e.target as LeafletMarker).getLatLng(); + onDragged(coordinates); + }); + } + + if (onContextMenu) { + newMarker.on("contextmenu", e => onContextMenu(e)) + } + + newMarker.addTo(parentMap); + + return () => newMarker.removeFrom(parentMap); + }, [ parentMap, coordinates, onMouseDown, onDragged, icon ]); + + return (
) +} + +export function GpxTrack({ gpxXmlString, options }: { gpxXmlString: string, options: GPXOptions }) { + const parentMap = useContext(ParentMap); + + useEffect(() => { + if (!parentMap) return; + + const track = new GPX(gpxXmlString, options); + track.addTo(parentMap); + + return () => track.removeFrom(parentMap); + }, [ parentMap, gpxXmlString, options ]); + + return
; +} diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/colorful/de.json b/apps/client/src/widgets/collections/geomap/styles/colorful/de.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/colorful/de.json rename to apps/client/src/widgets/collections/geomap/styles/colorful/de.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/colorful/en.json b/apps/client/src/widgets/collections/geomap/styles/colorful/en.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/colorful/en.json rename to apps/client/src/widgets/collections/geomap/styles/colorful/en.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/colorful/nolabel.json b/apps/client/src/widgets/collections/geomap/styles/colorful/nolabel.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/colorful/nolabel.json rename to apps/client/src/widgets/collections/geomap/styles/colorful/nolabel.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/colorful/style.json b/apps/client/src/widgets/collections/geomap/styles/colorful/style.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/colorful/style.json rename to apps/client/src/widgets/collections/geomap/styles/colorful/style.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/eclipse/de.json b/apps/client/src/widgets/collections/geomap/styles/eclipse/de.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/eclipse/de.json rename to apps/client/src/widgets/collections/geomap/styles/eclipse/de.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/eclipse/en.json b/apps/client/src/widgets/collections/geomap/styles/eclipse/en.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/eclipse/en.json rename to apps/client/src/widgets/collections/geomap/styles/eclipse/en.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/eclipse/nolabel.json b/apps/client/src/widgets/collections/geomap/styles/eclipse/nolabel.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/eclipse/nolabel.json rename to apps/client/src/widgets/collections/geomap/styles/eclipse/nolabel.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/eclipse/style.json b/apps/client/src/widgets/collections/geomap/styles/eclipse/style.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/eclipse/style.json rename to apps/client/src/widgets/collections/geomap/styles/eclipse/style.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/graybeard/de.json b/apps/client/src/widgets/collections/geomap/styles/graybeard/de.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/graybeard/de.json rename to apps/client/src/widgets/collections/geomap/styles/graybeard/de.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/graybeard/en.json b/apps/client/src/widgets/collections/geomap/styles/graybeard/en.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/graybeard/en.json rename to apps/client/src/widgets/collections/geomap/styles/graybeard/en.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/graybeard/nolabel.json b/apps/client/src/widgets/collections/geomap/styles/graybeard/nolabel.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/graybeard/nolabel.json rename to apps/client/src/widgets/collections/geomap/styles/graybeard/nolabel.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/graybeard/style.json b/apps/client/src/widgets/collections/geomap/styles/graybeard/style.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/graybeard/style.json rename to apps/client/src/widgets/collections/geomap/styles/graybeard/style.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/neutrino/de.json b/apps/client/src/widgets/collections/geomap/styles/neutrino/de.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/neutrino/de.json rename to apps/client/src/widgets/collections/geomap/styles/neutrino/de.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/neutrino/en.json b/apps/client/src/widgets/collections/geomap/styles/neutrino/en.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/neutrino/en.json rename to apps/client/src/widgets/collections/geomap/styles/neutrino/en.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/neutrino/nolabel.json b/apps/client/src/widgets/collections/geomap/styles/neutrino/nolabel.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/neutrino/nolabel.json rename to apps/client/src/widgets/collections/geomap/styles/neutrino/nolabel.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/neutrino/style.json b/apps/client/src/widgets/collections/geomap/styles/neutrino/style.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/neutrino/style.json rename to apps/client/src/widgets/collections/geomap/styles/neutrino/style.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/shadow/de.json b/apps/client/src/widgets/collections/geomap/styles/shadow/de.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/shadow/de.json rename to apps/client/src/widgets/collections/geomap/styles/shadow/de.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/shadow/en.json b/apps/client/src/widgets/collections/geomap/styles/shadow/en.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/shadow/en.json rename to apps/client/src/widgets/collections/geomap/styles/shadow/en.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/shadow/nolabel.json b/apps/client/src/widgets/collections/geomap/styles/shadow/nolabel.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/shadow/nolabel.json rename to apps/client/src/widgets/collections/geomap/styles/shadow/nolabel.json diff --git a/apps/client/src/widgets/view_widgets/geo_view/styles/shadow/style.json b/apps/client/src/widgets/collections/geomap/styles/shadow/style.json similarity index 100% rename from apps/client/src/widgets/view_widgets/geo_view/styles/shadow/style.json rename to apps/client/src/widgets/collections/geomap/styles/shadow/style.json diff --git a/apps/client/src/widgets/collections/interface.ts b/apps/client/src/widgets/collections/interface.ts new file mode 100644 index 000000000..7bec23a64 --- /dev/null +++ b/apps/client/src/widgets/collections/interface.ts @@ -0,0 +1,20 @@ +import FNote from "../../entities/fnote"; + +export const allViewTypes = ["list", "grid", "calendar", "table", "geoMap", "board", "presentation"] as const; +export type ViewTypeOptions = typeof allViewTypes[number]; + +export type ViewModeMedia = "screen" | "print"; + +export interface ViewModeProps { + note: FNote; + notePath: string; + /** + * We're using noteIds so that it's not necessary to load all notes at once when paging. + */ + noteIds: string[]; + highlightedTokens: string[] | null | undefined; + viewConfig: T | undefined; + saveConfig(newConfig: T): void; + media: ViewModeMedia; + onReady(): void; +} diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.css b/apps/client/src/widgets/collections/legacy/ListOrGridView.css new file mode 100644 index 000000000..60afe8954 --- /dev/null +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.css @@ -0,0 +1,140 @@ +.note-list { + overflow: hidden; + position: relative; + height: 100%; +} + +.note-book-card { + border-radius: 10px; + background-color: var(--accented-background-color); + padding: 10px 15px 15px 8px; + margin: 5px 5px 5px 5px; + overflow: hidden; + display: flex; + flex-direction: column; + flex-shrink: 0; + flex-grow: 1; +} + +.note-book-card:not(.expanded) .note-book-content { + padding: 10px +} + +.note-book-card.expanded .note-book-content { + display: block; + min-height: 0; + height: 100%; + padding-top: 10px; +} + +.note-book-content .rendered-content { + height: 100%; +} + +.note-book-header { + border-bottom: 1px solid var(--main-border-color); + margin-bottom: 0; + padding-bottom: .5rem; + word-break: break-all; + flex-shrink: 0; +} + +/* not-expanded title is limited to one line only */ +.note-book-card:not(.expanded) .note-book-header { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.note-book-header .rendered-note-attributes { + font-size: medium; +} + +.note-book-header .rendered-note-attributes:before { + content: "\00a0\00a0"; +} + +.note-book-header .note-icon { + font-size: 100%; + display: inline-block; + padding-inline-end: 7px; + position: relative; +} + +.note-book-card .note-book-card { + border: 1px solid var(--main-border-color); +} + +.note-book-content.type-image, .note-book-content.type-file, .note-book-content.type-protectedSession { + display: flex; + align-items: center; + justify-content: center; + text-align: center; + padding: 10px; +} + +.note-book-content.type-image img, .note-book-content.type-canvas svg { + max-width: 100%; + max-height: 100%; + object-fit: contain; +} + +.note-book-card.type-image .note-book-content img, +.note-book-card.type-text .note-book-content img, +.note-book-card.type-canvas .note-book-content img { + max-width: 100%; + max-height: 100%; +} + +.note-book-header { + flex-grow: 0; +} + +.note-list-wrapper { + height: 100%; + overflow: auto; +} + +.note-expander { + font-size: x-large; + position: relative; + top: 3px; + cursor: pointer; +} + +.note-list-pager { + text-align: center; +} + +.note-list.list-view .note-path { + margin-left: 0.5em; + vertical-align: middle; + opacity: 0.5; +} + +/* #region Grid view */ +.note-list.grid-view .note-list-container { + display: flex; + flex-wrap: wrap; +} + +.note-list.grid-view .note-book-card { + flex-basis: 300px; + border: 1px solid transparent; +} + +.note-list.grid-view .note-book-card { + max-height: 300px; +} + +.note-list.grid-view .note-book-card img { + max-height: 220px; + object-fit: contain; +} + +.note-list.grid-view .note-book-card:hover { + cursor: pointer; + border: 1px solid var(--main-border-color); + background: var(--more-accented-background-color); +} +/* #endregion */ \ No newline at end of file diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx new file mode 100644 index 000000000..2b5d1bdd0 --- /dev/null +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx @@ -0,0 +1,194 @@ +import { useEffect, useMemo, useRef, useState } from "preact/hooks"; +import FNote from "../../../entities/fnote"; +import Icon from "../../react/Icon"; +import { ViewModeProps } from "../interface"; +import { useNoteLabelBoolean, useImperativeSearchHighlighlighting } from "../../react/hooks"; +import NoteLink from "../../react/NoteLink"; +import "./ListOrGridView.css"; +import content_renderer from "../../../services/content_renderer"; +import { Pager, usePagination } from "../Pagination"; +import tree from "../../../services/tree"; +import link from "../../../services/link"; +import { t } from "../../../services/i18n"; +import attribute_renderer from "../../../services/attribute_renderer"; + +export function ListView({ note, noteIds: unfilteredNoteIds, highlightedTokens }: ViewModeProps<{}>) { + const [ isExpanded ] = useNoteLabelBoolean(note, "expanded"); + const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); + const { pageNotes, ...pagination } = usePagination(note, noteIds); + + return ( +
+ { noteIds.length > 0 &&
+ + + + + +
} +
+ ); +} + +export function GridView({ note, noteIds: unfilteredNoteIds, highlightedTokens }: ViewModeProps<{}>) { + const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); + const { pageNotes, ...pagination } = usePagination(note, noteIds); + + return ( +
+
+ + + + + +
+
+ ); +} + +function ListNoteCard({ note, parentNote, expand, highlightedTokens }: { note: FNote, parentNote: FNote, expand?: boolean, highlightedTokens: string[] | null | undefined }) { + const [ isExpanded, setExpanded ] = useState(expand); + const notePath = getNotePath(parentNote, note); + + // Reset expand state if switching to another note, or if user manually toggled expansion state. + useEffect(() => setExpanded(expand), [ note, expand ]); + + return ( +
+
+ setExpanded(!isExpanded)} + /> + + + + +
+ + {isExpanded && <> + + + } +
+ ) +} + +function GridNoteCard({ note, parentNote, highlightedTokens }: { note: FNote, parentNote: FNote, highlightedTokens: string[] | null | undefined }) { + const titleRef = useRef(null); + const [ noteTitle, setNoteTitle ] = useState(); + const notePath = getNotePath(parentNote, note); + const highlightSearch = useImperativeSearchHighlighlighting(highlightedTokens); + + useEffect(() => { + tree.getNoteTitle(note.noteId, parentNote.noteId).then(setNoteTitle); + }, [ note ]); + + useEffect(() => highlightSearch(titleRef.current), [ noteTitle, highlightedTokens ]); + + return ( +
link.goToLink(e)} + > +
+ + {noteTitle} + +
+ +
+ ) +} + +function NoteAttributes({ note }: { note: FNote }) { + const ref = useRef(null); + useEffect(() => { + attribute_renderer.renderNormalAttributes(note).then(({$renderedAttributes}) => { + ref.current?.replaceChildren(...$renderedAttributes); + }); + }, [ note ]); + + return +} + +function NoteContent({ note, trim, noChildrenList, highlightedTokens }: { note: FNote, trim?: boolean, noChildrenList?: boolean, highlightedTokens: string[] | null | undefined }) { + const contentRef = useRef(null); + const highlightSearch = useImperativeSearchHighlighlighting(highlightedTokens); + + useEffect(() => { + content_renderer.getRenderedContent(note, { + trim, + noChildrenList + }) + .then(({ $renderedContent, type }) => { + if (!contentRef.current) return; + if ($renderedContent[0].innerHTML) { + contentRef.current.replaceChildren(...$renderedContent); + } else { + contentRef.current.replaceChildren(); + } + contentRef.current.classList.add(`type-${type}`); + highlightSearch(contentRef.current); + }) + .catch(e => { + console.warn(`Caught error while rendering note '${note.noteId}' of type '${note.type}'`); + console.error(e); + contentRef.current?.replaceChildren(t("collections.rendering_error")); + }) + }, [ note, highlightedTokens ]); + + return
; +} + +function NoteChildren({ note, parentNote, highlightedTokens }: { note: FNote, parentNote: FNote, highlightedTokens: string[] | null | undefined }) { + const imageLinks = note.getRelations("imageLink"); + const [ childNotes, setChildNotes ] = useState(); + + useEffect(() => { + note.getChildNotes().then(childNotes => { + const filteredChildNotes = childNotes.filter((childNote) => !imageLinks.find((rel) => rel.value === childNote.noteId)); + setChildNotes(filteredChildNotes); + }); + }, [ note ]); + + return childNotes?.map(childNote => ) +} + +/** + * Filters the note IDs for the legacy view to filter out subnotes that are already included in the note content such as images, included notes. + */ +function useFilteredNoteIds(note: FNote, noteIds: string[]) { + return useMemo(() => { + const includedLinks = note ? note.getRelations().filter((rel) => rel.name === "imageLink" || rel.name === "includeNoteLink") : []; + const includedNoteIds = new Set(includedLinks.map((rel) => rel.value)); + return noteIds.filter((noteId) => !includedNoteIds.has(noteId) && noteId !== "_hidden"); + }, noteIds); +} + +function getNotePath(parentNote: FNote, childNote: FNote) { + if (parentNote.type === "search") { + // for search note parent, we want to display a non-search path + return childNote.noteId; + } else { + return `${parentNote.noteId}/${childNote.noteId}` + } +} diff --git a/apps/client/src/widgets/collections/presentation/index.css b/apps/client/src/widgets/collections/presentation/index.css new file mode 100644 index 000000000..5aafffd9f --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/index.css @@ -0,0 +1,10 @@ +.presentation-button-bar { + position: absolute; + top: 1em; + right: 1em; +} + +.presentation-container { + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/apps/client/src/widgets/collections/presentation/index.tsx b/apps/client/src/widgets/collections/presentation/index.tsx new file mode 100644 index 000000000..dfa4574e0 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/index.tsx @@ -0,0 +1,245 @@ +import { ViewModeMedia, ViewModeProps } from "../interface"; +import { useEffect, useLayoutEffect, useRef, useState } from "preact/hooks"; +import Reveal from "reveal.js"; +import slideBaseStylesheet from "reveal.js/dist/reveal.css?raw"; +import slideCustomStylesheet from "./slidejs.css?raw"; +import { buildPresentationModel, PresentationModel, PresentationSlideBaseModel } from "./model"; +import ShadowDom from "../../react/ShadowDom"; +import ActionButton from "../../react/ActionButton"; +import "./index.css"; +import { RefObject } from "preact"; +import { openInCurrentNoteContext } from "../../../components/note_context"; +import { useNoteLabelWithDefault, useTriliumEvent } from "../../react/hooks"; +import { t } from "../../../services/i18n"; +import { DEFAULT_THEME, loadPresentationTheme } from "./themes"; +import FNote from "../../../entities/fnote"; + +export default function PresentationView({ note, noteIds, media, onReady }: ViewModeProps<{}>) { + const [ presentation, setPresentation ] = useState(); + const containerRef = useRef(null); + const [ api, setApi ] = useState(); + const stylesheets = usePresentationStylesheets(note, media); + + function refresh() { + buildPresentationModel(note).then(setPresentation); + } + + useTriliumEvent("entitiesReloaded", ({ loadResults }) => { + if (loadResults.getNoteIds().find(noteId => noteIds.includes(noteId)) || + loadResults.getAttributeRows().find(attr => attr.noteId && attr.name?.startsWith("slide:") && noteIds.includes(attr.noteId))) { + refresh(); + } + }); + + useLayoutEffect(refresh, [ note, noteIds ]); + + useEffect(() => { + // We need to wait for Reveal.js to initialize (by setting api) and for the presentation to become available. + if (api && presentation) { + // Timeout is necessary because it otherwise can cause flakiness by rendering only the first slide. + setTimeout(onReady, 200); + } + }, [ api, presentation ]); + + if (!presentation || !stylesheets) return; + const content = ( + <> + {stylesheets.map(stylesheet => )} + + + ); + + if (media === "screen") { + return ( + <> + {content} + + + ) + } else if (media === "print") { + // Printing needs a query parameter that is read by Reveal.js. + const url = new URL(window.location.href); + url.searchParams.set("print-pdf", ""); + window.history.replaceState({}, '', url); + + // Shadow DOM doesn't work well with Reveal.js's PDF printing mechanism. + return content; + } +} + +function usePresentationStylesheets(note: FNote, media: ViewModeMedia) { + const [ themeName ] = useNoteLabelWithDefault(note, "presentation:theme", DEFAULT_THEME); + const [ stylesheets, setStylesheets ] = useState(); + + useLayoutEffect(() => { + loadPresentationTheme(themeName).then((themeStylesheet) => { + let stylesheets = [ + slideBaseStylesheet, + themeStylesheet, + slideCustomStylesheet + ]; + if (media === "screen") { + // We are rendering in the shadow DOM, so the global variables are not set correctly. + stylesheets = stylesheets.map(stylesheet => stylesheet.replace(/:root/g, ":host")); + } + setStylesheets(stylesheets); + }); + }, [ themeName ]); + + return stylesheets; +} + +function ButtonOverlay({ containerRef, api }: { containerRef: RefObject, api: Reveal.Api | undefined }) { + const [ isOverviewActive, setIsOverviewActive ] = useState(false); + useEffect(() => { + if (!api) return; + setIsOverviewActive(api.isOverview()); + const onEnabled = () => setIsOverviewActive(true); + const onDisabled = () => setIsOverviewActive(false); + api.on("overviewshown", onEnabled); + api.on("overviewhidden", onDisabled); + return () => { + api.off("overviewshown", onEnabled); + api.off("overviewhidden", onDisabled); + }; + }, [ api ]); + + return ( +
+
+ { + const currentSlide = api?.getCurrentSlide(); + const noteId = getNoteIdFromSlide(currentSlide); + + if (noteId) { + openInCurrentNoteContext(e, noteId); + } + }} + /> + + api?.toggleOverview()} + /> + + containerRef.current?.requestFullscreen()} + /> +
+
+ ) +} + +function Presentation({ presentation, setApi } : { presentation: PresentationModel, setApi: (api: Reveal.Api | undefined) => void }) { + const containerRef = useRef(null); + const [revealApi, setRevealApi] = useState(); + + useEffect(() => { + if (!containerRef.current) return; + + const api = new Reveal(containerRef.current, { + transition: "slide", + embedded: true, + pdfMaxPagesPerSlide: 1, + keyboardCondition(event) { + // Full-screen requests sometimes fail, we rely on the UI button instead. + if (event.key === "f") { + return false; + } + + return true; + }, + }); + api.initialize().then(() => { + setRevealApi(api); + setApi(api); + + if (containerRef.current) { + rewireLinks(containerRef.current, api); + } + }); + + return () => { + api.destroy(); + setRevealApi(undefined); + setApi(undefined); + } + }, []); + + useEffect(() => { + revealApi?.sync(); + }, [ presentation, revealApi ]); + + return ( +
+
+ {presentation.slides?.map(slide => { + if (!slide.verticalSlides) { + return + } else { + return ( +
+ + {slide.verticalSlides.map(slide => )} +
+ ); + } + })} +
+
+ ) + +} + +function Slide({ slide }: { slide: PresentationSlideBaseModel }) { + return ( +
+ ); +} + +function getNoteIdFromSlide(slide: HTMLElement | undefined) { + if (!slide) return; + return slide.dataset.noteId; +} + +function rewireLinks(container: HTMLElement, api: Reveal.Api) { + const links = container.querySelectorAll("a.reference-link"); + for (const link of links) { + link.addEventListener("click", () => { + /** + * Reveal.js has built-in navigation by either index or ID. However, the ID-based navigation doesn't work because it tries to look + * outside the shadom DOM (via document.getElementById). + */ + const url = new URL(link.href); + if (!url.hash.startsWith("#/slide-")) return; + const targetId = url.hash.substring(8); + const slide = container.querySelector(`#slide-${targetId}`); + if (!slide) return; + + const { h, v, f } = api.getIndices(slide); + api.slide(h, v, f); + }); + } +} diff --git a/apps/client/src/widgets/collections/presentation/model.spec.ts b/apps/client/src/widgets/collections/presentation/model.spec.ts new file mode 100644 index 000000000..e5b5b49b6 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/model.spec.ts @@ -0,0 +1,83 @@ +import { beforeAll, describe, expect, it } from "vitest"; +import { buildNote } from "../../../test/easy-froca"; +import FNote from "../../../entities/fnote"; +import { buildPresentationModel, PresentationModel } from "./model"; + +let presentationNote!: FNote; +let data!: PresentationModel; + +describe("Presentation model", () => { + beforeAll(async () => { + presentationNote = buildNote({ + title: "Presentation", + id: "presentation", + "#viewType": "presentation", + "children": [ + { + id: "slide1", + title: "First slide", + children: [ + { + id: "slide2", + title: "First-sub", + content: `

Go to Other note.

` + } + ] + }, + { + title: "Second slide", + id: "slide3", + content: `

Go to First slide.

`, + children: [ + { + id: "slide4", + title: "Second-sub", + content: `

Go to First-sub.

`, + } + ] + } + ] + }); + buildNote({ + id: "other", + title: "Other note" + }); + data = await buildPresentationModel(presentationNote); + }); + + it("it correctly maps horizontal and vertical slides", () => { + expect(data).toMatchObject({ + slides: [ + { + noteId: "slide1", + verticalSlides: [ + { + noteId: "slide2" + } + ] + }, + { + noteId: "slide3", + verticalSlides: [ + { + noteId: "slide4" + } + ] + } + ] + }) + }); + + it("empty slides don't render children", () => { + expect(data.slides[0].content.__html).toStrictEqual(""); + }); + + it("rewrites links to other slides", () => { + expect(data.slides[1].content.__html).toStrictEqual(`

Go to First slide.

`); + expect(data.slides[1].verticalSlides![0].content.__html).toStrictEqual(`

Go to First-sub.

`); + }); + + it("rewrites links even if they are not part of the slideshow", () => { + expect(data.slides[0].verticalSlides![0].content.__html).toStrictEqual(`

Go to Other note.

`); + }); +}); diff --git a/apps/client/src/widgets/collections/presentation/model.ts b/apps/client/src/widgets/collections/presentation/model.ts new file mode 100644 index 000000000..92b7ffe76 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/model.ts @@ -0,0 +1,73 @@ +import { NoteType } from "@triliumnext/commons"; +import FNote from "../../../entities/fnote"; +import contentRenderer from "../../../services/content_renderer"; + +type DangerouslySetInnerHTML = { __html: string; }; + +/** A top-level slide with optional vertical slides. */ +interface PresentationSlideModel extends PresentationSlideBaseModel { + verticalSlides: PresentationSlideBaseModel[] | undefined; +} + +/** Either a top-level slide or a vertical slide. */ +export interface PresentationSlideBaseModel { + noteId: string; + type: NoteType; + content: DangerouslySetInnerHTML; + backgroundColor?: string; + backgroundGradient?: string; +} + +export interface PresentationModel { + slides: PresentationSlideModel[]; +} + +export async function buildPresentationModel(note: FNote): Promise { + const slideNotes = await note.getChildNotes(); + const slides: PresentationSlideModel[] = await Promise.all(slideNotes.map(async slideNote => ({ + ...(await buildSlideModel(slideNote)), + verticalSlides: note.type !== "search" ? await buildVerticalSlides(slideNote) : undefined + }))); + + postProcessSlides(slides); + return { slides }; +} + +async function buildVerticalSlides(parentSlideNote: FNote): Promise { + const children = await parentSlideNote.getChildNotes(); + if (!children.length) return; + + const slides: PresentationSlideBaseModel[] = await Promise.all(children.map(buildSlideModel)); + + return slides; +} + +async function buildSlideModel(note: FNote): Promise { + const slideBackground = note.getLabelValue("slide:background") ?? undefined; + const isGradient = slideBackground?.includes("gradient("); + + return { + noteId: note.noteId, + type: note.type, + content: await processContent(note), + backgroundColor: !isGradient ? slideBackground : undefined, + backgroundGradient: isGradient ? slideBackground : undefined + } +} + +async function processContent(note: FNote): Promise { + const { $renderedContent } = await contentRenderer.getRenderedContent(note, { + noChildrenList: true + }); + return { __html: $renderedContent.html() }; +} + +async function postProcessSlides(slides: (PresentationSlideModel | PresentationSlideBaseModel)[]) { + for (const slide of slides) { + if (slide.type !== "text") continue; + slide.content.__html = slide.content.__html.replaceAll(/href="[^"]*#root[a-zA-Z0-9_\/]*\/([a-zA-Z0-9_]+)[^"]*"/g, `href="#/slide-$1"`); + if ("verticalSlides" in slide && slide.verticalSlides) { + postProcessSlides(slide.verticalSlides); + } + } +} diff --git a/apps/client/src/widgets/collections/presentation/slidejs.css b/apps/client/src/widgets/collections/presentation/slidejs.css new file mode 100644 index 000000000..4fee508f2 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/slidejs.css @@ -0,0 +1,29 @@ +figure img { + aspect-ratio: unset !important; + height: auto !important; +} + +span.katex-html { + display: none !important; +} + +p:has(span.text-tiny), +p:has(span.text-small), +p:has(span.text-big), +p:has(span.text-huge) { + line-height: unset !important; +} + +span.text-tiny { font-size: 0.5em; } +span.text-small { font-size: 0.75em; } +span.text-big { font-size: 1.5em; } +span.text-huge { font-size: 2em; } + +footer.file-footer { + display: none !important; +} + +.reveal video { + max-width: unset; + max-height: unset; +} \ No newline at end of file diff --git a/apps/client/src/widgets/collections/presentation/themes.spec.ts b/apps/client/src/widgets/collections/presentation/themes.spec.ts new file mode 100644 index 000000000..854cad190 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/themes.spec.ts @@ -0,0 +1,10 @@ +import { it, describe } from "vitest"; +import { getPresentationThemes, loadPresentationTheme } from "./themes"; + +describe("Presentation themes", () => { + it("can load all themes", async () => { + const themes = getPresentationThemes(); + + await Promise.all(themes.map(theme => loadPresentationTheme(theme.id))); + }); +}); diff --git a/apps/client/src/widgets/collections/presentation/themes.ts b/apps/client/src/widgets/collections/presentation/themes.ts new file mode 100644 index 000000000..414472d56 --- /dev/null +++ b/apps/client/src/widgets/collections/presentation/themes.ts @@ -0,0 +1,58 @@ +export const DEFAULT_THEME = "white"; + +const themes = { + black: { + name: "Black", + loadTheme: () => import("reveal.js/dist/theme/black.css?raw") + }, + white: { + name: "White", + loadTheme: () => import("reveal.js/dist/theme/white.css?raw") + }, + beige: { + name: "Beige", + loadTheme: () => import("reveal.js/dist/theme/beige.css?raw") + }, + serif: { + name: "Serif", + loadTheme: () => import("reveal.js/dist/theme/serif.css?raw") + }, + simple: { + name: "Simple", + loadTheme: () => import("reveal.js/dist/theme/simple.css?raw") + }, + solarized: { + name: "Solarized", + loadTheme: () => import("reveal.js/dist/theme/solarized.css?raw") + }, + moon: { + name: "Moon", + loadTheme: () => import("reveal.js/dist/theme/moon.css?raw") + }, + dracula: { + name: "Dracula", + loadTheme: () => import("reveal.js/dist/theme/dracula.css?raw") + }, + sky: { + name: "Sky", + loadTheme: () => import("reveal.js/dist/theme/sky.css?raw") + }, + blood: { + name: "Blood", + loadTheme: () => import("reveal.js/dist/theme/blood.css?raw") + } +} as const; + +export function getPresentationThemes() { + return Object.entries(themes).map(([ id, theme ]) => ({ + id: id, + name: theme.name + })); +} + +export async function loadPresentationTheme(name: keyof typeof themes | string) { + let theme = themes[name]; + if (!theme) theme = themes[DEFAULT_THEME]; + + return (await theme.loadTheme()).default; +} diff --git a/apps/client/src/widgets/collections/table/col_editing.ts b/apps/client/src/widgets/collections/table/col_editing.ts new file mode 100644 index 000000000..53f63a152 --- /dev/null +++ b/apps/client/src/widgets/collections/table/col_editing.ts @@ -0,0 +1,148 @@ +import { useLegacyImperativeHandlers } from "../../react/hooks"; +import { Attribute } from "../../../services/attribute_parser"; +import { RefObject } from "preact"; +import { Tabulator } from "tabulator-tables"; +import { useRef } from "preact/hooks"; +import { CommandListenerData, EventData } from "../../../components/app_context"; +import AttributeDetailWidget from "../../attribute_widgets/attribute_detail"; +import attributes from "../../../services/attributes"; +import FNote from "../../../entities/fnote"; +import { getAttributeFromField } from "./utils"; +import dialog from "../../../services/dialog"; +import { t } from "i18next"; +import { executeBulkActions } from "../../../services/bulk_action"; + +export default function useColTableEditing(api: RefObject, attributeDetailWidget: AttributeDetailWidget, parentNote: FNote) { + + const existingAttributeToEdit = useRef(); + const newAttribute = useRef(); + const newAttributePosition = useRef(); + + useLegacyImperativeHandlers({ + addNewTableColumnCommand({ referenceColumn, columnToEdit, direction, type }: EventData<"addNewTableColumn">) { + let attr: Attribute | undefined; + + existingAttributeToEdit.current = undefined; + if (columnToEdit) { + attr = getAttributeFromField(parentNote, columnToEdit.getField()); + if (attr) { + existingAttributeToEdit.current = { ...attr }; + } + } + + if (!attr) { + attr = { + type: "label", + name: `${type ?? "label"}:myLabel`, + value: "promoted,single,text", + isInheritable: true + }; + } + + if (referenceColumn && api.current) { + let newPosition = api.current.getColumns().indexOf(referenceColumn); + if (direction === "after") { + newPosition++; + } + + newAttributePosition.current = newPosition; + } else { + newAttributePosition.current = undefined; + } + + attributeDetailWidget.showAttributeDetail({ + attribute: attr, + allAttributes: [ attr ], + isOwned: true, + x: 0, + y: 150, + focus: "name", + hideMultiplicity: true + }); + }, + async updateAttributeListCommand({ attributes }: CommandListenerData<"updateAttributeList">) { + newAttribute.current = attributes[0]; + }, + async saveAttributesCommand() { + if (!newAttribute.current || !api.current) { + return; + } + + const { name, value, isInheritable } = newAttribute.current; + + api.current.blockRedraw(); + const isRename = (existingAttributeToEdit.current && existingAttributeToEdit.current.name !== name); + try { + if (isRename) { + const oldName = existingAttributeToEdit.current!.name.split(":")[1]; + const [ type, newName ] = name.split(":"); + await renameColumn(parentNote.noteId, type as "label" | "relation", oldName, newName); + } + + if (existingAttributeToEdit.current && (isRename || existingAttributeToEdit.current.isInheritable !== isInheritable)) { + attributes.removeOwnedLabelByName(parentNote, existingAttributeToEdit.current.name); + } + attributes.setLabel(parentNote.noteId, name, value, isInheritable); + } finally { + api.current.restoreRedraw(); + } + }, + async deleteTableColumnCommand({ columnToDelete }: CommandListenerData<"deleteTableColumn">) { + if (!api.current || !columnToDelete || !await dialog.confirm(t("table_view.delete_column_confirmation"))) { + return; + } + + let [ type, name ] = columnToDelete.getField()?.split(".", 2); + if (!type || !name) { + return; + } + type = type.replace("s", ""); + + api.current.blockRedraw(); + try { + await deleteColumn(parentNote.noteId, type as "label" | "relation", name); + attributes.removeOwnedLabelByName(parentNote, `${type}:${name}`); + } finally { + api.current.restoreRedraw(); + } + } + }); + + function resetNewAttributePosition() { + newAttribute.current = undefined; + newAttributePosition.current = undefined; + existingAttributeToEdit.current = undefined; + } + + return { newAttributePosition, resetNewAttributePosition }; +} + +async function deleteColumn(parentNoteId: string, type: "label" | "relation", columnName: string) { + if (type === "label") { + return executeBulkActions([parentNoteId], [{ + name: "deleteLabel", + labelName: columnName + }], true); + } else { + return executeBulkActions([parentNoteId], [{ + name: "deleteRelation", + relationName: columnName + }], true); + } +} + +async function renameColumn(parentNoteId: string, type: "label" | "relation", originalName: string, newName: string) { + if (type === "label") { + return executeBulkActions([parentNoteId], [{ + name: "renameLabel", + oldLabelName: originalName, + newLabelName: newName + }], true); + } else { + return executeBulkActions([parentNoteId], [{ + name: "renameRelation", + oldRelationName: originalName, + newRelationName: newName + }], true); + } +} diff --git a/apps/client/src/widgets/view_widgets/table_view/columns.spec.ts b/apps/client/src/widgets/collections/table/columns.spec.ts similarity index 100% rename from apps/client/src/widgets/view_widgets/table_view/columns.spec.ts rename to apps/client/src/widgets/collections/table/columns.spec.ts diff --git a/apps/client/src/widgets/view_widgets/table_view/columns.ts b/apps/client/src/widgets/collections/table/columns.tsx similarity index 54% rename from apps/client/src/widgets/view_widgets/table_view/columns.ts rename to apps/client/src/widgets/collections/table/columns.tsx index 39047fa70..74db6ddb7 100644 --- a/apps/client/src/widgets/view_widgets/table_view/columns.ts +++ b/apps/client/src/widgets/collections/table/columns.tsx @@ -1,7 +1,11 @@ -import { RelationEditor } from "./relation_editor.js"; -import { MonospaceFormatter, NoteFormatter, NoteTitleFormatter, RowNumberFormatter } from "./formatters.js"; -import type { ColumnDefinition } from "tabulator-tables"; +import type { CellComponent, ColumnDefinition, EmptyCallback, FormatterParams, ValueBooleanCallback, ValueVoidCallback } from "tabulator-tables"; import { LabelType } from "../../../services/promoted_attribute_definition_parser.js"; +import { JSX } from "preact"; +import { renderReactWidget } from "../../react/react_utils.jsx"; +import Icon from "../../react/Icon.jsx"; +import { useEffect, useRef, useState } from "preact/hooks"; +import froca from "../../../services/froca.js"; +import NoteAutocomplete from "../../react/NoteAutocomplete.jsx"; type ColumnType = LabelType | "relation"; @@ -26,7 +30,8 @@ const labelTypeMappings: Record> = { editor: "datetime" }, number: { - editor: "number" + editor: "number", + sorter: "number" }, time: { editor: "input" @@ -45,8 +50,8 @@ const labelTypeMappings: Record> = { } }, relation: { - editor: RelationEditor, - formatter: NoteFormatter + editor: wrapEditor(RelationEditor), + formatter: wrapFormatter(NoteFormatter) } }; @@ -58,6 +63,10 @@ interface BuildColumnArgs { position?: number; } +interface RowNumberFormatterParams { + movableRows?: boolean; +} + export function buildColumnDefinitions({ info, movableRows, existingColumnData, rowNumberHint, position }: BuildColumnArgs) { let columnDefs: ColumnDefinition[] = [ { @@ -68,19 +77,28 @@ export function buildColumnDefinitions({ info, movableRows, existingColumnData, frozen: true, rowHandle: movableRows, width: calculateIndexColumnWidth(rowNumberHint, movableRows), - formatter: RowNumberFormatter(movableRows) + formatter: wrapFormatter(({ cell, formatterParams }) =>
+ {(formatterParams as RowNumberFormatterParams).movableRows && <>{" "}} + {cell.getRow().getPosition(true)} +
), + formatterParams: { movableRows } satisfies RowNumberFormatterParams }, { field: "noteId", title: "Note ID", - formatter: MonospaceFormatter, + formatter: wrapFormatter(({ cell }) => {cell.getValue()}), visible: false }, { field: "title", title: "Title", editor: "input", - formatter: NoteTitleFormatter, + formatter: wrapFormatter(({ cell }) => { + const { noteId, iconClass, colorClass } = cell.getRow().getData(); + return + {" "}{cell.getValue()} + ; + }), width: 400 } ]; @@ -154,3 +172,64 @@ function calculateIndexColumnWidth(rowNumberHint: number, movableRows: boolean): } return columnWidth; } + +interface FormatterOpts { + cell: CellComponent + formatterParams: FormatterParams; +} + +interface EditorOpts { + cell: CellComponent, + success: ValueBooleanCallback, + cancel: ValueVoidCallback, + editorParams: {} +} + +function wrapFormatter(Component: (opts: FormatterOpts) => JSX.Element): ((cell: CellComponent, formatterParams: {}, onRendered: EmptyCallback) => string | HTMLElement) { + return (cell, formatterParams, onRendered) => { + const elWithParams = ; + return renderReactWidget(null, elWithParams)[0]; + }; +} + +function wrapEditor(Component: (opts: EditorOpts) => JSX.Element): (( + cell: CellComponent, + onRendered: EmptyCallback, + success: ValueBooleanCallback, + cancel: ValueVoidCallback, + editorParams: {}, +) => HTMLElement | false) { + return (cell, _, success, cancel, editorParams) => { + const elWithParams = + return renderReactWidget(null, elWithParams)[0]; + }; +} + +function NoteFormatter({ cell }: FormatterOpts) { + const noteId = cell.getValue(); + const [ note, setNote ] = useState(noteId ? froca.getNoteFromCache(noteId) : null) + + useEffect(() => { + if (!noteId || note?.noteId === noteId) return; + froca.getNote(noteId).then(setNote); + }, [ noteId ]); + + return + {note && <>{" "}{note.title}} + ; +} + +function RelationEditor({ cell, success }: EditorOpts) { + const inputRef = useRef(null); + useEffect(() => inputRef.current?.focus()); + + return +} diff --git a/apps/client/src/widgets/view_widgets/table_view/context_menu.ts b/apps/client/src/widgets/collections/table/context_menu.ts similarity index 71% rename from apps/client/src/widgets/view_widgets/table_view/context_menu.ts rename to apps/client/src/widgets/collections/table/context_menu.ts index 21f434d7d..eb0a303ae 100644 --- a/apps/client/src/widgets/view_widgets/table_view/context_menu.ts +++ b/apps/client/src/widgets/collections/table/context_menu.ts @@ -1,31 +1,35 @@ -import { ColumnComponent, RowComponent, Tabulator } from "tabulator-tables"; +import { ColumnComponent, EventCallBackMethods, RowComponent, Tabulator } from "tabulator-tables"; import contextMenu, { MenuItem } from "../../../menus/context_menu.js"; -import { TableData } from "./rows.js"; -import branches from "../../../services/branches.js"; +import FNote from "../../../entities/fnote.js"; import { t } from "../../../services/i18n.js"; +import { TableData } from "./rows.js"; import link_context_menu from "../../../menus/link_context_menu.js"; -import type FNote from "../../../entities/fnote.js"; import froca from "../../../services/froca.js"; -import type Component from "../../../components/component.js"; +import branches from "../../../services/branches.js"; +import Component from "../../../components/component.js"; +import { RefObject } from "preact"; -export function setupContextMenu(tabulator: Tabulator, parentNote: FNote) { - tabulator.on("rowContext", (e, row) => showRowContextMenu(e, row, parentNote, tabulator)); - tabulator.on("headerContext", (e, col) => showColumnContextMenu(e, col, parentNote, tabulator)); - tabulator.on("renderComplete", () => { - const headerRow = tabulator.element.querySelector(".tabulator-header-contents"); - headerRow?.addEventListener("contextmenu", (e) => showHeaderContextMenu(e, tabulator)); - }); +export function useContextMenu(parentNote: FNote, parentComponent: Component | null | undefined, tabulator: RefObject): Partial { + const events: Partial = {}; + if (!tabulator || !parentComponent) return events; - // Pressing the expand button prevents bubbling and the context menu remains menu when it shouldn't. - if (tabulator.options.dataTree) { - const dismissContextMenu = () => contextMenu.hide(); - tabulator.on("dataTreeRowExpanded", dismissContextMenu); - tabulator.on("dataTreeRowCollapsed", dismissContextMenu); + events["rowContext"] = (e, row) => tabulator.current && showRowContextMenu(parentComponent, e as MouseEvent, row, parentNote, tabulator.current); + events["headerContext"] = (e, col) => tabulator.current && showColumnContextMenu(parentComponent, e as MouseEvent, col, parentNote, tabulator.current); + events["renderComplete"] = () => { + const headerRow = tabulator.current?.element.querySelector(".tabulator-header-contents"); + headerRow?.addEventListener("contextmenu", (e) => showHeaderContextMenu(parentComponent, e as MouseEvent, tabulator.current!)); } + // Pressing the expand button prevents bubbling and the context menu remains menu when it shouldn't. + if (tabulator.current?.options.dataTree) { + const dismissContextMenu = () => contextMenu.hide(); + events["dataTreeRowExpanded"] = dismissContextMenu; + events["dataTreeRowCollapsed"] = dismissContextMenu; + } + + return events; } -function showColumnContextMenu(_e: UIEvent, column: ColumnComponent, parentNote: FNote, tabulator: Tabulator) { - const e = _e as MouseEvent; +function showColumnContextMenu(parentComponent: Component, e: MouseEvent, column: ColumnComponent, parentNote: FNote, tabulator: Tabulator) { const { title, field } = column.getDefinition(); const sorters = tabulator.getSorters(); @@ -70,7 +74,7 @@ function showColumnContextMenu(_e: UIEvent, column: ColumnComponent, parentNote: handler: () => tabulator.clearSort() }, { - title: "----" + kind: "separator" }, { title: t("table_view.hide-column", { title }), @@ -82,31 +86,31 @@ function showColumnContextMenu(_e: UIEvent, column: ColumnComponent, parentNote: uiIcon: "bx bx-columns", items: buildColumnItems(tabulator) }, - { title: "----" }, + { kind: "separator" }, { title: t("table_view.add-column-to-the-left"), uiIcon: "bx bx-horizontal-left", enabled: !column.getDefinition().frozen, - items: buildInsertSubmenu(e, column, "before"), - handler: () => getParentComponent(e)?.triggerCommand("addNewTableColumn", { + items: buildInsertSubmenu(parentComponent, column, "before"), + handler: () => parentComponent?.triggerCommand("addNewTableColumn", { referenceColumn: column }) }, { title: t("table_view.add-column-to-the-right"), uiIcon: "bx bx-horizontal-right", - items: buildInsertSubmenu(e, column, "after"), - handler: () => getParentComponent(e)?.triggerCommand("addNewTableColumn", { + items: buildInsertSubmenu(parentComponent, column, "after"), + handler: () => parentComponent?.triggerCommand("addNewTableColumn", { referenceColumn: column, direction: "after" }) }, - { title: "----" }, + { kind: "separator" }, { title: t("table_view.edit-column"), uiIcon: "bx bxs-edit-alt", enabled: isUserDefinedColumn, - handler: () => getParentComponent(e)?.triggerCommand("addNewTableColumn", { + handler: () => parentComponent?.triggerCommand("addNewTableColumn", { referenceColumn: column, columnToEdit: column }) @@ -115,7 +119,7 @@ function showColumnContextMenu(_e: UIEvent, column: ColumnComponent, parentNote: title: t("table_view.delete-column"), uiIcon: "bx bx-trash", enabled: isUserDefinedColumn, - handler: () => getParentComponent(e)?.triggerCommand("deleteTableColumn", { + handler: () => parentComponent?.triggerCommand("deleteTableColumn", { columnToDelete: column }) } @@ -131,8 +135,7 @@ function showColumnContextMenu(_e: UIEvent, column: ColumnComponent, parentNote: * Shows a context menu which has options dedicated to the header area (the part where the columns are, but in the empty space). * Provides generic options such as toggling columns. */ -function showHeaderContextMenu(_e: Event, tabulator: Tabulator) { - const e = _e as MouseEvent; +function showHeaderContextMenu(parentComponent: Component, e: MouseEvent, tabulator: Tabulator) { contextMenu.show({ items: [ { @@ -140,13 +143,13 @@ function showHeaderContextMenu(_e: Event, tabulator: Tabulator) { uiIcon: "bx bx-columns", items: buildColumnItems(tabulator) }, - { title: "----" }, + { kind: "separator" }, { title: t("table_view.new-column"), uiIcon: "bx bx-empty", enabled: false }, - ...buildInsertSubmenu(e) + ...buildInsertSubmenu(parentComponent) ], selectMenuItemHandler() {}, x: e.pageX, @@ -155,9 +158,9 @@ function showHeaderContextMenu(_e: Event, tabulator: Tabulator) { e.preventDefault(); } -export function showRowContextMenu(_e: UIEvent, row: RowComponent, parentNote: FNote, tabulator: Tabulator) { - const e = _e as MouseEvent; +export function showRowContextMenu(parentComponent: Component, e: MouseEvent, row: RowComponent, parentNote: FNote, tabulator: Tabulator) { const rowData = row.getData() as TableData; + const sorters = tabulator.getSorters(); let parentNoteId: string = parentNote.noteId; @@ -171,11 +174,12 @@ export function showRowContextMenu(_e: UIEvent, row: RowComponent, parentNote: F contextMenu.show({ items: [ ...link_context_menu.getItems(), - { title: "----" }, + { kind: "separator" }, { title: t("table_view.row-insert-above"), uiIcon: "bx bx-horizontal-left bx-rotate-90", - handler: () => getParentComponent(e)?.triggerCommand("addNewRow", { + enabled: !sorters.length, + handler: () => parentComponent?.triggerCommand("addNewRow", { parentNotePath: parentNoteId, customOpts: { target: "before", @@ -189,7 +193,7 @@ export function showRowContextMenu(_e: UIEvent, row: RowComponent, parentNote: F handler: async () => { const branchId = row.getData().branchId; const note = await froca.getBranch(branchId)?.getNote(); - getParentComponent(e)?.triggerCommand("addNewRow", { + parentComponent?.triggerCommand("addNewRow", { parentNotePath: note?.noteId, customOpts: { target: "after", @@ -201,7 +205,8 @@ export function showRowContextMenu(_e: UIEvent, row: RowComponent, parentNote: F { title: t("table_view.row-insert-below"), uiIcon: "bx bx-horizontal-left bx-rotate-270", - handler: () => getParentComponent(e)?.triggerCommand("addNewRow", { + enabled: !sorters.length, + handler: () => parentComponent?.triggerCommand("addNewRow", { parentNotePath: parentNoteId, customOpts: { target: "after", @@ -209,7 +214,7 @@ export function showRowContextMenu(_e: UIEvent, row: RowComponent, parentNote: F } }) }, - { title: "----" }, + { kind: "separator" }, { title: t("table_context_menu.delete_row"), uiIcon: "bx bx-trash", @@ -223,16 +228,6 @@ export function showRowContextMenu(_e: UIEvent, row: RowComponent, parentNote: F e.preventDefault(); } -function getParentComponent(e: MouseEvent) { - if (!e.target) { - return; - } - - return $(e.target) - .closest(".component") - .prop("component") as Component; -} - function buildColumnItems(tabulator: Tabulator) { const items: MenuItem[] = []; for (const column of tabulator.getColumns()) { @@ -249,13 +244,13 @@ function buildColumnItems(tabulator: Tabulator) { return items; } -function buildInsertSubmenu(e: MouseEvent, referenceColumn?: ColumnComponent, direction?: "before" | "after"): MenuItem[] { +function buildInsertSubmenu(parentComponent: Component, referenceColumn?: ColumnComponent, direction?: "before" | "after"): MenuItem[] { return [ { title: t("table_view.new-column-label"), uiIcon: "bx bx-hash", handler: () => { - getParentComponent(e)?.triggerCommand("addNewTableColumn", { + parentComponent?.triggerCommand("addNewTableColumn", { referenceColumn, type: "label", direction @@ -266,7 +261,7 @@ function buildInsertSubmenu(e: MouseEvent, referenceColumn?: ColumnComponent, di title: t("table_view.new-column-relation"), uiIcon: "bx bx-transfer", handler: () => { - getParentComponent(e)?.triggerCommand("addNewTableColumn", { + parentComponent?.triggerCommand("addNewTableColumn", { referenceColumn, type: "relation", direction diff --git a/apps/client/src/widgets/collections/table/index.css b/apps/client/src/widgets/collections/table/index.css new file mode 100644 index 000000000..ff24dda26 --- /dev/null +++ b/apps/client/src/widgets/collections/table/index.css @@ -0,0 +1,71 @@ +.table-view { + overflow: hidden; + position: relative; + height: 100%; + user-select: none; + padding: 0 5px 0 10px; +} + +.table-view-container { + height: 100%; +} + +.search-result-widget-content .table-view { + position: absolute; + top: 0; + inset-inline-start: 0; + inset-inline-end: 0; + bottom: 0; +} + +.tabulator-cell .autocomplete { + position: absolute; + top: 50%; + transform: translateY(-50%); + background: transparent; + outline: none !important; +} + +.tabulator .tabulator-header { + border-top: unset; + border-bottom-width: 1px; +} + +.tabulator .tabulator-header .tabulator-frozen.tabulator-frozen-left, +.tabulator-row .tabulator-cell.tabulator-frozen.tabulator-frozen-left { + border-inline-end-width: 1px; +} + +.tabulator .tabulator-row.archived { + opacity: 0.5; +} + +.tabulator .tabulator-footer { + background-color: unset; + padding: 5px 0; +} + +.tabulator .tabulator-footer .tabulator-footer-contents { + justify-content: left; + gap: 0.5em; +} + +.tabulator button.tree-expand, +.tabulator button.tree-collapse { + display: inline-block; + appearance: none; + border: 0; + background: transparent; + width: 1.5em; + position: relative; + vertical-align: middle; +} + +.tabulator button.tree-expand span, +.tabulator button.tree-collapse span { + position: absolute; + top: 0; + inset-inline-start: 0; + font-size: 1.5em; + transform: translateY(-50%); +} \ No newline at end of file diff --git a/apps/client/src/widgets/collections/table/index.tsx b/apps/client/src/widgets/collections/table/index.tsx new file mode 100644 index 000000000..f6ae82009 --- /dev/null +++ b/apps/client/src/widgets/collections/table/index.tsx @@ -0,0 +1,184 @@ +import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "preact/hooks"; +import { ViewModeProps } from "../interface"; +import { buildColumnDefinitions } from "./columns"; +import getAttributeDefinitionInformation, { buildRowDefinitions, TableData } from "./rows"; +import { useLegacyWidget, useNoteLabelBoolean, useNoteLabelInt, useTriliumEvent } from "../../react/hooks"; +import Tabulator from "./tabulator"; +import { Tabulator as VanillaTabulator, SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MoveRowsModule, ColumnDefinition, DataTreeModule, Options, RowComponent} from 'tabulator-tables'; +import { useContextMenu } from "./context_menu"; +import { ParentComponent } from "../../react/react_utils"; +import FNote from "../../../entities/fnote"; +import { t } from "../../../services/i18n"; +import Button from "../../react/Button"; +import "./index.css"; +import useRowTableEditing from "./row_editing"; +import useColTableEditing from "./col_editing"; +import AttributeDetailWidget from "../../attribute_widgets/attribute_detail"; +import attributes from "../../../services/attributes"; +import { RefObject } from "preact"; +import SpacedUpdate from "../../../services/spaced_update"; +import froca from "../../../services/froca"; + +interface TableConfig { + tableData: { + columns?: ColumnDefinition[]; + }; +} + +export default function TableView({ note, noteIds, notePath, viewConfig, saveConfig }: ViewModeProps) { + const tabulatorRef = useRef(null); + const parentComponent = useContext(ParentComponent); + + const [ attributeDetailWidgetEl, attributeDetailWidget ] = useLegacyWidget(() => new AttributeDetailWidget().contentSized()); + const contextMenuEvents = useContextMenu(note, parentComponent, tabulatorRef); + const persistenceProps = usePersistence(viewConfig, saveConfig); + const rowEditingEvents = useRowTableEditing(tabulatorRef, attributeDetailWidget, notePath); + const { newAttributePosition, resetNewAttributePosition } = useColTableEditing(tabulatorRef, attributeDetailWidget, note); + const { columnDefs, rowData, movableRows, hasChildren } = useData(note, noteIds, viewConfig, newAttributePosition, resetNewAttributePosition); + const dataTreeProps = useMemo(() => { + if (!hasChildren) return {}; + return { + dataTree: true, + dataTreeStartExpanded: true, + dataTreeBranchElement: false, + dataTreeElementColumn: "title", + dataTreeChildIndent: 20, + dataTreeExpandElement: ``, + dataTreeCollapseElement: `` + } + }, [ hasChildren ]); + + const rowFormatter = useCallback((row: RowComponent) => { + const data = row.getData() as TableData; + row.getElement().classList.toggle("archived", !!data.isArchived); + }, []); + + return ( +
+ {rowData !== undefined && persistenceProps && ( + <> + } + events={{ + ...contextMenuEvents, + ...rowEditingEvents + }} + persistence {...persistenceProps} + layout="fitDataFill" + index="branchId" + movableColumns + movableRows={movableRows} + rowFormatter={rowFormatter} + {...dataTreeProps} + /> + + + )} + {attributeDetailWidgetEl} +
+ ) +} + +function TableFooter({ note }: { note: FNote }) { + return (note.type !== "search" && +
+
+
+
+ ) +} + +function usePersistence(viewConfig: TableConfig | null | undefined, saveConfig: (newConfig: TableConfig) => void) { + const [ persistenceProps, setPersistenceProps ] = useState>(); + + useEffect(() => { + const viewConfigLocal = viewConfig ?? { tableData: {} }; + const spacedUpdate = new SpacedUpdate(() => { + saveConfig(viewConfigLocal); + }, 5_000); + + setPersistenceProps({ + persistenceReaderFunc(_, type) { + return viewConfigLocal.tableData?.[type]; + }, + persistenceWriterFunc(_, type, data) { + (viewConfigLocal.tableData as Record)[type] = data; + spacedUpdate.scheduleUpdate(); + }, + }); + + return () => { + spacedUpdate.updateNowIfNecessary(); + }; + }, [ viewConfig, saveConfig ]) + + return persistenceProps; +} + +function useData(note: FNote, noteIds: string[], viewConfig: TableConfig | undefined, newAttributePosition: RefObject, resetNewAttributePosition: () => void) { + const [ maxDepth ] = useNoteLabelInt(note, "maxNestingDepth") ?? -1; + const [ includeArchived ] = useNoteLabelBoolean(note, "includeArchived"); + + const [ columnDefs, setColumnDefs ] = useState(); + const [ rowData, setRowData ] = useState(); + const [ hasChildren, setHasChildren ] = useState(); + const [ isSorted ] = useNoteLabelBoolean(note, "sorted"); + const [ movableRows, setMovableRows ] = useState(false); + + async function refresh() { + const info = getAttributeDefinitionInformation(note); + + // Ensure all note IDs are loaded. + await froca.getNotes(noteIds); + + const { definitions: rowData, hasSubtree: hasChildren, rowNumber } = await buildRowDefinitions(note, info, includeArchived, maxDepth); + const columnDefs = buildColumnDefinitions({ + info, + movableRows, + existingColumnData: viewConfig?.tableData?.columns, + rowNumberHint: rowNumber, + position: newAttributePosition.current ?? undefined + }); + setColumnDefs(columnDefs); + setRowData(rowData); + setHasChildren(hasChildren); + resetNewAttributePosition(); + } + + useEffect(() => { refresh() }, [ note, noteIds, maxDepth, movableRows ]); + + useTriliumEvent("entitiesReloaded", ({ loadResults}) => { + // React to column changes. + if (loadResults.getAttributeRows().find(attr => + attr.type === "label" && + (attr.name?.startsWith("label:") || attr.name?.startsWith("relation:")) && + attributes.isAffecting(attr, note))) { + refresh(); + return; + } + + // React to external row updates. + if (loadResults.getBranchRows().some(branch => branch.parentNoteId === note.noteId || noteIds.includes(branch.parentNoteId ?? "")) + || loadResults.getNoteIds().some(noteId => noteIds.includes(noteId)) + || loadResults.getAttributeRows().some(attr => noteIds.includes(attr.noteId!)) + || loadResults.getAttributeRows().some(attr => attr.name === "archived" && attr.noteId && noteIds.includes(attr.noteId))) { + refresh(); + return; + } + }); + + // Identify if movable rows. + useEffect(() => { + setMovableRows(!isSorted && note.type !== "search" && !hasChildren); + }, [ isSorted, note, hasChildren ]); + + return { columnDefs, rowData, movableRows, hasChildren }; +} diff --git a/apps/client/src/widgets/collections/table/row_editing.ts b/apps/client/src/widgets/collections/table/row_editing.ts new file mode 100644 index 000000000..22ef0e7e4 --- /dev/null +++ b/apps/client/src/widgets/collections/table/row_editing.ts @@ -0,0 +1,105 @@ +import { EventCallBackMethods, RowComponent, Tabulator } from "tabulator-tables"; +import { CommandListenerData } from "../../../components/app_context"; +import note_create, { CreateNoteOpts } from "../../../services/note_create"; +import { useLegacyImperativeHandlers } from "../../react/hooks"; +import { RefObject } from "preact"; +import { setAttribute, setLabel } from "../../../services/attributes"; +import froca from "../../../services/froca"; +import server from "../../../services/server"; +import branches from "../../../services/branches"; +import AttributeDetailWidget from "../../attribute_widgets/attribute_detail"; + +export default function useRowTableEditing(api: RefObject, attributeDetailWidget: AttributeDetailWidget, parentNotePath: string): Partial { + // Adding new rows + useLegacyImperativeHandlers({ + addNewRowCommand({ customOpts, parentNotePath: customNotePath }: CommandListenerData<"addNewRow">) { + const notePath = customNotePath ?? parentNotePath; + if (notePath) { + const opts: CreateNoteOpts = { + activate: false, + ...customOpts + } + note_create.createNote(notePath, opts).then(({ branch }) => { + if (branch) { + setTimeout(() => { + if (!api.current) return; + focusOnBranch(api.current, branch?.branchId); + }, 100); + } + }) + } + } + }); + + // Editing existing rows. + return { + cellEdited: async (cell) => { + const noteId = cell.getRow().getData().noteId; + const field = cell.getField(); + let newValue = cell.getValue(); + + if (field === "title") { + server.put(`notes/${noteId}/title`, { title: newValue }); + return; + } + + if (field.includes(".")) { + const [ type, name ] = field.split(".", 2); + if (type === "labels") { + if (typeof newValue === "boolean") { + newValue = newValue ? "true" : "false"; + } + setLabel(noteId, name, newValue); + } else if (type === "relations") { + const note = await froca.getNote(noteId); + if (note) { + setAttribute(note, "relation", name, newValue); + } + } + } + }, + rowMoved(row) { + const branchIdsToMove = [ row.getData().branchId ]; + + const prevRow = row.getPrevRow(); + if (prevRow) { + branches.moveAfterBranch(branchIdsToMove, prevRow.getData().branchId); + return; + } + + const nextRow = row.getNextRow(); + if (nextRow) { + branches.moveBeforeBranch(branchIdsToMove, nextRow.getData().branchId); + } + } + }; +} + +function focusOnBranch(api: Tabulator, branchId: string) { + const row = findRowDataById(api.getRows(), branchId); + if (!row) return; + + // Expand the parent tree if any. + if (api.options.dataTree) { + const parent = row.getTreeParent(); + if (parent) { + parent.treeExpand(); + } + } + + row.getCell("title").edit(); +} + +function findRowDataById(rows: RowComponent[], branchId: string): RowComponent | null { + for (let row of rows) { + const item = row.getIndex() as string; + + if (item === branchId) { + return row; + } + + let found = findRowDataById(row.getTreeChildren(), branchId); + if (found) return found; + } + return null; +} diff --git a/apps/client/src/widgets/view_widgets/table_view/rows.ts b/apps/client/src/widgets/collections/table/rows.ts similarity index 87% rename from apps/client/src/widgets/view_widgets/table_view/rows.ts rename to apps/client/src/widgets/collections/table/rows.ts index 460f169ac..e1b0a765e 100644 --- a/apps/client/src/widgets/view_widgets/table_view/rows.ts +++ b/apps/client/src/widgets/collections/table/rows.ts @@ -10,19 +10,24 @@ export type TableData = { relations: Record; branchId: string; colorClass: string | undefined; + isArchived: boolean; _children?: TableData[]; }; -export async function buildRowDefinitions(parentNote: FNote, infos: AttributeDefinitionInformation[], maxDepth = -1, currentDepth = 0) { +export async function buildRowDefinitions(parentNote: FNote, infos: AttributeDefinitionInformation[], includeArchived: boolean, maxDepth = -1, currentDepth = 0) { const definitions: TableData[] = []; const childBranches = parentNote.getChildBranches(); let hasSubtree = false; let rowNumber = childBranches.length; + if (parentNote.type === "search") { + maxDepth = 0; + } + for (const branch of childBranches) { const note = await branch.getNote(); - if (!note) { - continue; // Skip if the note is not found + if (!note || (!includeArchived && note.isArchived)) { + continue; } const labels: typeof definitions[0]["labels"] = {}; @@ -41,12 +46,13 @@ export async function buildRowDefinitions(parentNote: FNote, infos: AttributeDef title: note.title, labels, relations, + isArchived: note.isArchived, branchId: branch.branchId, colorClass: note.getColorClass() } if (note.hasChildren() && (maxDepth < 0 || currentDepth < maxDepth)) { - const { definitions, rowNumber: subRowNumber } = (await buildRowDefinitions(note, infos, maxDepth, currentDepth + 1)); + const { definitions, rowNumber: subRowNumber } = (await buildRowDefinitions(note, infos, includeArchived, maxDepth, currentDepth + 1)); def._children = definitions; hasSubtree = true; rowNumber += subRowNumber; diff --git a/apps/client/src/widgets/collections/table/tabulator.tsx b/apps/client/src/widgets/collections/table/tabulator.tsx new file mode 100644 index 000000000..6301d5b38 --- /dev/null +++ b/apps/client/src/widgets/collections/table/tabulator.tsx @@ -0,0 +1,73 @@ +import { useContext, useEffect, useLayoutEffect, useRef } from "preact/hooks"; +import { EventCallBackMethods, Module, Options, Tabulator as VanillaTabulator } from "tabulator-tables"; +import "tabulator-tables/dist/css/tabulator.css"; +import "../../../../src/stylesheets/table.css"; +import { ParentComponent, renderReactWidget } from "../../react/react_utils"; +import { JSX } from "preact/jsx-runtime"; +import { isValidElement, RefObject } from "preact"; + +interface TableProps extends Omit { + tabulatorRef: RefObject; + className?: string; + data?: T[]; + modules?: (new (table: VanillaTabulator) => Module)[]; + events?: Partial; + index: keyof T; + footerElement?: string | HTMLElement | JSX.Element; +} + +export default function Tabulator({ className, columns, data, modules, tabulatorRef: externalTabulatorRef, footerElement, events, index, dataTree, ...restProps }: TableProps) { + const parentComponent = useContext(ParentComponent); + const containerRef = useRef(null); + const tabulatorRef = useRef(null); + + useLayoutEffect(() => { + if (!modules) return; + for (const module of modules) { + VanillaTabulator.registerModule(module); + } + }, [modules]); + + useLayoutEffect(() => { + if (!containerRef.current) return; + + const tabulator = new VanillaTabulator(containerRef.current, { + columns, + data, + footerElement: (parentComponent && isValidElement(footerElement) ? renderReactWidget(parentComponent, footerElement)[0] : undefined), + index: index as string | number | undefined, + dataTree, + ...restProps + }); + + tabulator.on("tableBuilt", () => { + tabulatorRef.current = tabulator; + externalTabulatorRef.current = tabulator; + }); + + return () => tabulator.destroy(); + }, [ dataTree ] ); + + useEffect(() => { + const tabulator = tabulatorRef.current; + if (!tabulator || !events) return; + + for (const [ eventName, handler ] of Object.entries(events)) { + tabulator.on(eventName as keyof EventCallBackMethods, handler); + } + + return () => { + for (const [ eventName, handler ] of Object.entries(events)) { + tabulator.off(eventName as keyof EventCallBackMethods, handler); + } + } + }, Object.values(events ?? {})); + + // Change in data. + useEffect(() => { tabulatorRef.current?.setData(data) }, [ data ]); + useEffect(() => { columns && tabulatorRef.current?.setColumns(columns)}, [ data]); + + return ( +
+ ); +} diff --git a/apps/client/src/widgets/collections/table/utils.ts b/apps/client/src/widgets/collections/table/utils.ts new file mode 100644 index 000000000..3daae04da --- /dev/null +++ b/apps/client/src/widgets/collections/table/utils.ts @@ -0,0 +1,21 @@ +import FNote from "../../../entities/fnote"; +import { Attribute } from "../../../services/attribute_parser"; + +export function getFAttributeFromField(parentNote: FNote, field: string) { + const [ type, name ] = field.split(".", 2); + const attrName = `${type.replace("s", "")}:${name}`; + return parentNote.getLabel(attrName); +} + +export function getAttributeFromField(parentNote: FNote, field: string): Attribute | undefined { + const fAttribute = getFAttributeFromField(parentNote, field); + if (fAttribute) { + return { + name: fAttribute.name, + value: fAttribute.value, + type: fAttribute.type, + isInheritable: fAttribute.isInheritable + }; + } + return undefined; +} diff --git a/apps/client/src/widgets/view_widgets/view_mode_storage.ts b/apps/client/src/widgets/collections/view_mode_storage.ts similarity index 95% rename from apps/client/src/widgets/view_widgets/view_mode_storage.ts rename to apps/client/src/widgets/collections/view_mode_storage.ts index b3bf6bda2..95c3ff800 100644 --- a/apps/client/src/widgets/view_widgets/view_mode_storage.ts +++ b/apps/client/src/widgets/collections/view_mode_storage.ts @@ -1,6 +1,6 @@ import type FNote from "../../entities/fnote"; -import type { ViewTypeOptions } from "../../services/note_list_renderer"; import server from "../../services/server"; +import { ViewTypeOptions } from "../collections/interface"; const ATTACHMENT_ROLE = "viewConfig"; diff --git a/apps/client/src/widgets/containers/root_container.ts b/apps/client/src/widgets/containers/root_container.ts index 6c2d87521..bd1ae9719 100644 --- a/apps/client/src/widgets/containers/root_container.ts +++ b/apps/client/src/widgets/containers/root_container.ts @@ -3,6 +3,7 @@ import FlexContainer from "./flex_container.js"; import options from "../../services/options.js"; import type BasicWidget from "../basic_widget.js"; import utils from "../../services/utils.js"; +import { LOCALES } from "@triliumnext/commons"; /** * The root container is the top-most widget/container, from which the entire layout derives. @@ -32,6 +33,7 @@ export default class RootContainer extends FlexContainer { this.#setMotion(options.is("motionEnabled")); this.#setShadows(options.is("shadowsEnabled")); this.#setBackdropEffects(options.is("backdropEffectsEnabled")); + this.#setLocaleAndDirection(options.get("locale")); return super.render(); } @@ -68,6 +70,12 @@ export default class RootContainer extends FlexContainer { #setBackdropEffects(enabled: boolean) { document.body.classList.toggle("backdrop-effects-disabled", !enabled); } + + #setLocaleAndDirection(locale: string) { + const correspondingLocale = LOCALES.find(l => l.id === locale); + document.body.lang = locale; + document.body.dir = correspondingLocale?.rtl ? "rtl" : "ltr"; + } } function getViewportHeight() { diff --git a/apps/client/src/widgets/containers/split_note_container.ts b/apps/client/src/widgets/containers/split_note_container.ts index 12d417973..8298d5989 100644 --- a/apps/client/src/widgets/containers/split_note_container.ts +++ b/apps/client/src/widgets/containers/split_note_container.ts @@ -3,7 +3,7 @@ import appContext, { type CommandData, type CommandListenerData, type EventData, import type BasicWidget from "../basic_widget.js"; import type NoteContext from "../../components/note_context.js"; import Component from "../../components/component.js"; - +import splitService from "../../services/resizer.js"; interface NoteContextEvent { noteContext: NoteContext; } @@ -52,6 +52,10 @@ export default class SplitNoteContainer extends FlexContainer { await widget.handleEvent("setNoteContext", { noteContext }); this.child(widget); + + if (noteContext.mainNtxId && noteContext.ntxId) { + splitService.setupNoteSplitResizer([noteContext.mainNtxId,noteContext.ntxId]); + } } async openNewNoteSplitEvent({ ntxId, notePath, hoistedNoteId, viewScope }: EventData<"openNewNoteSplit">) { @@ -95,9 +99,9 @@ export default class SplitNoteContainer extends FlexContainer { } } - closeThisNoteSplitCommand({ ntxId }: CommandListenerData<"closeThisNoteSplit">) { + async closeThisNoteSplitCommand({ ntxId }: CommandListenerData<"closeThisNoteSplit">) { if (ntxId) { - appContext.tabManager.removeNoteContext(ntxId); + await appContext.tabManager.removeNoteContext(ntxId); } } @@ -137,6 +141,8 @@ export default class SplitNoteContainer extends FlexContainer { // activate context that now contains the original note await appContext.tabManager.activateNoteContext(isMovingLeft ? ntxIds[leftIndex + 1] : ntxIds[leftIndex]); + + splitService.moveNoteSplitResizer(ntxIds[leftIndex]); } activeContextChangedEvent() { @@ -157,6 +163,8 @@ export default class SplitNoteContainer extends FlexContainer { recursiveCleanup(widget); delete this.widgets[ntxId]; } + + splitService.delNoteSplitResizer(ntxIds); } contextsReopenedEvent({ ntxId, afterNtxId }: EventData<"contextsReopened">) { diff --git a/apps/client/src/widgets/dialogs/add_link.tsx b/apps/client/src/widgets/dialogs/add_link.tsx index 97440491d..43cfa4e4e 100644 --- a/apps/client/src/widgets/dialogs/add_link.tsx +++ b/apps/client/src/widgets/dialogs/add_link.tsx @@ -22,6 +22,7 @@ export default function AddLinkDialog() { const [ linkType, setLinkType ] = useState(hasSelection ? "hyper-link" : "reference-link"); const [ suggestion, setSuggestion ] = useState(null); const [ shown, setShown ] = useState(false); + const hasSubmittedRef = useRef(false); useTriliumEvent("showAddLinkDialog", ( { textTypeWidget, text }) => { setTextTypeWidget(textTypeWidget); @@ -83,14 +84,11 @@ export default function AddLinkDialog() { } function onSubmit() { - if (suggestion?.notePath) { - // Handle note link + hasSubmittedRef.current = true; + + if (suggestion) { + // Insertion logic in onHidden because it needs focus. setShown(false); - textTypeWidget?.addLink(suggestion.notePath, linkType === "reference-link" ? null : linkTitle); - } else if (suggestion?.externalLink) { - // Handle external link - setShown(false); - textTypeWidget?.addLink(suggestion.externalLink, linkTitle, true); } else { logError("No link to add."); } @@ -109,6 +107,19 @@ export default function AddLinkDialog() { onSubmit={onSubmit} onShown={onShown} onHidden={() => { + // Insert the link. + if (hasSubmittedRef.current && suggestion && textTypeWidget) { + hasSubmittedRef.current = false; + + if (suggestion.notePath) { + // Handle note link + textTypeWidget.addLink(suggestion.notePath, linkType === "reference-link" ? null : linkTitle); + } else if (suggestion.externalLink) { + // Handle external link + textTypeWidget.addLink(suggestion.externalLink, linkTitle, true); + } + } + setSuggestion(null); setShown(false); }} diff --git a/apps/client/src/widgets/dialogs/branch_prefix.tsx b/apps/client/src/widgets/dialogs/branch_prefix.tsx index f04280748..46888f0ab 100644 --- a/apps/client/src/widgets/dialogs/branch_prefix.tsx +++ b/apps/client/src/widgets/dialogs/branch_prefix.tsx @@ -14,7 +14,7 @@ import FBranch from "../../entities/fbranch.js"; export default function BranchPrefixDialog() { const [ shown, setShown ] = useState(false); const [ branch, setBranch ] = useState(); - const [ prefix, setPrefix ] = useState(branch?.prefix ?? ""); + const [ prefix, setPrefix ] = useState(""); const branchInput = useRef(null); useTriliumEvent("editBranchPrefix", async () => { @@ -32,13 +32,15 @@ export default function BranchPrefixDialog() { const newBranchId = await froca.getBranchId(parentNoteId, noteId); if (!newBranchId) { return; - } + } const parentNote = await froca.getNote(parentNoteId); if (!parentNote || parentNote.type === "search") { return; } - setBranch(froca.getBranch(newBranchId)); + const newBranch = froca.getBranch(newBranchId); + setBranch(newBranch); + setPrefix(newBranch?.prefix ?? ""); setShown(true); }); @@ -77,4 +79,4 @@ export default function BranchPrefixDialog() { async function savePrefix(branchId: string, prefix: string) { await server.put(`branches/${branchId}/set-prefix`, { prefix: prefix }); toast.showMessage(t("branch_prefix.branch_prefix_saved")); -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/dialogs/bulk_actions.css b/apps/client/src/widgets/dialogs/bulk_actions.css index fe64a02b3..d6c8aec20 100644 --- a/apps/client/src/widgets/dialogs/bulk_actions.css +++ b/apps/client/src/widgets/dialogs/bulk_actions.css @@ -4,7 +4,7 @@ .bulk-actions-dialog .bulk-available-action-list button { padding: 2px 7px; - margin-right: 10px; + margin-inline-end: 10px; margin-bottom: 5px; } @@ -17,8 +17,15 @@ } .bulk-actions-dialog .bulk-existing-action-list .button-column { - /* minimal width so that table remains static sized and most space remains for middle column with settings */ width: 50px; white-space: nowrap; - text-align: right; + text-align: end; +} + +.bulk-actions-dialog .bulk-existing-action-list .button-column > * { + vertical-align: middle; +} + +.bulk-actions-dialog .bulk-existing-action-list .button-column .help-dropdown { + display: inline-block !important; } \ No newline at end of file diff --git a/apps/client/src/widgets/dialogs/export.css b/apps/client/src/widgets/dialogs/export.css index a3916d1be..a0903b06c 100644 --- a/apps/client/src/widgets/dialogs/export.css +++ b/apps/client/src/widgets/dialogs/export.css @@ -4,11 +4,11 @@ } .export-dialog form .format-choice { - padding-left: 40px; + padding-inline-start: 40px; } .export-dialog form .opml-versions { - padding-left: 60px; + padding-inline-start: 60px; } .export-dialog form .form-check-label { diff --git a/apps/client/src/widgets/dialogs/export.tsx b/apps/client/src/widgets/dialogs/export.tsx index 594104b66..dded32624 100644 --- a/apps/client/src/widgets/dialogs/export.tsx +++ b/apps/client/src/widgets/dialogs/export.tsx @@ -136,11 +136,11 @@ ws.subscribeToMessages(async (message) => { id: id, title: t("export.export_status"), message: message, - icon: "arrow-square-up-right" + icon: "export" }; } - if (message.taskType !== "export") { + if (!("taskType" in message) || message.taskType !== "export") { return; } @@ -155,4 +155,4 @@ ws.subscribeToMessages(async (message) => { toastService.showPersistent(toast); } -}); \ No newline at end of file +}); diff --git a/apps/client/src/widgets/dialogs/import.tsx b/apps/client/src/widgets/dialogs/import.tsx index 58f28dd54..46db5b8cd 100644 --- a/apps/client/src/widgets/dialogs/import.tsx +++ b/apps/client/src/widgets/dialogs/import.tsx @@ -8,15 +8,16 @@ import FormGroup, { FormMultiGroup } from "../react/FormGroup"; import Modal from "../react/Modal"; import RawHtml from "../react/RawHtml"; import importService, { UploadFilesOptions } from "../../services/import"; -import { useTriliumEvent } from "../react/hooks"; +import { useTriliumEvent, useTriliumOptionBool } from "../react/hooks"; export default function ImportDialog() { + const [ compressImages ] = useTriliumOptionBool("compressImages"); const [ parentNoteId, setParentNoteId ] = useState(); const [ noteTitle, setNoteTitle ] = useState(); const [ files, setFiles ] = useState(null); const [ safeImport, setSafeImport ] = useState(true); const [ explodeArchives, setExplodeArchives ] = useState(true); - const [ shrinkImages, setShrinkImages ] = useState(true); + const [ shrinkImages, setShrinkImages ] = useState(compressImages); const [ textImportedAsText, setTextImportedAsText ] = useState(true); const [ codeImportedAsCode, setCodeImportedAsCode ] = useState(true); const [ replaceUnderscoresWithSpaces, setReplaceUnderscoresWithSpaces ] = useState(true); @@ -36,7 +37,7 @@ export default function ImportDialog() { onSubmit={async () => { if (!files || !parentNoteId) { return; - } + } const options: UploadFilesOptions = { safeImport: boolToString(safeImport), @@ -50,11 +51,19 @@ export default function ImportDialog() { setShown(false); await importService.uploadFiles("notes", parentNoteId, Array.from(files), options); }} - onHidden={() => setShown(false)} + onHidden={() => { + setShown(false); + setFiles(null); + }} footer={
- +
); @@ -197,22 +228,25 @@ const CODE_STYLE: CSSProperties = { whiteSpace: "pre-wrap" }; -function RevisionContent({ revisionItem, fullRevision }: { revisionItem?: RevisionItem, fullRevision?: RevisionPojo }) { +function RevisionContent({ noteContent, revisionItem, fullRevision, showDiff }: { noteContent?:string, revisionItem?: RevisionItem, fullRevision?: RevisionPojo, showDiff: boolean}) { const content = fullRevision?.content; if (!revisionItem || !content) { return <>; } + if (showDiff) { + return + } switch (revisionItem.type) { case "text": return case "code": return
{content}
; - case "image": + case "image": switch (revisionItem.mime) { case "image/svg+xml": { //Base64 of other format images may be embedded in svg - const encodedSVG = encodeURIComponent(content as string); + const encodedSVG = encodeURIComponent(content as string); return ; @@ -267,6 +301,48 @@ function RevisionContentText({ content }: { content: string | Buffer
} +function RevisionContentDiff({ noteContent, itemContent, itemType }: { + noteContent?: string, + itemContent: string | Buffer | undefined, + itemType: string +}) { + const contentRef = useRef(null); + + useEffect(() => { + if (!noteContent || typeof itemContent !== "string") { + if (contentRef.current) { + contentRef.current.textContent = t("revisions.diff_not_available"); + } + return; + } + + let processedNoteContent = noteContent; + let processedItemContent = itemContent; + + if (itemType === "text") { + processedNoteContent = utils.formatHtml(noteContent); + processedItemContent = utils.formatHtml(itemContent); + } + + const diff = diffWords(processedNoteContent, processedItemContent); + const diffHtml = diff.map(part => { + if (part.added) { + return `${utils.escapeHtml(part.value)}`; + } else if (part.removed) { + return `${utils.escapeHtml(part.value)}`; + } else { + return utils.escapeHtml(part.value); + } + }).join(""); + + if (contentRef.current) { + contentRef.current.innerHTML = diffHtml; + } + }, [noteContent, itemContent, itemType]); + + return
; +} + function RevisionFooter({ note }: { note?: FNote }) { if (!note) { return <>; @@ -279,7 +355,7 @@ function RevisionFooter({ note }: { note?: FNote }) { if (revisionsNumberLimit === -1) { revisionsNumberLimit = "āˆž"; } - + return <> {t("revisions.snapshot_interval", { seconds: options.getInt("revisionSnapshotTimeInterval") })} @@ -300,4 +376,4 @@ async function getNote(noteId?: string | null) { } else { return appContext.tabManager.getActiveContextNote(); } -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/dialogs/upload_attachments.tsx b/apps/client/src/widgets/dialogs/upload_attachments.tsx index 2a780e616..7d3d54bda 100644 --- a/apps/client/src/widgets/dialogs/upload_attachments.tsx +++ b/apps/client/src/widgets/dialogs/upload_attachments.tsx @@ -40,14 +40,17 @@ export default function UploadAttachmentsDialog() { if (!files || !parentNoteId) { return; } - + setIsUploading(true); const filesCopy = Array.from(files); await importService.uploadFiles("attachments", parentNoteId, filesCopy, { shrinkImages }); setIsUploading(false); setShown(false); }} - onHidden={() => setShown(false)} + onHidden={() => { + setShown(false); + setFiles(null); + }} show={shown} > @@ -55,7 +58,7 @@ export default function UploadAttachmentsDialog() { - diff --git a/apps/client/src/widgets/find.ts b/apps/client/src/widgets/find.ts index e2f52d58a..d694d087a 100644 --- a/apps/client/src/widgets/find.ts +++ b/apps/client/src/widgets/find.ts @@ -8,6 +8,7 @@ import NoteContextAwareWidget from "./note_context_aware_widget.js"; import attributeService from "../services/attributes.js"; import FindInText from "./find_in_text.js"; import FindInCode from "./find_in_code.js"; +import { isIMEComposing } from "../services/shortcuts.js"; import FindInHtml from "./find_in_html.js"; import type { EventData } from "../components/app_context.js"; @@ -31,7 +32,7 @@ const TPL = /*html*/` } .find-widget-box > *, .replace-widget-box > *{ - margin-right: 15px; + margin-inline-end: 15px; } .find-widget-box, .replace-widget-box { @@ -162,6 +163,11 @@ export default class FindWidget extends NoteContextAwareWidget { this.$replaceButton.on("click", () => this.replace()); this.$input.on("keydown", async (e) => { + // Skip processing during IME composition + if (isIMEComposing(e.originalEvent as KeyboardEvent)) { + return; + } + if ((e.metaKey || e.ctrlKey) && (e.key === "F" || e.key === "f")) { // If ctrl+f is pressed when the findbox is shown, select the // whole input to find diff --git a/apps/client/src/widgets/highlights_list.ts b/apps/client/src/widgets/highlights_list.ts index c9843a479..5023facb9 100644 --- a/apps/client/src/widgets/highlights_list.ts +++ b/apps/client/src/widgets/highlights_list.ts @@ -24,7 +24,7 @@ const TPL = /*html*/`
} .highlights-list > ol { - padding-left: 20px; + padding-inline-start: 20px; } .highlights-list li { diff --git a/apps/client/src/widgets/icon_list.ts b/apps/client/src/widgets/icon_list.ts index 6282d8b60..a152e9a34 100644 --- a/apps/client/src/widgets/icon_list.ts +++ b/apps/client/src/widgets/icon_list.ts @@ -2090,14 +2090,14 @@ const icons: Icon[] = [ term: ["keypad"] }, { - name: "border-right", - slug: "border-right-regular", + name: "border-inline-end", + slug: "border-inline-end-regular", category_id: 111, type_of_icon: "REGULAR" }, { - name: "border-left", - slug: "border-left-regular", + name: "border-inline-start", + slug: "border-inline-start-regular", category_id: 111, type_of_icon: "REGULAR" }, diff --git a/apps/client/src/widgets/llm_chat/ui.ts b/apps/client/src/widgets/llm_chat/ui.ts index a17167840..15d4802ca 100644 --- a/apps/client/src/widgets/llm_chat/ui.ts +++ b/apps/client/src/widgets/llm_chat/ui.ts @@ -9,7 +9,7 @@ import { formatMarkdown, applyHighlighting } from "./utils.js"; export const TPL = `
- +
diff --git a/apps/client/src/widgets/llm_chat/validation.ts b/apps/client/src/widgets/llm_chat/validation.ts index 67a3bbcdc..2d287c401 100644 --- a/apps/client/src/widgets/llm_chat/validation.ts +++ b/apps/client/src/widgets/llm_chat/validation.ts @@ -34,10 +34,10 @@ export async function validateProviders(validationWarning: HTMLElement): Promise precedenceList = [precedenceStr]; } } - + // Check for configuration issues with providers in the precedence list const configIssues: string[] = []; - + // Always add experimental warning as the first item configIssues.push(t("ai_llm.experimental_warning")); diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.ts b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.ts deleted file mode 100644 index 434737641..000000000 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.ts +++ /dev/null @@ -1,64 +0,0 @@ -import BasicWidget from "../basic_widget.js"; -import appContext from "../../components/app_context.js"; -import contextMenu from "../../menus/context_menu.js"; -import noteCreateService from "../../services/note_create.js"; -import branchService from "../../services/branches.js"; -import treeService from "../../services/tree.js"; -import { t } from "../../services/i18n.js"; - -const TPL = /*html*/``; - -class MobileDetailMenuWidget extends BasicWidget { - private isHorizontalLayout: boolean; - - constructor(isHorizontalLayout: boolean) { - super(); - this.isHorizontalLayout = isHorizontalLayout; - } - - doRender() { - this.$widget = $(TPL); - - this.$widget.addClass(this.isHorizontalLayout ? "bx-dots-vertical-rounded" : "bx-menu"); - - this.$widget.on("click", async (e) => { - const note = appContext.tabManager.getActiveContextNote(); - - contextMenu.show<"insertChildNote" | "delete" | "showRevisions">({ - x: e.pageX, - y: e.pageY, - items: [ - { title: t("mobile_detail_menu.insert_child_note"), command: "insertChildNote", uiIcon: "bx bx-plus", enabled: note?.type !== "search" }, - { title: t("mobile_detail_menu.delete_this_note"), command: "delete", uiIcon: "bx bx-trash", enabled: note?.noteId !== "root" }, - { title: "----" }, - { title: "Note revisions", command: "showRevisions", uiIcon: "bx bx-history" } - ], - selectMenuItemHandler: async ({ command }) => { - if (command === "insertChildNote") { - noteCreateService.createNote(appContext.tabManager.getActiveContextNotePath() ?? undefined); - } else if (command === "delete") { - const notePath = appContext.tabManager.getActiveContextNotePath(); - if (!notePath) { - throw new Error("Cannot get note path to delete."); - } - - const branchId = await treeService.getBranchIdFromUrl(notePath); - - if (!branchId) { - throw new Error(t("mobile_detail_menu.error_cannot_get_branch_id", { notePath })); - } - - if (await branchService.deleteNotes([branchId])) { - this.triggerCommand("setActiveScreen", { screen: "tree" }); - } - } else if (command) { - this.triggerCommand(command); - } - }, - forcePositionOnMobile: true - }); - }); - } -} - -export default MobileDetailMenuWidget; diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx new file mode 100644 index 000000000..255ac8c99 --- /dev/null +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -0,0 +1,57 @@ +import { useContext } from "preact/hooks"; +import appContext from "../../components/app_context"; +import contextMenu from "../../menus/context_menu"; +import branches from "../../services/branches"; +import { t } from "../../services/i18n"; +import note_create from "../../services/note_create"; +import tree from "../../services/tree"; +import ActionButton from "../react/ActionButton"; +import { ParentComponent } from "../react/react_utils"; + +export default function MobileDetailMenu() { + const parentComponent = useContext(ParentComponent); + + return ( + { + const note = appContext.tabManager.getActiveContextNote(); + + contextMenu.show<"insertChildNote" | "delete" | "showRevisions">({ + x: e.pageX, + y: e.pageY, + items: [ + { title: t("mobile_detail_menu.insert_child_note"), command: "insertChildNote", uiIcon: "bx bx-plus", enabled: note?.type !== "search" }, + { title: t("mobile_detail_menu.delete_this_note"), command: "delete", uiIcon: "bx bx-trash", enabled: note?.noteId !== "root" }, + { kind: "separator" }, + { title: t("mobile_detail_menu.note_revisions"), command: "showRevisions", uiIcon: "bx bx-history" } + ], + selectMenuItemHandler: async ({ command }) => { + if (command === "insertChildNote") { + note_create.createNote(appContext.tabManager.getActiveContextNotePath() ?? undefined); + } else if (command === "delete") { + const notePath = appContext.tabManager.getActiveContextNotePath(); + if (!notePath) { + throw new Error("Cannot get note path to delete."); + } + + const branchId = await tree.getBranchIdFromUrl(notePath); + + if (!branchId) { + throw new Error(t("mobile_detail_menu.error_cannot_get_branch_id", { notePath })); + } + + if (await branches.deleteNotes([branchId]) && parentComponent) { + parentComponent.triggerCommand("setActiveScreen", { screen: "tree" }); + } + } else if (command && parentComponent) { + parentComponent.triggerCommand(command); + } + }, + forcePositionOnMobile: true + }); + }} + /> + ) +} diff --git a/apps/client/src/widgets/mobile_widgets/sidebar_container.ts b/apps/client/src/widgets/mobile_widgets/sidebar_container.ts index b01d5ff12..ef719d36a 100644 --- a/apps/client/src/widgets/mobile_widgets/sidebar_container.ts +++ b/apps/client/src/widgets/mobile_widgets/sidebar_container.ts @@ -27,6 +27,7 @@ export default class SidebarContainer extends FlexContainer { private backdropEl!: HTMLElement; private originalSidebarTransition: string; private originalBackdropTransition: string; + private screenWidth: number; constructor(screenName: Screen, direction: FlexDirection) { super(direction); @@ -37,6 +38,7 @@ export default class SidebarContainer extends FlexContainer { this.dragState = DRAG_STATE_NONE; this.originalSidebarTransition = ""; this.originalBackdropTransition = ""; + this.screenWidth = document.body.getBoundingClientRect().width; } doRender() { @@ -51,7 +53,9 @@ export default class SidebarContainer extends FlexContainer { const x = "touches" in e ? e.touches[0].clientX : e.clientX; this.startX = x; - if (x > 30 && this.currentTranslate === -100) { + // Prevent dragging if too far from the edge of the screen and the menu is closed. + let dragRefX = glob.isRtl ? this.screenWidth - x : x; + if (dragRefX > 30 && this.currentTranslate === -100) { return; } @@ -66,7 +70,7 @@ export default class SidebarContainer extends FlexContainer { } const x = "touches" in e ? e.touches[0].clientX : e.clientX; - const deltaX = x - this.startX; + const deltaX = glob.isRtl ? this.startX - x : x - this.startX; if (this.dragState === DRAG_STATE_INITIAL_DRAG) { if (this.currentTranslate === -100 ? deltaX > DRAG_CLOSED_START_THRESHOLD : deltaX < -DRAG_OPENED_START_THRESHOLD) { /* Disable the transitions since they affect performance, they are going to reenabled once drag ends. */ @@ -85,10 +89,15 @@ export default class SidebarContainer extends FlexContainer { } } else if (this.dragState === DRAG_STATE_DRAGGING) { const width = this.sidebarEl.offsetWidth; - const translatePercentage = Math.min(0, Math.max(this.currentTranslate + (deltaX / width) * 100, -100)); + let translatePercentage = Math.min(0, Math.max(this.currentTranslate + (deltaX / width) * 100, -100)); + const backdropOpacity = Math.max(0, 1 + translatePercentage / 100); this.translatePercentage = translatePercentage; - this.sidebarEl.style.transform = `translateX(${translatePercentage}%)`; - this.backdropEl.style.opacity = String(Math.max(0, 1 + translatePercentage / 100)); + if (glob.isRtl) { + this.sidebarEl.style.transform = `translateX(${-translatePercentage}%)`; + } else { + this.sidebarEl.style.transform = `translateX(${translatePercentage}%)`; + } + this.backdropEl.style.opacity = String(backdropOpacity); } // Consume the event to prevent the user from doing the back to previous page gesture on iOS. @@ -149,7 +158,15 @@ export default class SidebarContainer extends FlexContainer { } this.sidebarEl.classList.toggle("show", isOpen); - this.sidebarEl.style.transform = isOpen ? "translateX(0)" : "translateX(-100%)"; + if (isOpen) { + this.sidebarEl.style.transform = "translateX(0)"; + } else { + if (glob.isRtl) { + this.sidebarEl.style.transform = "translateX(100%)" + } else { + this.sidebarEl.style.transform = "translateX(-100%)"; + } + } this.sidebarEl.style.transition = this.originalSidebarTransition; this.backdropEl.classList.toggle("show", isOpen); diff --git a/apps/client/src/widgets/mobile_widgets/toggle_sidebar_button.ts b/apps/client/src/widgets/mobile_widgets/toggle_sidebar_button.ts deleted file mode 100644 index b2a8039a1..000000000 --- a/apps/client/src/widgets/mobile_widgets/toggle_sidebar_button.ts +++ /dev/null @@ -1,18 +0,0 @@ -import BasicWidget from "../basic_widget.js"; - -const TPL = /*html*/` -`; - -class ToggleSidebarButtonWidget extends BasicWidget { - doRender() { - this.$widget = $(TPL); - - this.$widget.on("click", () => - this.triggerCommand("setActiveScreen", { - screen: "tree" - }) - ); - } -} - -export default ToggleSidebarButtonWidget; diff --git a/apps/client/src/widgets/mobile_widgets/toggle_sidebar_button.tsx b/apps/client/src/widgets/mobile_widgets/toggle_sidebar_button.tsx new file mode 100644 index 000000000..d22f3df8c --- /dev/null +++ b/apps/client/src/widgets/mobile_widgets/toggle_sidebar_button.tsx @@ -0,0 +1,18 @@ +import { useContext } from "preact/hooks"; +import ActionButton from "../react/ActionButton"; +import { ParentComponent } from "../react/react_utils"; +import { t } from "../../services/i18n"; + +export default function ToggleSidebarButton() { + const parentComponent = useContext(ParentComponent); + + return ( + parentComponent?.triggerCommand("setActiveScreen", { + screen: "tree" + })} + /> + ) +} diff --git a/apps/client/src/widgets/note_detail.ts b/apps/client/src/widgets/note_detail.ts index bb66c39e6..a976b97ce 100644 --- a/apps/client/src/widgets/note_detail.ts +++ b/apps/client/src/widgets/note_detail.ts @@ -28,11 +28,12 @@ import ContentWidgetTypeWidget from "./type_widgets/content_widget.js"; import AttachmentListTypeWidget from "./type_widgets/attachment_list.js"; import AttachmentDetailTypeWidget from "./type_widgets/attachment_detail.js"; import MindMapWidget from "./type_widgets/mind_map.js"; -import utils from "../services/utils.js"; +import utils, { isElectron } from "../services/utils.js"; import type { NoteType } from "../entities/fnote.js"; import type TypeWidget from "./type_widgets/type_widget.js"; import { MermaidTypeWidget } from "./type_widgets/mermaid.js"; import AiChatTypeWidget from "./type_widgets/ai_chat.js"; +import toast from "../services/toast.js"; const TPL = /*html*/`
@@ -140,6 +141,13 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { doRender() { this.$widget = $(TPL); this.contentSized(); + + if (utils.isElectron()) { + const { ipcRenderer } = utils.dynamicRequire("electron"); + ipcRenderer.on("print-done", () => { + toast.closePersistent("printing"); + }); + } } async refresh() { @@ -195,7 +203,7 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { // https://github.com/zadam/trilium/issues/2522 const isBackendNote = this.noteContext?.noteId === "_backendLog"; const isSqlNote = this.mime === "text/x-sqlite;schema=trilium"; - const isFullHeightNoteType = ["canvas", "webView", "noteMap", "mindMap", "mermaid", "file"].includes(this.type ?? ""); + const isFullHeightNoteType = ["canvas", "webView", "noteMap", "mindMap", "mermaid", "file", "aiChat"].includes(this.type ?? ""); const isFullHeight = (!this.noteContext?.hasNoteList() && isFullHeightNoteType && !isSqlNote) || this.noteContext?.viewScope?.viewMode === "attachments" || isBackendNote; @@ -297,17 +305,53 @@ export default class NoteDetailWidget extends NoteContextAwareWidget { return; } - window.print(); + toast.showPersistent({ + icon: "bx bx-loader-circle bx-spin", + message: t("note_detail.printing"), + id: "printing" + }); + + if (isElectron()) { + const { ipcRenderer } = utils.dynamicRequire("electron"); + ipcRenderer.send("print-note", { + notePath: this.notePath + }); + } else { + const iframe = document.createElement('iframe'); + iframe.src = `?print#${this.notePath}`; + iframe.className = "print-iframe"; + document.body.appendChild(iframe); + iframe.onload = () => { + if (!iframe.contentWindow) { + toast.closePersistent("printing"); + document.body.removeChild(iframe); + return; + } + + iframe.contentWindow.addEventListener("note-ready", () => { + toast.closePersistent("printing"); + iframe.contentWindow?.print(); + document.body.removeChild(iframe); + }); + }; + } } async exportAsPdfEvent() { - if (!this.noteContext?.isActive() || !this.note) { + if (!this.noteContext?.isActive() || !this.note || !this.notePath) { return; } + toast.showPersistent({ + icon: "bx bx-loader-circle bx-spin", + message: t("note_detail.printing_pdf"), + id: "printing" + }); + const { ipcRenderer } = utils.dynamicRequire("electron"); ipcRenderer.send("export-as-pdf", { title: this.note.title, + notePath: this.notePath, pageSize: this.note.getAttributeValue("label", "printPageSize") ?? "Letter", landscape: this.note.hasAttribute("label", "printLandscape") }); diff --git a/apps/client/src/widgets/note_icon.css b/apps/client/src/widgets/note_icon.css index cb067a7f6..a05be824d 100644 --- a/apps/client/src/widgets/note_icon.css +++ b/apps/client/src/widgets/note_icon.css @@ -1,7 +1,6 @@ .note-icon-widget { - padding-top: 3px; - padding-left: 7px; - margin-right: 0; + padding-inline-start: 7px; + margin-inline-end: 0; width: 50px; height: 50px; } @@ -30,15 +29,15 @@ .note-icon-widget .filter-row { padding-top: 10px; padding-bottom: 10px; - padding-right: 20px; + padding-inline-end: 20px; display: flex; align-items: baseline; } .note-icon-widget .filter-row span { display: block; - padding-left: 15px; - padding-right: 15px; + padding-inline-start: 15px; + padding-inline-end: 15px; font-weight: bold; } diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index d991bc0e9..4401b013f 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -129,7 +129,7 @@ function NoteIconList({ note }: { note: FNote }) { class="icon-list" onClick={(e) => { const clickedTarget = e.target as HTMLElement; - + if (!clickedTarget.classList.contains("bx")) { return; } @@ -152,9 +152,9 @@ function NoteIconList({ note }: { note: FNote }) { for (const label of getIconLabels(note)) { attributes.removeAttributeById(note.noteId, label.attributeId); } - }} + }} /> -
+
)} {(iconData?.icons ?? []).map(({className, name}) => ( @@ -181,4 +181,4 @@ function getIconLabels(note: FNote) { return note.getOwnedLabels() .filter((label) => ["workspaceIconClass", "iconClass"] .includes(label.name)); -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/note_list.ts b/apps/client/src/widgets/note_list.ts deleted file mode 100644 index 74602c921..000000000 --- a/apps/client/src/widgets/note_list.ts +++ /dev/null @@ -1,178 +0,0 @@ -import NoteContextAwareWidget from "./note_context_aware_widget.js"; -import NoteListRenderer from "../services/note_list_renderer.js"; -import type FNote from "../entities/fnote.js"; -import type { CommandListener, CommandListenerData, CommandMappings, CommandNames, EventData, EventNames } from "../components/app_context.js"; -import type ViewMode from "./view_widgets/view_mode.js"; - -const TPL = /*html*/` -
- - -
-
-
`; - -export default class NoteListWidget extends NoteContextAwareWidget { - - private $content!: JQuery; - private isIntersecting?: boolean; - private noteIdRefreshed?: string; - private shownNoteId?: string | null; - private viewMode?: ViewMode | null; - private displayOnlyCollections: boolean; - - /** - * @param displayOnlyCollections if set to `true` then only collection-type views are displayed such as geo-map and the calendar. The original book types grid and list will be ignored. - */ - constructor(displayOnlyCollections: boolean) { - super(); - - this.displayOnlyCollections = displayOnlyCollections; - } - - isEnabled() { - if (!super.isEnabled()) { - return false; - } - - if (this.displayOnlyCollections && this.note?.type !== "book") { - const viewType = this.note?.getLabelValue("viewType"); - if (!viewType || ["grid", "list"].includes(viewType)) { - return false; - } - } - - return this.noteContext?.hasNoteList(); - } - - doRender() { - this.$widget = $(TPL); - this.contentSized(); - this.$content = this.$widget.find(".note-list-widget-content"); - - const observer = new IntersectionObserver( - (entries) => { - this.isIntersecting = entries[0].isIntersecting; - - this.checkRenderStatus(); - }, - { - rootMargin: "50px", - threshold: 0.1 - } - ); - - // there seems to be a race condition on Firefox which triggers the observer only before the widget is visible - // (intersection is false). https://github.com/zadam/trilium/issues/4165 - setTimeout(() => observer.observe(this.$widget[0]), 10); - } - - checkRenderStatus() { - // console.log("this.isIntersecting", this.isIntersecting); - // console.log(`${this.noteIdRefreshed} === ${this.noteId}`, this.noteIdRefreshed === this.noteId); - // console.log("this.shownNoteId !== this.noteId", this.shownNoteId !== this.noteId); - - if (this.note && this.isIntersecting && this.noteIdRefreshed === this.noteId && this.shownNoteId !== this.noteId) { - this.shownNoteId = this.noteId; - this.renderNoteList(this.note); - } - } - - async renderNoteList(note: FNote) { - const noteListRenderer = new NoteListRenderer({ - $parent: this.$content, - parentNote: note, - parentNotePath: this.notePath - }); - this.$widget.toggleClass("full-height", noteListRenderer.isFullHeight); - await noteListRenderer.renderList(); - this.viewMode = noteListRenderer.viewMode; - } - - async refresh() { - this.shownNoteId = null; - - await super.refresh(); - } - - async refreshNoteListEvent({ noteId }: EventData<"refreshNoteList">) { - if (this.isNote(noteId) && this.note) { - await this.renderNoteList(this.note); - } - } - - /** - * We have this event so that we evaluate intersection only after note detail is loaded. - * If it's evaluated before note detail, then it's clearly intersected (visible) although after note detail load - * it is not intersected (visible) anymore. - */ - noteDetailRefreshedEvent({ ntxId }: EventData<"noteDetailRefreshed">) { - if (!this.isNoteContext(ntxId)) { - return; - } - - this.noteIdRefreshed = this.noteId; - - setTimeout(() => this.checkRenderStatus(), 100); - } - - notesReloadedEvent({ noteIds }: EventData<"notesReloaded">) { - if (this.noteId && noteIds.includes(this.noteId)) { - this.refresh(); - } - } - - entitiesReloadedEvent(e: EventData<"entitiesReloaded">) { - if (e.loadResults.getAttributeRows().find((attr) => attr.noteId === this.noteId && attr.name && ["viewType", "expanded", "pageSize"].includes(attr.name))) { - this.refresh(); - this.checkRenderStatus(); - } - } - - buildTouchBarCommand(data: CommandListenerData<"buildTouchBar">) { - if (this.viewMode && "buildTouchBarCommand" in this.viewMode) { - return (this.viewMode as CommandListener<"buildTouchBar">).buildTouchBarCommand(data); - } - } - - triggerCommand(name: K, data?: CommandMappings[K]): Promise | undefined | null { - // Pass the commands to the view mode, which is not actually attached to the hierarchy. - if (this.viewMode?.triggerCommand(name, data)) { - return; - } - - return super.triggerCommand(name, data); - } - - handleEventInChildren(name: T, data: EventData): Promise | null { - super.handleEventInChildren(name, data); - - if (this.viewMode) { - const ret = this.viewMode.handleEvent(name, data); - if (ret) { - return ret; - } - } - - return null; - } - -} diff --git a/apps/client/src/widgets/note_map.ts b/apps/client/src/widgets/note_map.ts index d0274fc86..ef36d7b7e 100644 --- a/apps/client/src/widgets/note_map.ts +++ b/apps/client/src/widgets/note_map.ts @@ -38,7 +38,7 @@ const TPL = /*html*/`
/* removing default appearance */ -webkit-appearance: none; appearance: none; - margin-left: 15px; + margin-inline-start: 15px; width: 150px; } diff --git a/apps/client/src/widgets/note_title.css b/apps/client/src/widgets/note_title.css index aa3c31269..dd56edf96 100644 --- a/apps/client/src/widgets/note_title.css +++ b/apps/client/src/widgets/note_title.css @@ -12,6 +12,11 @@ padding: 1px 12px; } +.note-title-widget input.note-title[readonly] { + background: inherit; + outline: none; +} + .note-title-widget input.note-title.protected { text-shadow: 4px 4px 4px var(--muted-text-color); } diff --git a/apps/client/src/widgets/note_title.tsx b/apps/client/src/widgets/note_title.tsx index e2f30bcfc..8207198d6 100644 --- a/apps/client/src/widgets/note_title.tsx +++ b/apps/client/src/widgets/note_title.tsx @@ -8,16 +8,17 @@ import "./note_title.css"; import { isLaunchBarConfig } from "../services/utils"; import appContext from "../components/app_context"; import branches from "../services/branches"; +import { isIMEComposing } from "../services/shortcuts"; export default function NoteTitleWidget() { - const { note, noteId, componentId, viewScope, noteContext, parentComponent } = useNoteContext(); - const title = useNoteProperty(note, "title", componentId); + const { note, noteId, componentId, viewScope, noteContext, parentComponent } = useNoteContext(); + const title = useNoteProperty(note, "title", componentId); const isProtected = useNoteProperty(note, "isProtected"); const newTitle = useRef(""); - + const [ isReadOnly, setReadOnly ] = useState(false); - const [ navigationTitle, setNavigationTitle ] = useState(null); - + const [ navigationTitle, setNavigationTitle ] = useState(null); + // Manage read-only useEffect(() => { const isReadOnly = note === null @@ -33,7 +34,7 @@ export default function NoteTitleWidget() { if (isReadOnly) { noteContext?.getNavigationTitle().then(setNavigationTitle); } - }, [isReadOnly]); + }, [note, isReadOnly]); // Save changes to title. const spacedUpdate = useSpacedUpdate(async () => { @@ -42,11 +43,11 @@ export default function NoteTitleWidget() { } protected_session_holder.touchProtectedSessionIfNecessary(note); await server.put(`notes/${noteId}/title`, { title: newTitle.current }, componentId); - }); + }); // Prevent user from navigating away if the spaced update is not done. useEffect(() => { - appContext.addBeforeUnloadListener(() => spacedUpdate.isAllSavedAndTriggerUpdate()); + appContext.addBeforeUnloadListener(() => spacedUpdate.isAllSavedAndTriggerUpdate()); }, []); useTriliumEvents([ "beforeNoteSwitch", "beforeNoteContextRemove" ], () => spacedUpdate.updateNowIfNecessary()); @@ -78,6 +79,12 @@ export default function NoteTitleWidget() { spacedUpdate.scheduleUpdate(); }} onKeyDown={(e) => { + // Skip processing if IME is composing to prevent interference + // with text input in CJK languages + if (isIMEComposing(e)) { + return; + } + // Focus on the note content when pressing enter. if (e.key === "Enter") { e.preventDefault(); diff --git a/apps/client/src/widgets/note_tree.ts b/apps/client/src/widgets/note_tree.ts index 85e098338..f1c2ca736 100644 --- a/apps/client/src/widgets/note_tree.ts +++ b/apps/client/src/widgets/note_tree.ts @@ -61,7 +61,7 @@ const TPL = /*html*/` display: flex; align-items: flex-end; justify-content: flex-end; - right: 17px; + inset-inline-end: 17px; border-radius: 7px; border: 1px solid var(--main-border-color); } @@ -82,15 +82,15 @@ const TPL = /*html*/` } .collapse-tree-button { - right: 100px; + inset-inline-end: 100px; } .scroll-to-active-note-button { - right: 55px; + inset-inline-end: 55px; } .tree-settings-button { - right: 10px; + inset-inline-end: 10px; } .tree-settings-popup { @@ -195,6 +195,8 @@ export interface DragData { title: string; } +export const TREE_CLIPBOARD_TYPE = "application/x-fancytree-node"; + export default class NoteTreeWidget extends NoteContextAwareWidget { private $tree!: JQuery; private $treeActions!: JQuery; @@ -219,21 +221,22 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { this.$tree = this.$widget.find(".tree"); this.$treeActions = this.$widget.find(".tree-actions"); - this.$tree.on("mousedown", ".unhoist-button", () => hoistedNoteService.unhoist()); - this.$tree.on("mousedown", ".refresh-search-button", (e) => this.refreshSearch(e)); - this.$tree.on("mousedown", ".add-note-button", (e) => { - const node = $.ui.fancytree.getNode(e as unknown as Event); - const parentNotePath = treeService.getNotePath(node); + this.$tree.on("mousedown", (e: JQuery.MouseDownEvent) => { + const target = e.target as HTMLElement; + if (e.button !== 0) return; - noteCreateService.createNote(parentNotePath, { - isProtected: node.data.isProtected - }); - }); - - this.$tree.on("mousedown", ".enter-workspace-button", (e) => { - const node = $.ui.fancytree.getNode(e as unknown as Event); - - this.triggerCommand("hoistNote", { noteId: node.data.noteId }); + if (target.classList.contains("unhoist-button")) { + hoistedNoteService.unhoist(); + } else if (target.classList.contains("refresh-search-button")) { + this.refreshSearch(e); + } else if (target.classList.contains("add-note-button")) { + const node = $.ui.fancytree.getNode(e as unknown as Event); + const parentNotePath = treeService.getNotePath(node); + noteCreateService.createNote(parentNotePath, { isProtected: node.data.isProtected }); + } else if (target.classList.contains("enter-workspace-button")) { + const node = $.ui.fancytree.getNode(e as unknown as Event); + this.triggerCommand("hoistNote", { noteId: node.data.noteId }); + } }); // fancytree doesn't support middle click, so this is a way to support it @@ -382,7 +385,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { if (event.shiftKey && !ctrlKey) { const activeNode = this.getActiveNode(); - if (activeNode.getParent() !== node.getParent()) { + if (activeNode?.getParent() !== node.getParent()) { return true; } @@ -729,7 +732,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { shortcutService.bindElShortcut($(this.tree.$container), key, () => { const node = this.tree.getActiveNode(); - return handler(node, {} as JQuery.KeyDownEvent); + return node && handler(node, {} as JQuery.KeyDownEvent); // return false from the handler will stop default handling. }); } @@ -902,7 +905,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { const colorClass = note.getColorClass(); if (colorClass) { - extraClasses.push(colorClass); + extraClasses.push(...["tinted", colorClass]); } return extraClasses.join(" "); @@ -921,8 +924,9 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { nodes.push(node); } - if (nodes.length === 0) { - nodes.push(this.getActiveNode()); + const activeNode = this.getActiveNode(); + if (nodes.length === 0 && activeNode) { + nodes.push(activeNode); } // hidden subtree is hackily hidden via CSS when hoisted to root @@ -967,9 +971,6 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { this.collapseTree(); } - /** - * @returns {FancytreeNode|null} - */ getActiveNode() { return this.tree.getActiveNode(); } @@ -1219,7 +1220,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { } const activeNode = this.getActiveNode(); - const activeNodeFocused = activeNode?.hasFocus(); + const activeNodeFocused = !!activeNode?.hasFocus(); const activeNotePath = activeNode ? treeService.getNotePath(activeNode) : null; const refreshCtx: RefreshContext = { @@ -1531,7 +1532,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { // Automatically expand the hoisted note by default const node = this.getActiveNode(); - if (node.data.noteId === this.noteContext.hoistedNoteId){ + if (node?.data.noteId === this.noteContext.hoistedNoteId){ this.setExpanded(node.data.branchId, true); } } @@ -1809,6 +1810,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { buildTouchBarCommand({ TouchBar, buildIcon }: CommandListenerData<"buildTouchBar">) { const triggerCommand = (command: TreeCommandNames) => { const node = this.getActiveNode(); + if (!node) return; const notePath = treeService.getNotePath(node); this.triggerCommand(command, { @@ -1825,6 +1827,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { icon: buildIcon("NSImageNameTouchBarAddTemplate"), click: () => { const node = this.getActiveNode(); + if (!node) return; const notePath = treeService.getNotePath(node); noteCreateService.createNote(notePath, { isProtected: node.data.isProtected diff --git a/apps/client/src/widgets/note_wrapper.ts b/apps/client/src/widgets/note_wrapper.ts index 2e59cfbab..01a1f7c87 100644 --- a/apps/client/src/widgets/note_wrapper.ts +++ b/apps/client/src/widgets/note_wrapper.ts @@ -23,15 +23,21 @@ export default class NoteWrapperWidget extends FlexContainer { this.refresh(); } - noteSwitchedAndActivatedEvent() { + noteSwitchedAndActivatedEvent({ noteContext }: EventData<"setNoteContext">) { + this.noteContext = noteContext; + this.refresh(); } - noteSwitchedEvent() { + noteSwitchedEvent({ noteContext }: EventData<"setNoteContext">) { + this.noteContext = noteContext; + this.refresh(); } - activeContextChangedEvent() { + activeContextChangedEvent({ noteContext }: EventData<"setNoteContext">) { + this.noteContext = noteContext; + this.refresh(); } @@ -72,6 +78,10 @@ export default class NoteWrapperWidget extends FlexContainer { return true; } + if (note.type === "search" && ![ "grid", "list" ].includes(note.getLabelValue("viewType") ?? "list")) { + return true; + } + return !!note?.isLabelTruthy("fullContentWidth"); } @@ -81,7 +91,7 @@ export default class NoteWrapperWidget extends FlexContainer { const noteId = this.noteContext?.noteId; if ( loadResults.isNoteReloaded(noteId) || - loadResults.getAttributeRows().find((attr) => attr.type === "label" && ["cssClass", "language"].includes(attr.name ?? "") && attributeService.isAffecting(attr, this.noteContext?.note)) + loadResults.getAttributeRows().find((attr) => attr.type === "label" && ["cssClass", "language", "viewType"].includes(attr.name ?? "") && attributeService.isAffecting(attr, this.noteContext?.note)) ) { this.refresh(); } diff --git a/apps/client/src/widgets/promoted_attributes.ts b/apps/client/src/widgets/promoted_attributes.ts index 1b67ecec1..5853e1d87 100644 --- a/apps/client/src/widgets/promoted_attributes.ts +++ b/apps/client/src/widgets/promoted_attributes.ts @@ -45,7 +45,7 @@ const TPL = /*html*/` } .promoted-attribute-cell div.input-group { - margin-left: 10px; + margin-inline-start: 10px; display: flex; min-height: 40px; } @@ -95,8 +95,8 @@ const TPL = /*html*/` content: ""; position: absolute; top: 10px; - left: 0px; - right: 0; + inset-inline-start: 0px; + inset-inline-end: 0; height: 2px; background: rgba(0, 0, 0, 0.5); transform: rotate(45deg); diff --git a/apps/client/src/widgets/quick_search.ts b/apps/client/src/widgets/quick_search.ts index 95728b99e..cc326df98 100644 --- a/apps/client/src/widgets/quick_search.ts +++ b/apps/client/src/widgets/quick_search.ts @@ -2,9 +2,9 @@ import BasicWidget from "./basic_widget.js"; import server from "../services/server.js"; import linkService from "../services/link.js"; import froca from "../services/froca.js"; -import utils from "../services/utils.js"; +import utils, { handleRightToLeftPlacement } from "../services/utils.js"; import appContext from "../components/app_context.js"; -import shortcutService from "../services/shortcuts.js"; +import shortcutService, { isIMEComposing } from "../services/shortcuts.js"; import { t } from "../services/i18n.js"; import { Dropdown, Tooltip } from "bootstrap"; @@ -22,6 +22,8 @@ const TPL = /*html*/` } .quick-search .dropdown-menu { + --quick-search-item-delimiter-color: var(--dropdown-border-color); + max-height: 80vh; min-width: 400px; max-width: 720px; @@ -30,40 +32,40 @@ const TPL = /*html*/` text-overflow: ellipsis; box-shadow: -30px 50px 93px -50px black; } - + .quick-search .dropdown-item { white-space: normal; padding: 12px 16px; line-height: 1.4; position: relative; } - - .quick-search .dropdown-item:not(:last-child)::after { + + .quick-search .dropdown-item + .dropdown-item::after { content: ''; position: absolute; - left: 0; - bottom: 0; + inset-inline-start: 0; + top: 0; width: 100%; height: 1px; - background: var(--dropdown-border-color); + border-bottom: 1px solid var(--quick-search-item-delimiter-color); } - + .quick-search .dropdown-item:last-child::after { display: none; } - + .quick-search .dropdown-item.disabled::after { display: none; } - + .quick-search .dropdown-item.show-in-full-search::after { display: none; } - + .quick-search-item.dropdown-item:hover { background-color: #f8f9fa; } - + .quick-search .quick-search-item { width: 100%; } @@ -92,6 +94,8 @@ const TPL = /*html*/` background-color: var(--accented-background-color); color: var(--main-text-color); font-size: .85em; + overflow: hidden; + text-overflow: ellipsis; } /* Search result highlighting */ @@ -106,6 +110,10 @@ const TPL = /*html*/` margin: 0; } + .quick-search .bx-loader { + margin-inline-end: 4px; + } +
@@ -143,7 +151,7 @@ export default class QuickSearchWidget extends BasicWidget { private dropdown!: bootstrap.Dropdown; private $searchString!: JQuery; private $dropdownMenu!: JQuery; - + // State for infinite scrolling private allSearchResults: Array = []; private allSearchResultNoteIds: string[] = []; @@ -164,7 +172,7 @@ export default class QuickSearchWidget extends BasicWidget { }); this.$widget.find(".input-group-prepend").on("shown.bs.dropdown", () => this.search()); - + // Add scroll event listener for infinite scrolling this.$dropdownMenu.on("scroll", () => { this.handleScroll(); @@ -172,6 +180,14 @@ export default class QuickSearchWidget extends BasicWidget { if (utils.isMobile()) { this.$searchString.keydown((e) => { + // Skip processing if IME is composing to prevent interference + // with text input in CJK languages + // Note: jQuery wraps the native event, so we access originalEvent + const originalEvent = e.originalEvent as KeyboardEvent; + if (originalEvent && isIMEComposing(originalEvent)) { + return; + } + if (e.which === 13) { if (this.$dropdownMenu.is(":visible")) { this.search(); // just update already visible dropdown @@ -220,7 +236,11 @@ export default class QuickSearchWidget extends BasicWidget { this.isLoadingMore = false; this.$dropdownMenu.empty(); - this.$dropdownMenu.append(`${t("quick-search.searching")}`); + this.$dropdownMenu.append(` + + + ${t("quick-search.searching")} + `); const { searchResultNoteIds, searchResults, error } = await server.get(`quick-search/${encodeURIComponent(searchString)}`); @@ -228,7 +248,7 @@ export default class QuickSearchWidget extends BasicWidget { let tooltip = new Tooltip(this.$searchString[0], { trigger: "manual", title: `Search error: ${error}`, - placement: "right" + placement: handleRightToLeftPlacement("right") }); tooltip.show(); @@ -273,40 +293,40 @@ export default class QuickSearchWidget extends BasicWidget { if (!noteId) continue; const $item = $(''); - + // Build the display HTML with content snippet below the title let itemHtml = `
${result.highlightedNotePathTitle}
`; - + // Add attribute snippet (tags/attributes) below the title if available if (result.highlightedAttributeSnippet) { // Replace
with a blank space to join the atributes on the same single line const snippet = (result.highlightedAttributeSnippet as string).replace(//g, " "); itemHtml += `
${snippet}
`; } - + // Add content snippet below the attributes if available if (result.highlightedContentSnippet) { itemHtml += `
${result.highlightedContentSnippet}
`; } - + itemHtml += `
`; - + $item.html(itemHtml); - + $item.on("click", (e) => { this.dropdown.hide(); e.preventDefault(); - + const activeContext = appContext.tabManager.getActiveContext(); if (activeContext) { activeContext.setNote(noteId); } }); - + shortcutService.bindElShortcut($item, "return", () => { this.dropdown.hide(); @@ -370,7 +390,7 @@ export default class QuickSearchWidget extends BasicWidget { // Trigger loading more when user scrolls near the bottom (within 50px) if (scrollTop + clientHeight >= scrollHeight - 50) { const totalResults = this.allSearchResults.length > 0 ? this.allSearchResults.length : this.allSearchResultNoteIds.length; - + if (this.currentDisplayedCount < totalResults) { this.displayMoreResults(LOAD_MORE_BATCH_SIZE).then(() => { this.addShowInFullSearchButton(); diff --git a/apps/client/src/widgets/react/ActionButton.tsx b/apps/client/src/widgets/react/ActionButton.tsx index 41c4abbed..28489005d 100644 --- a/apps/client/src/widgets/react/ActionButton.tsx +++ b/apps/client/src/widgets/react/ActionButton.tsx @@ -5,34 +5,38 @@ import keyboard_actions from "../../services/keyboard_actions"; export interface ActionButtonProps { text: string; - titlePosition?: "bottom" | "left"; // TODO: Use it + titlePosition?: "top" | "right" | "bottom" | "left"; icon: string; className?: string; onClick?: (e: MouseEvent) => void; triggerCommand?: CommandNames; noIconActionClass?: boolean; + frame?: boolean; + active?: boolean; + disabled?: boolean; } -export default function ActionButton({ text, icon, className, onClick, triggerCommand, titlePosition, noIconActionClass }: ActionButtonProps) { +export default function ActionButton({ text, icon, className, onClick, triggerCommand, titlePosition, noIconActionClass, frame, active, disabled }: ActionButtonProps) { const buttonRef = useRef(null); const [ keyboardShortcut, setKeyboardShortcut ] = useState(); - + useStaticTooltip(buttonRef, { title: keyboardShortcut?.length ? `${text} (${keyboardShortcut?.join(",")})` : text, placement: titlePosition ?? "bottom", fallbackPlacements: [ titlePosition ?? "bottom" ] }); - + useEffect(() => { if (triggerCommand) { - keyboard_actions.getAction(triggerCommand).then(action => setKeyboardShortcut(action?.effectiveShortcuts)); + keyboard_actions.getAction(triggerCommand, true).then(action => setKeyboardShortcut(action?.effectiveShortcuts)); } }, [triggerCommand]); return -
{shown && children} -
+
) -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/react/FormCheckbox.tsx b/apps/client/src/widgets/react/FormCheckbox.tsx index 55e0797b3..13a62f631 100644 --- a/apps/client/src/widgets/react/FormCheckbox.tsx +++ b/apps/client/src/widgets/react/FormCheckbox.tsx @@ -22,7 +22,6 @@ const FormCheckbox = memo(({ name, disabled, label, currentValue, onChange, hint const labelRef = useRef(null); const id = useUniqueName(name); - // Fix: Move useEffect outside conditional useEffect(() => { if (!hint || !labelRef.current) return; @@ -34,22 +33,19 @@ const FormCheckbox = memo(({ name, disabled, label, currentValue, onChange, hint return () => tooltipInstance?.dispose(); }, [hint]); // Proper dependency - // Memoize style object const labelStyle = useMemo(() => hint ? { textDecoration: "underline dotted var(--main-text-color)" } : undefined, [hint] ); - // Memoize onChange handler const handleChange = useCallback((e: Event) => { onChange((e.target as HTMLInputElement).checked); }, [onChange]); - // Memoize title attribute const titleText = useMemo(() => hint ? escapeQuotes(hint) : undefined, [hint]); return ( -
+
  -
- {children} - {badges && badges.map(({ className, text }) => ( - {text} - ))} - {description &&
{description}
} -
-
+ {description ? ( +
+ +
+ ) : ( + + )} + ); } +function FormListContent({ children, badges, description }: Pick) { + return <> + {children} + {badges && badges.map(({ className, text }) => ( + {text} + ))} + {description &&
{description}
} + ; +} + interface FormListHeaderOpts { text: string; } @@ -129,4 +152,30 @@ export function FormListHeader({ text }: FormListHeaderOpts) { export function FormDropdownDivider() { return
; -} \ No newline at end of file +} + +export function FormDropdownSubmenu({ icon, title, children }: { icon: string, title: ComponentChildren, children: ComponentChildren }) { + const [ openOnMobile, setOpenOnMobile ] = useState(false); + + return ( +
  • + { + e.stopPropagation(); + + if (isMobile()) { + setOpenOnMobile(!openOnMobile); + } + }} + > + {" "} + {title} + + +
      + {children} +
    +
  • + ) +} diff --git a/apps/client/src/widgets/react/FormTextBox.tsx b/apps/client/src/widgets/react/FormTextBox.tsx index db67bf6c9..27df6326c 100644 --- a/apps/client/src/widgets/react/FormTextBox.tsx +++ b/apps/client/src/widgets/react/FormTextBox.tsx @@ -9,22 +9,26 @@ interface FormTextBoxProps extends Omit, " } export default function FormTextBox({ inputRef, className, type, currentValue, onChange, onBlur, autoFocus, ...rest}: FormTextBoxProps) { - if (type === "number" && currentValue) { - const { min, max } = rest; - const currentValueNum = parseInt(currentValue, 10); - if (min && currentValueNum < parseInt(String(min), 10)) { - currentValue = String(min); - } else if (max && currentValueNum > parseInt(String(max), 10)) { - currentValue = String(max); - } - } - useEffect(() => { if (autoFocus) { inputRef?.current?.focus(); } }, []); + function applyLimits(value: string) { + if (type === "number") { + const { min, max } = rest; + const currentValueNum = parseInt(value, 10); + if (min && currentValueNum < parseInt(String(min), 10)) { + return String(min); + } else if (max && currentValueNum > parseInt(String(max), 10)) { + return String(max); + } + } + + return value; + } + return ( { const target = e.currentTarget; - onChange?.(target.value, target.validity); + const currentValue = applyLimits(e.currentTarget.value); + onChange?.(currentValue, target.validity); })} - onBlur={onBlur && (e => { - const target = e.currentTarget; - onBlur(target.value); + onBlur={(e => { + const currentValue = applyLimits(e.currentTarget.value); + e.currentTarget.value = currentValue; + onBlur?.(currentValue); })} {...rest} /> @@ -49,6 +55,6 @@ export function FormTextBoxWithUnit(props: FormTextBoxProps & { unit: string }) + ) -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/react/FormToggle.css b/apps/client/src/widgets/react/FormToggle.css index f727bc5ff..941839143 100644 --- a/apps/client/src/widgets/react/FormToggle.css +++ b/apps/client/src/widgets/react/FormToggle.css @@ -18,7 +18,7 @@ .switch-widget .switch-button { display: block; position: relative; - margin-left: 8px; + margin-inline-start: 8px; width: var(--switch-track-width); height: var(--switch-track-height); border-radius: 24px; @@ -40,7 +40,7 @@ content: ""; position: absolute; top: 0; - left: 0; + inset-inline-start: 0; width: var(--switch-thumb-width); height: var(--switch-thumb-height); background-color: var(--switch-off-thumb-background); @@ -50,6 +50,10 @@ background 200ms ease-out; } +body[dir=rtl] .switch-widget .switch-button:after { + --x: calc(var(--y) * -1); +} + .switch-widget .switch-button.on:after { --x: calc(var(--switch-track-width) - var(--switch-thumb-width) - var(--y)); @@ -58,12 +62,16 @@ background 100ms ease-in; } +body[dir=rtl] .switch-widget .switch-button.on:after { + --x: calc((var(--switch-track-width) - var(--switch-thumb-width) - var(--y)) * -1); +} + .switch-widget .switch-button input[type="checkbox"] { /* A hidden check box for accesibility purposes */ position: absolute; top: 0; - left: 0; + inset-inline-start: 0; width: 100%; height: 100%; opacity: 0; @@ -86,7 +94,7 @@ .switch-widget .switch-help-button { border: 0; - margin-left: 4px; + margin-inline-start: 4px; background: none; cursor: pointer; font-size: 1.1em; diff --git a/apps/client/src/widgets/react/HelpRemoveButtons.tsx b/apps/client/src/widgets/react/HelpRemoveButtons.tsx index 7eda18b97..79c0a138f 100644 --- a/apps/client/src/widgets/react/HelpRemoveButtons.tsx +++ b/apps/client/src/widgets/react/HelpRemoveButtons.tsx @@ -14,17 +14,20 @@ export default function HelpRemoveButtons({ help, removeText, onRemove }: HelpRe {help && <> {help} {" "} - } + } { + e.preventDefault(); + onRemove?.(); + }} /> ); -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/react/Icon.tsx b/apps/client/src/widgets/react/Icon.tsx index cc7afe812..e047a1762 100644 --- a/apps/client/src/widgets/react/Icon.tsx +++ b/apps/client/src/widgets/react/Icon.tsx @@ -1,7 +1,8 @@ interface IconProps { icon?: string; + className?: string; } -export default function Icon({ icon }: IconProps) { - return +export default function Icon({ icon, className }: IconProps) { + return } \ No newline at end of file diff --git a/apps/client/src/widgets/react/KeyboardShortcut.tsx b/apps/client/src/widgets/react/KeyboardShortcut.tsx index ca8f6a852..0a76b8093 100644 --- a/apps/client/src/widgets/react/KeyboardShortcut.tsx +++ b/apps/client/src/widgets/react/KeyboardShortcut.tsx @@ -2,11 +2,14 @@ import { ActionKeyboardShortcut, KeyboardActionNames } from "@triliumnext/common import { useEffect, useState } from "preact/hooks"; import keyboard_actions from "../../services/keyboard_actions"; import { joinElements } from "./react_utils"; +import utils from "../../services/utils"; interface KeyboardShortcutProps { actionName: KeyboardActionNames; } +const isMobile = utils.isMobile(); + export default function KeyboardShortcut({ actionName }: KeyboardShortcutProps) { const [ action, setAction ] = useState(); @@ -18,17 +21,14 @@ export default function KeyboardShortcut({ actionName }: KeyboardShortcutProps) return <>; } - return ( - <> - {action.effectiveShortcuts?.map((shortcut) => { + return (!isMobile && + + {joinElements(action.effectiveShortcuts?.map((shortcut) => { const keys = shortcut.split("+"); - return joinElements(keys - .map((key, i) => ( - <> - {key} {i + 1 < keys.length && "+ "} - - ))) - })} - + return joinElements( + keys.map((key, i) => {key}) + , "+"); + }))} + ); } \ No newline at end of file diff --git a/apps/client/src/widgets/react/Modal.tsx b/apps/client/src/widgets/react/Modal.tsx index f13257a5d..37a0d96c0 100644 --- a/apps/client/src/widgets/react/Modal.tsx +++ b/apps/client/src/widgets/react/Modal.tsx @@ -36,9 +36,9 @@ interface ModalProps { onSubmit?: () => void; /** Called when the modal is shown. */ onShown?: () => void; - /** + /** * Called when the modal is hidden, either via close button, backdrop click or submit. - * + * * Here it's generally a good idea to set `show` to false to reflect the actual state of the modal. */ onHidden: () => void; @@ -71,23 +71,25 @@ export default function Modal({ children, className, size, title, header, footer useEffect(() => { const modalElement = modalRef.current; - if (!modalElement) { - return; - } + if (!modalElement) return; + if (onShown) { modalElement.addEventListener("shown.bs.modal", onShown); } - modalElement.addEventListener("hidden.bs.modal", () => { + + function onModalHidden() { onHidden(); if (elementToFocus.current && "focus" in elementToFocus.current) { (elementToFocus.current as HTMLElement).focus(); } - }); + } + + modalElement.addEventListener("hidden.bs.modal", onModalHidden); return () => { if (onShown) { modalElement.removeEventListener("shown.bs.modal", onShown); } - modalElement.removeEventListener("hidden.bs.modal", onHidden); + modalElement.removeEventListener("hidden.bs.modal", onModalHidden); }; }, [ onShown, onHidden ]); @@ -180,4 +182,4 @@ const ModalInner = memo(({ children, footer, footerAlignment, bodyStyle, footerS )} ); -}); \ No newline at end of file +}); diff --git a/apps/client/src/widgets/react/NoteLink.tsx b/apps/client/src/widgets/react/NoteLink.tsx index 221b902af..06841b534 100644 --- a/apps/client/src/widgets/react/NoteLink.tsx +++ b/apps/client/src/widgets/react/NoteLink.tsx @@ -1,25 +1,35 @@ -import { useEffect, useState } from "preact/hooks"; +import { useEffect, useRef, useState } from "preact/hooks"; import link from "../../services/link"; -import RawHtml from "./RawHtml"; +import { useImperativeSearchHighlighlighting } from "./hooks"; interface NoteLinkOpts { + className?: string; notePath: string | string[]; showNotePath?: boolean; showNoteIcon?: boolean; style?: Record; noPreview?: boolean; noTnLink?: boolean; + highlightedTokens?: string[] | null | undefined; } -export default function NoteLink({ notePath, showNotePath, showNoteIcon, style, noPreview, noTnLink }: NoteLinkOpts) { +export default function NoteLink({ className, notePath, showNotePath, showNoteIcon, style, noPreview, noTnLink, highlightedTokens }: NoteLinkOpts) { const stringifiedNotePath = Array.isArray(notePath) ? notePath.join("/") : notePath; + const ref = useRef(null); const [ jqueryEl, setJqueryEl ] = useState>(); + const highlightSearch = useImperativeSearchHighlighlighting(highlightedTokens); useEffect(() => { link.createLink(stringifiedNotePath, { showNotePath, showNoteIcon }) .then(setJqueryEl); }, [ stringifiedNotePath, showNotePath ]); + useEffect(() => { + if (!ref.current || !jqueryEl) return; + ref.current.replaceChildren(jqueryEl[0]); + highlightSearch(ref.current); + }, [ jqueryEl, highlightedTokens ]); + if (style) { jqueryEl?.css(style); } @@ -33,6 +43,10 @@ export default function NoteLink({ notePath, showNotePath, showNoteIcon, style, $linkEl?.addClass("tn-link"); } - return - -} \ No newline at end of file + if (className) { + $linkEl?.addClass(className); + } + + return + +} diff --git a/apps/client/src/widgets/react/RawHtml.tsx b/apps/client/src/widgets/react/RawHtml.tsx index a8b3b2820..e022b5480 100644 --- a/apps/client/src/widgets/react/RawHtml.tsx +++ b/apps/client/src/widgets/react/RawHtml.tsx @@ -1,4 +1,4 @@ -import type { CSSProperties } from "preact/compat"; +import type { CSSProperties, RefObject } from "preact/compat"; type HTMLElementLike = string | HTMLElement | JQuery; @@ -9,12 +9,12 @@ interface RawHtmlProps { onClick?: (e: MouseEvent) => void; } -export default function RawHtml(props: RawHtmlProps) { - return ; +export default function RawHtml({containerRef, ...props}: RawHtmlProps & { containerRef?: RefObject}) { + return ; } -export function RawHtmlBlock(props: RawHtmlProps) { - return
    +export function RawHtmlBlock({containerRef, ...props}: RawHtmlProps & { containerRef?: RefObject}) { + return
    } function getProps({ className, html, style, onClick }: RawHtmlProps) { @@ -38,4 +38,4 @@ export function getHtml(html: string | HTMLElement | JQuery) { return { __html: html as string }; -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/react/ShadowDom.tsx b/apps/client/src/widgets/react/ShadowDom.tsx new file mode 100644 index 000000000..7b98aba75 --- /dev/null +++ b/apps/client/src/widgets/react/ShadowDom.tsx @@ -0,0 +1,28 @@ +import { ComponentChildren, HTMLAttributes, JSX, RefObject, render } from "preact"; +import { useEffect, useState } from "preact/hooks"; +import { useSyncedRef } from "./hooks"; + +interface ShadowDomProps extends Omit, "ref"> { + children: ComponentChildren; + containerRef?: RefObject; +} + +export default function ShadowDom({ children, containerRef: externalContainerRef, ...containerProps }: ShadowDomProps) { + const containerRef = useSyncedRef(externalContainerRef, null); + const [ shadowRoot, setShadowRoot ] = useState(null); + + // Create the shadow root. + useEffect(() => { + if (!containerRef.current) return; + const shadow = containerRef.current.attachShadow({ mode: "open" }); + setShadowRoot(shadow); + }, []); + + // Render the child elements. + useEffect(() => { + if (!shadowRoot) return; + render(<>{children}, shadowRoot); + }, [ shadowRoot, children ]); + + return
    +} diff --git a/apps/client/src/widgets/react/TouchBar.tsx b/apps/client/src/widgets/react/TouchBar.tsx new file mode 100644 index 000000000..e0f40fd87 --- /dev/null +++ b/apps/client/src/widgets/react/TouchBar.tsx @@ -0,0 +1,204 @@ +import { useContext, useEffect, useMemo, useState } from "preact/hooks"; +import { ParentComponent } from "./react_utils"; +import { ComponentChildren, createContext } from "preact"; +import { TouchBarItem } from "../../components/touch_bar"; +import { dynamicRequire, isElectron, isMac } from "../../services/utils"; + +interface TouchBarProps { + children: ComponentChildren; +} + +interface LabelProps { + label: string; +} + +interface SliderProps { + label: string; + value: number; + minValue: number; + maxValue: number; + onChange: (newValue: number) => void; +} + +interface ButtonProps { + label?: string; + icon?: string; + click: () => void; + enabled?: boolean; +} + +interface SpacerProps { + size: "flexible" | "large" | "small"; +} + +interface SegmentedControlProps { + mode: "single" | "buttons"; + segments: { + label?: string; + icon?: string; + onClick?: () => void; + }[]; + selectedIndex?: number; + onChange?: (selectedIndex: number, isSelected: boolean) => void; +} + +interface TouchBarContextApi { + addItem(item: TouchBarItem): void; + TouchBar: typeof Electron.TouchBar; + nativeImage: typeof Electron.nativeImage; +} + +const TouchBarContext = createContext(null); + +export default function TouchBar({ children }: TouchBarProps) { + if (!isElectron() || !isMac()) { + return; + } + + const [ isFocused, setIsFocused ] = useState(false); + const parentComponent = useContext(ParentComponent); + const remote = dynamicRequire("@electron/remote") as typeof import("@electron/remote"); + const items: TouchBarItem[] = []; + + const api: TouchBarContextApi = { + TouchBar: remote.TouchBar, + nativeImage: remote.nativeImage, + addItem: (item) => { + items.push(item); + } + }; + + useEffect(() => { + const el = parentComponent?.$widget[0]; + if (!el) return; + + function onFocusGained() { + setIsFocused(true); + } + + function onFocusLost() { + setIsFocused(false); + } + + el.addEventListener("focusin", onFocusGained); + el.addEventListener("focusout", onFocusLost); + return () => { + el.removeEventListener("focusin", onFocusGained); + el.removeEventListener("focusout", onFocusLost); + } + }, []); + + useEffect(() => { + if (isFocused) { + remote.getCurrentWindow().setTouchBar(new remote.TouchBar({ items })); + } + }); + + return ( + + {children} + + ); +} + +export function TouchBarLabel({ label }: LabelProps) { + const api = useContext(TouchBarContext); + + if (api) { + const item = new api.TouchBar.TouchBarLabel({ + label + }); + api.addItem(item); + } + + return <>; +} + +export function TouchBarSlider({ label, value, minValue, maxValue, onChange }: SliderProps) { + const api = useContext(TouchBarContext); + + if (api) { + const item = new api.TouchBar.TouchBarSlider({ + label, + value, minValue, maxValue, + change: onChange + }); + api.addItem(item); + } + + return <>; +} + +export function TouchBarButton({ label, icon, click, enabled }: ButtonProps) { + const api = useContext(TouchBarContext); + const item = useMemo(() => { + if (!api) return null; + return new api.TouchBar.TouchBarButton({ + label, click, enabled, + icon: icon ? buildIcon(api.nativeImage, icon) : undefined + }); + }, [ label, icon ]); + + if (item && api) { + api.addItem(item); + } + + return <>; +} + +export function TouchBarSegmentedControl({ mode, segments, selectedIndex, onChange }: SegmentedControlProps) { + const api = useContext(TouchBarContext); + + if (api) { + const processedSegments: Electron.SegmentedControlSegment[] = segments.map(({icon, ...restProps}) => ({ + ...restProps, + icon: icon ? buildIcon(api.nativeImage, icon) : undefined + })); + const item = new api.TouchBar.TouchBarSegmentedControl({ + mode, selectedIndex, + segments: processedSegments, + change: (selectedIndex, isSelected) => { + if (segments[selectedIndex].onClick) { + segments[selectedIndex].onClick(); + } else if (onChange) { + onChange(selectedIndex, isSelected); + } + } + }); + api.addItem(item); + } + + return <>; +} + +export function TouchBarSpacer({ size }: SpacerProps) { + const api = useContext(TouchBarContext); + + if (api) { + const item = new api.TouchBar.TouchBarSpacer({ + size + }); + api.addItem(item); + } + + return <>; +} + +function buildIcon(nativeImage: typeof Electron.nativeImage, name: string) { + const sourceImage = nativeImage.createFromNamedImage(name, [-1, 0, 1]); + const { width, height } = sourceImage.getSize(); + const newImage = nativeImage.createEmpty(); + newImage.addRepresentation({ + scaleFactor: 1, + width: width / 2, + height: height / 2, + buffer: sourceImage.resize({ height: height / 2 }).toBitmap() + }); + newImage.addRepresentation({ + scaleFactor: 2, + width: width, + height: height, + buffer: sourceImage.toBitmap() + }); + return newImage; +} diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx index af5378144..a8a549edb 100644 --- a/apps/client/src/widgets/react/hooks.tsx +++ b/apps/client/src/widgets/react/hooks.tsx @@ -1,10 +1,10 @@ -import { useCallback, useContext, useDebugValue, useEffect, useLayoutEffect, useMemo, useRef, useState } from "preact/hooks"; -import { EventData, EventNames } from "../../components/app_context"; +import { Inputs, MutableRef, useCallback, useContext, useDebugValue, useEffect, useLayoutEffect, useMemo, useRef, useState } from "preact/hooks"; +import { CommandListenerData, EventData, EventNames } from "../../components/app_context"; import { ParentComponent } from "./react_utils"; import SpacedUpdate from "../../services/spaced_update"; -import { OptionNames } from "@triliumnext/commons"; +import { FilterLabelsByType, KeyboardActionNames, OptionNames, RelationNames } from "@triliumnext/commons"; import options, { type OptionValue } from "../../services/options"; -import utils, { reloadFrontendApp } from "../../services/utils"; +import utils, { escapeRegExp, reloadFrontendApp } from "../../services/utils"; import NoteContext from "../../components/note_context"; import BasicWidget, { ReactWrappedWidget } from "../basic_widget"; import FNote from "../../entities/fnote"; @@ -14,6 +14,12 @@ import NoteContextAwareWidget from "../note_context_aware_widget"; import { RefObject, VNode } from "preact"; import { Tooltip } from "bootstrap"; import { CSSProperties } from "preact/compat"; +import keyboard_actions from "../../services/keyboard_actions"; +import Mark from "mark.js"; +import { DragData } from "../note_tree"; +import Component from "../../components/component"; +import toast, { ToastOptions } from "../../services/toast"; +import { ViewMode } from "../../services/link"; export function useTriliumEvent(eventName: T, handler: (data: EventData) => void) { const parentComponent = useContext(ParentComponent); @@ -26,7 +32,7 @@ export function useTriliumEvent(eventName: T, handler: (da export function useTriliumEvents(eventNames: T[], handler: (data: EventData, eventName: T) => void) { const parentComponent = useContext(ParentComponent); - + useLayoutEffect(() => { const handlers: ({ eventName: T, callback: (data: EventData) => void })[] = []; for (const eventName of eventNames) { @@ -34,11 +40,11 @@ export function useTriliumEvents(eventNames: T[], handler: handler(data, eventName); }}) } - + for (const { eventName, callback } of handlers) { parentComponent?.registerHandler(eventName, callback); } - + return (() => { for (const { eventName, callback } of handlers) { parentComponent?.removeHandler(eventName, callback); @@ -50,21 +56,16 @@ export function useTriliumEvents(eventNames: T[], handler: export function useSpacedUpdate(callback: () => void | Promise, interval = 1000) { const callbackRef = useRef(callback); - const spacedUpdateRef = useRef(); + const spacedUpdateRef = useRef(new SpacedUpdate( + () => callbackRef.current(), + interval + )); // Update callback ref when it changes useEffect(() => { callbackRef.current = callback; }, [callback]); - // Create SpacedUpdate instance only once - if (!spacedUpdateRef.current) { - spacedUpdateRef.current = new SpacedUpdate( - () => callbackRef.current(), - interval - ); - } - // Update interval if it changes useEffect(() => { spacedUpdateRef.current?.setUpdateInterval(interval); @@ -75,10 +76,10 @@ export function useSpacedUpdate(callback: () => void | Promise, interval = /** * Allows a React component to read and write a Trilium option, while also watching for external changes. - * + * * Conceptually, `useTriliumOption` works just like `useState`, but the value is also automatically updated if * the option is changed somewhere else in the client. - * + * * @param name the name of the option to listen for. * @param needsRefresh whether to reload the frontend whenever the value is changed. * @returns an array where the first value is the current option value and the second value is the setter. @@ -114,7 +115,7 @@ export function useTriliumOption(name: OptionNames, needsRefresh?: boolean): [st /** * Similar to {@link useTriliumOption}, but the value is converted to and from a boolean instead of a string. - * + * * @param name the name of the option to listen for. * @param needsRefresh whether to reload the frontend whenever the value is changed. * @returns an array where the first value is the current option value and the second value is the setter. @@ -130,7 +131,7 @@ export function useTriliumOptionBool(name: OptionNames, needsRefresh?: boolean): /** * Similar to {@link useTriliumOption}, but the value is converted to and from a int instead of a string. - * + * * @param name the name of the option to listen for. * @param needsRefresh whether to reload the frontend whenever the value is changed. * @returns an array where the first value is the current option value and the second value is the setter. @@ -146,7 +147,7 @@ export function useTriliumOptionInt(name: OptionNames): [number, (newValue: numb /** * Similar to {@link useTriliumOption}, but the object value is parsed to and from a JSON instead of a string. - * + * * @param name the name of the option to listen for. * @returns an array where the first value is the current option value and the second value is the setter. */ @@ -160,8 +161,8 @@ export function useTriliumOptionJson(name: OptionNames): [ T, (newValue: T) = } /** - * Similar to {@link useTriliumOption}, but operates with multiple options at once. - * + * Similar to {@link useTriliumOption}, but operates with multiple options at once. + * * @param names the name of the option to listen for. * @returns an array where the first value is a map where the keys are the option names and the values, and the second value is the setter which takes in the same type of map and saves them all at once. */ @@ -181,10 +182,10 @@ export function useTriliumOptions(...names: T[]) { /** * Generates a unique name via a random alphanumeric string of a fixed length. - * + * *

    * Generally used to assign names to inputs that are unique, especially useful for widgets inside tabs. - * + * * @param prefix a prefix to add to the unique name. * @returns a name with the given prefix and a random alpanumeric string appended to it. */ @@ -195,7 +196,8 @@ export function useUniqueName(prefix?: string) { export function useNoteContext() { const [ noteContext, setNoteContext ] = useState(); const [ notePath, setNotePath ] = useState(); - const [ note, setNote ] = useState(); + const [ note, setNote ] = useState(); + const [ , setViewMode ] = useState(); const [ refreshCounter, setRefreshCounter ] = useState(0); useEffect(() => { @@ -204,7 +206,8 @@ export function useNoteContext() { useTriliumEvents([ "setNoteContext", "activeContextChanged", "noteSwitchedAndActivated", "noteSwitched" ], ({ noteContext }) => { setNoteContext(noteContext); - setNotePath(noteContext.notePath); + setNotePath(noteContext.notePath); + setViewMode(noteContext.viewScope?.viewMode); }); useTriliumEvent("frocaReloaded", () => { setNote(noteContext?.note); @@ -234,7 +237,7 @@ export function useNoteContext() { /** * Allows a React component to listen to obtain a property of a {@link FNote} while also automatically watching for changes, either via the user changing to a different note or the property being changed externally. - * + * * @param note the {@link FNote} whose property to obtain. * @param property a property of a {@link FNote} to obtain the value from (e.g. `title`, `isProtected`). * @param componentId optionally, constricts the refresh of the value if an update occurs externally via the component ID of a legacy widget. This can be used to avoid external data replacing fresher, user-inputted data. @@ -258,7 +261,7 @@ export function useNoteProperty(note: FNote | null | unde return note?.[property]; } -export function useNoteRelation(note: FNote | undefined | null, relationName: string): [string | null | undefined, (newValue: string) => void] { +export function useNoteRelation(note: FNote | undefined | null, relationName: RelationNames): [string | null | undefined, (newValue: string) => void] { const [ relationValue, setRelationValue ] = useState(note?.getRelationValue(relationName)); useEffect(() => setRelationValue(note?.getRelationValue(relationName) ?? null), [ note ]); @@ -286,28 +289,34 @@ export function useNoteRelation(note: FNote | undefined | null, relationName: st /** * Allows a React component to read or write a note's label while also reacting to changes in value. - * + * * @param note the note whose label to read/write. * @param labelName the name of the label to read/write. - * @returns an array where the first element is the getter and the second element is the setter. The setter has a special behaviour for convenience: if the value is undefined, the label is created without a value (e.g. a tag), if the value is null then the label is removed. + * @returns an array where the first element is the getter and the second element is the setter. The setter has a special behaviour for convenience: + * - if the value is undefined, the label is created without a value (e.g. a tag) + * - if the value is null then the label is removed. */ -export function useNoteLabel(note: FNote | undefined | null, labelName: string): [string | null | undefined, (newValue: string | null | undefined) => void] { - const [ labelValue, setLabelValue ] = useState(note?.getLabelValue(labelName)); +export function useNoteLabel(note: FNote | undefined | null, labelName: FilterLabelsByType): [string | null | undefined, (newValue: string | null | undefined) => void] { + const [ , setLabelValue ] = useState(); useEffect(() => setLabelValue(note?.getLabelValue(labelName) ?? null), [ note ]); useTriliumEvent("entitiesReloaded", ({ loadResults }) => { for (const attr of loadResults.getAttributeRows()) { if (attr.type === "label" && attr.name === labelName && attributes.isAffecting(attr, note)) { - setLabelValue(attr.value ?? null); + if (!attr.isDeleted) { + setLabelValue(attr.value); + } else { + setLabelValue(null); + } } } }); const setter = useCallback((value: string | null | undefined) => { if (note) { - if (value || value === undefined) { + if (value !== null) { attributes.setLabel(note.noteId, labelName, value) - } else if (value === null) { + } else { attributes.removeOwnedLabelByName(note, labelName); } } @@ -316,12 +325,17 @@ export function useNoteLabel(note: FNote | undefined | null, labelName: string): useDebugValue(labelName); return [ - labelValue, + note?.getLabelValue(labelName), setter ] as const; } -export function useNoteLabelBoolean(note: FNote | undefined | null, labelName: string): [ boolean, (newValue: boolean) => void] { +export function useNoteLabelWithDefault(note: FNote | undefined | null, labelName: FilterLabelsByType, defaultValue: string): [string, (newValue: string | null | undefined) => void] { + const [ labelValue, setLabelValue ] = useNoteLabel(note, labelName); + return [ labelValue ?? defaultValue, setLabelValue]; +} + +export function useNoteLabelBoolean(note: FNote | undefined | null, labelName: FilterLabelsByType): [ boolean, (newValue: boolean) => void] { const [ labelValue, setLabelValue ] = useState(!!note?.hasLabel(labelName)); useEffect(() => setLabelValue(!!note?.hasLabel(labelName)), [ note ]); @@ -349,23 +363,42 @@ export function useNoteLabelBoolean(note: FNote | undefined | null, labelName: s return [ labelValue, setter ] as const; } -export function useNoteBlob(note: FNote | null | undefined): [ FBlob | null | undefined ] { +export function useNoteLabelInt(note: FNote | undefined | null, labelName: FilterLabelsByType): [ number | undefined, (newValue: number) => void] { + //@ts-expect-error `useNoteLabel` only accepts string properties but we need to be able to read number ones. + const [ value, setValue ] = useNoteLabel(note, labelName); + useDebugValue(labelName); + return [ + (value ? parseInt(value, 10) : undefined), + (newValue) => setValue(String(newValue)) + ] +} + +export function useNoteBlob(note: FNote | null | undefined): FBlob | null | undefined { const [ blob, setBlob ] = useState(); - + function refresh() { - note?.getBlob().then(setBlob); + note?.getBlob().then(setBlob); } useEffect(refresh, [ note?.noteId ]); useTriliumEvent("entitiesReloaded", ({ loadResults }) => { - if (note && loadResults.hasRevisionForNote(note.noteId)) { + if (!note) return; + + // Check if the note was deleted. + if (loadResults.getEntityRow("notes", note.noteId)?.isDeleted) { + setBlob(null); + return; + } + + // Check if a revision occurred. + if (loadResults.hasRevisionForNote(note.noteId)) { refresh(); } }); useDebugValue(note?.noteId); - return [ blob ] as const; + return blob; } export function useLegacyWidget(widgetFactory: () => T, { noteContext, containerClassName, containerStyle }: { @@ -387,7 +420,7 @@ export function useLegacyWidget(widgetFactory: () => T, { if (noteContext && widget instanceof NoteContextAwareWidget) { widget.setNoteContextEvent({ noteContext }); } - + const renderedWidget = widget.render(); return [ widget, renderedWidget ]; }, []); @@ -414,7 +447,7 @@ export function useLegacyWidget(widgetFactory: () => T, { /** * Attaches a {@link ResizeObserver} to the given ref and reads the bounding client rect whenever it changes. - * + * * @param ref a ref to a {@link HTMLElement} to determine the size and observe the changes in size. * @returns the size of the element, reacting to changes. */ @@ -444,7 +477,7 @@ export function useElementSize(ref: RefObject) { /** * Obtains the inner width and height of the window, as well as reacts to changes in size. - * + * * @returns the width and height of the window. */ export function useWindowSize() { @@ -452,7 +485,7 @@ export function useWindowSize() { windowWidth: window.innerWidth, windowHeight: window.innerHeight }); - + useEffect(() => { function onResize() { setSize({ @@ -498,22 +531,39 @@ export function useTooltip(elRef: RefObject, config: Partial, config?: Partial) { +export function useStaticTooltip(elRef: RefObject, config?: Partial) { useEffect(() => { - if (!elRef?.current) return; + const hasTooltip = config?.title || elRef.current?.getAttribute("title"); + if (!elRef?.current || !hasTooltip) return; - const $el = $(elRef.current); - $el.tooltip(config); + const tooltip = Tooltip.getOrCreateInstance(elRef.current, config); return () => { - $el.tooltip("dispose"); + tooltip.dispose(); + // workaround for https://github.com/twbs/bootstrap/issues/37474 + (tooltip as any)._activeTrigger = {}; + (tooltip as any)._element = document.createElement('noscript'); // placeholder with no behavior } }, [ elRef, config ]); } +export function useStaticTooltipWithKeyboardShortcut(elRef: RefObject, title: string, actionName: KeyboardActionNames | undefined, opts?: Omit, "title">) { + const [ keyboardShortcut, setKeyboardShortcut ] = useState(); + useStaticTooltip(elRef, { + title: keyboardShortcut?.length ? `${title} (${keyboardShortcut?.join(",")})` : title, + ...opts + }); + + useEffect(() => { + if (actionName) { + keyboard_actions.getAction(actionName).then(action => setKeyboardShortcut(action?.effectiveShortcuts)); + } + }, [actionName]); +} + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type export function useLegacyImperativeHandlers(handlers: Record) { const parentComponent = useContext(ParentComponent); @@ -532,4 +582,122 @@ export function useSyncedRef(externalRef?: RefObject, initialValue: T | nu }, [ ref, externalRef ]); return ref; -} \ No newline at end of file +} + +export function useImperativeSearchHighlighlighting(highlightedTokens: string[] | null | undefined) { + const mark = useRef(); + const highlightRegex = useMemo(() => { + if (!highlightedTokens?.length) return null; + const regex = highlightedTokens.map((token) => escapeRegExp(token)).join("|"); + return new RegExp(regex, "gi") + }, [ highlightedTokens ]); + + return (el: HTMLElement | null | undefined) => { + if (!el || !highlightRegex) return; + + if (!mark.current) { + mark.current = new Mark(el); + } + + mark.current.unmark(); + mark.current.markRegExp(highlightRegex, { + element: "span", + className: "ck-find-result" + }); + }; +} + +export function useNoteTreeDrag(containerRef: MutableRef, { dragEnabled, dragNotEnabledMessage, callback }: { + dragEnabled: boolean, + dragNotEnabledMessage: Omit; + callback: (data: DragData[], e: DragEvent) => void +}) { + useEffect(() => { + const container = containerRef.current; + if (!container) return; + + function onDragEnter(e: DragEvent) { + if (!dragEnabled) { + toast.showPersistent({ + ...dragNotEnabledMessage, + id: "drag-not-enabled", + closeAfter: 5000 + }); + } + } + + function onDragOver(e: DragEvent) { + e.preventDefault(); + } + + function onDrop(e: DragEvent) { + toast.closePersistent("drag-not-enabled"); + if (!dragEnabled) { + return; + } + + const data = e.dataTransfer?.getData('text'); + if (!data) { + return; + } + + const parsedData = JSON.parse(data) as DragData[]; + if (!parsedData.length) { + return; + } + + callback(parsedData, e); + } + + function onDragLeave() { + toast.closePersistent("drag-not-enabled"); + } + + container.addEventListener("dragenter", onDragEnter); + container.addEventListener("dragover", onDragOver); + container.addEventListener("drop", onDrop); + container.addEventListener("dragleave", onDragLeave) + + return () => { + container.removeEventListener("dragenter", onDragEnter); + container.removeEventListener("dragover", onDragOver); + container.removeEventListener("drop", onDrop); + container.removeEventListener("dragleave", onDragLeave); + }; + }, [ containerRef, callback ]); +} + +export function useTouchBar( + factory: (context: CommandListenerData<"buildTouchBar"> & { parentComponent: Component | null }) => void, + inputs: Inputs +) { + const parentComponent = useContext(ParentComponent); + + useLegacyImperativeHandlers({ + buildTouchBarCommand(context: CommandListenerData<"buildTouchBar">) { + return factory({ + ...context, + parentComponent + }); + } + }); + + useEffect(() => { + parentComponent?.triggerCommand("refreshTouchBar"); + }, inputs); +} + +export function useResizeObserver(ref: RefObject, callback: () => void) { + const resizeObserver = useRef(null); + useEffect(() => { + resizeObserver.current?.disconnect(); + const observer = new ResizeObserver(callback); + resizeObserver.current = observer; + + if (ref.current) { + observer.observe(ref.current); + } + + return () => observer.disconnect(); + }, [ callback, ref ]); +} diff --git a/apps/client/src/widgets/react/react_utils.tsx b/apps/client/src/widgets/react/react_utils.tsx index 40bb1b9cb..d752662f5 100644 --- a/apps/client/src/widgets/react/react_utils.tsx +++ b/apps/client/src/widgets/react/react_utils.tsx @@ -24,11 +24,11 @@ export function refToJQuerySelector(ref: RefObject | n * @param el the JSX element to render. * @returns the rendered wrapped DOM element. */ -export function renderReactWidget(parentComponent: Component, el: JSX.Element) { +export function renderReactWidget(parentComponent: Component | null, el: JSX.Element) { return renderReactWidgetAtElement(parentComponent, el, new DocumentFragment()).children(); } -export function renderReactWidgetAtElement(parentComponent: Component, el: JSX.Element, container: Element | DocumentFragment) { +export function renderReactWidgetAtElement(parentComponent: Component | null, el: JSX.Element, container: Element | DocumentFragment) { render(( {el} @@ -41,7 +41,9 @@ export function disposeReactWidget(container: Element) { render(null, container); } -export function joinElements(components: ComponentChild[], separator = ", ") { +export function joinElements(components: ComponentChild[] | undefined, separator = ", ") { + if (!components) return <>; + const joinedComponents: ComponentChild[] = []; for (let i=0; i{joinedComponents}; } diff --git a/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx b/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx index d5e3332c1..11a843233 100644 --- a/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx +++ b/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx @@ -5,7 +5,7 @@ import { FormDropdownDivider, FormListBadge, FormListItem } from "../react/FormL import { getAvailableLocales, t } from "../../services/i18n"; import { useNoteLabel, useNoteLabelBoolean, useNoteProperty, useTriliumEvent, useTriliumOption } from "../react/hooks"; import mime_types from "../../services/mime_types"; -import { Locale, NoteType, ToggleInParentResponse } from "@triliumnext/commons"; +import { Locale, LOCALES, NoteType, ToggleInParentResponse } from "@triliumnext/commons"; import server from "../../services/server"; import dialog from "../../services/dialog"; import FormToggle from "../react/FormToggle"; @@ -20,10 +20,11 @@ import { TabContext } from "./ribbon-interface"; import Modal from "../react/Modal"; import { CodeMimeTypesList } from "../type_widgets/options/code_notes"; import { ContentLanguagesList } from "../type_widgets/options/i18n"; +import { LocaleSelector } from "../type_widgets/options/components/LocaleSelector"; export default function BasicPropertiesTab({ note }: TabContext) { return ( -

    +
    @@ -43,7 +44,7 @@ function NoteTypeWidget({ note }: { note?: FNote | null }) { return mime_types.getMimeTypes().filter(mimeType => mimeType.enabled) }, [ codeNotesMimeTypes ]); const notSelectableNoteTypes = useMemo(() => NOTE_TYPES.filter((nt) => nt.reserved || nt.static).map((nt) => nt.type), []); - + const currentNoteType = useNoteProperty(note, "type") ?? undefined; const currentNoteMime = useNoteProperty(note, "mime"); const [ modalShown, setModalShown ] = useState(false); @@ -95,7 +96,7 @@ function NoteTypeWidget({ note }: { note?: FNote | null }) { checked={checked} badges={badges} onClick={() => changeNoteType(type, mime)} - >{title} + >{title} ); } else { return ( @@ -103,7 +104,7 @@ function NoteTypeWidget({ note }: { note?: FNote | null }) { {title} @@ -131,7 +132,7 @@ function NoteTypeWidget({ note }: { note?: FNote | null }) {
    - ) + ) } function ProtectedNoteSwitch({ note }: { note?: FNote | null }) { @@ -151,7 +152,7 @@ function ProtectedNoteSwitch({ note }: { note?: FNote | null }) { function EditabilitySelect({ note }: { note?: FNote | null }) { const [ readOnly, setReadOnly ] = useNoteLabelBoolean(note, "readOnly"); - const [ autoReadOnlyDisabled, setAutoReadOnlyDisabled ] = useNoteLabelBoolean(note, "autoReadOnlyDisabled"); + const [ autoReadOnlyDisabled, setAutoReadOnlyDisabled ] = useNoteLabelBoolean(note, "autoReadOnlyDisabled"); const options = useMemo(() => ([ { @@ -208,7 +209,7 @@ function BookmarkSwitch({ note }: { note?: FNote | null }) { { if (!note) return; const resp = await server.put(`notes/${note.noteId}/toggle-in-parent/_lbBookmarks/${shouldBookmark}`); @@ -260,11 +261,11 @@ function SharedSwitch({ note }: { note?: FNote | null }) { } else { if (note?.getParentBranches().length === 1 && !(await dialog.confirm(t("shared_switch.shared-branch")))) { return; - } + } const shareBranch = note?.getParentBranches().find((b) => b.parentNoteId === "_share"); if (!shareBranch?.branchId) return; - await server.remove(`branches/${shareBranch.branchId}?taskId=no-progress-reporting`); + await server.remove(`branches/${shareBranch.branchId}?taskId=no-progress-reporting`); } sync.syncNow(true); @@ -290,70 +291,33 @@ function NoteLanguageSwitch({ note }: { note?: FNote | null }) { id: "", name: t("note_language.not_set") }; - const [ currentNoteLanguage, setCurrentNoteLanguage ] = useNoteLabel(note, "language"); const [ modalShown, setModalShown ] = useState(false); - const locales = useMemo(() => { const enabledLanguages = JSON.parse(languages ?? "[]") as string[]; const filteredLanguages = getAvailableLocales().filter((l) => typeof l !== "object" || enabledLanguages.includes(l.id)); - const leftToRightLanguages = filteredLanguages.filter((l) => !l.rtl); - const rightToLeftLanguages = filteredLanguages.filter((l) => l.rtl); - - let locales: ("---" | Locale)[] = [ - DEFAULT_LOCALE - ]; - - if (leftToRightLanguages.length > 0) { - locales = [ - ...locales, - "---", - ...leftToRightLanguages - ]; - } - - if (rightToLeftLanguages.length > 0) { - locales = [ - ...locales, - "---", - ...rightToLeftLanguages - ]; - } - - // This will separate the list of languages from the "Configure languages" button. - // If there is at least one language. - locales.push("---"); - return locales; + return filteredLanguages; }, [ languages ]); - const currentLocale = useMemo(() => { - return locales.find(locale => typeof locale === "object" && locale.id === currentNoteLanguage) as Locale | undefined; - }, [ currentNoteLanguage ]); - - return ( + return (
    {t("basic_properties.language")}:   - - {locales.map(locale => { - if (typeof locale === "object") { - const checked = locale.id === (currentNoteLanguage ?? ""); - return setCurrentNoteLanguage(locale.id)} - >{locale.name} - } else { - return - } - })} + setModalShown(true)} + icon="bx bx-cog" + >{t("note_language.configure-languages")} + )} + > - setModalShown(true)} - >{t("note_language.configure-languages")} - + - +
    - ) + ); } function findTypeTitle(type?: NoteType, mime?: string | null) { @@ -378,4 +342,4 @@ function findTypeTitle(type?: NoteType, mime?: string | null) { return noteType ? noteType.title : type; } -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/ribbon/CollectionPropertiesTab.tsx b/apps/client/src/widgets/ribbon/CollectionPropertiesTab.tsx index 760194bf3..9d8113b3c 100644 --- a/apps/client/src/widgets/ribbon/CollectionPropertiesTab.tsx +++ b/apps/client/src/widgets/ribbon/CollectionPropertiesTab.tsx @@ -1,6 +1,5 @@ import { useContext, useMemo } from "preact/hooks"; import { t } from "../../services/i18n"; -import { ViewTypeOptions } from "../../services/note_list_renderer"; import FormSelect, { FormSelectWithGroups } from "../react/FormSelect"; import { TabContext } from "./ribbon-interface"; import { mapToKeyValueArray } from "../../services/utils"; @@ -12,6 +11,7 @@ import FNote from "../../entities/fnote"; import FormCheckbox from "../react/FormCheckbox"; import FormTextBox from "../react/FormTextBox"; import { ComponentChildren } from "preact"; +import { ViewTypeOptions } from "../collections/interface"; const VIEW_TYPE_MAPPINGS: Record = { grid: t("book_properties.grid"), @@ -19,12 +19,14 @@ const VIEW_TYPE_MAPPINGS: Record = { calendar: t("book_properties.calendar"), table: t("book_properties.table"), geoMap: t("book_properties.geo-map"), - board: t("book_properties.board") + board: t("book_properties.board"), + presentation: t("book_properties.presentation") }; export default function CollectionPropertiesTab({ note }: TabContext) { const [ viewType, setViewType ] = useNoteLabel(note, "viewType"); - const viewTypeWithDefault = viewType ?? "grid"; + const defaultViewType = (note?.type === "search" ? "list" : "grid"); + const viewTypeWithDefault = (viewType ?? defaultViewType) as ViewTypeOptions; const properties = bookPropertiesConfig[viewTypeWithDefault].properties; return ( @@ -32,7 +34,7 @@ export default function CollectionPropertiesTab({ note }: TabContext) { {note && ( <> - + )}
    @@ -54,15 +56,25 @@ function CollectionTypeSwitcher({ viewType, setViewType }: { viewType: string, s ) } -function BookProperties({ note, properties }: { note: FNote, properties: BookProperty[] }) { +function BookProperties({ viewType, note, properties }: { viewType: ViewTypeOptions, note: FNote, properties: BookProperty[] }) { return ( -
    + <> {properties.map(property => (
    {mapPropertyView({ note, property })}
    ))} -
    + + {viewType !== "list" && viewType !== "grid" && ( + + )} + ) } @@ -108,7 +120,9 @@ function CheckboxPropertyView({ note, property }: { note: FNote, property: Check } function NumberPropertyView({ note, property }: { note: FNote, property: NumberProperty }) { + //@ts-expect-error Interop with text box which takes in string values even for numbers. const [ value, setValue ] = useNoteLabel(note, property.bindToLabel); + const disabled = property.disabled?.(note); return ( @@ -117,6 +131,7 @@ function NumberPropertyView({ note, property }: { note: FNote, property: NumberP currentValue={value ?? ""} onChange={setValue} style={{ width: (property.width ?? 100) + "px" }} min={property.min ?? 0} + disabled={disabled} /> ) @@ -130,7 +145,7 @@ function ComboBoxPropertyView({ note, property }: { note: FNote, property: Combo ) @@ -146,4 +161,4 @@ function LabelledEntry({ label, children }: { label: string, children: Component ) -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/ribbon/FilePropertiesTab.tsx b/apps/client/src/widgets/ribbon/FilePropertiesTab.tsx index c65b9ab3e..4b42699d3 100644 --- a/apps/client/src/widgets/ribbon/FilePropertiesTab.tsx +++ b/apps/client/src/widgets/ribbon/FilePropertiesTab.tsx @@ -12,7 +12,7 @@ import FNote from "../../entities/fnote"; export default function FilePropertiesTab({ note }: { note?: FNote | null }) { const [ originalFileName ] = useNoteLabel(note, "originalFileName"); const canAccessProtectedNote = !note?.isProtected || protected_session_holder.isProtectedSessionAvailable(); - const [ blob ] = useNoteBlob(note); + const blob = useNoteBlob(note); return (
    @@ -52,7 +52,7 @@ export default function FilePropertiesTab({ note }: { note?: FNote | null }) { { if (!fileToUpload) { return; @@ -74,4 +74,4 @@ export default function FilePropertiesTab({ note }: { note?: FNote | null }) { )}
    ); -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/ribbon/FormattingToolbar.tsx b/apps/client/src/widgets/ribbon/FormattingToolbar.tsx index 3282ce5af..8828b15ee 100644 --- a/apps/client/src/widgets/ribbon/FormattingToolbar.tsx +++ b/apps/client/src/widgets/ribbon/FormattingToolbar.tsx @@ -1,4 +1,5 @@ -import { useNoteContext, useTriliumOption } from "../react/hooks"; +import { useTriliumOption } from "../react/hooks"; +import { TabContext } from "./ribbon-interface"; /** * Handles the editing toolbar when the CKEditor is in decoupled mode. @@ -6,19 +7,13 @@ import { useNoteContext, useTriliumOption } from "../react/hooks"; * This toolbar is only enabled if the user has selected the classic CKEditor. * * The ribbon item is active by default for text notes, as long as they are not in read-only mode. - * + * * ! The toolbar is not only used in the ribbon, but also in the quick edit feature. */ -export default function FormattingToolbar({ hidden }: { hidden?: boolean }) { +export default function FormattingToolbar({ hidden }: TabContext) { const [ textNoteEditorType ] = useTriliumOption("textNoteEditorType"); return (textNoteEditorType === "ckeditor-classic" &&
    ) }; - -export function PopupEditorFormattingToolbar() { - // TODO: Integrate this directly once we migrate away from class components. - const { note } = useNoteContext(); - return
    ) -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/ribbon/NotePropertiesTab.tsx b/apps/client/src/widgets/ribbon/NotePropertiesTab.tsx index 8cc0c2b85..9dc1574c7 100644 --- a/apps/client/src/widgets/ribbon/NotePropertiesTab.tsx +++ b/apps/client/src/widgets/ribbon/NotePropertiesTab.tsx @@ -17,4 +17,4 @@ export default function NotePropertiesTab({ note }: TabContext) { )}
    ) -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/ribbon/Ribbon.tsx b/apps/client/src/widgets/ribbon/Ribbon.tsx index 53813b1f4..1c5b8a7bb 100644 --- a/apps/client/src/widgets/ribbon/Ribbon.tsx +++ b/apps/client/src/widgets/ribbon/Ribbon.tsx @@ -1,185 +1,41 @@ import { useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks"; -import { t } from "../../services/i18n"; -import { useNoteContext, useNoteProperty, useStaticTooltip, useTooltip, useTriliumEvent, useTriliumEvents } from "../react/hooks"; +import { useNoteContext, useNoteProperty, useStaticTooltipWithKeyboardShortcut, useTriliumEvents } from "../react/hooks"; import "./style.css"; -import { VNode } from "preact"; -import BasicPropertiesTab from "./BasicPropertiesTab"; -import FormattingToolbar from "./FormattingToolbar"; + import { numberObjectsInPlace } from "../../services/utils"; -import { TabContext } from "./ribbon-interface"; -import options from "../../services/options"; import { EventNames } from "../../components/app_context"; -import FNote from "../../entities/fnote"; -import ScriptTab from "./ScriptTab"; -import EditedNotesTab from "./EditedNotesTab"; -import NotePropertiesTab from "./NotePropertiesTab"; -import NoteInfoTab from "./NoteInfoTab"; -import SimilarNotesTab from "./SimilarNotesTab"; -import FilePropertiesTab from "./FilePropertiesTab"; -import ImagePropertiesTab from "./ImagePropertiesTab"; -import NotePathsTab from "./NotePathsTab"; -import NoteMapTab from "./NoteMapTab"; -import OwnedAttributesTab from "./OwnedAttributesTab"; -import InheritedAttributesTab from "./InheritedAttributesTab"; -import CollectionPropertiesTab from "./CollectionPropertiesTab"; -import SearchDefinitionTab from "./SearchDefinitionTab"; import NoteActions from "./NoteActions"; -import keyboard_actions from "../../services/keyboard_actions"; import { KeyboardActionNames } from "@triliumnext/commons"; +import { RIBBON_TAB_DEFINITIONS } from "./RibbonDefinition"; +import { TabConfiguration, TitleContext } from "./ribbon-interface"; -interface TitleContext { - note: FNote | null | undefined; -} - -interface TabConfiguration { - title: string | ((context: TitleContext) => string); - icon: string; - content: (context: TabContext) => VNode | false; - show: boolean | ((context: TitleContext) => boolean | null | undefined); - toggleCommand?: KeyboardActionNames; - activate?: boolean | ((context: TitleContext) => boolean); - /** - * By default the tab content will not be rendered unless the tab is active (i.e. selected by the user). Setting to `true` will ensure that the tab is rendered even when inactive, for cases where the tab needs to be accessible at all times (e.g. for the detached editor toolbar) or if event handling is needed. - */ - stayInDom?: boolean; -} - -const TAB_CONFIGURATION = numberObjectsInPlace([ - { - title: t("classic_editor_toolbar.title"), - icon: "bx bx-text", - show: ({ note }) => note?.type === "text" && options.get("textNoteEditorType") === "ckeditor-classic", - toggleCommand: "toggleRibbonTabClassicEditor", - content: FormattingToolbar, - stayInDom: true - }, - { - title: ({ note }) => note?.isTriliumSqlite() ? t("script_executor.query") : t("script_executor.script"), - icon: "bx bx-play", - content: ScriptTab, - activate: true, - show: ({ note }) => note && - (note.isTriliumScript() || note.isTriliumSqlite()) && - (note.hasLabel("executeDescription") || note.hasLabel("executeButton")) - }, - { - title: t("search_definition.search_parameters"), - icon: "bx bx-search", - content: SearchDefinitionTab, - activate: true, - show: ({ note }) => note?.type === "search" - }, - { - title: t("edited_notes.title"), - icon: "bx bx-calendar-edit", - content: EditedNotesTab, - show: ({ note }) => note?.hasOwnedLabel("dateNote"), - activate: ({ note }) => (note?.getPromotedDefinitionAttributes().length === 0 || !options.is("promotedAttributesOpenInRibbon")) && options.is("editedNotesOpenInRibbon") - }, - { - title: t("book_properties.book_properties"), - icon: "bx bx-book", - content: CollectionPropertiesTab, - show: ({ note }) => note?.type === "book", - toggleCommand: "toggleRibbonTabBookProperties" - }, - { - title: t("note_properties.info"), - icon: "bx bx-info-square", - content: NotePropertiesTab, - show: ({ note }) => !!note?.getLabelValue("pageUrl"), - activate: true - }, - { - title: t("file_properties.title"), - icon: "bx bx-file", - content: FilePropertiesTab, - show: ({ note }) => note?.type === "file", - toggleCommand: "toggleRibbonTabFileProperties", - activate: true - }, - { - title: t("image_properties.title"), - icon: "bx bx-image", - content: ImagePropertiesTab, - show: ({ note }) => note?.type === "image", - toggleCommand: "toggleRibbonTabImageProperties", - activate: true, - }, - { - // BasicProperties - title: t("basic_properties.basic_properties"), - icon: "bx bx-slider", - content: BasicPropertiesTab, - show: ({note}) => !note?.isLaunchBarConfig(), - toggleCommand: "toggleRibbonTabBasicProperties" - }, - { - title: t("owned_attribute_list.owned_attributes"), - icon: "bx bx-list-check", - content: OwnedAttributesTab, - show: ({note}) => !note?.isLaunchBarConfig(), - toggleCommand: "toggleRibbonTabOwnedAttributes", - stayInDom: true - }, - { - title: t("inherited_attribute_list.title"), - icon: "bx bx-list-plus", - content: InheritedAttributesTab, - show: ({note}) => !note?.isLaunchBarConfig(), - toggleCommand: "toggleRibbonTabInheritedAttributes" - }, - { - title: t("note_paths.title"), - icon: "bx bx-collection", - content: NotePathsTab, - show: true, - toggleCommand: "toggleRibbonTabNotePaths" - }, - { - title: t("note_map.title"), - icon: "bx bxs-network-chart", - content: NoteMapTab, - show: true, - toggleCommand: "toggleRibbonTabNoteMap" - }, - { - title: t("similar_notes.title"), - icon: "bx bx-bar-chart", - show: ({ note }) => note?.type !== "search" && !note?.isLabelTruthy("similarNotesWidgetDisabled"), - content: SimilarNotesTab, - toggleCommand: "toggleRibbonTabSimilarNotes" - }, - { - title: t("note_info_widget.title"), - icon: "bx bx-info-circle", - show: ({ note }) => !!note, - content: NoteInfoTab, - toggleCommand: "toggleRibbonTabNoteInfo" - } -]); +const TAB_CONFIGURATION = numberObjectsInPlace(RIBBON_TAB_DEFINITIONS); export default function Ribbon() { const { note, ntxId, hoistedNoteId, notePath, noteContext, componentId } = useNoteContext(); const noteType = useNoteProperty(note, "type"); const titleContext: TitleContext = { note }; const [ activeTabIndex, setActiveTabIndex ] = useState(); - const filteredTabs = useMemo( - () => TAB_CONFIGURATION.filter(tab => typeof tab.show === "boolean" ? tab.show : tab.show?.(titleContext)), + const computedTabs = useMemo( + () => TAB_CONFIGURATION.map(tab => { + const shouldShow = typeof tab.show === "boolean" ? tab.show : tab.show?.(titleContext); + return { + ...tab, + shouldShow + } + }), [ titleContext, note, noteType ]); // Automatically activate the first ribbon tab that needs to be activated whenever a note changes. useEffect(() => { - const tabToActivate = filteredTabs.find(tab => typeof tab.activate === "boolean" ? tab.activate : tab.activate?.(titleContext)); - if (tabToActivate) { - setActiveTabIndex(tabToActivate.index); - } + const tabToActivate = computedTabs.find(tab => tab.shouldShow && (typeof tab.activate === "boolean" ? tab.activate : tab.activate?.(titleContext))); + setActiveTabIndex(tabToActivate?.index); }, [ note?.noteId ]); // Register keyboard shortcuts. const eventsToListenTo = useMemo(() => TAB_CONFIGURATION.filter(config => config.toggleCommand).map(config => config.toggleCommand) as EventNames[], []); useTriliumEvents(eventsToListenTo, useCallback((e, toggleCommand) => { - const correspondingTab = filteredTabs.find(tab => tab.toggleCommand === toggleCommand); + const correspondingTab = computedTabs.find(tab => tab.toggleCommand === toggleCommand); if (correspondingTab) { if (activeTabIndex !== correspondingTab.index) { setActiveTabIndex(correspondingTab.index); @@ -187,7 +43,7 @@ export default function Ribbon() { setActiveTabIndex(undefined); } } - }, [ filteredTabs, activeTabIndex ])); + }, [ computedTabs, activeTabIndex ])); return (
    @@ -195,8 +51,8 @@ export default function Ribbon() { <>
    - {filteredTabs.map(({ title, icon, index, toggleCommand }) => ( - ( + shouldShow && }
    - -
    - {filteredTabs.map(tab => { + +
    + {computedTabs.map(tab => { const isActive = tab.index === activeTabIndex; if (!isActive && !tab.stayInDom) { return; @@ -252,16 +108,7 @@ export default function Ribbon() { function RibbonTab({ icon, title, active, onClick, toggleCommand }: { icon: string; title: string; active: boolean, onClick: () => void, toggleCommand?: KeyboardActionNames }) { const iconRef = useRef(null); - const [ keyboardShortcut, setKeyboardShortcut ] = useState(); - useStaticTooltip(iconRef, { - title: keyboardShortcut?.length ? `${title} (${keyboardShortcut?.join(",")})` : title - }); - - useEffect(() => { - if (toggleCommand) { - keyboard_actions.getAction(toggleCommand).then(action => setKeyboardShortcut(action?.effectiveShortcuts)); - } - }, [toggleCommand]); + useStaticTooltipWithKeyboardShortcut(iconRef, title, toggleCommand); return ( <> diff --git a/apps/client/src/widgets/ribbon/RibbonDefinition.ts b/apps/client/src/widgets/ribbon/RibbonDefinition.ts new file mode 100644 index 000000000..8f37053dc --- /dev/null +++ b/apps/client/src/widgets/ribbon/RibbonDefinition.ts @@ -0,0 +1,134 @@ +import ScriptTab from "./ScriptTab"; +import EditedNotesTab from "./EditedNotesTab"; +import NotePropertiesTab from "./NotePropertiesTab"; +import NoteInfoTab from "./NoteInfoTab"; +import SimilarNotesTab from "./SimilarNotesTab"; +import FilePropertiesTab from "./FilePropertiesTab"; +import ImagePropertiesTab from "./ImagePropertiesTab"; +import NotePathsTab from "./NotePathsTab"; +import NoteMapTab from "./NoteMapTab"; +import OwnedAttributesTab from "./OwnedAttributesTab"; +import InheritedAttributesTab from "./InheritedAttributesTab"; +import CollectionPropertiesTab from "./CollectionPropertiesTab"; +import SearchDefinitionTab from "./SearchDefinitionTab"; +import BasicPropertiesTab from "./BasicPropertiesTab"; +import FormattingToolbar from "./FormattingToolbar"; +import options from "../../services/options"; +import { t } from "../../services/i18n"; +import { TabConfiguration } from "./ribbon-interface"; + +export const RIBBON_TAB_DEFINITIONS: TabConfiguration[] = [ + { + title: t("classic_editor_toolbar.title"), + icon: "bx bx-text", + show: ({ note }) => note?.type === "text" && options.get("textNoteEditorType") === "ckeditor-classic", + toggleCommand: "toggleRibbonTabClassicEditor", + content: FormattingToolbar, + activate: true, + stayInDom: true + }, + { + title: ({ note }) => note?.isTriliumSqlite() ? t("script_executor.query") : t("script_executor.script"), + icon: "bx bx-play", + content: ScriptTab, + activate: true, + show: ({ note }) => note && + (note.isTriliumScript() || note.isTriliumSqlite()) && + (note.hasLabel("executeDescription") || note.hasLabel("executeButton")) + }, + { + title: t("search_definition.search_parameters"), + icon: "bx bx-search", + content: SearchDefinitionTab, + activate: true, + show: ({ note }) => note?.type === "search" + }, + { + title: t("edited_notes.title"), + icon: "bx bx-calendar-edit", + content: EditedNotesTab, + show: ({ note }) => note?.hasOwnedLabel("dateNote"), + activate: ({ note }) => (note?.getPromotedDefinitionAttributes().length === 0 || !options.is("promotedAttributesOpenInRibbon")) && options.is("editedNotesOpenInRibbon") + }, + { + title: t("book_properties.book_properties"), + icon: "bx bx-book", + content: CollectionPropertiesTab, + show: ({ note }) => note?.type === "book" || note?.type === "search", + toggleCommand: "toggleRibbonTabBookProperties" + }, + { + title: t("note_properties.info"), + icon: "bx bx-info-square", + content: NotePropertiesTab, + show: ({ note }) => !!note?.getLabelValue("pageUrl"), + activate: true + }, + { + title: t("file_properties.title"), + icon: "bx bx-file", + content: FilePropertiesTab, + show: ({ note }) => note?.type === "file", + toggleCommand: "toggleRibbonTabFileProperties", + activate: ({ note }) => note?.mime !== "application/pdf" + }, + { + title: t("image_properties.title"), + icon: "bx bx-image", + content: ImagePropertiesTab, + show: ({ note }) => note?.type === "image", + toggleCommand: "toggleRibbonTabImageProperties", + activate: true, + }, + { + // BasicProperties + title: t("basic_properties.basic_properties"), + icon: "bx bx-slider", + content: BasicPropertiesTab, + show: ({note}) => !note?.isLaunchBarConfig(), + toggleCommand: "toggleRibbonTabBasicProperties" + }, + { + title: t("owned_attribute_list.owned_attributes"), + icon: "bx bx-list-check", + content: OwnedAttributesTab, + show: ({note}) => !note?.isLaunchBarConfig(), + toggleCommand: "toggleRibbonTabOwnedAttributes", + stayInDom: true + }, + { + title: t("inherited_attribute_list.title"), + icon: "bx bx-list-plus", + content: InheritedAttributesTab, + show: ({note}) => !note?.isLaunchBarConfig(), + toggleCommand: "toggleRibbonTabInheritedAttributes" + }, + { + title: t("note_paths.title"), + icon: "bx bx-collection", + content: NotePathsTab, + show: true, + toggleCommand: "toggleRibbonTabNotePaths" + }, + { + title: t("note_map.title"), + icon: "bx bxs-network-chart", + content: NoteMapTab, + show: true, + toggleCommand: "toggleRibbonTabNoteMap" + }, + { + title: t("similar_notes.title"), + icon: "bx bx-bar-chart", + show: ({ note }) => note?.type !== "search" && !note?.isLabelTruthy("similarNotesWidgetDisabled"), + content: SimilarNotesTab, + toggleCommand: "toggleRibbonTabSimilarNotes" + }, + { + title: t("note_info_widget.title"), + icon: "bx bx-info-circle", + show: ({ note }) => !!note, + content: NoteInfoTab, + toggleCommand: "toggleRibbonTabNoteInfo" + } +]; diff --git a/apps/client/src/widgets/ribbon/ScriptTab.tsx b/apps/client/src/widgets/ribbon/ScriptTab.tsx index 81ac3a3ef..dbdd49a0b 100644 --- a/apps/client/src/widgets/ribbon/ScriptTab.tsx +++ b/apps/client/src/widgets/ribbon/ScriptTab.tsx @@ -25,4 +25,4 @@ export default function ScriptTab({ note }: TabContext) {
    ); -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionOptions.tsx b/apps/client/src/widgets/ribbon/SearchDefinitionOptions.tsx index 6f98c63e1..33f9d0a36 100644 --- a/apps/client/src/widgets/ribbon/SearchDefinitionOptions.tsx +++ b/apps/client/src/widgets/ribbon/SearchDefinitionOptions.tsx @@ -57,7 +57,7 @@ export const SEARCH_OPTIONS: SearchOption[] = [ defaultValue: "root", icon: "bx bx-filter-alt", label: t("search_definition.ancestor"), - component: AncestorOption, + component: AncestorOption, additionalAttributesToDelete: [ { type: "label", name: "ancestorDepth" } ] }, { @@ -115,7 +115,7 @@ function SearchOption({ note, title, titleIcon, children, help, attributeName, a additionalAttributesToDelete?: { type: "label" | "relation", name: string }[] }) { return ( - + {titleIcon && <>{" "}} {title} @@ -173,7 +173,7 @@ function SearchStringOption({ note, refreshResults, error, ...restProps }: Searc } }, [ error ]); - return {t("search_string.search_syntax")} - {t("search_string.also_see")} {t("search_string.complete_help")} @@ -243,7 +243,7 @@ function AncestorOption({ note, ...restProps}: SearchOptionProps) { const options: { value: string | undefined; label: string }[] = [ { value: "", label: t("ancestor.depth_doesnt_matter") }, { value: "eq1", label: `${t("ancestor.depth_eq", { count: 1 })} (${t("ancestor.direct_children")})` } - ]; + ]; for (let i=2; i<=9; i++) options.push({ value: "eq" + i, label: t("ancestor.depth_eq", { count: i }) }); for (let i=0; i<=9; i++) options.push({ value: "gt" + i, label: t("ancestor.depth_gt", { count: i }) }); @@ -253,7 +253,7 @@ function AncestorOption({ note, ...restProps}: SearchOptionProps) { }, []); return
    @@ -263,7 +263,7 @@ function AncestorOption({ note, ...restProps}: SearchOptionProps) { placeholder={t("ancestor.placeholder")} /> -
    {t("ancestor.depth_label")}:
    +
    {t("ancestor.depth_label")}:
    -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionTab.css b/apps/client/src/widgets/ribbon/SearchDefinitionTab.css new file mode 100644 index 000000000..967a9a2f7 --- /dev/null +++ b/apps/client/src/widgets/ribbon/SearchDefinitionTab.css @@ -0,0 +1,174 @@ +.search-setting-table { + margin-top: 0; + margin-bottom: 7px; + width: 100%; + border-collapse: separate; + border-spacing: 10px; +} + +.search-setting-table div { + white-space: nowrap; +} + +.search-setting-table .title-column { + /* minimal width so that table remains static sized and most space remains for middle column with settings */ + width: 50px; + white-space: nowrap; +} + +.search-setting-table .button-column { + /* minimal width so that table remains static sized and most space remains for middle column with settings */ + width: 50px; + white-space: nowrap; + text-align: end; + vertical-align: middle; +} + +.search-setting-table .button-column .dropdown { + display: inline-block !important; +} + +.search-setting-table .button-column .dropdown-menu { + white-space: normal; +} + +.search-setting-table .button-column > * { + vertical-align: middle; +} + +.attribute-list hr { + height: 1px; + border-color: var(--main-border-color); + position: relative; + top: 4px; + margin-top: 5px; + margin-bottom: 0; +} + +.search-definition-widget input:invalid { + border: 3px solid red; +} + +.add-search-option button { + margin: 3px; +} + +.dropdown-header { + background-color: var(--accented-background-color); +} + +.search-actions-container { + display: flex; + justify-content: space-evenly; +} + +body.mobile .search-definition-widget { + contain: none; +} + +@media (max-width: 720px) { + + .search-setting-table { + display: block; + font-size: 0.9em; + } + + .search-setting-table tr { + padding: 0.5em 0; + border-bottom: 1px solid var(--main-border-color); + } + + .search-setting-table tr, + .search-setting-table td { + display: block; + } + + .search-setting-table tbody { + display: block; + padding: 0 1em; + } + + .search-setting-table tbody:first-of-type { + display: block; + overflow: auto; + } + + .search-setting-table .add-search-option { + display: flex; + } + + .search-setting-table .add-search-option button { + font-size: 0.75em; + } + + .search-options tr, + .action-options tr { + display: flex; + align-items: center; + } + + .action-options tr > td > div { + flex-wrap: wrap; + gap: 0.5em 0; + } + + .action-options input { + max-width: 75vw; + } + + .search-setting-table .title-column { + width: unset; + margin-right: 0.5em; + min-width: 30%; + flex-shrink: 0; + } + + .search-setting-table .button-column { + flex-grow: 1; + justify-content: end; + overflow: hidden; + flex-shrink: 0; + } + + .search-setting-table .button-column .bx-help-circle { + display: none; + } + + .search-setting-table tr.orderBy td:nth-of-type(2) { + display: flex; + flex-direction: column; + overflow: hidden; + gap: 0.5em; + } + + .search-setting-table tr.searchString td:nth-of-type(2) { + flex-grow: 1; + } + + .search-setting-table tr.searchString .button-column { + flex-grow: 0; + flex-shrink: 0; + width: 64px; + } + + .search-setting-table tr.ancestor > td > div { + flex-direction: column; + align-items: flex-start !important; + } + + .search-actions tr { + border-bottom: 0; + } + + .search-actions-container { + align-items: center; + justify-content: center !important; + } + + .search-result-widget, + .note-list.list-view, + .note-list-wrapper { + overflow: unset; + height: unset !important; + } +} \ No newline at end of file diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx index 36fef6b3d..ac7bf8d14 100644 --- a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx +++ b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx @@ -20,8 +20,9 @@ import bulk_action, { ACTION_GROUPS } from "../../services/bulk_action"; import { FormListHeader, FormListItem } from "../react/FormList"; import RenameNoteBulkAction from "../bulk_actions/note/rename_note"; import { getErrorMessage } from "../../services/utils"; +import "./SearchDefinitionTab.css"; -export default function SearchDefinitionTab({ note, ntxId }: TabContext) { +export default function SearchDefinitionTab({ note, ntxId, hidden }: TabContext) { const parentComponent = useContext(ParentComponent); const [ searchOptions, setSearchOptions ] = useState<{ availableOptions: SearchOption[], activeOptions: SearchOption[] }>(); const [ error, setError ] = useState<{ message: string }>(); @@ -33,7 +34,7 @@ export default function SearchDefinitionTab({ note, ntxId }: TabContext) { const activeOptions: SearchOption[] = []; for (const searchOption of SEARCH_OPTIONS) { - const attr = note.getAttribute(searchOption.attributeType, searchOption.attributeName); + const attr = note.getAttribute(searchOption.attributeType, searchOption.attributeName); if (attr) { activeOptions.push(searchOption); } else { @@ -75,24 +76,26 @@ export default function SearchDefinitionTab({ note, ntxId }: TabContext) { return (
    - {note && + {note && !hidden && - - - + + + - + + + + {searchOptions?.activeOptions.map(({ attributeType, attributeName, component, additionalAttributesToDelete, defaultValue }) => { const Component = component; @@ -108,10 +111,10 @@ export default function SearchDefinitionTab({ note, ntxId }: TabContext) { })} - + - @@ -36,18 +36,61 @@

    Adding a new app CSS note or modifying an existing one does not immediately apply changes. To see the changes, press Ctrl+Shift+R to refresh the page first.

    -

    Example use-case: customizing the printing stylesheet

    +

    Sample use cases

    +

    Customizing the printing stylesheet

    When printing a document or exporting as PDF, it is possible to adjust the style by creating a CSS note that uses the @media selector.

    For example, to change the font of the document from the one defined by the theme or the user to a serif one:

    @media print {
    -
     	body {
    -
             --main-font-family: serif !important;
    -
             --detail-font-family: var(--main-font-family) !important;
    -
         }
    -
    -}
    \ No newline at end of file +} +

    Per-workspace styles

    +

    When using Workspaces, + it can be helpful to create a visual distinction between notes in different + workspaces.

    +

    To do so:

    +
      +
    1. In the note with #workspace, add an inheritable attribute #cssClass(inheritable) with + a value that uniquely identifies the workspace (say my-workspace).
    2. +
    3. Anywhere in the note structure, create a CSS note with #appCss.
    4. +
    +

    Change the color of the icons in the Note Tree

    .fancytree-node.my-workspace.fancytree-custom-icon {
    +    color: #ff0000;
    +}
    +

    Change the color of the note title and the icon

    +

    To change the color of the note title and the icon (above the content):

    .note-split.my-workspace .note-icon-widget button.note-icon,
    +.note-split.my-workspace .note-title-widget input.note-title {
    +    color: #ff0000;
    +}
    +

    Add a watermark to the note content

    +
    + +
    +
      +
    1. Insert an image in any note and take the URL of the image.
    2. +
    3. Use the following CSS, adjusting the background-image and width and height to + the desired values.
    4. +
    .note-split.my-workspace .scrolling-container:after {
    +    position: fixed;
    +    content: "";
    +    background-image: url("/api/attachments/Rvm3zJNITQI1/image/logo.png");
    +    background-size: contain;
    +    background-position: center;
    +    background-repeat: no-repeat;
    +    width: 237px;
    +    height: 44px;
    +    bottom: 1em;
    +    right: 1em;
    +    opacity: 0.5;
    +    z-index: 0;
    +}
    +

    Limitations

    +

    Some parts of the application can't be styled directly via custom CSS + because they are rendered in an isolated mode (shadow DOM), more specifically:

    + \ No newline at end of file diff --git a/apps/server/src/assets/translations/ar/server.json b/apps/server/src/assets/translations/ar/server.json new file mode 100644 index 000000000..e51c4c9f9 --- /dev/null +++ b/apps/server/src/assets/translations/ar/server.json @@ -0,0 +1,353 @@ +{ + "keyboard_actions": { + "open-jump-to-note-dialog": "فتح Ł…Ų±ŲØŲ¹ Ų§Ł„Ų­ŁˆŲ§Ų± \"الانتقال الى الملاحظة\"", + "open-command-palette": "فتح Ł„ŁˆŲ­Ų© Ų§Ł„Ų§ŁˆŲ§Ł…Ų±", + "quick-search": "ŲŖŁŲ¹ŁŠŁ„ ؓريط البحث Ų§Ł„Ų³Ų±ŁŠŲ¹", + "collapse-tree": "طي Ų¬Ł…ŁŠŲ¹ الملاحظات", + "collapse-subtree": "طي Ų§Ł„ŁŲ±ŁˆŲ¹ التابعة للملاحظة Ų§Ł„Ų­Ų§Ł„ŁŠŲ©", + "sort-child-notes": "ترتيب الملاحظات Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "creating-and-moving-notes": "انؓاؔ الملاحظات ŁˆŁ†Ł‚Ł„Ł‡Ų§", + "create-note-after": "انؓاؔ ملاحظة ŲØŲ¹ŲÆ الملاحظة Ų§Ł„Ų­Ų§Ł„ŁŠŲ©", + "create-note-into": "انؓاؔ ملاحظة فرعية ŲŖŲ§ŲØŲ¹Ų© للملاحظة Ų§Ł„Ų­Ų§Ł„ŁŠŲ©", + "delete-note": "حذف ملاحظة", + "move-note-up": "نقل الملاحظة للاعلى", + "move-note-down": "نثل الملاحظة للاسفل", + "clone-notes-to": "استنساخ الملاحظات المحددة", + "move-notes-to": "نقل الملاحظات للمحددة", + "note-clipboard": "حافظة الملاحظات", + "copy-notes-to-clipboard": "نسخ الملاحظات المحددة الى الحافظة", + "paste-notes-from-clipboard": "لصق الملاحظا من الحافظة الى الملاحظة Ų§Ł„Ų­Ų§Ł„ŁŠŲ©", + "cut-notes-to-clipboard": "قص الملاحظات المحددة الى الحافظة", + "select-all-notes-in-parent": "تحديد Ų¬Ł…ŁŠŲ¹ الملاحظات من Ł…Ų³ŲŖŁˆŁ‰ الملاحظة Ų§Ł„Ų­Ų§Ł„ŁŠ", + "back-in-note-history": "الانتقال الى الملاحظة السابقة في السجل", + "forward-in-note-history": "الانتقال الى الملاحظة Ų§Ł„ŲŖŲ§Ł„ŁŠŲ© في السجل", + "scroll-to-active-note": "ŲŖŁ…Ų±ŁŠŲ± Ų“Ų¬Ų±Ų© الملاحظات الى الملاحظة النؓطة", + "search-in-subtree": "البحث عن الملاحظات في الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ© للملاحظة النؓطة", + "expand-subtree": "توسيع الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ© للملاحظة Ų§Ł„Ų­Ų§Ł„ŁŠŲ©", + "create-note-into-inbox": "انؓاؔ ملاحظة في ŲµŁ†ŲÆŁˆŁ‚ Ų§Ł„ŁˆŲ§Ų±ŲÆ (Ų§Ų°Ų§ ŁƒŲ§Ł† معرفا) او في ملاحظة Ų§Ł„ŁŠŁˆŁ…", + "move-note-up-in-hierarchy": "نقل الملاحظة للاعلى في التسلسل Ų§Ł„Ł‡Ų±Ł…ŁŠ", + "move-note-down-in-hierarchy": "نقل الملاحظة للاسفل في التسلسل Ų§Ł„Ł‡Ų±Ł…ŁŠ", + "edit-note-title": "الانتقال من Ų“Ų¬Ų±Ų© الملاحظات ؄لى ŲŖŁŲ§ŲµŁŠŁ„ الملاحظة وتحرير Ų§Ł„Ų¹Ł†ŁˆŲ§Ł†", + "edit-branch-prefix": "Ų¹Ų±Ų¶ Ł…Ų±ŲØŲ¹ حوار \"ŲŖŲ¹ŲÆŁŠŁ„ ŲØŲ§ŲÆŲ¦Ų© الفرع\"", + "add-note-above-to-the-selection": "اضافة ملاحظة ŁŁˆŁ‚ الملاحظة المحددة", + "add-note-below-to-selection": "اضافة ملاحظة اسفل الملاحظة المحددة", + "duplicate-subtree": "استنساخ الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "tabs-and-windows": "Ų§Ł„ŲŖŲØŁˆŁŠŲØŲ§ŲŖ ŁˆŲ§Ł„Ł†ŁˆŲ§ŁŲ°", + "open-new-tab": "فتح تبويب جديد", + "close-active-tab": "غلق Ų§Ł„ŲŖŲØŁˆŁŠŲØ النؓط", + "reopen-last-tab": "Ų§Ų¹Ų§ŲÆŲ© فتح Ų§Ų®Ų± تبويب مغلق", + "activate-next-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ Ų§Ł„Ł…ŁˆŲ¬ŁˆŲÆ على Ų§Ł„ŁŠŁ…ŁŠŁ†", + "activate-previous-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ Ų§Ł„Ł…ŁˆŲ¬ŁˆŲÆ على Ų§Ł„ŁŠŲ³Ų§Ų±", + "open-new-window": "فتح نافذة جديدة فارغة", + "first-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ Ų§Ł„Ų§ŁˆŁ„ في القائمة", + "second-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ Ų§Ł„Ų«Ų§Ł†ŁŠ في القائمة", + "third-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ الثالث في الثائمة", + "fourth-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ الرابع في القائمة", + "fifth-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ الخامس في القائمة", + "sixth-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ السادس في القائمة", + "seventh-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ السابع في القائمة", + "eight-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ الثامن في القائمة", + "ninth-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ التاسع في القائمة", + "last-tab": "ŲŖŁ†Ų“ŁŠŲ· Ų§Ł„ŲŖŲØŁˆŁŠŲØ Ų§Ł„Ų§Ų®ŁŠŲ± في القائمة", + "other": "أخرى", + "dialogs": "Ł…Ų±ŲØŲ¹Ų§ŲŖ Ų§Ł„Ų­ŁˆŲ§Ų±", + "ribbon-tabs": "علامات Ų§Ł„ŲŖŲØŁˆŁŠŲØ في Ų§Ł„Ų“Ų±ŁŠŲ·", + "reload-frontend-app": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ­Ł…ŁŠŁ„ Ų§Ł„ŁˆŲ§Ų¬Ł‡Ų©", + "zoom-out": "تصغير العرض", + "zoom-in": "تكبير العرض", + "note-navigation": "التنقل ŲØŁŠŁ† الملاحظات", + "show-options": "افتح صفحة \"Ų§Ł„Ų®ŁŠŲ§Ų±Ų§ŲŖ\"", + "text-note-operations": "Ų¹Ł…Ł„ŁŠŲ§ŲŖ الملاحظة Ų§Ł„Ł†ŲµŁŠŲ©", + "add-new-label": "انؓاؔ ŲŖŲ³Ł…ŁŠŲ© جديدة", + "create-new-relation": "انؓاؔ علاقة جديدة", + "toggle-basic-properties": "اظهار/اخفاؔ الخصائص Ų§Ł„Ų§Ų³Ų§Ų³ŁŠŲ©", + "toggle-file-properties": "اظهار/اخفاؔ Ų®ŲµŲ§Ų¦Ųµ الملف", + "toggle-image-properties": "اظهار/اخفاؔ Ų®ŲµŲ§Ų¦Ųµ Ų§Ł„ŲµŁˆŲ±Ų©", + "toggle-owned-attributes": "اظهار/اخفاؔ السمات Ų§Ł„Ł…Ł…Ł„ŁˆŁƒŲ©", + "toggle-inherited-attributes": "اظهار/اخفاؔ السمات Ų§Ł„Ł…ŲŖŁˆŲ§Ų±Ų«Ł‡", + "toggle-promoted-attributes": "Ų§ŲøŲ®Ų§Ų±/اخفاؔ السمات Ų§Ł„Ł…Ų±ŁˆŲ¬Ų©", + "toggle-link-map": "اظهار/اخفاؔ خريطة الرابط", + "toggle-note-info": "اظهار/اخفاؔ Ł…Ų¹Ł„ŁˆŁ…Ų§ŲŖ الملاحظة", + "toggle-note-paths": "اظها/اخفاؔ Ł…Ų³Ų§Ų±Ų§ŲŖ الملاحظة", + "toggle-similar-notes": "اظهار/اخفاؔ الملاحظات المؓابهة", + "print-active-note": "Ų·ŲØŲ§Ų¹Ų© Ų§Ł„Ł…Ł„Ų§Ų­ŲøŲ©ā€ النؓطة", + "unhoist": "الغاؔ Ų§Ł„ŲŖŲ±ŁƒŁŠŲ² من اي Ł…ŁƒŲ§Ł†", + "open-dev-tools": "فتح ادوات Ų§Ł„Ł…Ų·ŁˆŲ±", + "find-in-text": "اظهار/اخفاؔ Ł„ŁˆŲ­Ų© الفتح", + "toggle-full-screen": "اظهار/اخفاؔ وضع ملؔ الؓاؓة", + "reset-zoom-level": "Ų§Ų¹Ų§ŲÆŲ© Ų¶ŲØŲ· Ł…Ų³ŲŖŁˆŁ‰ Ų§Ł„ŲŖŁƒŲØŁŠŲ±", + "toggle-book-properties": "اظهار/اخفاؔ Ų®ŲµŲ§Ų¦Ųµ Ų§Ł„Ł…Ų¬Ł…ŁˆŲ¹Ų©", + "show-note-source": "Ų¹Ų±Ų¶ Ł…Ų±ŲØŲ¹ حوار \"Ł…ŲµŲÆŲ± الملاحظات\"", + "show-revisions": "Ų¹Ų±Ų¶ Ł…Ų±ŲØŲ¹ حوار \" Ł…Ų±Ų§Ų¬Ų¹Ų§ŲŖ الملاحظة\"", + "show-recent-changes": "Ų¹Ų±Ų¶ Ł…Ų±ŲØŲ¹ حوار \" Ų§Ł„ŲŖŲŗŁŠŲ±Ų§ŲŖ Ų§Ł„Ų§Ų®ŁŠŲ±Ų©\"", + "show-sql-console": "فتح صفحة \" وحدة ŲŖŲ­ŁƒŁ… SQL\"", + "show-backend-log": "فتح صفحة \"سجل Ų§Ł„Ų®Ł„ŁŁŠŲ©\"", + "edit-readonly-note": "ŲŖŲ¹ŲÆŁŠŁ„ ملاحظة القراؔة فقط", + "attributes-labels-and-relations": "سمات ( ŲŖŲ³Ł…ŁŠŲ§ŲŖ و علاقات)", + "render-active-note": "Ų¹Ų±Ų¶ ( Ų§Ų¹Ų§ŲÆŲ© Ų¹Ų±Ų¶) الملاحظة المؤرؓفة" + }, + "setup_sync-from-server": { + "note": "ملاحظة:", + "password": "ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "password-placeholder": "ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "back": "رجوع", + "server-host-placeholder": "https://:", + "proxy-server-placeholder": "https://:", + "finish-setup": "Ų§ŁƒŁ…Ų§Ł„ Ų§Ł„ŲŖŲ«ŲØŁŠŲŖ", + "heading": "مزامنة من الخادم", + "server-host": "Ų¹Ł†ŁˆŲ§Ł† Ų®Ų§ŲÆŁ… ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ…", + "proxy-server": "Ų®Ų§ŲÆŁ… ŁˆŁƒŁŠŁ„ (اختياري)" + }, + "weekdays": { + "monday": "Ų§Ł„Ų§Ų«Ł†ŁŠŁ†", + "tuesday": "الثلاثاؔ", + "wednesday": "الاربعاؔ", + "thursday": "Ų§Ł„Ų®Ł…ŁŠŲ³", + "friday": "الجمعة", + "saturday": "السبت", + "sunday": "الأحد" + }, + "months": { + "january": "ŁŠŁ†Ų§ŁŠŲ±", + "february": "فبراير", + "march": "Ł…Ų§Ų±Ų³", + "april": "Ų§ŲØŲ±ŁŠŁ„", + "may": "Ł…Ų§ŁŠŁˆ", + "june": "ŁŠŁˆŁ†ŁŠŁˆ", + "july": "ŁŠŁˆŁ„ŁŠŁˆ", + "august": "Ų£ŲŗŲ³Ų·Ų³", + "september": "Ų³ŲØŲŖŁ…ŲØŲ±", + "october": "أكتوبر", + "november": "Ł†ŁˆŁŁ…ŲØŲ±", + "december": "ŲÆŁŠŲ³Ł…ŲØŲ±" + }, + "special_notes": { + "search_prefix": "ŲØŲ­Ų«:" + }, + "hidden-subtree": { + "calendar-title": "ŲŖŁ‚ŁˆŁŠŁ…", + "bookmarks-title": "العلامات Ų§Ł„Ł…Ų±Ų¬Ų¹ŁŠŲ©", + "settings-title": "Ų£Ų¹ŲÆŲ§ŲÆŲ§ŲŖ", + "options-title": "خيارات", + "appearance-title": "المظهر", + "shortcuts-title": "Ų£Ų®ŲŖŲµŲ§Ų±Ų§ŲŖ", + "images-title": "صور", + "password-title": "ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "backup-title": "نسخة أحتياطية", + "sync-title": "مزامنة", + "other": "أخرى", + "advanced-title": "متقدم", + "inbox-title": "ŲµŁ†ŲÆŁˆŁ‚ Ų§Ł„ŁˆŲ§Ų±ŲÆ", + "spacer-title": "فاصل", + "spellcheck-title": "Ų§Ł„ŲŖŲÆŁ‚ŁŠŁ‚ Ų§Ł„Ų§Ł…Ł„Ų§Ų¦ŁŠ", + "multi-factor-authentication-title": "المصادقة Ł…ŲŖŲ¹ŲÆŲÆŲ© Ų§Ł„Ų¹ŁˆŲ§Ł…Ł„", + "root-title": "الملاحظات Ų§Ł„Ł…Ų®ŁŁŠŲ©", + "search-history-title": "سجل البحث", + "note-map-title": "خريطة الملاحظات", + "shared-notes-title": "الملاحظات Ų§Ł„Ł…Ų“ŲŖŲ±ŁƒŲ©", + "bulk-action-title": "Ų§Ų¬Ų±Ų§Ų” Ų¬Ł…Ų§Ų¹ŁŠ", + "backend-log-title": "سجل الخادم", + "user-hidden-title": "Ł…Ų®ŁŁŠ عن المستخدم", + "command-launcher-title": "Ł…Ų“ŲŗŁ„ Ų§Ł„Ų§ŁˆŲ§Ł…Ų±", + "note-launcher-title": "Ł…Ų“ŲŗŁ„ الملاحظة", + "script-launcher-title": "Ł…Ų“ŲŗŁ„ Ų§Ł„Ų³ŁƒŲ±ŲØŲŖ", + "built-in-widget-title": "عنصر ŁˆŲ§Ų¬Ł‡Ų© Ł…ŲÆŁ…Ų¬", + "custom-widget-title": "عنصر ŁˆŲ§Ų¬Ł‡Ų© Ł…Ų®ŲµŲµ", + "launch-bar-title": "ؓريط Ų§Ł„ŲŖŲ“ŲŗŁŠŁ„", + "available-launchers-title": "المؓغلات المتاحة", + "new-note-title": "ملاحظة جديدة", + "search-notes-title": "البحث في الملاحظات", + "jump-to-note-title": "انتقل الى...", + "recent-changes-title": "Ų§Ł„ŲŖŲŗŁŠŲ±Ų§ŲŖ Ų§Ł„Ų§Ų®ŁŠŲ±Ų©", + "quick-search-title": "البحث Ų§Ł„Ų³Ų±ŁŠŲ¹", + "protected-session-title": "الجلسة Ų§Ł„Ł…Ų­Ł…ŁŠŲ©", + "sync-status-title": "حالة المزامنة", + "text-notes": "ملاحظات Ł†ŲµŁŠŲ©", + "code-notes-title": "ملاحظات ŲØŲ±Ł…Ų¬ŁŠŲ©", + "visible-launchers-title": "المؓغلات Ų§Ł„Ł…Ų±Ų¦ŁŠŲ©", + "user-guide": "ŲÆŁ„ŁŠŁ„ المستخدم", + "ai-llm-title": "AI/LLM", + "etapi-title": "ETAPI", + "sql-console-history-title": "سجل وحدة ŲŖŲ­ŁƒŁ… SQL", + "launch-bar-templates-title": "Ł‚ŁˆŲ§Ł„ŲØ ؓريط Ų§Ł„ŲŖŲ“ŲŗŁŠŁ„", + "base-abstract-launcher-title": "المؓغل Ų§Ł„Ų§Ų³Ų§Ų³ŁŠ المجرد", + "llm-chat-title": "الدردؓة Ł…Ų¹ الملاحظات", + "localization": "اللغة ŁˆŲ§Ł„Ł…Ł†Ų·Ł‚Ų©", + "go-to-previous-note-title": "اذهب الى الملاحظة السابقة", + "go-to-next-note-title": "اذهب الى الملاحظة Ų§Ł„ŲŖŲ§Ł„ŁŠŲ©", + "open-today-journal-note-title": "فتح ملاحظة مجلة Ų§Ł„ŁŠŁˆŁ…" + }, + "tray": { + "bookmarks": "العلامات Ų§Ł„Ł…Ų±Ų¬Ų¹ŁŠŲ©", + "tooltip": "ملاحظات ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ…", + "close": "انهاؔ ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ…", + "recents": "الملاحظات Ų§Ł„Ų­ŲÆŁŠŲ«Ų©", + "new-note": "ملاحظة جديدة", + "show-windows": "اظهار Ų§Ł„Ł†ŁˆŲ§ŁŲ°", + "open_new_window": "فتح نافذة جديدة", + "today": "فتح ملاحظة مجلة Ų§Ł„ŁŠŁˆŁ…" + }, + "modals": { + "error_title": "Ų®Ų·Ų£" + }, + "share_theme": { + "search_placeholder": "ŲØŲ­Ų«...", + "subpages": "الصفحات Ų§Ł„ŁŲ±Ų¹ŁŠŲ©:", + "expand": "توسيع", + "site-theme": "المظهر العام Ł„Ł„Ł…ŁˆŁ‚Ų¹", + "image_alt": "صورة المقال", + "on-this-page": "في هذه السفحة" + }, + "hidden_subtree_templates": { + "description": "Ų§Ł„ŁˆŲµŁ", + "calendar": "Ų§Ł„ŲŖŁ‚ŁˆŁŠŁ…", + "table": "Ų¬ŲÆŁˆŁ„", + "geolocation": "Ų§Ł„Ł…ŁˆŁ‚Ų¹ Ų§Ł„Ų¬ŲŗŲ±Ų§ŁŁŠ", + "board": "Ł„ŁˆŲ­Ų©", + "status": "الحالة", + "board_status_done": "ŲŖŁ…ŲŖ", + "start-time": "ŁˆŁ‚ŲŖ البدؔ", + "end-time": "ŁˆŁ‚ŲŖ الانتهاؔ", + "built-in-templates": "Ų§Ł„Ł‚ŁˆŲ§Ł„ŲØ المدمجة", + "board_note_first": "الملاحظة Ų§Ł„Ų§ŁˆŁ„Ł‰", + "board_note_second": "الملاحظة Ų§Ł„Ų«Ų§Ł†ŁŠŲ©", + "board_note_third": "الملاحظة الرابعة", + "board_status_todo": "قائمة المهام", + "board_status_progress": "Ł‚ŁŠŲÆ Ų§Ł„ŲŖŁ†ŁŁŠŲ°", + "text-snippet": "مقتطف Ł†ŲµŁŠ", + "list-view": "Ų¹Ų±Ų¶ القائمة", + "grid-view": "Ų¹Ų±Ų¶ ؓبكي", + "geo-map": "خريطة جغرافية", + "start-date": "تاريخ البدؔ", + "end-date": "تاريخ الانتهاؔ", + "presentation": "Ų¹Ų±Ų¶ ŲŖŁ‚ŲÆŁŠŁ…ŁŠ", + "presentation_slide": "ؓريحة العرض Ų§Ł„ŲŖŁ‚ŲÆŁŠŁ…ŁŠ", + "presentation_slide_first": "Ų§Ł„Ų“Ų±ŁŠŲ­Ų© Ų§Ł„Ų§ŁˆŁ„Ł‰", + "presentation_slide_second": "Ų§Ł„Ų“Ų±ŁŠŲ­Ų© Ų§Ł„Ų«Ų§Ł†ŁŠŲ©", + "background": "Ų§Ł„Ų®Ł„ŁŁŠŲ©" + }, + "login": { + "title": "ŲŖŲ³Ų¬ŁŠŁ„ Ų§Ł„ŲÆŲ®ŁˆŁ„", + "password": "ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "button": "ŲŖŲ³Ų¬ŁŠŁ„ Ų§Ł„ŲÆŲ®ŁˆŁ„", + "heading": "ŲŖŲ³Ų¬ŁŠŁ„ Ų§Ł„ŲÆŲ®ŁˆŁ„ الى ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ…", + "remember-me": "ŲŖŲ°ŁƒŲ±Ł†ŁŠ" + }, + "set_password": { + "password": "ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "title": "ŲŖŲ¹ŁŠŁ† ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "heading": "ŲŖŲ¹ŁŠŁ† ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "password-confirmation": "تاكيد ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±", + "button": "ŲŖŲ¹ŁŠŁ† ŁƒŁ„Ł…Ų© Ų§Ł„Ł…Ų±ŁˆŲ±" + }, + "setup": { + "next": "Ų§Ł„ŲŖŲ§Ł„ŁŠ", + "title": "تثبيت", + "heading": "تثبيت ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ… للملاحظات", + "init-in-progress": "Ų¬Ų§Ų± ŲŖŁ‡ŁŠŲ¦Ų© المستند" + }, + "setup_sync-from-desktop": { + "step6-here": "هنا", + "heading": "مزامنة من Ų³Ų·Ų­ Ų§Ł„Ł…ŁƒŲŖŲØ", + "step3": "انقر على صنف المزامنة." + }, + "setup_sync-in-progress": { + "outstanding-items-default": "غير Ł…ŲŖŁˆŁŲ±", + "heading": "المزامنة جارية", + "outstanding-items": "عناصر المزامنة المعلقة:" + }, + "share_page": { + "parent": "الأصل:", + "child-notes": "الملاحظات Ų§Ł„ŁŲ±Ų¹ŁŠŲ©:" + }, + "notes": { + "duplicate-note-suffix": "(Ł…ŁƒŲ±Ų±)", + "new-note": "ملاحظة جديدة" + }, + "keyboard_action_names": { + "jump-to-note": "انتقل الى ...", + "command-palette": "Ł„ŁˆŲ­Ų© Ų§Ł„Ų§ŁˆŲ§Ł…Ų±", + "quick-search": "البحث Ų§Ł„Ų³Ų±ŁŠŲ¹", + "expand-subtree": "توسيع الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "collapse-tree": "طي الؓجرة", + "collapse-subtree": "طي الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "delete-notes": "حذف الملاحظات", + "duplicate-subtree": "تكرار الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "show-options": "Ų¹Ų±Ų¶ Ų§Ł„Ų®ŁŠŲ§Ų±Ų§ŲŖ", + "show-revisions": "Ų¹Ų±Ų¶ المراجعات", + "show-help": "Ų¹Ų±Ų¶ المساعدة", + "show-cheatsheet": "Ų¹Ų±Ų¶ ŲÆŁ„ŁŠŁ„ الاختصارات", + "unhoist-note": "الغاؔ تثبيت الملاحظة", + "zoom-out": "تصغير العرض", + "zoom-in": "تكبير العرض", + "search-in-subtree": "البحث في الؓجرة Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "sort-child-notes": "ترتيب الملاحظات Ų§Ł„ŁŲ±Ų¹ŁŠŲ©", + "create-note-after": "انؓاؔ ملاحظة ŲØŲ¹ŲÆ", + "create-note-into": "انؓاؔ Ł…Ų¹Ł„ŁˆŁ…Ų§ŲŖ الملاحظة", + "move-note-up": "انقل الملاحظة للاعلى", + "move-note-down": "انقل الملاحظة للاسفل", + "edit-note-title": "تحرير Ų¹Ł†ŁˆŲ§Ł† الملاحظة", + "clone-notes-to": "نسخ الملاحظة الى", + "move-notes-to": "نقل الملاحظات الى", + "open-new-tab": "فتح علامة تبويب جديدة", + "close-active-tab": "اغلاق Ų§Ł„ŲŖŲØŁˆŁŠŲØ النؓط", + "reopen-last-tab": "Ų§Ų¹Ų§ŲÆŲ© فتح Ų§Ų®Ų± تبويب", + "activate-next-tab": "ŲŖŁ†Ų“ŁŠŲ· علامة Ų§Ł„ŲŖŲØŁˆŁŠŲØ اللاحقة", + "activate-previous-tab": "ŲŖŁ†Ų“ŁŠŲ· علامة Ų§Ł„ŲŖŲØŁˆŁŠŲØ السابقة", + "open-new-window": "فتح نافذة جديدة", + "print-active-note": "Ų·ŲØŲ§Ų¹Ų© الملاحظة النؓطة", + "open-note-externally": "افتح الملاحظة خارجيا", + "render-active-note": "Ų¹Ų±Ų¶ الملاحظة النؓطة", + "run-active-note": "ŲŖŲ“ŲŗŁŠŁ„ الملاحظة النؓطة", + "open-developer-tools": "فتح ادوات Ų§Ł„Ł…Ų·ŁˆŲ±", + "find-in-text": "البحث في النص", + "toggle-left-pane": "اظهار/اخفاؔ Ų§Ł„Ł„ŁˆŲ­Ų© Ų§Ł„ŁŠŲ³Ų±Ł‰", + "toggle-full-screen": "اظهار/اخفاؔ وضع ملؔ الؓاؓة", + "reset-zoom-level": "Ų§Ų¹Ų§ŲÆŲ© Ų¶ŲØŲ· Ł…Ų³ŲŖŁˆŁ‰ Ų§Ł„ŲŖŁƒŲØŁŠŲ±", + "copy-without-formatting": "نسخ ŲØŲÆŁˆŁ† ŲŖŁ†Ų³ŁŠŁ‚", + "add-new-relation": "اضافة علاقة جديدة", + "toggle-right-pane": "اظهار/اخفاؔ Ų§Ł„Ł„ŁˆŲ­Ų© Ų§Ł„ŁŠŁ…Ł†Ł‰", + "switch-to-second-tab": "الانتقال الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ Ų§Ł„Ų«Ų§Ł†ŁŠ", + "switch-to-third-tab": "الانتقال الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ الثالث", + "switch-to-fourth-tab": "الانتقال الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ الرابع", + "switch-to-fifth-tab": "الانتقال الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ الخامس", + "switch-to-sixth-tab": "الانتقال الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ السادس", + "switch-to-seventh-tab": "الانتقال الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ السابع", + "switch-to-eighth-tab": "الانتقال الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ الثامن", + "switch-to-ninth-tab": "الانتقال الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ التاسع", + "switch-to-last-tab": "الانتقال الى Ų§Ų®Ų± تبويب", + "add-link-to-text": "اضافة Ų±Ų§ŲØŲ· الى النص", + "edit-branch-prefix": "تحرير ŲØŲ§ŲÆŲ¦Ų© الفرع", + "toggle-zen-mode": "اظهار/ اخفاؔ وضع Zen", + "show-note-source": "اظهار Ł…ŲµŲÆŲ± الملاحظة", + "show-recent-changes": "Ų¹Ų±Ų¶ Ų§Ł„ŲŖŲŗŁŠŲ±Ų§ŲŖ Ų§Ł„Ų§Ų®ŁŠŲ±Ų©", + "show-sql-console": "Ų¹Ų±Ų¶ وحدة ŲŖŲ­ŁƒŁ… SQL", + "show-backend-log": "Ų¹Ų±Ų¶ سجل Ų§Ł„Ų®Ł„ŁŁŠŲ©", + "cut-into-note": "قص الى الملاحظة", + "edit-read-only-note": "تحرير ملاحظة للقراؔة فقط", + "add-new-label": "اضافة ŲŖŲ³Ł…ŁŠŲ© جديدة", + "reload-frontend-app": "Ų§Ų¹Ų§ŲÆŲ© ŲŖŲ­Ł…ŁŠŁ„ Ų§Ł„ŁˆŲ§Ų¬Ł‡Ų© Ų§Ł„Ų§Ł…Ų§Ł…ŁŠŲ© Ł„Ł„ŲŖŲ·ŲØŁŠŁ‚", + "force-save-revision": "فرض حفظ المراجعة", + "toggle-note-hoisting": "اظهار/ اخفاؔ Ų§Ł„ŲŖŲ±ŁƒŁŠŲ² في الملاحظة", + "back-in-note-history": "Ų§Ł„Ų±Ų¬ŁˆŲ¹ الى سجل الملاحظة", + "forward-in-note-history": "التقدم للامام في سجل الملاحظة", + "scroll-to-active-note": "ŲŖŁ…Ų±ŁŠŲ± تلى الملاحظة النؓطة", + "create-note-into-inbox": "انؓاؔ ملاحظة في Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„ŁˆŲ§Ų±ŲÆ", + "copy-notes-to-clipboard": "نسخ الملاحظات الى الخافظة", + "paste-notes-from-clipboard": "لصق الملاحظات الى الحافظة", + "cut-notes-to-clipboard": "قص الملاحظات الى الحافظة", + "toggle-system-tray-icon": "ŲŖŲØŲÆŁŠŁ„ Ų§ŁŠŁ‚ŁˆŁ†Ų© علبة النظام", + "switch-to-first-tab": "Ų§Ł„ŲŖŲØŲÆŁŠŁ„ الى Ų§Ł„ŲŖŲØŁˆŁŠŲØ Ų§Ł„Ų§ŁˆŁ„", + "follow-link-under-cursor": "Ų§ŲŖŲØŲ¹ الرابط اسفل المؤؓر", + "paste-markdown-into-text": "لصق نص بتنسبق Markdown" + }, + "share_404": { + "title": "غير Ł…ŁˆŲ¬ŁˆŲÆ", + "heading": "غير Ł…ŁˆŲ¬ŁˆŲÆ" + }, + "weekdayNumber": "Ų§Ł„Ų§Ų³ŲØŁˆŲ¹{رقم Ų§Ł„Ų§Ų³ŁŠŁˆŲ¹}", + "quarterNumber": "الربع {رقم الربع}", + "pdf": { + "export_filter": "مستند PDF (.pdf)" + } +} diff --git a/apps/server/src/assets/translations/cn/server.json b/apps/server/src/assets/translations/cn/server.json index 0ff95e57a..788af2b5a 100644 --- a/apps/server/src/assets/translations/cn/server.json +++ b/apps/server/src/assets/translations/cn/server.json @@ -1,428 +1,440 @@ { - "keyboard_actions": { - "open-jump-to-note-dialog": "ę‰“å¼€ā€œč·³č½¬åˆ°ē¬”č®°ā€åÆ¹čÆę”†", - "search-in-subtree": "åœØå½“å‰ē¬”č®°ēš„å­ę ‘äø­ęœē“¢ē¬”č®°", - "expand-subtree": "å±•å¼€å½“å‰ē¬”č®°ēš„å­ę ‘", - "collapse-tree": "ęŠ˜å å®Œę•“ēš„ē¬”č®°ę ‘", - "collapse-subtree": "ęŠ˜å å½“å‰ē¬”č®°ēš„å­ę ‘", - "sort-child-notes": "ęŽ’åŗå­ē¬”č®°", - "creating-and-moving-notes": "åˆ›å»ŗå’Œē§»åŠØē¬”č®°", - "create-note-into-inbox": "åœØę”¶ä»¶ē®±ļ¼ˆč‹„å·²å®šä¹‰ļ¼‰ęˆ–ę—„č®°äø­åˆ›å»ŗē¬”č®°", - "delete-note": "åˆ é™¤ē¬”č®°", - "move-note-up": "å‘äøŠē§»åŠØē¬”č®°", - "move-note-down": "å‘äø‹ē§»åŠØē¬”č®°", - "move-note-up-in-hierarchy": "åœØå±‚ēŗ§äø­å‘äøŠē§»åŠØē¬”č®°", - "move-note-down-in-hierarchy": "åœØå±‚ēŗ§äø­å‘äø‹ē§»åŠØē¬”č®°", - "edit-note-title": "ä»Žę ‘č·³č½¬åˆ°ē¬”č®°čÆ¦ęƒ…å¹¶ē¼–č¾‘ę ‡é¢˜", - "edit-branch-prefix": "ę˜¾ē¤ŗē¼–č¾‘åˆ†ę”Æå‰ē¼€åÆ¹čÆę”†", - "note-clipboard": "ē¬”č®°å‰Ŗč““ęæ", - "copy-notes-to-clipboard": "å¤åˆ¶é€‰å®šēš„ē¬”č®°åˆ°å‰Ŗč““ęæ", - "paste-notes-from-clipboard": "ä»Žå‰Ŗč““ęæē²˜č““ē¬”č®°åˆ°å½“å‰ē¬”č®°äø­", - "cut-notes-to-clipboard": "å‰Ŗåˆ‡é€‰å®šēš„ē¬”č®°åˆ°å‰Ŗč““ęæ", - "select-all-notes-in-parent": "é€‰ę‹©å½“å‰ē¬”č®°ēŗ§åˆ«ēš„ę‰€ęœ‰ē¬”č®°", - "add-note-above-to-the-selection": "å°†äøŠę–¹ē¬”č®°ę·»åŠ åˆ°é€‰ę‹©äø­", - "add-note-below-to-selection": "å°†äø‹ę–¹ē¬”č®°ę·»åŠ åˆ°é€‰ę‹©äø­", - "duplicate-subtree": "å¤åˆ¶å­ę ‘", - "tabs-and-windows": "ę ‡ē­¾é”µå’ŒēŖ—å£", - "open-new-tab": "打开新标签锵", - "close-active-tab": "å…³é—­å½“å‰ę ‡ē­¾é”µ", - "reopen-last-tab": "é‡ę–°ę‰“å¼€ęœ€åŽå…³é—­ēš„ę ‡ē­¾é”µ", - "activate-next-tab": "åˆ‡ę¢äø‹äø€äøŖę ‡ē­¾é”µ", - "activate-previous-tab": "åˆ‡ę¢äøŠäø€äøŖę ‡ē­¾é”µ", - "open-new-window": "ę‰“å¼€ę–°ēŖ—å£", - "toggle-tray": "显示/éšč—ē³»ē»Ÿę‰˜ē›˜å›¾ę ‡", - "first-tab": "åˆ‡ę¢åˆ°ē¬¬äø€äøŖę ‡ē­¾é”µ", - "second-tab": "åˆ‡ę¢åˆ°ē¬¬äŗŒäøŖę ‡ē­¾é”µ", - "third-tab": "åˆ‡ę¢åˆ°ē¬¬äø‰äøŖę ‡ē­¾é”µ", - "fourth-tab": "åˆ‡ę¢åˆ°ē¬¬å››äøŖę ‡ē­¾é”µ", - "fifth-tab": "åˆ‡ę¢åˆ°ē¬¬äŗ”äøŖę ‡ē­¾é”µ", - "sixth-tab": "åˆ‡ę¢åˆ°ē¬¬å…­äøŖę ‡ē­¾é”µ", - "seventh-tab": "åˆ‡ę¢åˆ°ē¬¬äøƒäøŖę ‡ē­¾é”µ", - "eight-tab": "åˆ‡ę¢åˆ°ē¬¬å…«äøŖę ‡ē­¾é”µ", - "ninth-tab": "åˆ‡ę¢åˆ°ē¬¬ä¹äøŖę ‡ē­¾é”µ", - "last-tab": "åˆ‡ę¢åˆ°ęœ€åŽäø€äøŖę ‡ē­¾é”µ", - "dialogs": "åÆ¹čÆę”†", - "show-note-source": "ę˜¾ē¤ŗē¬”č®°ęŗä»£ē åÆ¹čÆę”†", - "show-options": "ę˜¾ē¤ŗé€‰é”¹åÆ¹čÆę”†", - "show-revisions": "ę˜¾ē¤ŗäæ®č®¢åŽ†å²åÆ¹čÆę”†", - "show-recent-changes": "ę˜¾ē¤ŗęœ€čæ‘ę›“ę”¹åÆ¹čÆę”†", - "show-sql-console": "显示SQLęŽ§åˆ¶å°åÆ¹čÆę”†", - "show-backend-log": "ę˜¾ē¤ŗåŽē«Æę—„åæ—åÆ¹čÆę”†", - "text-note-operations": "ę–‡ęœ¬ē¬”č®°ę“ä½œ", - "add-link-to-text": "ę‰“å¼€åÆ¹čÆę”†ä»„ę·»åŠ é“¾ęŽ„åˆ°ę–‡ęœ¬", - "follow-link-under-cursor": "č®æé—®å…‰ę ‡äø‹ēš„é“¾ęŽ„", - "insert-date-and-time-to-text": "åœØę–‡ęœ¬äø­ę’å…„ę—„ęœŸå’Œę—¶é—“", - "paste-markdown-into-text": "ä»Žå‰Ŗč““ęæē²˜č““ Markdown åˆ°ę–‡ęœ¬ē¬”č®°", - "cut-into-note": "å‰Ŗåˆ‡å½“å‰ē¬”č®°ēš„é€‰åŒŗå¹¶åˆ›å»ŗåŒ…å«é€‰å®šę–‡ęœ¬ēš„å­ē¬”č®°", - "add-include-note-to-text": "ę‰“å¼€åÆ¹čÆę”†ä»„ę·»åŠ äø€äøŖåŒ…å«ē¬”č®°", - "edit-readonly-note": "ē¼–č¾‘åŖčÆ»ē¬”č®°", - "attributes-labels-and-relations": "å±žę€§ļ¼ˆę ‡ē­¾å’Œå…³ē³»ļ¼‰", - "add-new-label": "åˆ›å»ŗę–°ę ‡ē­¾", - "create-new-relation": "åˆ›å»ŗę–°å…³ē³»", - "ribbon-tabs": "åŠŸčƒ½åŒŗę ‡ē­¾é”µ", - "toggle-basic-properties": "åˆ‡ę¢åŸŗęœ¬å±žę€§", - "toggle-file-properties": "åˆ‡ę¢ę–‡ä»¶å±žę€§", - "toggle-image-properties": "åˆ‡ę¢å›¾åƒå±žę€§", - "toggle-owned-attributes": "åˆ‡ę¢ę‹„ęœ‰ēš„å±žę€§", - "toggle-inherited-attributes": "åˆ‡ę¢ē»§ę‰æēš„å±žę€§", - "toggle-promoted-attributes": "åˆ‡ę¢ęå‡ēš„å±žę€§", - "toggle-link-map": "åˆ‡ę¢é“¾ęŽ„åœ°å›¾", - "toggle-note-info": "åˆ‡ę¢ē¬”č®°äæ”ęÆ", - "toggle-note-paths": "åˆ‡ę¢ē¬”č®°č·Æå¾„", - "toggle-similar-notes": "åˆ‡ę¢ē›øä¼¼ē¬”č®°", - "other": "其他", - "toggle-right-pane": "åˆ‡ę¢å³ä¾§é¢ęæēš„ę˜¾ē¤ŗļ¼ŒåŒ…ę‹¬ē›®å½•å’Œé«˜äŗ®", - "print-active-note": "ę‰“å°å½“å‰ē¬”č®°", - "open-note-externally": "ä»„é»˜č®¤åŗ”ē”Øę‰“å¼€ē¬”č®°ę–‡ä»¶", - "render-active-note": "ęø²ęŸ“ļ¼ˆé‡ę–°ęø²ęŸ“ļ¼‰å½“å‰ē¬”č®°", - "run-active-note": "čæč”Œå½“å‰ JavaScriptļ¼ˆå‰/åŽē«Æļ¼‰ä»£ē ē¬”č®°", - "toggle-note-hoisting": "ęå‡ē¬”č®°", - "unhoist": "å–ę¶ˆęå‡ē¬”č®°", - "reload-frontend-app": "é‡ę–°åŠ č½½å‰ē«Æåŗ”ē”Ø", - "open-dev-tools": "ę‰“å¼€å¼€å‘č€…å·„å…·", - "toggle-left-note-tree-panel": "åˆ‡ę¢å·¦ä¾§ļ¼ˆē¬”č®°ę ‘ļ¼‰é¢ęæ", - "toggle-full-screen": "åˆ‡ę¢å…Øå±ęØ”å¼", - "zoom-out": "ē¼©å°", - "zoom-in": "放大", - "note-navigation": "ē¬”č®°åÆ¼čˆŖ", - "reset-zoom-level": "é‡ē½®ē¼©ę”¾ēŗ§åˆ«", - "copy-without-formatting": "ę— ę ¼å¼å¤åˆ¶é€‰å®šę–‡ęœ¬", - "force-save-revision": "å¼ŗåˆ¶åˆ›å»ŗ/äæå­˜å½“å‰ē¬”č®°ēš„ę–°äæ®č®¢ē‰ˆęœ¬", - "show-help": "显示帮助", - "toggle-book-properties": "åˆ‡ę¢ä¹¦ē±å±žę€§", - "toggle-classic-editor-toolbar": "äøŗē¼–č¾‘å™Øåˆ‡ę¢ę ¼å¼ę ‡ē­¾é”µēš„å›ŗå®šå·„å…·ę ", - "export-as-pdf": "åÆ¼å‡ŗå½“å‰ē¬”č®°äøŗ PDF", - "show-cheatsheet": "ę˜¾ē¤ŗåæ«ę·é”®ęŒ‡å—", - "toggle-zen-mode": "启用/ē¦ē”Øē¦…ęØ”å¼ļ¼ˆäøŗäø“ę³Øē¼–č¾‘č€Œē²¾ē®€ē•Œé¢ļ¼‰", - "open-command-palette": "ę‰“å¼€å‘½ä»¤é¢ęæ", - "quick-search": "ęæ€ę“»åæ«é€Ÿęœē“¢ę ", - "create-note-after": "åœØå½“å‰ē¬”č®°åŽé¢åˆ›å»ŗē¬”č®°", - "create-note-into": "åˆ›å»ŗē¬”č®°ä½œäøŗå½“å‰ē¬”č®°ēš„å­ē¬”č®°", - "clone-notes-to": "å…‹éš†é€‰äø­ēš„ē¬”č®°åˆ°", - "move-notes-to": "ē§»åŠØé€‰äø­ēš„ē¬”č®°åˆ°", - "find-in-text": "åœØę–‡ęœ¬äø­ęŸ„ę‰¾", - "back-in-note-history": "åÆ¼čˆŖåˆ°åŽ†å²č®°å½•äø­ēš„äøŠäø€äøŖē¬”č®°", - "forward-in-note-history": "åÆ¼čˆŖåˆ°åŽ†å²č®°å½•ēš„äø‹äø€äøŖē¬”č®°", - "scroll-to-active-note": "ę»šåŠØē¬”č®°ę ‘åˆ°å½“å‰ē¬”č®°" - }, - "login": { - "title": "登录", - "heading": "Trilium 登录", - "incorrect-totp": "TOTP äøę­£ē”®ļ¼ŒčÆ·é‡čÆ•ć€‚", - "incorrect-password": "åÆ†ē äøę­£ē”®ļ¼ŒčÆ·é‡čÆ•ć€‚", - "password": "密码", - "remember-me": "č®°ä½ęˆ‘", - "button": "登录", - "sign_in_with_sso": "使用 {{ ssoIssuerName }} 登录" - }, - "set_password": { - "title": "设置密码", - "heading": "设置密码", - "description": "åœØę‚Øčƒ½å¤Ÿä»ŽWeb开始使用Triliumä¹‹å‰ļ¼Œę‚Øéœ€č¦å…ˆč®¾ē½®äø€äøŖåÆ†ē ć€‚ę‚Øä¹‹åŽå°†ä½æē”Øę­¤åÆ†ē ē™»å½•ć€‚", - "password": "密码", - "password-confirmation": "密码甮认", - "button": "设置密码" - }, - "javascript-required": "Triliuméœ€č¦åÆē”ØJavaScript怂", - "setup": { - "heading": "TriliumNext笔记设置", - "new-document": "ęˆ‘ę˜Æę–°ē”Øęˆ·ļ¼Œęˆ‘ęƒ³äøŗęˆ‘ēš„ē¬”č®°åˆ›å»ŗäø€äøŖę–°ēš„Trilium文攣", - "sync-from-desktop": "ęˆ‘å·²ē»ęœ‰äø€äøŖę”Œé¢å®žä¾‹ļ¼Œęˆ‘ęƒ³č®¾ē½®äøŽå®ƒēš„åŒę­„", - "sync-from-server": "ęˆ‘å·²ē»ęœ‰äø€äøŖęœåŠ”å™Øå®žä¾‹ļ¼Œęˆ‘ęƒ³č®¾ē½®äøŽå®ƒēš„åŒę­„", - "next": "下一歄", - "init-in-progress": "ę–‡ę”£åˆå§‹åŒ–čæ›č”Œäø­", - "redirecting": "ę‚Øå°†å¾ˆåæ«č¢«é‡å®šå‘åˆ°åŗ”ē”ØēØ‹åŗć€‚", - "title": "设置" - }, - "setup_sync-from-desktop": { - "heading": "ä»Žę”Œé¢åŒę­„", - "description": "ę­¤č®¾ē½®éœ€č¦ä»Žę”Œé¢å®žä¾‹å¼€å§‹ļ¼š", - "step1": "ę‰“å¼€ę‚Øēš„TriliumNextē¬”č®°ę”Œé¢å®žä¾‹ć€‚", - "step2": "从Triliumčœå•äø­ļ¼Œē‚¹å‡»ā€œé€‰é”¹ā€ć€‚", - "step3": "ē‚¹å‡»ā€œåŒę­„ā€ē±»åˆ«ć€‚", - "step4": "å°†ęœåŠ”å™Øå®žä¾‹åœ°å€ę›“ę”¹äøŗļ¼š{{- host}} å¹¶ē‚¹å‡»äæå­˜ć€‚", - "step5": "ē‚¹å‡»ā€œęµ‹čÆ•åŒę­„ā€ęŒ‰é’®ä»„éŖŒčÆčæžęŽ„ę˜Æå¦ęˆåŠŸć€‚", - "step6": "å®Œęˆčæ™äŗ›ę­„éŖ¤åŽļ¼Œē‚¹å‡»{{- link}}怂", - "step6-here": "čæ™é‡Œ" - }, - "setup_sync-from-server": { - "heading": "ä»ŽęœåŠ”å™ØåŒę­„", - "instructions": "čÆ·åœØäø‹é¢č¾“å…„TriliumęœåŠ”å™Øåœ°å€å’Œå‡­ę®ć€‚čæ™å°†ä»ŽęœåŠ”å™Øäø‹č½½ę•“äøŖTriliumę–‡ę”£å¹¶č®¾ē½®äøŽå®ƒēš„åŒę­„ć€‚ę ¹ę®ę–‡ę”£å¤§å°å’Œę‚Øēš„čæžęŽ„ēš„é€Ÿåŗ¦ļ¼Œčæ™åÆčƒ½éœ€č¦äø€ę®µę—¶é—“ć€‚", - "server-host": "TriliumęœåŠ”å™Øåœ°å€", - "server-host-placeholder": "https://<äø»ęœŗåē§°>:<ē«Æå£>", - "proxy-server": "ä»£ē†ęœåŠ”å™Øļ¼ˆåÆé€‰ļ¼‰", - "proxy-server-placeholder": "https://<äø»ęœŗåē§°>:<ē«Æå£>", - "note": "ę³Øę„ļ¼š", - "proxy-instruction": "å¦‚ęžœę‚Øå°†ä»£ē†č®¾ē½®ē•™ē©ŗļ¼Œå°†ä½æē”Øē³»ē»Ÿä»£ē†ļ¼ˆä»…é€‚ē”ØäŗŽę”Œé¢åŗ”ē”Øļ¼‰", - "password": "密码", - "password-placeholder": "密码", - "back": "čæ”å›ž", - "finish-setup": "完成设置" - }, - "setup_sync-in-progress": { - "heading": "同歄中", - "successful": "åŒę­„å·²č¢«ę­£ē”®č®¾ē½®ć€‚åˆå§‹åŒę­„å®ŒęˆåÆčƒ½éœ€č¦äø€äŗ›ę—¶é—“ć€‚å®ŒęˆåŽļ¼Œę‚Øå°†č¢«é‡å®šå‘åˆ°ē™»å½•é”µé¢ć€‚", - "outstanding-items": "ęœŖå®Œęˆēš„åŒę­„é”¹ē›®ļ¼š", - "outstanding-items-default": "ꗠ" - }, - "share_404": { - "title": "ęœŖę‰¾åˆ°", - "heading": "ęœŖę‰¾åˆ°" - }, - "share_page": { - "parent": "父级:", - "clipped-from": "ę­¤ē¬”č®°ęœ€åˆå‰Ŗåˆ‡č‡Ŗ {{- url}}", - "child-notes": "å­ē¬”č®°ļ¼š", - "no-content": "ę­¤ē¬”č®°ę²”ęœ‰å†…å®¹ć€‚" - }, - "weekdays": { - "monday": "周一", - "tuesday": "å‘ØäŗŒ", - "wednesday": "周三", - "thursday": "周四", - "friday": "周五", - "saturday": "周六", - "sunday": "周旄" - }, - "weekdayNumber": "第 {weekNumber} 周", - "months": { - "january": "äø€ęœˆ", - "february": "二月", - "march": "äø‰ęœˆ", - "april": "å››ęœˆ", - "may": "äŗ”ęœˆ", - "june": "å…­ęœˆ", - "july": "七月", - "august": "å…«ęœˆ", - "september": "ä¹ęœˆ", - "october": "åęœˆ", - "november": "åäø€ęœˆ", - "december": "åäŗŒęœˆ" - }, - "quarterNumber": "第 {quarterNumber} 季度", - "special_notes": { - "search_prefix": "搜瓢:" - }, - "test_sync": { - "not-configured": "åŒę­„ęœåŠ”å™Øäø»ęœŗęœŖé…ē½®ć€‚čÆ·å…ˆé…ē½®åŒę­„ć€‚", - "successful": "åŒę­„ęœåŠ”å™Øę”ę‰‹ęˆåŠŸļ¼ŒåŒę­„å·²å¼€å§‹ć€‚" - }, - "hidden-subtree": { - "root-title": "éšč—ēš„ē¬”č®°", - "search-history-title": "ęœē“¢åŽ†å²", - "note-map-title": "ē¬”č®°åœ°å›¾", - "sql-console-history-title": "SQL ęŽ§åˆ¶å°åŽ†å²", - "shared-notes-title": "共享笔记", - "bulk-action-title": "ę‰¹é‡ę“ä½œ", - "backend-log-title": "åŽē«Æę—„åæ—", - "user-hidden-title": "éšč—ēš„ē”Øęˆ·", - "launch-bar-templates-title": "åÆåŠØę ęØ”ęæ", - "base-abstract-launcher-title": "åŸŗē”€ę‘˜č¦åÆåŠØå™Ø", - "command-launcher-title": "å‘½ä»¤åÆåŠØå™Ø", - "note-launcher-title": "ē¬”č®°åÆåŠØå™Ø", - "script-launcher-title": "č„šęœ¬åÆåŠØå™Ø", - "built-in-widget-title": "å†…ē½®å°ē»„ä»¶", - "spacer-title": "ē©ŗē™½å ä½", - "custom-widget-title": "č‡Ŗå®šä¹‰å°ē»„ä»¶", - "launch-bar-title": "åÆåŠØę ", - "available-launchers-title": "åÆē”ØåÆåŠØå™Ø", - "go-to-previous-note-title": "č·³č½¬åˆ°äøŠäø€ę”ē¬”č®°", - "go-to-next-note-title": "č·³č½¬åˆ°äø‹äø€ę”ē¬”č®°", - "new-note-title": "新建笔记", - "search-notes-title": "ęœē“¢ē¬”č®°", - "calendar-title": "ę—„åŽ†", - "recent-changes-title": "ęœ€čæ‘ę›“ę”¹", - "bookmarks-title": "书签", - "open-today-journal-note-title": "ę‰“å¼€ä»Šå¤©ēš„ę—„č®°ē¬”č®°", - "quick-search-title": "åæ«é€Ÿęœē“¢", - "protected-session-title": "å—äæęŠ¤ēš„ä¼ščÆ", - "sync-status-title": "åŒę­„ēŠ¶ę€", - "settings-title": "设置", - "options-title": "选锹", - "appearance-title": "外观", - "shortcuts-title": "åæ«ę·é”®", - "text-notes": "ę–‡ęœ¬ē¬”č®°", - "code-notes-title": "代码笔记", - "images-title": "图片", - "spellcheck-title": "ę‹¼å†™ę£€ęŸ„", - "password-title": "密码", - "multi-factor-authentication-title": "å¤šå› ē“ č®¤čÆ", - "etapi-title": "ETAPI", - "backup-title": "备份", - "sync-title": "同歄", - "other": "其他", - "advanced-title": "高级", - "visible-launchers-title": "åÆč§åÆåŠØå™Ø", - "user-guide": "ē”Øęˆ·ęŒ‡å—", - "localization": "čÆ­čØ€å’ŒåŒŗåŸŸ", - "jump-to-note-title": "跳转至...", - "llm-chat-title": "äøŽē¬”č®°čŠå¤©", - "ai-llm-title": "AI/LLM", - "inbox-title": "ę”¶ä»¶ē®±" - }, - "notes": { - "new-note": "新建笔记", - "duplicate-note-suffix": "(重复)", - "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" - }, - "backend_log": { - "log-does-not-exist": "åŽē«Æę—„åæ—ę–‡ä»¶ '{{ fileName }}' ęš‚äøå­˜åœØć€‚", - "reading-log-failed": "čÆ»å–åŽē«Æę—„åæ—ę–‡ä»¶ '{{ fileName }}' 失蓄。" - }, - "content_renderer": { - "note-cannot-be-displayed": "ę­¤ē¬”č®°ē±»åž‹ę— ę³•ę˜¾ē¤ŗć€‚" - }, - "pdf": { - "export_filter": "PDF 文攣 (*.pdf)", - "unable-to-export-message": "å½“å‰ē¬”č®°ę— ę³•č¢«åÆ¼å‡ŗäøŗ PDF怂", - "unable-to-export-title": "无法导出为 PDF", - "unable-to-save-message": "ę‰€é€‰ę–‡ä»¶äøčƒ½č¢«å†™å…„ć€‚é‡čÆ•ęˆ–é€‰ę‹©å¦äø€äøŖē›®ēš„åœ°ć€‚" - }, - "tray": { - "tooltip": "TriliumNext 笔记", - "close": "退出 Trilium", - "recents": "ęœ€čæ‘ē¬”č®°", - "bookmarks": "书签", - "today": "ę‰“å¼€ä»Šå¤©ēš„ę—„č®°ē¬”č®°", - "new-note": "新建笔记", - "show-windows": "ę˜¾ē¤ŗēŖ—å£", - "open_new_window": "ę‰“å¼€ę–°ēŖ—å£" - }, - "migration": { - "old_version": "ē”±ę‚Øå½“å‰ē‰ˆęœ¬ēš„ē›“ęŽ„čæē§»äøč¢«ę”ÆęŒć€‚čÆ·å…ˆå‡ēŗ§åˆ°ęœ€ę–°ēš„ v0.60.4 ē„¶åŽå†åˆ°čæ™äøŖē‰ˆęœ¬ć€‚", - "error_message": "čæē§»åˆ°ē‰ˆęœ¬ {{version}} ę—¶å‘ē”Ÿé”™čÆÆ: {{stack}}", - "wrong_db_version": "ę•°ę®åŗ“ēš„ē‰ˆęœ¬ļ¼ˆ{{version}}ļ¼‰ę–°äŗŽåŗ”ē”ØęœŸęœ›ēš„ē‰ˆęœ¬ļ¼ˆ{{targetVersion}}ļ¼‰ļ¼Œčæ™ę„å‘³ē€å®ƒē”±äø€äøŖę›“åŠ ę–°ēš„äø”äøå…¼å®¹ēš„ Trilium ę‰€åˆ›å»ŗć€‚å‡ēŗ§åˆ°ęœ€ę–°ē‰ˆēš„ Trilium ä»„č§£å†³ę­¤é—®é¢˜ć€‚" - }, - "modals": { - "error_title": "错误" - }, - "keyboard_action_names": { - "back-in-note-history": "čæ”å›žē¬”č®°åŽ†å²", - "forward-in-note-history": "å‰čæ›ē¬”č®°åŽ†å²", - "jump-to-note": "跳转到...", - "command-palette": "å‘½ä»¤é¢ęæ", - "scroll-to-active-note": "ę»šåŠØåˆ°å½“å‰ē¬”č®°", - "quick-search": "åæ«é€Ÿęœē“¢", - "search-in-subtree": "åœØå­ę ‘äø­ęœē“¢", - "expand-subtree": "展开子树", - "collapse-tree": "ęŠ˜å ę•“äøŖę ‘", - "collapse-subtree": "ęŠ˜å å­ę ‘", - "sort-child-notes": "ęŽ’åŗå­ē¬”č®°", - "create-note-after": "åœØåŽé¢åˆ›å»ŗē¬”č®°", - "create-note-into": "åˆ›å»ŗē¬”č®°åˆ°", - "create-note-into-inbox": "åˆ›å»ŗē¬”č®°åˆ°ę”¶ä»¶ē®±", - "delete-notes": "åˆ é™¤ē¬”č®°", - "move-note-up": "äøŠē§»ē¬”č®°", - "move-note-down": "下移笔记", - "move-note-up-in-hierarchy": "åœØå±‚ēŗ§äø­äøŠē§»ē¬”č®°", - "move-note-down-in-hierarchy": "åœØå±‚ēŗ§äø­äø‹ē§»ē¬”č®°", - "edit-note-title": "ē¼–č¾‘ē¬”č®°ę ‡é¢˜", - "edit-branch-prefix": "ē¼–č¾‘åˆ†ę”Æå‰ē¼€", - "clone-notes-to": "å…‹éš†ē¬”č®°åˆ°", - "move-notes-to": "ē§»åŠØē¬”č®°åˆ°", - "copy-notes-to-clipboard": "å¤åˆ¶ē¬”č®°åˆ°å‰Ŗč““ęæ", - "paste-notes-from-clipboard": "ä»Žå‰Ŗč““ęæē²˜č““ē¬”č®°", - "cut-notes-to-clipboard": "å‰Ŗåˆ‡ē¬”č®°åˆ°å‰Ŗč““ęæ", - "select-all-notes-in-parent": "é€‰ę‹©ēˆ¶čŠ‚ē‚¹äø­ę‰€ęœ‰ē¬”č®°", - "zoom-in": "放大", - "zoom-out": "ē¼©å°", - "reset-zoom-level": "é‡ē½®ē¼©ę”¾ēŗ§åˆ«", - "copy-without-formatting": "ę— ę ¼å¼å¤åˆ¶", - "force-save-revision": "å¼ŗåˆ¶äæå­˜äæ®č®¢ē‰ˆęœ¬", - "add-note-above-to-selection": "å°†äøŠę–¹ē¬”č®°ę·»åŠ åˆ°é€‰ę‹©", - "add-note-below-to-selection": "å°†äø‹ę–¹ē¬”č®°ę·»åŠ åˆ°é€‰ę‹©", - "duplicate-subtree": "å¤åˆ¶å­ę ‘", - "open-new-tab": "打开新标签锵", - "close-active-tab": "å…³é—­å½“å‰ę ‡ē­¾é”µ", - "reopen-last-tab": "é‡ę–°ę‰“å¼€ęœ€åŽå…³é—­ēš„ę ‡ē­¾é”µ", - "activate-next-tab": "åˆ‡ę¢äø‹äø€äøŖę ‡ē­¾é”µ", - "activate-previous-tab": "åˆ‡ę¢äøŠäø€äøŖę ‡ē­¾é”µ", - "open-new-window": "ę‰“å¼€ę–°ēŖ—å£", - "toggle-system-tray-icon": "显示/éšč—ē³»ē»Ÿę‰˜ē›˜å›¾ę ‡", - "toggle-zen-mode": "启用/ē¦ē”Øē¦…ęØ”å¼", - "switch-to-first-tab": "åˆ‡ę¢åˆ°ē¬¬äø€äøŖę ‡ē­¾é”µ", - "switch-to-second-tab": "åˆ‡ę¢åˆ°ē¬¬äŗŒäøŖę ‡ē­¾é”µ", - "switch-to-third-tab": "åˆ‡ę¢åˆ°ē¬¬äø‰äøŖę ‡ē­¾é”µ", - "switch-to-fourth-tab": "åˆ‡ę¢åˆ°ē¬¬å››äøŖę ‡ē­¾é”µ", - "switch-to-fifth-tab": "åˆ‡ę¢åˆ°ē¬¬äŗ”äøŖę ‡ē­¾é”µ", - "switch-to-sixth-tab": "åˆ‡ę¢åˆ°ē¬¬å…­äøŖę ‡ē­¾é”µ", - "switch-to-seventh-tab": "åˆ‡ę¢åˆ°ē¬¬äøƒäøŖę ‡ē­¾é”µ", - "switch-to-eighth-tab": "åˆ‡ę¢åˆ°ē¬¬å…«äøŖę ‡ē­¾é”µ", - "switch-to-ninth-tab": "åˆ‡ę¢åˆ°ē¬¬ä¹äøŖę ‡ē­¾é”µ", - "switch-to-last-tab": "åˆ‡ę¢åˆ°ęœ€åŽäø€äøŖę ‡ē­¾é”µ", - "show-note-source": "ę˜¾ē¤ŗē¬”č®°ęŗä»£ē ", - "show-options": "ę˜¾ē¤ŗé€‰é”¹", - "show-revisions": "ę˜¾ē¤ŗäæ®č®¢åŽ†å²", - "show-recent-changes": "ę˜¾ē¤ŗęœ€čæ‘ę›“ę”¹", - "show-sql-console": "显示SQLęŽ§åˆ¶å°", - "show-backend-log": "ę˜¾ē¤ŗåŽē«Æę—„åæ—", - "show-help": "显示帮助", - "show-cheatsheet": "ę˜¾ē¤ŗåæ«ę·é”®ęŒ‡å—", - "add-link-to-text": "äøŗę–‡ęœ¬ę·»åŠ é“¾ęŽ„", - "follow-link-under-cursor": "č®æé—®å…‰ę ‡äø‹ēš„é“¾ęŽ„", - "insert-date-and-time-to-text": "åœØę–‡ęœ¬äø­ę’å…„ę—„ęœŸå’Œę—¶é—“", - "paste-markdown-into-text": "粘蓓Markdownåˆ°ę–‡ęœ¬", - "cut-into-note": "å‰Ŗåˆ‡åˆ°ē¬”č®°", - "add-include-note-to-text": "åœØę–‡ęœ¬äø­ę·»åŠ åŒ…å«ē¬”č®°", - "edit-read-only-note": "ē¼–č¾‘åŖčÆ»ē¬”č®°", - "add-new-label": "ę·»åŠ ę–°ę ‡ē­¾", - "add-new-relation": "ę·»åŠ ę–°å…³ē³»", - "toggle-ribbon-tab-classic-editor": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē»å…øē¼–č¾‘å™Ø", - "toggle-ribbon-tab-basic-properties": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šåŸŗęœ¬å±žę€§", - "toggle-ribbon-tab-book-properties": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šä¹¦ē±å±žę€§", - "toggle-ribbon-tab-file-properties": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šę–‡ä»¶å±žę€§", - "toggle-ribbon-tab-image-properties": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šå›¾ē‰‡å±žę€§", - "toggle-ribbon-tab-owned-attributes": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šč‡Ŗęœ‰å±žę€§", - "toggle-ribbon-tab-inherited-attributes": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē»§ę‰æå±žę€§", - "toggle-ribbon-tab-promoted-attributes": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šęå‡å±žę€§", - "toggle-ribbon-tab-note-map": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē¬”č®°åœ°å›¾", - "toggle-ribbon-tab-note-info": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē¬”č®°äæ”ęÆ", - "toggle-ribbon-tab-note-paths": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē¬”č®°č·Æå¾„", - "toggle-ribbon-tab-similar-notes": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē›øä¼¼ē¬”č®°", - "toggle-right-pane": "åˆ‡ę¢å³ä¾§é¢ęæ", - "print-active-note": "ę‰“å°å½“å‰ē¬”č®°", - "export-active-note-as-pdf": "åÆ¼å‡ŗå½“å‰ē¬”č®°äøŗ PDF", - "open-note-externally": "åœØå¤–éƒØę‰“å¼€ē¬”č®°", - "render-active-note": "ęø²ęŸ“å½“å‰ē¬”č®°", - "run-active-note": "čæč”Œå½“å‰ē¬”č®°", - "toggle-note-hoisting": "ęå‡ē¬”č®°", - "unhoist-note": "å–ę¶ˆęå‡ē¬”č®°", - "reload-frontend-app": "é‡ę–°åŠ č½½å‰ē«Æåŗ”ē”Ø", - "open-developer-tools": "ę‰“å¼€å¼€å‘č€…å·„å…·", - "find-in-text": "åœØę–‡ęœ¬äø­ęŸ„ę‰¾", - "toggle-left-pane": "åˆ‡ę¢å·¦ä¾§é¢ęæ", - "toggle-full-screen": "åˆ‡ę¢å…Øå±ęØ”å¼" - }, - "share_theme": { - "site-theme": "ē½‘ē«™äø»é¢˜", - "search_placeholder": "搜瓢...", - "image_alt": "文章图片", - "last-updated": "ęœ€åŽę›“ę–°äŗŽ {{- date}}", - "subpages": "å­é”µé¢ļ¼š", - "on-this-page": "ęœ¬é”µå†…å®¹", - "expand": "展开" - }, - "hidden_subtree_templates": { - "text-snippet": "ę–‡ęœ¬ē‰‡ę®µ", - "description": "ęčæ°", - "list-view": "åˆ—č”Øč§†å›¾", - "grid-view": "网格视图", - "calendar": "ę—„åŽ†", - "table": "蔨格", - "geo-map": "åœ°ē†åœ°å›¾", - "start-date": "å¼€å§‹ę—„ęœŸ", - "end-date": "ē»“ęŸę—„ęœŸ", - "start-time": "开始时闓", - "end-time": "ē»“ęŸę—¶é—“", - "geolocation": "åœ°ē†ä½ē½®", - "built-in-templates": "å†…ē½®ęØ”ęæ", - "board": "ēœ‹ęæ", - "status": "ēŠ¶ę€", - "board_note_first": "第一个笔记", - "board_note_second": "ē¬¬äŗŒäøŖē¬”č®°", - "board_note_third": "第三个笔记", - "board_status_todo": "待办", - "board_status_progress": "čæ›č”Œäø­", - "board_status_done": "已完成" - } + "keyboard_actions": { + "open-jump-to-note-dialog": "ę‰“å¼€ā€œč·³č½¬åˆ°ē¬”č®°ā€åÆ¹čÆę”†", + "search-in-subtree": "åœØå½“å‰ē¬”č®°ēš„å­ę ‘äø­ęœē“¢ē¬”č®°", + "expand-subtree": "å±•å¼€å½“å‰ē¬”č®°ēš„å­ę ‘", + "collapse-tree": "ęŠ˜å å®Œę•“ēš„ē¬”č®°ę ‘", + "collapse-subtree": "ęŠ˜å å½“å‰ē¬”č®°ēš„å­ę ‘", + "sort-child-notes": "ęŽ’åŗå­ē¬”č®°", + "creating-and-moving-notes": "åˆ›å»ŗå’Œē§»åŠØē¬”č®°", + "create-note-into-inbox": "åœØę”¶ä»¶ē®±ļ¼ˆč‹„å·²å®šä¹‰ļ¼‰ęˆ–ę—„č®°äø­åˆ›å»ŗē¬”č®°", + "delete-note": "åˆ é™¤ē¬”č®°", + "move-note-up": "å‘äøŠē§»åŠØē¬”č®°", + "move-note-down": "å‘äø‹ē§»åŠØē¬”č®°", + "move-note-up-in-hierarchy": "åœØå±‚ēŗ§äø­å‘äøŠē§»åŠØē¬”č®°", + "move-note-down-in-hierarchy": "åœØå±‚ēŗ§äø­å‘äø‹ē§»åŠØē¬”č®°", + "edit-note-title": "ä»Žę ‘č·³č½¬åˆ°ē¬”č®°čÆ¦ęƒ…å¹¶ē¼–č¾‘ę ‡é¢˜", + "edit-branch-prefix": "ę˜¾ē¤ŗē¼–č¾‘åˆ†ę”Æå‰ē¼€åÆ¹čÆę”†", + "note-clipboard": "ē¬”č®°å‰Ŗč““ęæ", + "copy-notes-to-clipboard": "å¤åˆ¶é€‰å®šēš„ē¬”č®°åˆ°å‰Ŗč““ęæ", + "paste-notes-from-clipboard": "ä»Žå‰Ŗč““ęæē²˜č““ē¬”č®°åˆ°å½“å‰ē¬”č®°äø­", + "cut-notes-to-clipboard": "å‰Ŗåˆ‡é€‰å®šēš„ē¬”č®°åˆ°å‰Ŗč““ęæ", + "select-all-notes-in-parent": "é€‰ę‹©å½“å‰ē¬”č®°ēŗ§åˆ«ēš„ę‰€ęœ‰ē¬”č®°", + "add-note-above-to-the-selection": "å°†äøŠę–¹ē¬”č®°ę·»åŠ åˆ°é€‰ę‹©äø­", + "add-note-below-to-selection": "å°†äø‹ę–¹ē¬”č®°ę·»åŠ åˆ°é€‰ę‹©äø­", + "duplicate-subtree": "å¤åˆ¶å­ę ‘", + "tabs-and-windows": "ę ‡ē­¾é”µå’ŒēŖ—å£", + "open-new-tab": "打开新标签锵", + "close-active-tab": "å…³é—­å½“å‰ę ‡ē­¾é”µ", + "reopen-last-tab": "é‡ę–°ę‰“å¼€ęœ€åŽå…³é—­ēš„ę ‡ē­¾é”µ", + "activate-next-tab": "åˆ‡ę¢äø‹äø€äøŖę ‡ē­¾é”µ", + "activate-previous-tab": "åˆ‡ę¢äøŠäø€äøŖę ‡ē­¾é”µ", + "open-new-window": "ę‰“å¼€ę–°ēŖ—å£", + "toggle-tray": "显示/éšč—ē³»ē»Ÿę‰˜ē›˜å›¾ę ‡", + "first-tab": "åˆ‡ę¢åˆ°ē¬¬äø€äøŖę ‡ē­¾é”µ", + "second-tab": "åˆ‡ę¢åˆ°ē¬¬äŗŒäøŖę ‡ē­¾é”µ", + "third-tab": "åˆ‡ę¢åˆ°ē¬¬äø‰äøŖę ‡ē­¾é”µ", + "fourth-tab": "åˆ‡ę¢åˆ°ē¬¬å››äøŖę ‡ē­¾é”µ", + "fifth-tab": "åˆ‡ę¢åˆ°ē¬¬äŗ”äøŖę ‡ē­¾é”µ", + "sixth-tab": "åˆ‡ę¢åˆ°ē¬¬å…­äøŖę ‡ē­¾é”µ", + "seventh-tab": "åˆ‡ę¢åˆ°ē¬¬äøƒäøŖę ‡ē­¾é”µ", + "eight-tab": "åˆ‡ę¢åˆ°ē¬¬å…«äøŖę ‡ē­¾é”µ", + "ninth-tab": "åˆ‡ę¢åˆ°ē¬¬ä¹äøŖę ‡ē­¾é”µ", + "last-tab": "åˆ‡ę¢åˆ°ęœ€åŽäø€äøŖę ‡ē­¾é”µ", + "dialogs": "åÆ¹čÆę”†", + "show-note-source": "ę˜¾ē¤ŗē¬”č®°ęŗä»£ē åÆ¹čÆę”†", + "show-options": "ę˜¾ē¤ŗé€‰é”¹åÆ¹čÆę”†", + "show-revisions": "ę˜¾ē¤ŗäæ®č®¢åŽ†å²åÆ¹čÆę”†", + "show-recent-changes": "ę˜¾ē¤ŗęœ€čæ‘ę›“ę”¹åÆ¹čÆę”†", + "show-sql-console": "显示SQLęŽ§åˆ¶å°åÆ¹čÆę”†", + "show-backend-log": "ę˜¾ē¤ŗåŽē«Æę—„åæ—åÆ¹čÆę”†", + "text-note-operations": "ę–‡ęœ¬ē¬”č®°ę“ä½œ", + "add-link-to-text": "ę‰“å¼€åÆ¹čÆę”†ä»„ę·»åŠ é“¾ęŽ„åˆ°ę–‡ęœ¬", + "follow-link-under-cursor": "č®æé—®å…‰ę ‡äø‹ēš„é“¾ęŽ„", + "insert-date-and-time-to-text": "åœØę–‡ęœ¬äø­ę’å…„ę—„ęœŸå’Œę—¶é—“", + "paste-markdown-into-text": "ä»Žå‰Ŗč““ęæē²˜č““ Markdown åˆ°ę–‡ęœ¬ē¬”č®°", + "cut-into-note": "å‰Ŗåˆ‡å½“å‰ē¬”č®°ēš„é€‰åŒŗå¹¶åˆ›å»ŗåŒ…å«é€‰å®šę–‡ęœ¬ēš„å­ē¬”č®°", + "add-include-note-to-text": "ę‰“å¼€åÆ¹čÆę”†ä»„ę·»åŠ äø€äøŖåŒ…å«ē¬”č®°", + "edit-readonly-note": "ē¼–č¾‘åŖčÆ»ē¬”č®°", + "attributes-labels-and-relations": "å±žę€§ļ¼ˆę ‡ē­¾å’Œå…³ē³»ļ¼‰", + "add-new-label": "åˆ›å»ŗę–°ę ‡ē­¾", + "create-new-relation": "åˆ›å»ŗę–°å…³ē³»", + "ribbon-tabs": "åŠŸčƒ½åŒŗę ‡ē­¾é”µ", + "toggle-basic-properties": "åˆ‡ę¢åŸŗęœ¬å±žę€§", + "toggle-file-properties": "åˆ‡ę¢ę–‡ä»¶å±žę€§", + "toggle-image-properties": "åˆ‡ę¢å›¾åƒå±žę€§", + "toggle-owned-attributes": "åˆ‡ę¢ę‹„ęœ‰ēš„å±žę€§", + "toggle-inherited-attributes": "åˆ‡ę¢ē»§ę‰æēš„å±žę€§", + "toggle-promoted-attributes": "åˆ‡ę¢ęå‡ēš„å±žę€§", + "toggle-link-map": "åˆ‡ę¢é“¾ęŽ„åœ°å›¾", + "toggle-note-info": "åˆ‡ę¢ē¬”č®°äæ”ęÆ", + "toggle-note-paths": "åˆ‡ę¢ē¬”č®°č·Æå¾„", + "toggle-similar-notes": "åˆ‡ę¢ē›øä¼¼ē¬”č®°", + "other": "其他", + "toggle-right-pane": "åˆ‡ę¢å³ä¾§é¢ęæēš„ę˜¾ē¤ŗļ¼ŒåŒ…ę‹¬ē›®å½•å’Œé«˜äŗ®", + "print-active-note": "ę‰“å°å½“å‰ē¬”č®°", + "open-note-externally": "ä»„é»˜č®¤åŗ”ē”Øę‰“å¼€ē¬”č®°ę–‡ä»¶", + "render-active-note": "ęø²ęŸ“ļ¼ˆé‡ę–°ęø²ęŸ“ļ¼‰å½“å‰ē¬”č®°", + "run-active-note": "čæč”Œå½“å‰ JavaScriptļ¼ˆå‰/åŽē«Æļ¼‰ä»£ē ē¬”č®°", + "toggle-note-hoisting": "ęå‡ē¬”č®°", + "unhoist": "å–ę¶ˆęå‡ē¬”č®°", + "reload-frontend-app": "é‡ę–°åŠ č½½å‰ē«Æåŗ”ē”Ø", + "open-dev-tools": "ę‰“å¼€å¼€å‘č€…å·„å…·", + "toggle-left-note-tree-panel": "åˆ‡ę¢å·¦ä¾§ļ¼ˆē¬”č®°ę ‘ļ¼‰é¢ęæ", + "toggle-full-screen": "åˆ‡ę¢å…Øå±ęØ”å¼", + "zoom-out": "ē¼©å°", + "zoom-in": "放大", + "note-navigation": "ē¬”č®°åÆ¼čˆŖ", + "reset-zoom-level": "é‡ē½®ē¼©ę”¾ēŗ§åˆ«", + "copy-without-formatting": "ę— ę ¼å¼å¤åˆ¶é€‰å®šę–‡ęœ¬", + "force-save-revision": "å¼ŗåˆ¶åˆ›å»ŗ/äæå­˜å½“å‰ē¬”č®°ēš„ę–°äæ®č®¢ē‰ˆęœ¬", + "show-help": "显示帮助", + "toggle-book-properties": "åˆ‡ę¢ä¹¦ē±å±žę€§", + "toggle-classic-editor-toolbar": "äøŗē¼–č¾‘å™Øåˆ‡ę¢ę ¼å¼ę ‡ē­¾é”µēš„å›ŗå®šå·„å…·ę ", + "export-as-pdf": "åÆ¼å‡ŗå½“å‰ē¬”č®°äøŗ PDF", + "show-cheatsheet": "ę˜¾ē¤ŗåæ«ę·é”®ęŒ‡å—", + "toggle-zen-mode": "启用/ē¦ē”Øē¦…ęØ”å¼ļ¼ˆäøŗäø“ę³Øē¼–č¾‘č€Œē²¾ē®€ē•Œé¢ļ¼‰", + "open-command-palette": "ę‰“å¼€å‘½ä»¤é¢ęæ", + "quick-search": "ęæ€ę“»åæ«é€Ÿęœē“¢ę ", + "create-note-after": "åœØå½“å‰ē¬”č®°åŽé¢åˆ›å»ŗē¬”č®°", + "create-note-into": "åˆ›å»ŗē¬”č®°ä½œäøŗå½“å‰ē¬”č®°ēš„å­ē¬”č®°", + "clone-notes-to": "å…‹éš†é€‰äø­ēš„ē¬”č®°åˆ°", + "move-notes-to": "ē§»åŠØé€‰äø­ēš„ē¬”č®°åˆ°", + "find-in-text": "åœØę–‡ęœ¬äø­ęŸ„ę‰¾", + "back-in-note-history": "åÆ¼čˆŖåˆ°åŽ†å²č®°å½•äø­ēš„äøŠäø€äøŖē¬”č®°", + "forward-in-note-history": "åÆ¼čˆŖåˆ°åŽ†å²č®°å½•ēš„äø‹äø€äøŖē¬”č®°", + "scroll-to-active-note": "ę»šåŠØē¬”č®°ę ‘åˆ°å½“å‰ē¬”č®°" + }, + "login": { + "title": "登录", + "heading": "Trilium 登录", + "incorrect-totp": "TOTP äøę­£ē”®ļ¼ŒčÆ·é‡čÆ•ć€‚", + "incorrect-password": "åÆ†ē äøę­£ē”®ļ¼ŒčÆ·é‡čÆ•ć€‚", + "password": "密码", + "remember-me": "č®°ä½ęˆ‘", + "button": "登录", + "sign_in_with_sso": "使用 {{ ssoIssuerName }} 登录" + }, + "set_password": { + "title": "设置密码", + "heading": "设置密码", + "description": "åœØę‚Øčƒ½å¤Ÿä»ŽWeb开始使用Triliumä¹‹å‰ļ¼Œę‚Øéœ€č¦å…ˆč®¾ē½®äø€äøŖåÆ†ē ć€‚ę‚Øä¹‹åŽå°†ä½æē”Øę­¤åÆ†ē ē™»å½•ć€‚", + "password": "密码", + "password-confirmation": "密码甮认", + "button": "设置密码" + }, + "javascript-required": "Triliuméœ€č¦åÆē”ØJavaScript怂", + "setup": { + "heading": "TriliumNext笔记设置", + "new-document": "ęˆ‘ę˜Æę–°ē”Øęˆ·ļ¼Œęˆ‘ęƒ³äøŗęˆ‘ēš„ē¬”č®°åˆ›å»ŗäø€äøŖę–°ēš„Trilium文攣", + "sync-from-desktop": "ęˆ‘å·²ē»ęœ‰äø€äøŖę”Œé¢å®žä¾‹ļ¼Œęˆ‘ęƒ³č®¾ē½®äøŽå®ƒēš„åŒę­„", + "sync-from-server": "ęˆ‘å·²ē»ęœ‰äø€äøŖęœåŠ”å™Øå®žä¾‹ļ¼Œęˆ‘ęƒ³č®¾ē½®äøŽå®ƒēš„åŒę­„", + "next": "下一歄", + "init-in-progress": "ę–‡ę”£åˆå§‹åŒ–čæ›č”Œäø­", + "redirecting": "ę‚Øå°†å¾ˆåæ«č¢«é‡å®šå‘åˆ°åŗ”ē”ØēØ‹åŗć€‚", + "title": "设置" + }, + "setup_sync-from-desktop": { + "heading": "ä»Žę”Œé¢åŒę­„", + "description": "ę­¤č®¾ē½®éœ€č¦ä»Žę”Œé¢å®žä¾‹å¼€å§‹ļ¼š", + "step1": "ę‰“å¼€ę‚Øēš„TriliumNextē¬”č®°ę”Œé¢å®žä¾‹ć€‚", + "step2": "从Triliumčœå•äø­ļ¼Œē‚¹å‡»ā€œé€‰é”¹ā€ć€‚", + "step3": "ē‚¹å‡»ā€œåŒę­„ā€ē±»åˆ«ć€‚", + "step4": "å°†ęœåŠ”å™Øå®žä¾‹åœ°å€ę›“ę”¹äøŗļ¼š{{- host}} å¹¶ē‚¹å‡»äæå­˜ć€‚", + "step5": "ē‚¹å‡»ā€œęµ‹čÆ•åŒę­„ā€ęŒ‰é’®ä»„éŖŒčÆčæžęŽ„ę˜Æå¦ęˆåŠŸć€‚", + "step6": "å®Œęˆčæ™äŗ›ę­„éŖ¤åŽļ¼Œē‚¹å‡»{{- link}}怂", + "step6-here": "čæ™é‡Œ" + }, + "setup_sync-from-server": { + "heading": "ä»ŽęœåŠ”å™ØåŒę­„", + "instructions": "čÆ·åœØäø‹é¢č¾“å…„TriliumęœåŠ”å™Øåœ°å€å’Œå‡­ę®ć€‚čæ™å°†ä»ŽęœåŠ”å™Øäø‹č½½ę•“äøŖTriliumę–‡ę”£å¹¶č®¾ē½®äøŽå®ƒēš„åŒę­„ć€‚ę ¹ę®ę–‡ę”£å¤§å°å’Œę‚Øēš„čæžęŽ„ēš„é€Ÿåŗ¦ļ¼Œčæ™åÆčƒ½éœ€č¦äø€ę®µę—¶é—“ć€‚", + "server-host": "TriliumęœåŠ”å™Øåœ°å€", + "server-host-placeholder": "https://<äø»ęœŗåē§°>:<ē«Æå£>", + "proxy-server": "ä»£ē†ęœåŠ”å™Øļ¼ˆåÆé€‰ļ¼‰", + "proxy-server-placeholder": "https://<äø»ęœŗåē§°>:<ē«Æå£>", + "note": "ę³Øę„ļ¼š", + "proxy-instruction": "å¦‚ęžœę‚Øå°†ä»£ē†č®¾ē½®ē•™ē©ŗļ¼Œå°†ä½æē”Øē³»ē»Ÿä»£ē†ļ¼ˆä»…é€‚ē”ØäŗŽę”Œé¢åŗ”ē”Øļ¼‰", + "password": "密码", + "password-placeholder": "密码", + "back": "čæ”å›ž", + "finish-setup": "完成设置" + }, + "setup_sync-in-progress": { + "heading": "同歄中", + "successful": "åŒę­„å·²č¢«ę­£ē”®č®¾ē½®ć€‚åˆå§‹åŒę­„å®ŒęˆåÆčƒ½éœ€č¦äø€äŗ›ę—¶é—“ć€‚å®ŒęˆåŽļ¼Œę‚Øå°†č¢«é‡å®šå‘åˆ°ē™»å½•é”µé¢ć€‚", + "outstanding-items": "ęœŖå®Œęˆēš„åŒę­„é”¹ē›®ļ¼š", + "outstanding-items-default": "ꗠ" + }, + "share_404": { + "title": "ęœŖę‰¾åˆ°", + "heading": "ęœŖę‰¾åˆ°" + }, + "share_page": { + "parent": "父级:", + "clipped-from": "ę­¤ē¬”č®°ęœ€åˆå‰Ŗåˆ‡č‡Ŗ {{- url}}", + "child-notes": "å­ē¬”č®°ļ¼š", + "no-content": "ę­¤ē¬”č®°ę²”ęœ‰å†…å®¹ć€‚" + }, + "weekdays": { + "monday": "周一", + "tuesday": "å‘ØäŗŒ", + "wednesday": "周三", + "thursday": "周四", + "friday": "周五", + "saturday": "周六", + "sunday": "周旄" + }, + "weekdayNumber": "第 {weekNumber} 周", + "months": { + "january": "äø€ęœˆ", + "february": "二月", + "march": "äø‰ęœˆ", + "april": "å››ęœˆ", + "may": "äŗ”ęœˆ", + "june": "å…­ęœˆ", + "july": "七月", + "august": "å…«ęœˆ", + "september": "ä¹ęœˆ", + "october": "åęœˆ", + "november": "åäø€ęœˆ", + "december": "åäŗŒęœˆ" + }, + "quarterNumber": "第 {quarterNumber} 季度", + "special_notes": { + "search_prefix": "搜瓢:" + }, + "test_sync": { + "not-configured": "åŒę­„ęœåŠ”å™Øäø»ęœŗęœŖé…ē½®ć€‚čÆ·å…ˆé…ē½®åŒę­„ć€‚", + "successful": "åŒę­„ęœåŠ”å™Øę”ę‰‹ęˆåŠŸļ¼ŒåŒę­„å·²å¼€å§‹ć€‚" + }, + "hidden-subtree": { + "root-title": "éšč—ēš„ē¬”č®°", + "search-history-title": "ęœē“¢åŽ†å²", + "note-map-title": "ē¬”č®°åœ°å›¾", + "sql-console-history-title": "SQL ęŽ§åˆ¶å°åŽ†å²", + "shared-notes-title": "共享笔记", + "bulk-action-title": "ę‰¹é‡ę“ä½œ", + "backend-log-title": "åŽē«Æę—„åæ—", + "user-hidden-title": "éšč—ēš„ē”Øęˆ·", + "launch-bar-templates-title": "åÆåŠØę ęØ”ęæ", + "base-abstract-launcher-title": "åŸŗē”€ę‘˜č¦åÆåŠØå™Ø", + "command-launcher-title": "å‘½ä»¤åÆåŠØå™Ø", + "note-launcher-title": "ē¬”č®°åÆåŠØå™Ø", + "script-launcher-title": "č„šęœ¬åÆåŠØå™Ø", + "built-in-widget-title": "å†…ē½®å°ē»„ä»¶", + "spacer-title": "ē©ŗē™½å ä½", + "custom-widget-title": "č‡Ŗå®šä¹‰å°ē»„ä»¶", + "launch-bar-title": "åÆåŠØę ", + "available-launchers-title": "åÆē”ØåÆåŠØå™Ø", + "go-to-previous-note-title": "č·³č½¬åˆ°äøŠäø€ę”ē¬”č®°", + "go-to-next-note-title": "č·³č½¬åˆ°äø‹äø€ę”ē¬”č®°", + "new-note-title": "新建笔记", + "search-notes-title": "ęœē“¢ē¬”č®°", + "calendar-title": "ę—„åŽ†", + "recent-changes-title": "ęœ€čæ‘ę›“ę”¹", + "bookmarks-title": "书签", + "open-today-journal-note-title": "ę‰“å¼€ä»Šå¤©ēš„ę—„č®°ē¬”č®°", + "quick-search-title": "åæ«é€Ÿęœē“¢", + "protected-session-title": "å—äæęŠ¤ēš„ä¼ščÆ", + "sync-status-title": "åŒę­„ēŠ¶ę€", + "settings-title": "设置", + "options-title": "选锹", + "appearance-title": "外观", + "shortcuts-title": "åæ«ę·é”®", + "text-notes": "ę–‡ęœ¬ē¬”č®°", + "code-notes-title": "代码笔记", + "images-title": "图片", + "spellcheck-title": "ę‹¼å†™ę£€ęŸ„", + "password-title": "密码", + "multi-factor-authentication-title": "å¤šå› ē“ č®¤čÆ", + "etapi-title": "ETAPI", + "backup-title": "备份", + "sync-title": "同歄", + "other": "其他", + "advanced-title": "高级", + "visible-launchers-title": "åÆč§åÆåŠØå™Ø", + "user-guide": "ē”Øęˆ·ęŒ‡å—", + "localization": "čÆ­čØ€å’ŒåŒŗåŸŸ", + "jump-to-note-title": "跳转至...", + "llm-chat-title": "äøŽē¬”č®°čŠå¤©", + "ai-llm-title": "AI/LLM", + "inbox-title": "ę”¶ä»¶ē®±" + }, + "notes": { + "new-note": "新建笔记", + "duplicate-note-suffix": "(重复)", + "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" + }, + "backend_log": { + "log-does-not-exist": "åŽē«Æę—„åæ—ę–‡ä»¶ '{{ fileName }}' ęš‚äøå­˜åœØć€‚", + "reading-log-failed": "čÆ»å–åŽē«Æę—„åæ—ę–‡ä»¶ '{{ fileName }}' 失蓄。" + }, + "content_renderer": { + "note-cannot-be-displayed": "ę­¤ē¬”č®°ē±»åž‹ę— ę³•ę˜¾ē¤ŗć€‚" + }, + "pdf": { + "export_filter": "PDF 文攣 (*.pdf)", + "unable-to-export-message": "å½“å‰ē¬”č®°ę— ę³•č¢«åÆ¼å‡ŗäøŗ PDF怂", + "unable-to-export-title": "无法导出为 PDF", + "unable-to-save-message": "ę‰€é€‰ę–‡ä»¶äøčƒ½č¢«å†™å…„ć€‚é‡čÆ•ęˆ–é€‰ę‹©å¦äø€äøŖē›®ēš„åœ°ć€‚" + }, + "tray": { + "tooltip": "TriliumNext 笔记", + "close": "退出 Trilium", + "recents": "ęœ€čæ‘ē¬”č®°", + "bookmarks": "书签", + "today": "ę‰“å¼€ä»Šå¤©ēš„ę—„č®°ē¬”č®°", + "new-note": "新建笔记", + "show-windows": "ę˜¾ē¤ŗēŖ—å£", + "open_new_window": "ę‰“å¼€ę–°ēŖ—å£" + }, + "migration": { + "old_version": "ē”±ę‚Øå½“å‰ē‰ˆęœ¬ēš„ē›“ęŽ„čæē§»äøč¢«ę”ÆęŒć€‚čÆ·å…ˆå‡ēŗ§åˆ°ęœ€ę–°ēš„ v0.60.4 ē„¶åŽå†åˆ°čæ™äøŖē‰ˆęœ¬ć€‚", + "error_message": "čæē§»åˆ°ē‰ˆęœ¬ {{version}} ę—¶å‘ē”Ÿé”™čÆÆ: {{stack}}", + "wrong_db_version": "ę•°ę®åŗ“ēš„ē‰ˆęœ¬ļ¼ˆ{{version}}ļ¼‰ę–°äŗŽåŗ”ē”ØęœŸęœ›ēš„ē‰ˆęœ¬ļ¼ˆ{{targetVersion}}ļ¼‰ļ¼Œčæ™ę„å‘³ē€å®ƒē”±äø€äøŖę›“åŠ ę–°ēš„äø”äøå…¼å®¹ēš„ Trilium ę‰€åˆ›å»ŗć€‚å‡ēŗ§åˆ°ęœ€ę–°ē‰ˆēš„ Trilium ä»„č§£å†³ę­¤é—®é¢˜ć€‚" + }, + "modals": { + "error_title": "错误" + }, + "keyboard_action_names": { + "back-in-note-history": "čæ”å›žē¬”č®°åŽ†å²", + "forward-in-note-history": "å‰čæ›ē¬”č®°åŽ†å²", + "jump-to-note": "跳转到...", + "command-palette": "å‘½ä»¤é¢ęæ", + "scroll-to-active-note": "ę»šåŠØåˆ°å½“å‰ē¬”č®°", + "quick-search": "åæ«é€Ÿęœē“¢", + "search-in-subtree": "åœØå­ę ‘äø­ęœē“¢", + "expand-subtree": "展开子树", + "collapse-tree": "ęŠ˜å ę•“äøŖę ‘", + "collapse-subtree": "ęŠ˜å å­ę ‘", + "sort-child-notes": "ęŽ’åŗå­ē¬”č®°", + "create-note-after": "åœØåŽé¢åˆ›å»ŗē¬”č®°", + "create-note-into": "åˆ›å»ŗē¬”č®°åˆ°", + "create-note-into-inbox": "åˆ›å»ŗē¬”č®°åˆ°ę”¶ä»¶ē®±", + "delete-notes": "åˆ é™¤ē¬”č®°", + "move-note-up": "äøŠē§»ē¬”č®°", + "move-note-down": "下移笔记", + "move-note-up-in-hierarchy": "åœØå±‚ēŗ§äø­äøŠē§»ē¬”č®°", + "move-note-down-in-hierarchy": "åœØå±‚ēŗ§äø­äø‹ē§»ē¬”č®°", + "edit-note-title": "ē¼–č¾‘ē¬”č®°ę ‡é¢˜", + "edit-branch-prefix": "ē¼–č¾‘åˆ†ę”Æå‰ē¼€", + "clone-notes-to": "å…‹éš†ē¬”č®°åˆ°", + "move-notes-to": "ē§»åŠØē¬”č®°åˆ°", + "copy-notes-to-clipboard": "å¤åˆ¶ē¬”č®°åˆ°å‰Ŗč““ęæ", + "paste-notes-from-clipboard": "ä»Žå‰Ŗč““ęæē²˜č““ē¬”č®°", + "cut-notes-to-clipboard": "å‰Ŗåˆ‡ē¬”č®°åˆ°å‰Ŗč““ęæ", + "select-all-notes-in-parent": "é€‰ę‹©ēˆ¶čŠ‚ē‚¹äø­ę‰€ęœ‰ē¬”č®°", + "zoom-in": "放大", + "zoom-out": "ē¼©å°", + "reset-zoom-level": "é‡ē½®ē¼©ę”¾ēŗ§åˆ«", + "copy-without-formatting": "ę— ę ¼å¼å¤åˆ¶", + "force-save-revision": "å¼ŗåˆ¶äæå­˜äæ®č®¢ē‰ˆęœ¬", + "add-note-above-to-selection": "å°†äøŠę–¹ē¬”č®°ę·»åŠ åˆ°é€‰ę‹©", + "add-note-below-to-selection": "å°†äø‹ę–¹ē¬”č®°ę·»åŠ åˆ°é€‰ę‹©", + "duplicate-subtree": "å¤åˆ¶å­ę ‘", + "open-new-tab": "打开新标签锵", + "close-active-tab": "å…³é—­å½“å‰ę ‡ē­¾é”µ", + "reopen-last-tab": "é‡ę–°ę‰“å¼€ęœ€åŽå…³é—­ēš„ę ‡ē­¾é”µ", + "activate-next-tab": "åˆ‡ę¢äø‹äø€äøŖę ‡ē­¾é”µ", + "activate-previous-tab": "åˆ‡ę¢äøŠäø€äøŖę ‡ē­¾é”µ", + "open-new-window": "ę‰“å¼€ę–°ēŖ—å£", + "toggle-system-tray-icon": "显示/éšč—ē³»ē»Ÿę‰˜ē›˜å›¾ę ‡", + "toggle-zen-mode": "启用/ē¦ē”Øē¦…ęØ”å¼", + "switch-to-first-tab": "åˆ‡ę¢åˆ°ē¬¬äø€äøŖę ‡ē­¾é”µ", + "switch-to-second-tab": "åˆ‡ę¢åˆ°ē¬¬äŗŒäøŖę ‡ē­¾é”µ", + "switch-to-third-tab": "åˆ‡ę¢åˆ°ē¬¬äø‰äøŖę ‡ē­¾é”µ", + "switch-to-fourth-tab": "åˆ‡ę¢åˆ°ē¬¬å››äøŖę ‡ē­¾é”µ", + "switch-to-fifth-tab": "åˆ‡ę¢åˆ°ē¬¬äŗ”äøŖę ‡ē­¾é”µ", + "switch-to-sixth-tab": "åˆ‡ę¢åˆ°ē¬¬å…­äøŖę ‡ē­¾é”µ", + "switch-to-seventh-tab": "åˆ‡ę¢åˆ°ē¬¬äøƒäøŖę ‡ē­¾é”µ", + "switch-to-eighth-tab": "åˆ‡ę¢åˆ°ē¬¬å…«äøŖę ‡ē­¾é”µ", + "switch-to-ninth-tab": "åˆ‡ę¢åˆ°ē¬¬ä¹äøŖę ‡ē­¾é”µ", + "switch-to-last-tab": "åˆ‡ę¢åˆ°ęœ€åŽäø€äøŖę ‡ē­¾é”µ", + "show-note-source": "ę˜¾ē¤ŗē¬”č®°ęŗä»£ē ", + "show-options": "ę˜¾ē¤ŗé€‰é”¹", + "show-revisions": "ę˜¾ē¤ŗäæ®č®¢åŽ†å²", + "show-recent-changes": "ę˜¾ē¤ŗęœ€čæ‘ę›“ę”¹", + "show-sql-console": "显示SQLęŽ§åˆ¶å°", + "show-backend-log": "ę˜¾ē¤ŗåŽē«Æę—„åæ—", + "show-help": "显示帮助", + "show-cheatsheet": "ę˜¾ē¤ŗåæ«ę·é”®ęŒ‡å—", + "add-link-to-text": "äøŗę–‡ęœ¬ę·»åŠ é“¾ęŽ„", + "follow-link-under-cursor": "č®æé—®å…‰ę ‡äø‹ēš„é“¾ęŽ„", + "insert-date-and-time-to-text": "åœØę–‡ęœ¬äø­ę’å…„ę—„ęœŸå’Œę—¶é—“", + "paste-markdown-into-text": "粘蓓Markdownåˆ°ę–‡ęœ¬", + "cut-into-note": "å‰Ŗåˆ‡åˆ°ē¬”č®°", + "add-include-note-to-text": "åœØę–‡ęœ¬äø­ę·»åŠ åŒ…å«ē¬”č®°", + "edit-read-only-note": "ē¼–č¾‘åŖčÆ»ē¬”č®°", + "add-new-label": "ę·»åŠ ę–°ę ‡ē­¾", + "add-new-relation": "ę·»åŠ ę–°å…³ē³»", + "toggle-ribbon-tab-classic-editor": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē»å…øē¼–č¾‘å™Ø", + "toggle-ribbon-tab-basic-properties": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šåŸŗęœ¬å±žę€§", + "toggle-ribbon-tab-book-properties": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šä¹¦ē±å±žę€§", + "toggle-ribbon-tab-file-properties": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šę–‡ä»¶å±žę€§", + "toggle-ribbon-tab-image-properties": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šå›¾ē‰‡å±žę€§", + "toggle-ribbon-tab-owned-attributes": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šč‡Ŗęœ‰å±žę€§", + "toggle-ribbon-tab-inherited-attributes": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē»§ę‰æå±žę€§", + "toggle-ribbon-tab-promoted-attributes": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šęå‡å±žę€§", + "toggle-ribbon-tab-note-map": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē¬”č®°åœ°å›¾", + "toggle-ribbon-tab-note-info": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē¬”č®°äæ”ęÆ", + "toggle-ribbon-tab-note-paths": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē¬”č®°č·Æå¾„", + "toggle-ribbon-tab-similar-notes": "åˆ‡ę¢åŠŸčƒ½åŒŗę ‡ē­¾ļ¼šē›øä¼¼ē¬”č®°", + "toggle-right-pane": "åˆ‡ę¢å³ä¾§é¢ęæ", + "print-active-note": "ę‰“å°å½“å‰ē¬”č®°", + "export-active-note-as-pdf": "åÆ¼å‡ŗå½“å‰ē¬”č®°äøŗ PDF", + "open-note-externally": "åœØå¤–éƒØę‰“å¼€ē¬”č®°", + "render-active-note": "ęø²ęŸ“å½“å‰ē¬”č®°", + "run-active-note": "čæč”Œå½“å‰ē¬”č®°", + "toggle-note-hoisting": "ęå‡ē¬”č®°", + "unhoist-note": "å–ę¶ˆęå‡ē¬”č®°", + "reload-frontend-app": "é‡ę–°åŠ č½½å‰ē«Æåŗ”ē”Ø", + "open-developer-tools": "ę‰“å¼€å¼€å‘č€…å·„å…·", + "find-in-text": "åœØę–‡ęœ¬äø­ęŸ„ę‰¾", + "toggle-left-pane": "åˆ‡ę¢å·¦ä¾§é¢ęæ", + "toggle-full-screen": "åˆ‡ę¢å…Øå±ęØ”å¼" + }, + "share_theme": { + "site-theme": "ē½‘ē«™äø»é¢˜", + "search_placeholder": "搜瓢...", + "image_alt": "文章图片", + "last-updated": "ęœ€åŽę›“ę–°äŗŽ {{- date}}", + "subpages": "å­é”µé¢ļ¼š", + "on-this-page": "ęœ¬é”µå†…å®¹", + "expand": "展开" + }, + "hidden_subtree_templates": { + "text-snippet": "ę–‡ęœ¬ē‰‡ę®µ", + "description": "ęčæ°", + "list-view": "åˆ—č”Øč§†å›¾", + "grid-view": "网格视图", + "calendar": "ę—„åŽ†", + "table": "蔨格", + "geo-map": "åœ°ē†åœ°å›¾", + "start-date": "å¼€å§‹ę—„ęœŸ", + "end-date": "ē»“ęŸę—„ęœŸ", + "start-time": "开始时闓", + "end-time": "ē»“ęŸę—¶é—“", + "geolocation": "åœ°ē†ä½ē½®", + "built-in-templates": "å†…ē½®ęØ”ęæ", + "board": "ēœ‹ęæ", + "status": "ēŠ¶ę€", + "board_note_first": "第一个笔记", + "board_note_second": "ē¬¬äŗŒäøŖē¬”č®°", + "board_note_third": "第三个笔记", + "board_status_todo": "待办", + "board_status_progress": "čæ›č”Œäø­", + "board_status_done": "已完成", + "presentation": "演示", + "presentation_slide": "演示幻灯片", + "presentation_slide_first": "第一张幻灯片", + "presentation_slide_second": "ē¬¬äŗŒå¼ å¹»ēÆē‰‡", + "background": "čƒŒę™Æ" + }, + "sql_init": { + "db_not_initialized_desktop": "ę•°ę®åŗ“å°šęœŖåˆå§‹åŒ–ļ¼ŒčÆ·ä¾ē…§å±å¹•ęē¤ŗę“ä½œć€‚", + "db_not_initialized_server": "ę•°ę®åŗ“å°šęœŖåˆå§‹åŒ–ļ¼ŒčÆ·č®æé—®č®¾ē½®é”µé¢ http://[your-server-host]:{{port}} ęŸ„ēœ‹å¦‚ä½•åˆå§‹åŒ– Trilium怂" + }, + "desktop": { + "instance_already_running": "å·²ē»ęœ‰äø€äøŖčæč”Œäø­ēš„å®žä¾‹ļ¼Œę­£åœØå°†ē„¦ē‚¹åˆ‡ę¢åˆ°čÆ„å®žä¾‹ć€‚" + } } diff --git a/apps/server/src/assets/translations/cs/server.json b/apps/server/src/assets/translations/cs/server.json new file mode 100644 index 000000000..72710a16e --- /dev/null +++ b/apps/server/src/assets/translations/cs/server.json @@ -0,0 +1,24 @@ +{ + "keyboard_actions": { + "back-in-note-history": "Navigovat na předchozĆ­ poznĆ”mku v historii", + "forward-in-note-history": "Navigovat na nĆ”sledujĆ­cĆ­ poznĆ”mku v historii", + "open-jump-to-note-dialog": "Otevřít dialog \"PřejĆ­t na poznĆ”mku\"", + "open-command-palette": "Otevřít paletu příkazÅÆ", + "scroll-to-active-note": "Posunout strom poznĆ”mek na aktivnĆ­ položku", + "quick-search": "Zobrazit pole pro rychlĆ© hledĆ”nĆ­", + "search-in-subtree": "Hledat poznĆ”mky pod aktuĆ”lně zvolenou", + "expand-subtree": "Rozbalit podstrom aktivnĆ­ poznĆ”mky", + "collapse-tree": "Sbalit celý strom poznĆ”mek", + "collapse-subtree": "SbalĆ­ podstrom aktivnĆ­ poznĆ”mky", + "sort-child-notes": "Seřadit podřízenĆ© poznĆ”mky", + "creating-and-moving-notes": "VytvÔřenĆ­ a přesouvĆ”nĆ­ poznĆ”mek", + "create-note-after": "Vytvořit poznĆ”mku za aktivnĆ­ poznĆ”mkou", + "create-note-into": "Vytvořit poznĆ”mku jako potomka aktivnĆ­ poznĆ”mky", + "create-note-into-inbox": "Vytvořit poznĆ”mku v inboxu (pokud je definovĆ”n) nebo dennĆ­ poznĆ”mku", + "delete-note": "Smazat poznĆ”mku", + "move-note-up": "Posunout poznĆ”mku nahoru", + "move-note-down": "Posunout poznĆ”mku dolÅÆ", + "move-note-up-in-hierarchy": "Přesunout poznĆ”mku o Ćŗroveň výŔe", + "move-note-down-in-hierarchy": "Přesunout poznĆ”mku ve struktuře níže" + } +} diff --git a/apps/server/src/assets/translations/de/server.json b/apps/server/src/assets/translations/de/server.json index 63f4a58fd..6ee28f60f 100644 --- a/apps/server/src/assets/translations/de/server.json +++ b/apps/server/src/assets/translations/de/server.json @@ -307,7 +307,12 @@ "board_note_second": "Zweite Notiz", "board_note_third": "Dritte Notiz", "board_status_todo": "To-Do", - "board_status_progress": "In Bearbeitung" + "board_status_progress": "In Bearbeitung", + "presentation": "PrƤsentation", + "presentation_slide": "PrƤsentationsfolie", + "presentation_slide_first": "Erste Folie", + "presentation_slide_second": "Zweite Folie", + "background": "Hintergrund" }, "keyboard_action_names": { "copy-notes-to-clipboard": "Notizen in Zwischenablage kopieren", @@ -424,5 +429,12 @@ "subpages": "Unterseiten:", "on-this-page": "Auf dieser Seite", "expand": "Erweitern" + }, + "sql_init": { + "db_not_initialized_desktop": "Datenbank nicht initialisiert, bitte folge den Anweisungen auf dem Bildschirm.", + "db_not_initialized_server": "DB nicht initialisiert, bitte besuche die Einrichtungsseite - http://[Server-Host]:{{port}}, um Anweisungen zur Initialisierung von Trilium zu erhalten." + }, + "desktop": { + "instance_already_running": "Es lƤuft bereits eine Instanz, bitte beachte stattdessen diese Instanz." } } diff --git a/apps/server/src/assets/translations/el/server.json b/apps/server/src/assets/translations/el/server.json index 0967ef424..7f584b034 100644 --- a/apps/server/src/assets/translations/el/server.json +++ b/apps/server/src/assets/translations/el/server.json @@ -1 +1,8 @@ -{} +{ + "keyboard_actions": { + "back-in-note-history": "ĪœĪµĻ„Ī¬Ī²Ī±ĻƒĪ· ĻƒĻ„Ī·Ī½ Ļ€ĻĪæĪ·Ī³ĪæĻĪ¼ĪµĪ½Ī· ĻƒĪ·Ī¼ĪµĪÆĻ‰ĻƒĪ· ĻƒĻ„Īæ Ī¹ĻƒĻ„ĪæĻĪ¹ĪŗĻŒ", + "forward-in-note-history": "ĪœĪµĻ„Ī±Ī²ĪµĪÆĻ„Īµ ĻƒĻ„Ī·Ī½ ĪµĻ€ĻŒĪ¼ĪµĪ½Ī· ĻƒĪ·Ī¼ĪµĪÆĻ‰ĻƒĪ· ĻƒĻ„Īæ Ī¹ĻƒĻ„ĪæĻĪ¹ĪŗĻŒ", + "open-jump-to-note-dialog": "Ανοίξτε το παράθυρο Ī“Ī¹Ī±Ī»ĻŒĪ³ĪæĻ… \"ĪœĪµĻ„Ī¬Ī²Ī±ĻƒĪ· ĻƒĻ„Ī· ĻƒĪ·Ī¼ĪµĪÆĻ‰ĻƒĪ·\"", + "open-command-palette": "Άνοιγμα παλέτας ĪµĪ½Ļ„ĪæĪ»ĻŽĪ½" + } +} diff --git a/apps/server/src/assets/translations/en/server.json b/apps/server/src/assets/translations/en/server.json index 5837c7321..972f45154 100644 --- a/apps/server/src/assets/translations/en/server.json +++ b/apps/server/src/assets/translations/en/server.json @@ -373,7 +373,8 @@ "export_filter": "PDF Document (*.pdf)", "unable-to-export-message": "The current note could not be exported as a PDF.", "unable-to-export-title": "Unable to export as PDF", - "unable-to-save-message": "The selected file could not be written to. Try again or select another destination." + "unable-to-save-message": "The selected file could not be written to. Try again or select another destination.", + "unable-to-print": "Unable to print the note" }, "tray": { "tooltip": "Trilium Notes", @@ -423,6 +424,18 @@ "board_note_third": "Third note", "board_status_todo": "To Do", "board_status_progress": "In Progress", - "board_status_done": "Done" + "board_status_done": "Done", + "presentation": "Presentation", + "presentation_slide": "Presentation slide", + "presentation_slide_first": "First slide", + "presentation_slide_second": "Second slide", + "background": "Background" + }, + "sql_init": { + "db_not_initialized_desktop": "DB not initialized, please follow on-screen instructions.", + "db_not_initialized_server": "DB not initialized, please visit setup page - http://[your-server-host]:{{port}} to see instructions on how to initialize Trilium." + }, + "desktop": { + "instance_already_running": "There's already an instance running, focusing that instance instead." } } diff --git a/apps/server/src/assets/translations/es/server.json b/apps/server/src/assets/translations/es/server.json index 39ee936db..2577e2442 100644 --- a/apps/server/src/assets/translations/es/server.json +++ b/apps/server/src/assets/translations/es/server.json @@ -1,428 +1,439 @@ { - "keyboard_actions": { - "back-in-note-history": "Navegar a la nota previa en el historial", - "forward-in-note-history": "Navegar a la nota siguiente en el historial", - "open-jump-to-note-dialog": "Abrir cuadro de diĆ”logo \"Saltar a nota\"", - "scroll-to-active-note": "Desplazarse a la nota activa en el Ć”rbol de notas", - "quick-search": "Activar barra de bĆŗsqueda rĆ”pida", - "search-in-subtree": "Buscar notas en el subĆ”rbol de la nota activa", - "expand-subtree": "Expandir el subĆ”rbol de la nota actual", - "collapse-tree": "Colapsa el Ć”rbol de notas completo", - "collapse-subtree": "Colapsa el subĆ”rbol de la nota actual", - "sort-child-notes": "Ordenar subnotas", - "creating-and-moving-notes": "Creando y moviendo notas", - "create-note-after": "Crear nota despuĆ©s de la nota activa", - "create-note-into": "Crear nota como subnota de la nota activa", - "create-note-into-inbox": "Crear una nota en la bandeja de entrada (si estĆ” definida) o nota del dĆ­a", - "delete-note": "Eliminar nota", - "move-note-up": "Subir nota", - "move-note-down": "Bajar nota", - "move-note-up-in-hierarchy": "Subir nota en la jerarquĆ­a", - "move-note-down-in-hierarchy": "Bajar nota en la jerarquĆ­a", - "edit-note-title": "Saltar del Ć”rbol al detalle de la nota y editar el tĆ­tulo", - "edit-branch-prefix": "Mostrar cuadro de diĆ”logo Editar prefijo de rama", - "note-clipboard": "Portapapeles de notas", - "copy-notes-to-clipboard": "Copiar las notas seleccionadas al portapapeles", - "paste-notes-from-clipboard": "Pegar las notas del portapapeles en una nota activa", - "cut-notes-to-clipboard": "Cortar las notas seleccionadas al portapapeles", - "select-all-notes-in-parent": "Seleccionar todas las notas del nivel de la nota actual", - "add-note-above-to-the-selection": "Agregar nota arriba de la selección", - "add-note-below-to-selection": "Agregar nota arriba de la selección", - "duplicate-subtree": "Duplicar subĆ”rbol", - "tabs-and-windows": "PestaƱas y ventanas", - "open-new-tab": "Abre una nueva pestaƱa", - "close-active-tab": "Cierra la pestaƱa activa", - "reopen-last-tab": "Vuelve a abrir la Ćŗltima pestaƱa cerrada", - "activate-next-tab": "Activa la pestaƱa de la derecha", - "activate-previous-tab": "Activa la pestaƱa de la izquierda", - "open-new-window": "Abrir nueva ventana vacĆ­a", - "toggle-tray": "Muestra/Oculta la aplicación en la bandeja del sistema", - "first-tab": "Activa la primera pestaƱa de la lista", - "second-tab": "Activa la segunda pestaƱa de la lista", - "third-tab": "Activa la tercera pestaƱa de la lista", - "fourth-tab": "Activa la cuarta pestaƱa de la lista", - "fifth-tab": "Activa la quinta pestaƱa de la lista", - "sixth-tab": "Activa la sexta pestaƱa de la lista", - "seventh-tab": "Activa la sĆ©ptima pestaƱa de la lista", - "eight-tab": "Activa la octava pestaƱa de la lista", - "ninth-tab": "Activa la novena pestaƱa de la lista", - "last-tab": "Activa la Ćŗltima pestaƱa de la lista", - "dialogs": "DiĆ”logos", - "show-note-source": "Muestra el cuadro de diĆ”logo Fuente de nota", - "show-options": "Muestra el cuadro de diĆ”logo Opciones", - "show-revisions": "Muestra el cuadro de diĆ”logo Revisiones de notas", - "show-recent-changes": "Muestra el cuadro de diĆ”logo Cambios recientes", - "show-sql-console": "Muestra el cuadro de diĆ”logo Consola SQL", - "show-backend-log": "Muestra el cuadro de diĆ”logo Registro de backend", - "show-help": "Muestra ayuda/hoja de referencia integrada", - "show-cheatsheet": "Muestra un modal con operaciones de teclado comunes", - "text-note-operations": "Operaciones de notas de texto", - "add-link-to-text": "Abrir cuadro de diĆ”logo para agregar un enlace al texto", - "follow-link-under-cursor": "Seguir el enlace dentro del cual se coloca el cursor", - "insert-date-and-time-to-text": "Insertar fecha y hora actuales en el texto", - "paste-markdown-into-text": "Pega Markdown del portapapeles en la nota de texto", - "cut-into-note": "Corta la selección de la nota actual y crea una subnota con el texto seleccionado", - "add-include-note-to-text": "Abre el cuadro de diĆ”logo para incluir una nota", - "edit-readonly-note": "Editar una nota de sólo lectura", - "attributes-labels-and-relations": "Atributos (etiquetas y relaciones)", - "add-new-label": "Crear nueva etiqueta", - "create-new-relation": "Crear nueva relación", - "ribbon-tabs": "PestaƱas de cinta", - "toggle-basic-properties": "Alternar propiedades bĆ”sicas", - "toggle-file-properties": "Alternar propiedades de archivo", - "toggle-image-properties": "Alternar propiedades de imagen", - "toggle-owned-attributes": "Alternar atributos de propiedad", - "toggle-inherited-attributes": "Alternar atributos heredados", - "toggle-promoted-attributes": "Alternar atributos destacados", - "toggle-link-map": "Alternar mapa de enlaces", - "toggle-note-info": "Alternar información de nota", - "toggle-note-paths": "Alternar rutas de notas", - "toggle-similar-notes": "Alternar notas similares", - "other": "Otro", - "toggle-right-pane": "Alternar la visualización del panel derecho, que incluye la tabla de contenidos y aspectos destacados", - "print-active-note": "Imprimir nota activa", - "open-note-externally": "Abrir nota como un archivo con la aplicación predeterminada", - "render-active-note": "Renderizar (volver a renderizar) nota activa", - "run-active-note": "Ejecutar nota de código JavaScript activa (frontend/backend)", - "toggle-note-hoisting": "Alterna la elevación de la nota activa", - "unhoist": "Bajar desde cualquier lugar", - "reload-frontend-app": "Recargar frontend de la aplicación", - "open-dev-tools": "Abrir herramientas de desarrollo", - "find-in-text": "Alternar panel de bĆŗsqueda", - "toggle-left-note-tree-panel": "Alternar panel izquierdo (Ć”rbol de notas)", - "toggle-full-screen": "Alternar pantalla completa", - "zoom-out": "Alejar", - "zoom-in": "Acercar", - "note-navigation": "Navegación de notas", - "reset-zoom-level": "Restablecer nivel de zoom", - "copy-without-formatting": "Copiar el texto seleccionado sin formatear", - "force-save-revision": "Forzar la creación/guardado de una nueva revisión de nota de la nota activa", - "toggle-book-properties": "Alternar propiedades del libro", - "toggle-classic-editor-toolbar": "Alternar la pestaƱa de formato por el editor con barra de herramientas fija", - "export-as-pdf": "Exporta la nota actual como un PDF", - "toggle-zen-mode": "Habilita/Deshabilita el modo Zen (IU mĆ­nima para edición sin distracciones)", - "open-command-palette": "Abrir paleta de comandos", - "clone-notes-to": "Clonar notas seleccionadas", - "move-notes-to": "Mover notas seleccionadas" - }, - "login": { - "title": "Iniciar sesión", - "heading": "Iniciar sesión en Trilium", - "incorrect-totp": "El TOTP es incorrecto. Por favor, intente de nuevo.", - "incorrect-password": "La contraseƱa es incorrecta. Por favor intĆ©ntalo de nuevo.", - "password": "ContraseƱa", - "remember-me": "Recordarme", - "button": "Iniciar sesión", - "sign_in_with_sso": "Iniciar sesión con {{ ssoIssuerName }}" - }, - "set_password": { - "title": "Establecer contraseƱa", - "heading": "Establecer contraseƱa", - "description": "Antes de poder comenzar a usar Trilium desde la web, primero debe establecer una contraseƱa. Luego utilizarĆ” esta contraseƱa para iniciar sesión.", - "password": "ContraseƱa", - "password-confirmation": "Confirmación de contraseƱa", - "button": "Establecer contraseƱa" - }, - "javascript-required": "Trilium requiere que JavaScript estĆ© habilitado.", - "setup": { - "heading": "Configuración de Trilium Notes", - "new-document": "Soy un usuario nuevo y quiero crear un nuevo documento de Trilium para mis notas", - "sync-from-desktop": "Ya tengo una instancia de escritorio y quiero configurar la sincronización con ella", - "sync-from-server": "Ya tengo una instancia de servidor y quiero configurar la sincronización con ella", - "next": "Siguiente", - "init-in-progress": "Inicialización del documento en curso", - "redirecting": "En breve serĆ” redirigido a la aplicación.", - "title": "Configuración" - }, - "setup_sync-from-desktop": { - "heading": "Sincronizar desde el escritorio", - "description": "Esta configuración debe iniciarse desde la instancia de escritorio:", - "step1": "Abra su instancia de escritorio de Trilium Notes.", - "step2": "En el menĆŗ Trilium, dĆ© clic en Opciones.", - "step3": "DĆ© clic en la categorĆ­a Sincronizar.", - "step4": "Cambie la dirección de la instancia del servidor a: {{- host}} y dĆ© clic en Guardar.", - "step5": "DĆ© clic en el botón \"Probar sincronización\" para verificar que la conexión fue exitosa.", - "step6": "Una vez que haya completado estos pasos, dĆ© clic en {{- link}}.", - "step6-here": "aquĆ­" - }, - "setup_sync-from-server": { - "heading": "Sincronización desde el servidor", - "instructions": "Por favor, ingrese la dirección y las credenciales del servidor Trilium a continuación. Esto descargarĆ” todo el documento de Trilium desde el servidor y configurarĆ” la sincronización. Dependiendo del tamaƱo del documento y de la velocidad de su conexión, esto puede tardar un poco.", - "server-host": "Dirección del servidor Trilium", - "server-host-placeholder": "https://:", - "proxy-server": "Servidor proxy (opcional)", - "proxy-server-placeholder": "https://:", - "note": "Nota:", - "proxy-instruction": "Si deja la configuración de proxy en blanco, se utilizarĆ” el proxy del sistema (aplica Ćŗnicamente a la aplicación de escritorio)", - "password": "ContraseƱa", - "password-placeholder": "ContraseƱa", - "back": "AtrĆ”s", - "finish-setup": "Finalizar la configuración" - }, - "setup_sync-in-progress": { - "heading": "Sincronización en progreso", - "successful": "La sincronización se ha configurado correctamente. La sincronización inicial tardarĆ” algĆŗn tiempo en finalizar. Una vez hecho esto, serĆ” redirigido a la pĆ”gina de inicio de sesión.", - "outstanding-items": "Elementos de sincronización destacados:", - "outstanding-items-default": "N/A" - }, - "share_404": { - "title": "No encontrado", - "heading": "No encontrado" - }, - "share_page": { - "parent": "padre:", - "clipped-from": "Esta nota fue recortada originalmente de {{- url}}", - "child-notes": "Subnotas:", - "no-content": "Esta nota no tiene contenido." - }, - "weekdays": { - "monday": "Lunes", - "tuesday": "Martes", - "wednesday": "MiĆ©rcoles", - "thursday": "Jueves", - "friday": "Viernes", - "saturday": "SĆ”bado", - "sunday": "Domingo" - }, - "weekdayNumber": "Semana {weekNumber}", - "months": { - "january": "Enero", - "february": "Febrero", - "march": "Marzo", - "april": "Abril", - "may": "Mayo", - "june": "Junio", - "july": "Julio", - "august": "Agosto", - "september": "Septiembre", - "october": "Octubre", - "november": "Noviembre", - "december": "Diciembre" - }, - "quarterNumber": "Cuarto {quarterNumber}", - "special_notes": { - "search_prefix": "Buscar:" - }, - "test_sync": { - "not-configured": "El servidor de sincronización no estĆ” configurado. Por favor configure primero la sincronización.", - "successful": "El protocolo de enlace del servidor de sincronización ha sido exitoso, la sincronización ha comenzado." - }, - "hidden-subtree": { - "root-title": "Notas ocultas", - "search-history-title": "Buscar historial", - "note-map-title": "Mapa de nota", - "sql-console-history-title": "Historial de consola SQL", - "shared-notes-title": "Notas compartidas", - "bulk-action-title": "Acción en lote", - "backend-log-title": "Registro de Backend", - "user-hidden-title": "Usuario oculto", - "launch-bar-templates-title": "Plantillas de barra de lanzamiento", - "base-abstract-launcher-title": "Lanzador abstracto base", - "command-launcher-title": "Lanzador de comando", - "note-launcher-title": "Lanzador de nota", - "script-launcher-title": "Lanzador de script", - "built-in-widget-title": "Widget integrado", - "spacer-title": "Espaciador", - "custom-widget-title": "Widget personalizado", - "launch-bar-title": "Barra de lanzamiento", - "available-launchers-title": "Lanzadores disponibles", - "go-to-previous-note-title": "Ir a nota previa", - "go-to-next-note-title": "Ir a nota siguiente", - "new-note-title": "Nueva nota", - "search-notes-title": "Buscar notas", - "calendar-title": "Calendario", - "recent-changes-title": "Cambios recientes", - "bookmarks-title": "Marcadores", - "open-today-journal-note-title": "Abrir nota del diario de hoy", - "quick-search-title": "BĆŗsqueda rĆ”pida", - "protected-session-title": "Sesión protegida", - "sync-status-title": "Sincronizar estado", - "settings-title": "Ajustes", - "llm-chat-title": "Chat con notas", - "options-title": "Opciones", - "appearance-title": "Apariencia", - "shortcuts-title": "Atajos", - "text-notes": "Notas de texto", - "code-notes-title": "Notas de código", - "images-title": "ImĆ”genes", - "spellcheck-title": "Corrección ortogrĆ”fica", - "password-title": "ContraseƱa", - "multi-factor-authentication-title": "MFA", - "etapi-title": "ETAPI", - "backup-title": "Respaldo", - "sync-title": "Sincronizar", - "ai-llm-title": "IA/LLM", - "other": "Otros", - "advanced-title": "Avanzado", - "visible-launchers-title": "Lanzadores visibles", - "user-guide": "GuĆ­a de Usuario", - "localization": "Idioma y Región", - "inbox-title": "Bandeja", - "jump-to-note-title": "Saltar a..." - }, - "notes": { - "new-note": "Nueva nota", - "duplicate-note-suffix": "(dup)", - "duplicate-note-title": "{{- noteTitle}} {{duplicateNoteSuffix}}" - }, - "backend_log": { - "log-does-not-exist": "El archivo de registro del backend '{{fileName}}' no existe (aĆŗn).", - "reading-log-failed": "Leer el archivo de registro del backend '{{fileName}}' falló." - }, - "content_renderer": { - "note-cannot-be-displayed": "Este tipo de nota no puede ser mostrado." - }, - "pdf": { - "export_filter": "Documento PDF (*.pdf)", - "unable-to-export-message": "La nota actual no pudo ser exportada como PDF.", - "unable-to-export-title": "No es posible exportar como PDF", - "unable-to-save-message": "No se pudo escribir en el archivo seleccionado. Intente de nuevo o seleccione otro destino." - }, - "tray": { - "tooltip": "Trilium Notes", - "close": "Cerrar Trilium", - "recents": "Notas recientes", - "bookmarks": "Marcadores", - "today": "Abrir nota del diario de hoy", - "new-note": "Nueva nota", - "show-windows": "Mostrar ventanas", - "open_new_window": "Abrir nueva ventana" - }, - "migration": { - "old_version": "La migración directa desde tu versión actual no estĆ” soportada. Por favor actualice a v0.60.4 primero y solo despuĆ©s a esta versión.", - "error_message": "Error durante la migración a la versión {{version}}: {{stack}}", - "wrong_db_version": "La versión de la DB {{version}} es mĆ”s nueva que la versión de la DB actual {{targetVersion}}, lo que significa que fue creada por una versión mĆ”s reciente e incompatible de Trilium. Actualice a la Ćŗltima versión de Trilium para resolver este problema." - }, - "modals": { - "error_title": "Error" - }, - "share_theme": { - "site-theme": "Tema de sitio", - "search_placeholder": "BĆŗsqueda...", - "image_alt": "Imagen de artĆ­culo", - "last-updated": "Última actualización en {{-date}}", - "subpages": "SubpĆ”ginas:", - "on-this-page": "En esta pĆ”gina", - "expand": "Expandir" - }, - "keyboard_action_names": { - "jump-to-note": "Saltar a...", - "command-palette": "Paleta de comandos", - "scroll-to-active-note": "Desplazarse a la nota activa", - "quick-search": "BĆŗsqueda rĆ”pida", - "search-in-subtree": "Buscar en subĆ”rbol", - "expand-subtree": "Expandir subĆ”rbol", - "collapse-tree": "Colapsar Ć”rbol", - "collapse-subtree": "Colapsar subĆ”rbol", - "sort-child-notes": "Ordenar nodos hijos", - "create-note-after": "Crear nota tras", - "create-note-into": "Crear nota en", - "create-note-into-inbox": "Crear nota en bandeja de entrada", - "delete-notes": "Eliminar notas", - "move-note-up": "Subir nota", - "move-note-down": "Bajar nota", - "move-note-up-in-hierarchy": "Subir nota en la jerarquĆ­a", - "move-note-down-in-hierarchy": "Bajar nota en la jerarquĆ­a", - "edit-note-title": "Editar tĆ­tulo de nota", - "edit-branch-prefix": "Editar prefijo de rama", - "clone-notes-to": "Clonar notas a", - "move-notes-to": "Mover notas a", - "copy-notes-to-clipboard": "Copiar notas al portapapeles", - "paste-notes-from-clipboard": "Pegar notas del portapapeles", - "add-note-above-to-selection": "AƱadir nota superior a la selección", - "add-note-below-to-selection": "AƱadir nota inferior a la selección", - "duplicate-subtree": "Duplicar subĆ”rbol", - "open-new-tab": "Abrir nueva pestaƱa", - "close-active-tab": "Cerrar pestaƱa activa", - "reopen-last-tab": "Reabrir Ćŗltima pestaƱa", - "activate-next-tab": "Activar siguiente pestaƱa", - "activate-previous-tab": "Activar pestaƱa anterior", - "open-new-window": "Abrir nueva ventana", - "show-options": "Mostrar opciones", - "show-revisions": "Mostrar revisiones", - "show-recent-changes": "Mostrar cambios recientes", - "show-sql-console": "Mostrar consola SQL", - "switch-to-first-tab": "Ir a la primera pestaƱa", - "switch-to-second-tab": "Ir a la segunda pestaƱa", - "switch-to-third-tab": "Ir a la tercera pestaƱa", - "switch-to-fourth-tab": "Ir a la cuarta pestaƱa", - "switch-to-fifth-tab": "Ir a la quinta pestaƱa", - "switch-to-sixth-tab": "Ir a la sexta pestaƱa", - "switch-to-seventh-tab": "Ir a la sĆ©ptima pestaƱa", - "switch-to-eighth-tab": "Ir a la octava pestaƱa", - "switch-to-ninth-tab": "Ir a la novena pestaƱa", - "switch-to-last-tab": "Ir a la Ćŗltima pestaƱa", - "show-note-source": "Mostrar nota fuente", - "show-help": "Mostrar ayuda", - "add-new-label": "AƱadir nueva etiqueta", - "add-new-relation": "AƱadir nueva relación", - "print-active-note": "Imprimir nota activa", - "export-active-note-as-pdf": "Exportar nota activa como PDF", - "open-note-externally": "Abrir nota externamente", - "find-in-text": "Encontrar en texto", - "copy-without-formatting": "Copiar sin formato", - "reset-zoom-level": "Restablecer el nivel de zoom", - "open-developer-tools": "Abrir herramientas de desarrollo", - "insert-date-and-time-to-text": "Insertar fecha y hora al texto", - "edit-read-only-note": "Editar nota de solo lectura", - "toggle-system-tray-icon": "Mostrar/ocultar icono en la bandeja del sistema", - "toggle-zen-mode": "Activar/desactivar modo Zen", - "add-link-to-text": "AƱadir enlace al texto", - "zoom-in": "Acercar", - "zoom-out": "Alejar", - "toggle-full-screen": "Activar/desactivar pantalla completa", - "toggle-left-pane": "Abrir/cerrar panel izquierdo", - "toggle-right-pane": "Mostrar/ocultar panel derecho", - "unhoist-note": "Desanclar nota", - "toggle-note-hoisting": "Activar/desactivar anclaje de nota", - "show-cheatsheet": "Mostrar hoja de referencia", - "follow-link-under-cursor": "Seguir enlace bajo cursor", - "reload-frontend-app": "Recargar aplicación del cliente", - "run-active-note": "Ejecutar nota activa", - "render-active-note": "Generar nota activa", - "back-in-note-history": "Anterior en el historial de notas", - "forward-in-note-history": "Posterior en el historial de notas", - "cut-notes-to-clipboard": "Cortar notas al portapapeles", - "select-all-notes-in-parent": "Seleccionar todas las notas en padre", - "show-backend-log": "Mostrar registro del servidor", - "paste-markdown-into-text": "Pegar Markdown en el texto", - "cut-into-note": "Cortar en la nota", - "add-include-note-to-text": "Agregar nota incluida al texto", - "force-save-revision": "Forzar guardado de revisión", - "toggle-ribbon-tab-classic-editor": "Mostrar pestaƱa de la cinta de opciones: Editor clĆ”sico", - "toggle-ribbon-tab-basic-properties": "Mostrar pestaƱa de la cinta de opciones: Propiedades bĆ”sicas", - "toggle-ribbon-tab-book-properties": "Mostrar pestaƱa de la cinta de opciones: Propiedades de libro", - "toggle-ribbon-tab-file-properties": "Mostrar pestaƱa de la cinta de opciones: Propiedades de archivo", - "toggle-ribbon-tab-image-properties": "Mostrar pestaƱa de la cinta de opciones: Propiedades de imagen", - "toggle-ribbon-tab-inherited-attributes": "Mostrar pestaƱa de la cinta de opciones: Atributos heredados", - "toggle-ribbon-tab-note-map": "Mostrar pestaƱa de la cinta de opciones: Mapa de notas", - "toggle-ribbon-tab-note-info": "Mostrar pestaƱa de la cinta de opciones: Información de nota", - "toggle-ribbon-tab-note-paths": "Mostrar pestaƱa de la cinta de opciones: Rutas de nota", - "toggle-ribbon-tab-similar-notes": "Mostrar pestaƱa de la cinta de opciones: Notas similares", - "toggle-ribbon-tab-owned-attributes": "Mostrar pestaƱa de la cinta de opciones: Propiedades asignadas", - "toggle-ribbon-tab-promoted-attributes": "Mostrar pestaƱa de la cinta de opciones: Atributos destacados" - }, - "hidden_subtree_templates": { - "board_note_first": "Primera nota", - "board_note_second": "Segunda nota", - "board_note_third": "Tercera nota", - "board_status_progress": "En progreso", - "calendar": "Calendario", - "description": "Descripción", - "list-view": "Vista de lista", - "grid-view": "Vista de cuadrĆ­cula", - "status": "Estado", - "table": "Tabla", - "text-snippet": "Fragmento de texto", - "geo-map": "Mapa Geo", - "start-date": "Fecha de inicio", - "end-date": "Fecha de finalización", - "start-time": "Hora de inicio", - "end-time": "Hora de finalización", - "geolocation": "Geolocalización", - "built-in-templates": "Plantillas predefinidas", - "board_status_todo": "Por hacer", - "board_status_done": "Hecho", - "board": "Tablero" - } + "keyboard_actions": { + "back-in-note-history": "Navegar a la nota previa en el historial", + "forward-in-note-history": "Navegar a la nota siguiente en el historial", + "open-jump-to-note-dialog": "Abrir cuadro de diĆ”logo \"Saltar a nota\"", + "scroll-to-active-note": "Desplazar el Ć”rbol de notas a la nota activa", + "quick-search": "Activar barra de bĆŗsqueda rĆ”pida", + "search-in-subtree": "Buscar notas en el subĆ”rbol de la nota activa", + "expand-subtree": "Expandir el subĆ”rbol de la nota actual", + "collapse-tree": "Colapsa el Ć”rbol de notas completo", + "collapse-subtree": "Colapsa el subĆ”rbol de la nota actual", + "sort-child-notes": "Ordenar subnotas", + "creating-and-moving-notes": "Creando y moviendo notas", + "create-note-after": "Crear nota despuĆ©s de la nota activa", + "create-note-into": "Crear nota como subnota de la nota activa", + "create-note-into-inbox": "Crear una nota en la bandeja de entrada (si estĆ” definida) o nota del dĆ­a", + "delete-note": "Eliminar nota", + "move-note-up": "Subir nota", + "move-note-down": "Bajar nota", + "move-note-up-in-hierarchy": "Subir nota en la jerarquĆ­a", + "move-note-down-in-hierarchy": "Bajar nota en la jerarquĆ­a", + "edit-note-title": "Saltar del Ć”rbol al detalle de la nota y editar el tĆ­tulo", + "edit-branch-prefix": "Mostrar cuadro de diĆ”logo Editar prefijo de rama", + "note-clipboard": "Portapapeles de notas", + "copy-notes-to-clipboard": "Copiar las notas seleccionadas al portapapeles", + "paste-notes-from-clipboard": "Pegar las notas del portapapeles en una nota activa", + "cut-notes-to-clipboard": "Cortar las notas seleccionadas al portapapeles", + "select-all-notes-in-parent": "Seleccionar todas las notas del nivel de la nota actual", + "add-note-above-to-the-selection": "Agregar nota arriba de la selección", + "add-note-below-to-selection": "Agregar nota arriba de la selección", + "duplicate-subtree": "Duplicar subĆ”rbol", + "tabs-and-windows": "PestaƱas y ventanas", + "open-new-tab": "Abre una nueva pestaƱa", + "close-active-tab": "Cierra la pestaƱa activa", + "reopen-last-tab": "Vuelve a abrir la Ćŗltima pestaƱa cerrada", + "activate-next-tab": "Activa la pestaƱa de la derecha", + "activate-previous-tab": "Activa la pestaƱa de la izquierda", + "open-new-window": "Abrir nueva ventana vacĆ­a", + "toggle-tray": "Muestra/Oculta la aplicación en la bandeja del sistema", + "first-tab": "Activa la primera pestaƱa de la lista", + "second-tab": "Activa la segunda pestaƱa de la lista", + "third-tab": "Activa la tercera pestaƱa de la lista", + "fourth-tab": "Activa la cuarta pestaƱa de la lista", + "fifth-tab": "Activa la quinta pestaƱa de la lista", + "sixth-tab": "Activa la sexta pestaƱa de la lista", + "seventh-tab": "Activa la sĆ©ptima pestaƱa de la lista", + "eight-tab": "Activa la octava pestaƱa de la lista", + "ninth-tab": "Activa la novena pestaƱa de la lista", + "last-tab": "Activa la Ćŗltima pestaƱa de la lista", + "dialogs": "DiĆ”logos", + "show-note-source": "Muestra el cuadro de diĆ”logo Fuente de nota", + "show-options": "Muestra el cuadro de diĆ”logo Opciones", + "show-revisions": "Muestra el cuadro de diĆ”logo Revisiones de notas", + "show-recent-changes": "Muestra el cuadro de diĆ”logo Cambios recientes", + "show-sql-console": "Muestra el cuadro de diĆ”logo Consola SQL", + "show-backend-log": "Muestra el cuadro de diĆ”logo Registro de backend", + "show-help": "Muestra ayuda/hoja de referencia integrada", + "show-cheatsheet": "Muestra un modal con operaciones de teclado comunes", + "text-note-operations": "Operaciones de notas de texto", + "add-link-to-text": "Abrir cuadro de diĆ”logo para agregar un enlace al texto", + "follow-link-under-cursor": "Seguir el enlace dentro del cual se coloca el cursor", + "insert-date-and-time-to-text": "Insertar fecha y hora actuales en el texto", + "paste-markdown-into-text": "Pega Markdown del portapapeles en la nota de texto", + "cut-into-note": "Corta la selección de la nota actual y crea una subnota con el texto seleccionado", + "add-include-note-to-text": "Abre el cuadro de diĆ”logo para incluir una nota", + "edit-readonly-note": "Editar una nota de sólo lectura", + "attributes-labels-and-relations": "Atributos (etiquetas y relaciones)", + "add-new-label": "Crear nueva etiqueta", + "create-new-relation": "Crear nueva relación", + "ribbon-tabs": "PestaƱas de cinta", + "toggle-basic-properties": "Alternar propiedades bĆ”sicas", + "toggle-file-properties": "Alternar propiedades de archivo", + "toggle-image-properties": "Alternar propiedades de imagen", + "toggle-owned-attributes": "Alternar atributos de propiedad", + "toggle-inherited-attributes": "Alternar atributos heredados", + "toggle-promoted-attributes": "Alternar atributos destacados", + "toggle-link-map": "Alternar mapa de enlaces", + "toggle-note-info": "Alternar información de nota", + "toggle-note-paths": "Alternar rutas de notas", + "toggle-similar-notes": "Alternar notas similares", + "other": "Otro", + "toggle-right-pane": "Alternar la visualización del panel derecho, que incluye la tabla de contenidos y aspectos destacados", + "print-active-note": "Imprimir nota activa", + "open-note-externally": "Abrir nota como un archivo con la aplicación predeterminada", + "render-active-note": "Renderizar (volver a renderizar) nota activa", + "run-active-note": "Ejecutar nota de código JavaScript activa (frontend/backend)", + "toggle-note-hoisting": "Alterna la elevación de la nota activa", + "unhoist": "Bajar desde cualquier lugar", + "reload-frontend-app": "Recargar frontend de la aplicación", + "open-dev-tools": "Abrir herramientas de desarrollo", + "find-in-text": "Alternar panel de bĆŗsqueda", + "toggle-left-note-tree-panel": "Alternar panel izquierdo (Ć”rbol de notas)", + "toggle-full-screen": "Alternar pantalla completa", + "zoom-out": "Alejar", + "zoom-in": "Acercar", + "note-navigation": "Navegación de notas", + "reset-zoom-level": "Restablecer nivel de zoom", + "copy-without-formatting": "Copiar el texto seleccionado sin formatear", + "force-save-revision": "Forzar la creación/guardado de una nueva revisión de nota de la nota activa", + "toggle-book-properties": "Alternar propiedades del libro", + "toggle-classic-editor-toolbar": "Alternar la pestaƱa de formato por el editor con barra de herramientas fija", + "export-as-pdf": "Exporta la nota actual como un PDF", + "toggle-zen-mode": "Habilita/Deshabilita el modo Zen (IU mĆ­nima para edición sin distracciones)", + "open-command-palette": "Abrir paleta de comandos", + "clone-notes-to": "Clonar notas seleccionadas", + "move-notes-to": "Mover notas seleccionadas" + }, + "login": { + "title": "Iniciar sesión", + "heading": "Iniciar sesión en Trilium", + "incorrect-totp": "El TOTP es incorrecto. Por favor, intente de nuevo.", + "incorrect-password": "La contraseƱa es incorrecta. Por favor intĆ©ntalo de nuevo.", + "password": "ContraseƱa", + "remember-me": "Recordarme", + "button": "Iniciar sesión", + "sign_in_with_sso": "Iniciar sesión con {{ ssoIssuerName }}" + }, + "set_password": { + "title": "Establecer contraseƱa", + "heading": "Establecer contraseƱa", + "description": "Antes de poder comenzar a usar Trilium desde la web, primero debe establecer una contraseƱa. Luego utilizarĆ” esta contraseƱa para iniciar sesión.", + "password": "ContraseƱa", + "password-confirmation": "Confirmación de contraseƱa", + "button": "Establecer contraseƱa" + }, + "javascript-required": "Trilium requiere que JavaScript estĆ© habilitado.", + "setup": { + "heading": "Configuración de Trilium Notes", + "new-document": "Soy un usuario nuevo y quiero crear un nuevo documento de Trilium para mis notas", + "sync-from-desktop": "Ya tengo una instancia de escritorio y quiero configurar la sincronización con ella", + "sync-from-server": "Ya tengo una instancia de servidor y quiero configurar la sincronización con ella", + "next": "Siguiente", + "init-in-progress": "Inicialización del documento en curso", + "redirecting": "En breve serĆ” redirigido a la aplicación.", + "title": "Configuración" + }, + "setup_sync-from-desktop": { + "heading": "Sincronizar desde el escritorio", + "description": "Esta configuración debe iniciarse desde la instancia de escritorio:", + "step1": "Abra su instancia de escritorio de Trilium Notes.", + "step2": "En el menĆŗ Trilium, dĆ© clic en Opciones.", + "step3": "DĆ© clic en la categorĆ­a Sincronizar.", + "step4": "Cambie la dirección de la instancia del servidor a: {{- host}} y dĆ© clic en Guardar.", + "step5": "DĆ© clic en el botón \"Probar sincronización\" para verificar que la conexión fue exitosa.", + "step6": "Una vez que haya completado estos pasos, dĆ© clic en {{- link}}.", + "step6-here": "aquĆ­" + }, + "setup_sync-from-server": { + "heading": "Sincronización desde el servidor", + "instructions": "Por favor, ingrese la dirección y las credenciales del servidor Trilium a continuación. Esto descargarĆ” todo el documento de Trilium desde el servidor y configurarĆ” la sincronización. Dependiendo del tamaƱo del documento y de la velocidad de su conexión, esto puede tardar un poco.", + "server-host": "Dirección del servidor Trilium", + "server-host-placeholder": "https://:", + "proxy-server": "Servidor proxy (opcional)", + "proxy-server-placeholder": "https://:", + "note": "Nota:", + "proxy-instruction": "Si deja la configuración de proxy en blanco, se utilizarĆ” el proxy del sistema (aplica Ćŗnicamente a la aplicación de escritorio)", + "password": "ContraseƱa", + "password-placeholder": "ContraseƱa", + "back": "AtrĆ”s", + "finish-setup": "Finalizar la configuración" + }, + "setup_sync-in-progress": { + "heading": "Sincronización en progreso", + "successful": "La sincronización se ha configurado correctamente. La sincronización inicial tardarĆ” algĆŗn tiempo en finalizar. Una vez hecho esto, serĆ” redirigido a la pĆ”gina de inicio de sesión.", + "outstanding-items": "Elementos de sincronización destacados:", + "outstanding-items-default": "N/A" + }, + "share_404": { + "title": "No encontrado", + "heading": "No encontrado" + }, + "share_page": { + "parent": "padre:", + "clipped-from": "Esta nota fue recortada originalmente de {{- url}}", + "child-notes": "Subnotas:", + "no-content": "Esta nota no tiene contenido." + }, + "weekdays": { + "monday": "Lunes", + "tuesday": "Martes", + "wednesday": "MiĆ©rcoles", + "thursday": "Jueves", + "friday": "Viernes", + "saturday": "SĆ”bado", + "sunday": "Domingo" + }, + "weekdayNumber": "Semana {weekNumber}", + "months": { + "january": "Enero", + "february": "Febrero", + "march": "Marzo", + "april": "Abril", + "may": "Mayo", + "june": "Junio", + "july": "Julio", + "august": "Agosto", + "september": "Septiembre", + "october": "Octubre", + "november": "Noviembre", + "december": "Diciembre" + }, + "quarterNumber": "Cuarto {quarterNumber}", + "special_notes": { + "search_prefix": "Buscar:" + }, + "test_sync": { + "not-configured": "El servidor de sincronización no estĆ” configurado. Por favor configure primero la sincronización.", + "successful": "El protocolo de enlace del servidor de sincronización ha sido exitoso, la sincronización ha comenzado." + }, + "hidden-subtree": { + "root-title": "Notas ocultas", + "search-history-title": "Buscar historial", + "note-map-title": "Mapa de nota", + "sql-console-history-title": "Historial de consola SQL", + "shared-notes-title": "Notas compartidas", + "bulk-action-title": "Acción en lote", + "backend-log-title": "Registro de Backend", + "user-hidden-title": "Usuario oculto", + "launch-bar-templates-title": "Plantillas de barra de lanzamiento", + "base-abstract-launcher-title": "Lanzador abstracto base", + "command-launcher-title": "Lanzador de comando", + "note-launcher-title": "Lanzador de nota", + "script-launcher-title": "Lanzador de script", + "built-in-widget-title": "Widget integrado", + "spacer-title": "Espaciador", + "custom-widget-title": "Widget personalizado", + "launch-bar-title": "Barra de lanzamiento", + "available-launchers-title": "Lanzadores disponibles", + "go-to-previous-note-title": "Ir a nota previa", + "go-to-next-note-title": "Ir a nota siguiente", + "new-note-title": "Nueva nota", + "search-notes-title": "Buscar notas", + "calendar-title": "Calendario", + "recent-changes-title": "Cambios recientes", + "bookmarks-title": "Marcadores", + "open-today-journal-note-title": "Abrir nota del diario de hoy", + "quick-search-title": "BĆŗsqueda rĆ”pida", + "protected-session-title": "Sesión protegida", + "sync-status-title": "Sincronizar estado", + "settings-title": "Ajustes", + "llm-chat-title": "Chat con notas", + "options-title": "Opciones", + "appearance-title": "Apariencia", + "shortcuts-title": "Atajos", + "text-notes": "Notas de texto", + "code-notes-title": "Notas de código", + "images-title": "ImĆ”genes", + "spellcheck-title": "Corrección ortogrĆ”fica", + "password-title": "ContraseƱa", + "multi-factor-authentication-title": "MFA", + "etapi-title": "ETAPI", + "backup-title": "Respaldo", + "sync-title": "Sincronizar", + "ai-llm-title": "IA/LLM", + "other": "Otros", + "advanced-title": "Avanzado", + "visible-launchers-title": "Lanzadores visibles", + "user-guide": "GuĆ­a de Usuario", + "localization": "Idioma y Región", + "inbox-title": "Bandeja", + "jump-to-note-title": "Saltar a..." + }, + "notes": { + "new-note": "Nueva nota", + "duplicate-note-suffix": "(dup)", + "duplicate-note-title": "{{- noteTitle}} {{duplicateNoteSuffix}}" + }, + "backend_log": { + "log-does-not-exist": "El archivo de registro del backend '{{fileName}}' no existe (aĆŗn).", + "reading-log-failed": "Leer el archivo de registro del backend '{{fileName}}' falló." + }, + "content_renderer": { + "note-cannot-be-displayed": "Este tipo de nota no puede ser mostrado." + }, + "pdf": { + "export_filter": "Documento PDF (*.pdf)", + "unable-to-export-message": "La nota actual no pudo ser exportada como PDF.", + "unable-to-export-title": "No es posible exportar como PDF", + "unable-to-save-message": "No se pudo escribir en el archivo seleccionado. Intente de nuevo o seleccione otro destino." + }, + "tray": { + "tooltip": "Trilium Notes", + "close": "Cerrar Trilium", + "recents": "Notas recientes", + "bookmarks": "Marcadores", + "today": "Abrir nota del diario de hoy", + "new-note": "Nueva nota", + "show-windows": "Mostrar ventanas", + "open_new_window": "Abrir nueva ventana" + }, + "migration": { + "old_version": "La migración directa desde tu versión actual no estĆ” soportada. Por favor actualice a v0.60.4 primero y solo despuĆ©s a esta versión.", + "error_message": "Error durante la migración a la versión {{version}}: {{stack}}", + "wrong_db_version": "La versión de la DB {{version}} es mĆ”s nueva que la versión de la DB actual {{targetVersion}}, lo que significa que fue creada por una versión mĆ”s reciente e incompatible de Trilium. Actualice a la Ćŗltima versión de Trilium para resolver este problema." + }, + "modals": { + "error_title": "Error" + }, + "share_theme": { + "site-theme": "Tema de sitio", + "search_placeholder": "BĆŗsqueda...", + "image_alt": "Imagen de artĆ­culo", + "last-updated": "Última actualización en {{-date}}", + "subpages": "SubpĆ”ginas:", + "on-this-page": "En esta pĆ”gina", + "expand": "Expandir" + }, + "keyboard_action_names": { + "jump-to-note": "Saltar a...", + "command-palette": "Paleta de comandos", + "scroll-to-active-note": "Desplazarse a la nota activa", + "quick-search": "BĆŗsqueda rĆ”pida", + "search-in-subtree": "Buscar en subĆ”rbol", + "expand-subtree": "Expandir subĆ”rbol", + "collapse-tree": "Colapsar Ć”rbol", + "collapse-subtree": "Colapsar subĆ”rbol", + "sort-child-notes": "Ordenar nodos hijos", + "create-note-after": "Crear nota tras", + "create-note-into": "Crear nota en", + "create-note-into-inbox": "Crear nota en bandeja de entrada", + "delete-notes": "Eliminar notas", + "move-note-up": "Subir nota", + "move-note-down": "Bajar nota", + "move-note-up-in-hierarchy": "Subir nota en la jerarquĆ­a", + "move-note-down-in-hierarchy": "Bajar nota en la jerarquĆ­a", + "edit-note-title": "Editar tĆ­tulo de nota", + "edit-branch-prefix": "Editar prefijo de rama", + "clone-notes-to": "Clonar notas a", + "move-notes-to": "Mover notas a", + "copy-notes-to-clipboard": "Copiar notas al portapapeles", + "paste-notes-from-clipboard": "Pegar notas del portapapeles", + "add-note-above-to-selection": "AƱadir nota superior a la selección", + "add-note-below-to-selection": "AƱadir nota inferior a la selección", + "duplicate-subtree": "Duplicar subĆ”rbol", + "open-new-tab": "Abrir nueva pestaƱa", + "close-active-tab": "Cerrar pestaƱa activa", + "reopen-last-tab": "Reabrir Ćŗltima pestaƱa", + "activate-next-tab": "Activar siguiente pestaƱa", + "activate-previous-tab": "Activar pestaƱa anterior", + "open-new-window": "Abrir nueva ventana", + "show-options": "Mostrar opciones", + "show-revisions": "Mostrar revisiones", + "show-recent-changes": "Mostrar cambios recientes", + "show-sql-console": "Mostrar consola SQL", + "switch-to-first-tab": "Ir a la primera pestaƱa", + "switch-to-second-tab": "Ir a la segunda pestaƱa", + "switch-to-third-tab": "Ir a la tercera pestaƱa", + "switch-to-fourth-tab": "Ir a la cuarta pestaƱa", + "switch-to-fifth-tab": "Ir a la quinta pestaƱa", + "switch-to-sixth-tab": "Ir a la sexta pestaƱa", + "switch-to-seventh-tab": "Ir a la sĆ©ptima pestaƱa", + "switch-to-eighth-tab": "Ir a la octava pestaƱa", + "switch-to-ninth-tab": "Ir a la novena pestaƱa", + "switch-to-last-tab": "Ir a la Ćŗltima pestaƱa", + "show-note-source": "Mostrar nota fuente", + "show-help": "Mostrar ayuda", + "add-new-label": "AƱadir nueva etiqueta", + "add-new-relation": "AƱadir nueva relación", + "print-active-note": "Imprimir nota activa", + "export-active-note-as-pdf": "Exportar nota activa como PDF", + "open-note-externally": "Abrir nota externamente", + "find-in-text": "Encontrar en texto", + "copy-without-formatting": "Copiar sin formato", + "reset-zoom-level": "Restablecer el nivel de zoom", + "open-developer-tools": "Abrir herramientas de desarrollo", + "insert-date-and-time-to-text": "Insertar fecha y hora al texto", + "edit-read-only-note": "Editar nota de solo lectura", + "toggle-system-tray-icon": "Mostrar/ocultar icono en la bandeja del sistema", + "toggle-zen-mode": "Activar/desactivar modo Zen", + "add-link-to-text": "AƱadir enlace al texto", + "zoom-in": "Acercar", + "zoom-out": "Alejar", + "toggle-full-screen": "Activar/desactivar pantalla completa", + "toggle-left-pane": "Abrir/cerrar panel izquierdo", + "toggle-right-pane": "Mostrar/ocultar panel derecho", + "unhoist-note": "Desanclar nota", + "toggle-note-hoisting": "Activar/desactivar anclaje de nota", + "show-cheatsheet": "Mostrar hoja de referencia", + "follow-link-under-cursor": "Seguir enlace bajo cursor", + "reload-frontend-app": "Recargar aplicación del cliente", + "run-active-note": "Ejecutar nota activa", + "render-active-note": "Generar nota activa", + "back-in-note-history": "AtrĆ”s en el historial de notas", + "forward-in-note-history": "Avanzar en el historial de notas", + "cut-notes-to-clipboard": "Cortar notas al portapapeles", + "select-all-notes-in-parent": "Seleccionar todas las notas en padre", + "show-backend-log": "Mostrar registro del servidor", + "paste-markdown-into-text": "Pegar Markdown en el texto", + "cut-into-note": "Cortar en la nota", + "add-include-note-to-text": "Agregar nota incluida al texto", + "force-save-revision": "Forzar guardado de revisión", + "toggle-ribbon-tab-classic-editor": "Mostrar pestaƱa de la cinta de opciones: Editor clĆ”sico", + "toggle-ribbon-tab-basic-properties": "Mostrar pestaƱa de la cinta de opciones: Propiedades bĆ”sicas", + "toggle-ribbon-tab-book-properties": "Mostrar pestaƱa de la cinta de opciones: Propiedades de libro", + "toggle-ribbon-tab-file-properties": "Mostrar pestaƱa de la cinta de opciones: Propiedades de archivo", + "toggle-ribbon-tab-image-properties": "Mostrar pestaƱa de la cinta de opciones: Propiedades de imagen", + "toggle-ribbon-tab-inherited-attributes": "Mostrar pestaƱa de la cinta de opciones: Atributos heredados", + "toggle-ribbon-tab-note-map": "Mostrar pestaƱa de la cinta de opciones: Mapa de notas", + "toggle-ribbon-tab-note-info": "Mostrar pestaƱa de la cinta de opciones: Información de nota", + "toggle-ribbon-tab-note-paths": "Mostrar pestaƱa de la cinta de opciones: Rutas de nota", + "toggle-ribbon-tab-similar-notes": "Mostrar pestaƱa de la cinta de opciones: Notas similares", + "toggle-ribbon-tab-owned-attributes": "Mostrar pestaƱa de la cinta de opciones: Propiedades asignadas", + "toggle-ribbon-tab-promoted-attributes": "Mostrar pestaƱa de la cinta de opciones: Atributos destacados" + }, + "hidden_subtree_templates": { + "board_note_first": "Primera nota", + "board_note_second": "Segunda nota", + "board_note_third": "Tercera nota", + "board_status_progress": "En progreso", + "calendar": "Calendario", + "description": "Descripción", + "list-view": "Vista de lista", + "grid-view": "Vista de cuadrĆ­cula", + "status": "Estado", + "table": "Tabla", + "text-snippet": "Fragmento de texto", + "geo-map": "Mapa Geo", + "start-date": "Fecha de inicio", + "end-date": "Fecha de finalización", + "start-time": "Hora de inicio", + "end-time": "Hora de finalización", + "geolocation": "Geolocalización", + "built-in-templates": "Plantillas predefinidas", + "board_status_todo": "Por hacer", + "board_status_done": "Hecho", + "board": "Tablero", + "presentation": "Presentación", + "presentation_slide": "Slide de presentación", + "presentation_slide_first": "Primer slide", + "presentation_slide_second": "Segundo slide" + }, + "sql_init": { + "db_not_initialized_desktop": "Base de datos no inicializada, por favor, siga las instrucciones en pantalla.", + "db_not_initialized_server": "Base de datos no inicializada, por favor, visite la pĆ”gina de configuración - http://[your-server-host]:{{port}} para ver instrucciones sobre cómo inicializar Trilium." + }, + "desktop": { + "instance_already_running": "Ya hay una instancia en ejecución, enfocando esa instancia en su lugar." + } } diff --git a/apps/server/src/assets/translations/fi/server.json b/apps/server/src/assets/translations/fi/server.json index 3339c32d1..e78ef1504 100644 --- a/apps/server/src/assets/translations/fi/server.json +++ b/apps/server/src/assets/translations/fi/server.json @@ -5,6 +5,13 @@ "creating-and-moving-notes": "Luo ja siirrƤ muistioita", "delete-note": "Poista muistio", "move-note-up": "SiirrƤ muistio ylƶs", - "open-command-palette": "Avaa komentovalikko" + "open-command-palette": "Avaa komentovalikko", + "back-in-note-history": "Palaa edelliseen muistiinpanoon", + "forward-in-note-history": "Siirry seuraavaan muistiinpanoon", + "open-jump-to-note-dialog": "Avaa \"Siirry muistiinpanoon\" -dialogi", + "scroll-to-active-note": "NƤytƤ aktiivinen muistiinpano puunƤkymƤssƤ", + "move-note-down": "SiirrƤ muistiinpanoa alaspƤin", + "move-note-up-in-hierarchy": "SiirrƤ muistiinpanoa hierarkiassa ylƶspƤin", + "move-note-down-in-hierarchy": "SiirrƤ muistiinpanoa hierarkiassa alaspƤin" } } diff --git a/apps/server/src/assets/translations/fr/server.json b/apps/server/src/assets/translations/fr/server.json index 38c8dc840..b4ff71af7 100644 --- a/apps/server/src/assets/translations/fr/server.json +++ b/apps/server/src/assets/translations/fr/server.json @@ -250,7 +250,13 @@ "other": "Autre", "advanced-title": "AvancĆ©", "visible-launchers-title": "Raccourcis visibles", - "user-guide": "Guide de l'utilisateur" + "user-guide": "Guide de l'utilisateur", + "jump-to-note-title": "Aller Ć ...", + "llm-chat-title": "Discuter avec Notes", + "multi-factor-authentication-title": "MFA", + "ai-llm-title": "AI/LLM", + "localization": "Langue et rĆ©gion", + "inbox-title": "BoĆ®te de rĆ©ception" }, "notes": { "new-note": "Nouvelle note", @@ -268,7 +274,8 @@ "export_filter": "Document PDF (*.pdf)", "unable-to-export-message": "La note actuelle n'a pas pu ĆŖtre exportĆ©e en format PDF.", "unable-to-export-title": "Impossible d'exporter au format PDF", - "unable-to-save-message": "Le fichier sĆ©lectionnĆ© n'a pas pu ĆŖtre Ć©crit. RĆ©essayez ou sĆ©lectionnez une autre destination." + "unable-to-save-message": "Le fichier sĆ©lectionnĆ© n'a pas pu ĆŖtre Ć©crit. RĆ©essayez ou sĆ©lectionnez une autre destination.", + "unable-to-print": "Impossible d'imprimer la note" }, "tray": { "tooltip": "Trilium Notes", @@ -277,7 +284,8 @@ "bookmarks": "Signets", "today": "Ouvrir la note du journal du jour", "new-note": "Nouvelle note", - "show-windows": "Afficher les fenĆŖtres" + "show-windows": "Afficher les fenĆŖtres", + "open_new_window": "Ouvrir une nouvelle fenĆŖtre" }, "migration": { "old_version": "La migration directe Ć  partir de votre version actuelle n'est pas prise en charge. Veuillez d'abord mettre Ć  jour vers la version v0.60.4, puis vers cette nouvelle version.", @@ -375,6 +383,59 @@ "zoom-in": "Zoomer", "reset-zoom-level": "RĆ©initilaliser le zoom", "copy-without-formatting": "Copier sans mise en forme", - "force-save-revision": "Forcer la sauvegarde de la rĆ©vision" + "force-save-revision": "Forcer la sauvegarde de la rĆ©vision", + "toggle-ribbon-tab-promoted-attributes": "Basculer les attributs promus de l'onglet du ruban", + "toggle-ribbon-tab-note-map": "Basculer l'onglet du ruban Note Map", + "toggle-ribbon-tab-note-info": "Basculer l'onglet du ruban Note Info", + "toggle-ribbon-tab-note-paths": "Basculer les chemins de notes de l'onglet du ruban", + "toggle-ribbon-tab-similar-notes": "Basculer l'onglet du ruban Notes similaires", + "toggle-note-hoisting": "Activer la focalisation sur la note", + "unhoist-note": "DĆ©sactiver la focalisation sur la note" + }, + "sql_init": { + "db_not_initialized_desktop": "Base de donnĆ©es non initialisĆ©e, merci de suivre les instructions Ć  l'Ć©cran.", + "db_not_initialized_server": "Base de donnĆ©es non initialisĆ©e, veuillez visitez - http://[your-server-host]:{{port}} pour consulter les instructions d'initialisation de Trilium." + }, + "desktop": { + "instance_already_running": "Une instance est dĆ©jĆ  en cours d'execution, ouverture de cette instance Ć  la place." + }, + "weekdayNumber": "Semaine {weekNumber}", + "quarterNumber": "Trimestre {quarterNumber}", + "share_theme": { + "site-theme": "ThĆØme du site", + "search_placeholder": "Recherche...", + "image_alt": "Image de l'article", + "last-updated": "DerniĆØre mise Ć  jour le {{- date}}", + "subpages": "Sous-pages:", + "on-this-page": "Sur cette page", + "expand": "DĆ©velopper" + }, + "hidden_subtree_templates": { + "text-snippet": "Extrait de texte", + "description": "Description", + "list-view": "Vue en liste", + "grid-view": "Vue en grille", + "calendar": "Calendrier", + "table": "Tableau", + "geo-map": "Carte gĆ©ographique", + "start-date": "Date de dĆ©but", + "end-date": "Date de fin", + "start-time": "Heure de dĆ©but", + "end-time": "Heure de fin", + "geolocation": "GĆ©olocalisation", + "built-in-templates": "ModĆØles intĆ©grĆ©s", + "board": "Tableau de bord", + "status": "Ɖtat", + "board_note_first": "PremiĆØre note", + "board_note_second": "DeuxiĆØme note", + "board_note_third": "TroisiĆØme note", + "board_status_todo": "A faire", + "board_status_progress": "En cours", + "board_status_done": "TerminĆ©", + "presentation": "PrĆ©sentation", + "presentation_slide": "Diapositive de prĆ©sentation", + "presentation_slide_first": "PremiĆØre diapositive", + "presentation_slide_second": "DeuxiĆØme diapositive", + "background": "ArriĆØre-plan" } } diff --git a/apps/server/src/assets/translations/hr/server.json b/apps/server/src/assets/translations/hr/server.json new file mode 100644 index 000000000..425f08c5f --- /dev/null +++ b/apps/server/src/assets/translations/hr/server.json @@ -0,0 +1,102 @@ +{ + "keyboard_actions": { + "back-in-note-history": "Idi na prethodnu povijesnu biljeÅ”ku", + "forward-in-note-history": "Idi na sljedeću povijesnu biljeÅ”ku", + "open-jump-to-note-dialog": "Otvori prozor \"Skokni na biljeÅ”ku\"", + "open-command-palette": "Otvori naredbenu ploču", + "scroll-to-active-note": "Pomakni stablo biljeÅ”ke na aktivnu biljeÅ”ku", + "quick-search": "Uključi traku brzog pretraživanja", + "search-in-subtree": "Traži biljeÅ”ke u podstablu aktivne biljeÅ”ke", + "expand-subtree": "ProÅ”iri podstablo trenutne biljeÅ”ke", + "collapse-tree": "Zatvara cijelo stablo biljeÅ”ke", + "collapse-subtree": "Zatvara podstablo trenutne biljeÅ”ke", + "sort-child-notes": "Sortiraj podbiljeÅ”ke", + "creating-and-moving-notes": "Stvaranje i premjeÅ”tanje biljeÅ”ki", + "create-note-after": "Stvori biljeÅ”ku nakon aktivne biljeÅ”ke", + "create-note-into": "Stvori biljeÅ”ku kao podbiljeÅ”ku aktivne biljeÅ”ke", + "delete-note": "ObriÅ”i biljeÅ”ku", + "move-note-up": "Premjesti biljeÅ”ku gore", + "move-note-down": "Premjesti biljeÅ”ku dolje", + "move-note-up-in-hierarchy": "Premjesti biljeÅ”ku viÅ”e u hijerarhiju", + "move-note-down-in-hierarchy": "Premjesti biljeÅ”ku niže u hijerarhiju", + "edit-branch-prefix": "Prikaži prozor \"Uredi prefiks grane\"", + "clone-notes-to": "Kloniraj označene biljeÅ”ke", + "move-notes-to": "Premjesti označene biljeÅ”ke", + "note-clipboard": "Međuspremnik biljeÅ”ki", + "copy-notes-to-clipboard": "Kopiraj označene biljeÅ”ke u međuspremnik", + "paste-notes-from-clipboard": "Zalijepi biljeÅ”ke iz međuspremnika u aktivnu biljeÅ”ku", + "cut-notes-to-clipboard": "Izreži označene biljeÅ”ke u međuspremnik", + "select-all-notes-in-parent": "Označi sve biljeÅ”ke u trenutnoj razini biljeÅ”ke", + "add-note-above-to-the-selection": "Dodaj biljeÅ”ku iznad označenog", + "add-note-below-to-selection": "Dodaj biljeÅ”ku ispod označenog", + "duplicate-subtree": "Udvostruči podstablo", + "tabs-and-windows": "Kartice i Prozori", + "open-new-tab": "Otvori novu karticu", + "close-active-tab": "Zatvori aktivnu karticu", + "reopen-last-tab": "Ponovno otvori zadnju zatvorenu karticu", + "activate-next-tab": "Aktiviraj karticu nadesno", + "activate-previous-tab": "Aktiviraj karticu nalijevo", + "open-new-window": "Otvori novi prazni prozor", + "toggle-tray": "Prikaži/sakrij aplikaciju unutar trake sustava", + "first-tab": "Aktiviraj prvu karticu na popisu", + "second-tab": "Aktiviraj drugu karticu na popisu", + "third-tab": "Aktiviraj treću karticu na popisu", + "fourth-tab": "Aktiviraj četvrtu karticu na popisu", + "fifth-tab": "Aktiviraj petu karticu na popisu", + "sixth-tab": "Aktiviraj Å”estu karticu na popisu", + "seventh-tab": "Aktiviraj sedmu karticu na popisu", + "eight-tab": "Aktiviraj osmu karticu na popisu", + "ninth-tab": "Aktiviraj devetu karticu na popisu", + "last-tab": "Aktiviraj posljednju karticu na popisu", + "dialogs": "Prozori", + "show-note-source": "Prikaži prozor \"Izvor BiljeÅ”ke\"", + "show-options": "Otvori stranicu \"Postavke\"", + "show-revisions": "Prikaži prozor \"Ispravci BiljeÅ”ki\"", + "show-recent-changes": "Prikaži prozor \"Nedavne Promjene\"", + "show-sql-console": "Otvori stranicu \"SQL konzola\"", + "show-backend-log": "Otvori stranicu \"Dnevnik Pozadine\"", + "show-help": "Otvori ugrađeni Vodič za Korisnike", + "show-cheatsheet": "Prikaži modalni prozor s uobičajenim radnjama na tipkovnici", + "text-note-operations": "Radnje tekstualnih biljeÅ”ki", + "add-link-to-text": "Otvori prozor za dodavanje poveznice u tekst", + "follow-link-under-cursor": "Slijedi poveznice unutar kojih je stavljen znak umetanja", + "insert-date-and-time-to-text": "Umetni trenutni datum i vrijeme u tekst", + "paste-markdown-into-text": "Lijepi Markdown iz međuspremnika u tekstualnu biljeÅ”ku", + "cut-into-note": "Reže označeno u trenutnoj bilježnici i stvara podbiljeÅ”ku s označenim tekstom", + "add-include-note-to-text": "Otvara prozor za uključivanje biljeÅ”ke", + "edit-readonly-note": "Uredi biljeÅ”ku samo za čitanje", + "attributes-labels-and-relations": "Atributi (oznake i relacije)", + "add-new-label": "Stvori novu oznaku", + "create-new-relation": "Stvori novu relaciju", + "ribbon-tabs": "Vrpčane kartice", + "toggle-basic-properties": "Uključi/Isključi Osnova Svojstva", + "toggle-file-properties": "Uključi/Isključi Svojstva Datoteke", + "toggle-image-properties": "Uključi/Isključi Svojstva Slike", + "toggle-owned-attributes": "Uključi/Isključi Atribute u VlasniÅ”tvu", + "toggle-inherited-attributes": "Uključi/Isključi Naslijeđene Atribute", + "toggle-promoted-attributes": "Uključi/Isključi Promovirane Atribute", + "toggle-link-map": "Uključi/Isključi Kartu Poveznica", + "toggle-note-info": "Uključi/Isključi Informacije BiljeÅ”ke", + "toggle-note-paths": "Uključi/Isključi Puteve BiljeÅ”ke", + "toggle-similar-notes": "Uključi/Isključi Slične BiljeÅ”ke", + "other": "Ostalo", + "toggle-right-pane": "Uključi/isključi prikaz desnog okna, koje uključuje Sadržaj i Istaknuto", + "print-active-note": "IspiÅ”i aktivnu biljeÅ”ku", + "open-note-externally": "Otvori biljeÅ”ku kao datoteku u zadanoj aplikaciji", + "render-active-note": "Iscrtaj (ponovno iscrtaj) aktivnu biljeÅ”ku", + "run-active-note": "Pokreni biljeÅ”ku aktivnog JavaScript (frontend/backend) koda", + "toggle-note-hoisting": "Uključi/isključi podizanje aktivne biljeÅ”ke", + "unhoist": "PoniÅ”ti podizanje od bilokud", + "reload-frontend-app": "Ponovno učitaj frontend", + "open-dev-tools": "Otvori alate za razvojne programere", + "find-in-text": "Uključi/Isključi traku za pretraživanje", + "toggle-left-note-tree-panel": "Uključi/isključi lijevu (stablo biljeÅ”ki) ploču", + "toggle-full-screen": "Uključi/isključi prikaz na cijelom zaslonu", + "zoom-out": "Odzumiraj", + "zoom-in": "Zumiraj", + "note-navigation": "Navigacija biljeÅ”ki", + "reset-zoom-level": "Resetiraj razinu zumiranja", + "copy-without-formatting": "Kopiraj označeni tekst bez oblikovanja", + "force-save-revision": "Prisilno stvori/pohrani novi ispravak biljeÅ”ke aktivne biljeÅ”ke" + } +} diff --git a/apps/server/src/assets/translations/id/server.json b/apps/server/src/assets/translations/id/server.json new file mode 100644 index 000000000..f4a654123 --- /dev/null +++ b/apps/server/src/assets/translations/id/server.json @@ -0,0 +1,88 @@ +{ + "keyboard_actions": { + "back-in-note-history": "Navigasi ke catatan sebelumnya di history", + "forward-in-note-history": "Navigasi ke catatan selanjutnya di history", + "open-jump-to-note-dialog": "Buka dialog \"Menuju ke catatan\"", + "open-command-palette": "Buka palet perintah", + "scroll-to-active-note": "Gulir cabang catatan ke catatan aktif", + "quick-search": "Aktifkan bilah pencarian cepat", + "search-in-subtree": "Mencari catatan di sub cabang catatan aktif", + "expand-subtree": "Perluas sub-cabang catatan saat ini", + "collapse-tree": "Buka cabang seluruh catatan", + "collapse-subtree": "Buka sub-cabang catatan saat ini", + "sort-child-notes": "Urutkan sub catatan", + "creating-and-moving-notes": "Membuat dan memindahkan catatan", + "create-note-after": "Buat catatan setelah catatan aktif", + "create-note-into": "Buat catatan sebagai sub dari catatan aktif", + "create-note-into-inbox": "Buat catatan di kotak masuk (jika ditentukan) atau catatan harian", + "delete-note": "Hapus catatan", + "move-note-up": "Pindah catatan ke atas", + "move-note-down": "Pindah catatan ke bawah", + "move-note-up-in-hierarchy": "Pindahkan catatan ke atas dalam hierarki", + "move-note-down-in-hierarchy": "Pindahkan catatan ke bawah dalam hierarki", + "edit-note-title": "Lompat dari pohon ke detail catatan dan edit judul", + "edit-branch-prefix": "Tampilkan dialog \"Edit awalan cabang\"", + "clone-notes-to": "Kloning catatan yang dipilih", + "move-notes-to": "Pindahkan catatan yang dipilih", + "note-clipboard": "Clipboard catatan", + "copy-notes-to-clipboard": "Salin catatan yang dipilih ke clipboard", + "paste-notes-from-clipboard": "Tempel catatan dari clipboard ke catatan aktif", + "cut-notes-to-clipboard": "Potong catatan yang dipilih ke clipboard", + "select-all-notes-in-parent": "Pilih semua catatan dari level catatan saat ini", + "add-note-above-to-the-selection": "Tambahkan catatan di atas ke pilihan", + "add-note-below-to-selection": "Tambahkan catatan di bawah ini ke pilihan", + "duplicate-subtree": "Duplikasi sub-cabang", + "tabs-and-windows": "Tab & Jendela", + "open-new-tab": "Buka tab baru", + "close-active-tab": "Tutup tab aktif", + "reopen-last-tab": "Buka kembali tab terakhir yang ditutup", + "activate-next-tab": "Aktifkan tab di sebelah kanan", + "activate-previous-tab": "Aktifkan tab di sebelah kiri", + "open-new-window": "Buka jendela kosong baru", + "toggle-tray": "Menampilkan/menyembunyikan aplikasi dari tray sistem", + "first-tab": "Aktifkan tab pertama dalam daftar", + "second-tab": "Aktifkan tab kedua dalam daftar", + "third-tab": "Aktifkan tab ketiga dalam daftar", + "fourth-tab": "Aktifkan tab keempat dalam daftar", + "fifth-tab": "Aktifkan tab kelima dalam daftar", + "sixth-tab": "Aktifkan tab keenam dalam daftar", + "seventh-tab": "Aktifkan tab ketujuh dalam daftar", + "eight-tab": "Aktifkan tab kedelapan dalam daftar", + "ninth-tab": "Aktifkan tab kesembilan dalam daftar", + "last-tab": "Aktifkan tab terakhir dalam daftar", + "dialogs": "Dialog", + "show-note-source": "Tampilkan dialog \"Sumber Catatan\"", + "show-options": "Buka halaman \"Opsi\"", + "show-revisions": "Tampilkan dialog \"Revisi Catatan\"", + "show-recent-changes": "Tampilkan dialog \"Perubahan Terbaru\"", + "show-sql-console": "Buka halaman \"SQL Console\"", + "show-backend-log": "Buka halaman \"Log Backend\"", + "show-help": "Buka Panduan Pengguna bawaan", + "show-cheatsheet": "Menampilkan modal dengan operasi keyboard umum", + "text-note-operations": "Operasi catatan teks", + "add-link-to-text": "Buka dialog untuk menambahkan tautan ke teks", + "follow-link-under-cursor": "Ikuti tautan tempat tanda sisipan ditempatkan", + "insert-date-and-time-to-text": "Masukkan tanggal & waktu saat ini ke dalam teks", + "paste-markdown-into-text": "Menempelkan Markdown dari clipboard ke catatan teks", + "cut-into-note": "Memotong pilihan dari catatan saat ini dan membuat subcatatan dengan teks yang dipilih", + "add-include-note-to-text": "Membuka dialog untuk menyertakan catatan", + "edit-readonly-note": "Edit catatan read-only", + "attributes-labels-and-relations": "Atribut (label & relasi)", + "add-new-label": "Buat label baru", + "create-new-relation": "Buat relasi baru", + "ribbon-tabs": "Tab pita", + "toggle-basic-properties": "Alihkan Properti Dasar", + "toggle-file-properties": "Alihkan Properti File", + "toggle-image-properties": "Alihkan Properti Gambar", + "toggle-owned-attributes": "Alihkan Atribut yang Dimiliki", + "toggle-inherited-attributes": "Alihkan Atribut yang Diwarisi", + "toggle-promoted-attributes": "Alihkan Atribut yang Dipromosikan", + "toggle-link-map": "Alihkan Peta Tautan", + "toggle-note-info": "Alihkan Info Catatan", + "toggle-note-paths": "Alihkan Jalur Catatan", + "toggle-similar-notes": "Alihkan Catatan Serupa", + "other": "Yang lain", + "toggle-right-pane": "Alihkan tampilan panel kanan, yang mencakup Daftar Isi dan Sorotan", + "print-active-note": "Cetak catatan aktif" + } +} diff --git a/apps/server/src/assets/translations/it/server.json b/apps/server/src/assets/translations/it/server.json index 0787990b5..1b88e03d7 100644 --- a/apps/server/src/assets/translations/it/server.json +++ b/apps/server/src/assets/translations/it/server.json @@ -1,164 +1,441 @@ { - "keyboard_action_names": { - "zoom-in": "Ingrandisci", - "reset-zoom-level": "Ripristina il livello di ingrandimento", - "zoom-out": "Riduci", - "toggle-full-screen": "Attiva/disattiva lo Schermo Intero", - "toggle-left-pane": "Attiva/disattiva il Pannello Sinistro", - "toggle-zen-mode": "Attiva/disattiva la modalitĆ  zen", - "toggle-right-pane": "Attiva/disattiva il Pannello Destro", - "toggle-system-tray-icon": "Attiva/disattiva l'Icona nel Vassoio di Sistema", - "toggle-note-hoisting": "Attiva/disattiva l'Ancoraggio della Nota", - "unhoist-note": "Disancora la Nota", - "reload-frontend-app": "Ricarica l'Applicazione Frontend", - "open-developer-tools": "Apri gli Strumenti da Sviluppatore", - "find-in-text": "Cerca nel Testo", - "print-active-note": "Stampa la Nota Attiva", - "export-active-note-as-pdf": "Esporta la nota attiva come PDF", - "open-note-externally": "Apri Esternamente la Nota", - "run-active-note": "Esegui la Nota Attiva", - "render-active-note": "Presenta la Nota Attiva" - }, - "hidden-subtree": { - "options-title": "Opzioni", - "appearance-title": "Aspetto", - "shortcuts-title": "Scorciatoie", - "text-notes": "Note di Testo", - "code-notes-title": "Note di Codice", - "images-title": "Immagini", - "spellcheck-title": "Controllo Ortografico", - "password-title": "Password", - "multi-factor-authentication-title": "MFA", - "etapi-title": "ETAPI", - "backup-title": "Archiviazione", - "sync-title": "Sincronizza", - "ai-llm-title": "IA/LLM", - "other": "Altro", - "advanced-title": "Avanzato", - "user-guide": "Guida Utente", - "visible-launchers-title": "Lanciatori Visibili", - "localization": "Lingua e Regione", - "inbox-title": "Posta in arrivo" - }, - "notes": { - "new-note": "Nuova nota", - "duplicate-note-suffix": "(dup)", - "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" - }, - "backend_log": { - "log-does-not-exist": "Il file di log del backend '{{ fileName }}' non esiste (ancora).", - "reading-log-failed": "La lettura del file di log del backend '{{ fileName }}' ĆØ fallita." - }, - "content_renderer": { - "note-cannot-be-displayed": "Questo tipo di nota non può essere visualizzato." - }, - "pdf": { - "export_filter": "Documento PDF (*.pdf)", - "unable-to-export-message": "La nota corrente non può essere esportata come PDF.", - "unable-to-export-title": "Impossibile esportare come PDF", - "unable-to-save-message": "Il file selezionato non può essere salvato. Prova di nuovo o seleziona un'altra destinazione." - }, - "tray": { - "tooltip": "Trilium Notes", - "close": "Esci da Trilium", - "recents": "Note recenti", - "bookmarks": "Segnalibri", - "today": "Apri la nota di oggi", - "new-note": "Nuova nota", - "show-windows": "Mostra le finestre", - "open_new_window": "Aprire una nuova finestra" - }, - "migration": { - "old_version": "La migrazione diretta dalla tua versione attuale non ĆØ supportata. Si prega di aggiornare prima all'ultima versione v0.60.4 e solo dopo a questa versione.", - "error_message": "Errore durante la migrazione alla versione {{version}}: {{stack}}", - "wrong_db_version": "La versione del database ({{version}}) ĆØ più recente di quanto l'applicazione si aspetti ({{targetVersion}}), il che significa che ĆØ stato creato da una versione più nuova e incompatibile di Trilium. Aggiorna Trilium all'ultima versione per risolvere questo problema." - }, - "modals": { - "error_title": "Errore" - }, - "share_theme": { - "site-theme": "Tema del Sito", - "search_placeholder": "Cerca..." - }, - "keyboard_actions": { - "back-in-note-history": "Navigare alla nota precedente della cronologia", - "forward-in-note-history": "Navigare alla prossima nota della cronologia", - "open-jump-to-note-dialog": "Apri la finestra di dialogo \"Salta alla nota\"", - "open-command-palette": "Apri la palette dei comandi", - "scroll-to-active-note": "Scorri l'albero fino alla nota attiva", - "quick-search": "Attiva la barra di ricerca rapida", - "search-in-subtree": "Cerca le note nel sotto albero della nota attiva", - "expand-subtree": "Espande il sotto albero della nota corrente", - "collapse-tree": "Contrae l'albero completo delle note", - "collapse-subtree": "Contrae il sotto albero della nota corrente", - "sort-child-notes": "Ordina le note figlio", - "creating-and-moving-notes": "Crea e sposta le note", - "create-note-after": "Crea una nota dopo quella attiva", - "create-note-into": "Crea una nota come figlia di quella attiva", - "create-note-into-inbox": "Creare una nota nella casella di posta (se definita) o nella nota del giorno", - "delete-note": "Elimina una nota", - "move-note-up": "Sposta su una nota", - "move-note-down": "Sposta giù una nota", - "move-note-up-in-hierarchy": "Sposta su la nota nella gerarchia", - "move-note-down-in-hierarchy": "Sposta giù una nota nella gerarchia", - "edit-note-title": "Salta dall'albero al dettaglio della nota e modifica il titolo", - "edit-branch-prefix": "Mostra la finestra di dialogo \"Modifica il prefisso del ramo\"", - "clone-notes-to": "Clona le note selezionate", - "move-notes-to": "Sposta le note selezionate", - "note-clipboard": "Appunti delle Note", - "copy-notes-to-clipboard": "Copia le note selezionate negli appunti", - "paste-notes-from-clipboard": "Incolla le note dagli appunti nella nota attiva", - "cut-notes-to-clipboard": "Tagliare le note selezionate negli appunti", - "select-all-notes-in-parent": "Seleziona tutte le note dal livello di nota corrente", - "add-note-above-to-the-selection": "Aggiungi una nota sopra alla selezione", - "add-note-below-to-selection": "Aggiungi una nota sotto alla selezione", - "duplicate-subtree": "Duplica il sotto albero", - "tabs-and-windows": "Schede e Finestre", - "open-new-tab": "Apri una nuova scheda", - "close-active-tab": "Chiudi la scheda attiva", - "reopen-last-tab": "Riapri l'ultima scheda chiusa", - "activate-next-tab": "Attiva la scheda sulla destra", - "activate-previous-tab": "Attiva la scheda a sinistra", - "open-new-window": "Apri una nuova finestra vuota", - "toggle-tray": "Mostra/nascondi l'applicazione dal vassoio di sistema", - "first-tab": "Attiva la prima scheda nell'elenco", - "second-tab": "Attiva la seconda scheda nell'elenco", - "third-tab": "Attiva la terza scheda nell'elenco", - "fourth-tab": "Attiva la quarta scheda nella lista", - "fifth-tab": "Attiva la quinta scheda nell'elenco", - "sixth-tab": "Attiva la sesta scheda nell'elenco", - "seventh-tab": "Attiva la settima scheda nella lista", - "eight-tab": "Attiva l'ottava scheda nell'elenco", - "ninth-tab": "Attiva la nona scheda nella lista", - "last-tab": "Attiva l'ultima scheda nell'elenco", - "dialogs": "Finestre di dialogo", - "show-note-source": "Mostra la finestra di dialogo \"Sorgente della Nota\"", - "show-options": "Apri la pagina \"Opzioni\"", - "show-revisions": "Mostra la finestra di dialogo \"Revisione della Nota\"", - "show-recent-changes": "Mostra la finestra di dialogo \"Modifiche Recenti\"", - "show-sql-console": "Apri la pagina \"Console SQL\"", - "show-backend-log": "Apri la pagina \"Log del Backend\"", - "show-help": "Apri la Guida Utente integrata", - "show-cheatsheet": "Mostra una finestra modale con le operazioni comuni da tastiera", - "text-note-operations": "Operazioni sulle note di testo", - "add-link-to-text": "Apri la finestra di dialogo per aggiungere il collegamento al testo", - "follow-link-under-cursor": "Segui il collegamento all'interno del quale ĆØ il cursore", - "insert-date-and-time-to-text": "Inserisci la data e l'ora corrente nel testo", - "paste-markdown-into-text": "Incolla il Markdown dagli appunti nella nota di testo", - "cut-into-note": "Taglia la selezione dalla nota corrente e crea una sotto nota col testo selezionato", - "add-include-note-to-text": "Apre la finestra di dialogo per includere una nota", - "edit-readonly-note": "Modifica una nota di sola lettura", - "attributes-labels-and-relations": "Attributi (etichette e relazioni)", - "add-new-label": "Crea una nuova etichetta", - "create-new-relation": "Crea una nuova relazione", - "ribbon-tabs": "Nastro delle schede", - "toggle-basic-properties": "Mostra/nascondi le ProprietĆ  di Base", - "toggle-file-properties": "Attiva ProprietĆ  del file", - "toggle-image-properties": "Attiva ProprietĆ  Immagine", - "toggle-owned-attributes": "Attiva Attributi Propri", - "toggle-inherited-attributes": "Attiva Attributi Ereditati", - "toggle-promoted-attributes": "Attiva Attributi Promossi", - "toggle-link-map": "Attiva Mappa Link", - "toggle-note-info": "Attiva Informazioni Nota" - } + "keyboard_action_names": { + "zoom-in": "Ingrandisci", + "reset-zoom-level": "Ripristina il livello di ingrandimento", + "zoom-out": "Rimpicciolisci", + "toggle-full-screen": "Attiva/Disattiva la modalitĆ  a schermo intero", + "toggle-left-pane": "Attiva/Disattiva il pannello sinistro", + "toggle-zen-mode": "Attiva/disattiva la modalitĆ  zen", + "toggle-right-pane": "Attiva/disattiva il pannello destro", + "toggle-system-tray-icon": "Attiva/Disattiva l'Icona nel vassoio di sistema", + "toggle-note-hoisting": "Attiva/Disattiva l'ancoraggio della Nota", + "unhoist-note": "Disancora la nota", + "reload-frontend-app": "Ricarica l'applicazione frontend", + "open-developer-tools": "Apri gli strumenti per sviluppatori", + "find-in-text": "Cerca nel testo", + "print-active-note": "Stampa la nota attiva", + "export-active-note-as-pdf": "Esporta la nota attiva come PDF", + "open-note-externally": "Apri la nota esternamente", + "run-active-note": "Esegui la Nota Attiva", + "render-active-note": "Renderizza nota attiva", + "back-in-note-history": "Torna alla cronologia della nota", + "forward-in-note-history": "Avanti nella cronologia della nota", + "jump-to-note": "Vai a...", + "command-palette": "Menù dei comandi", + "scroll-to-active-note": "Scorri alla nota attiva", + "quick-search": "Ricerca rapida", + "search-in-subtree": "Ricerca in sotto-albero", + "expand-subtree": "Espandi sotto-albero", + "collapse-tree": "Comprimi albero", + "collapse-subtree": "Comprimi sotto-albero", + "sort-child-notes": "Ordina le note figlie", + "create-note-after": "Crea nota dopo", + "create-note-into": "Crea nota dentro", + "create-note-into-inbox": "Crea nota in Inbox", + "delete-notes": "Elimina note", + "move-note-up": "Sposta nota in alto", + "move-note-down": "Sposta nota in basso", + "move-note-up-in-hierarchy": "Sposta nota in alto nella gerarchia", + "move-note-down-in-hierarchy": "Sposta nota in basso nella gerarchia", + "edit-note-title": "Modifica il titolo della nota", + "edit-branch-prefix": "Modifica il prefisso del ramo", + "clone-notes-to": "Clona note in", + "move-notes-to": "Sposta note in", + "copy-notes-to-clipboard": "Copia note negli appunti", + "paste-notes-from-clipboard": "Incolla note dagli appunti", + "cut-notes-to-clipboard": "Taglia note negli appunti", + "select-all-notes-in-parent": "Seleziona tutte le note al livello superiore", + "add-note-above-to-selection": "Aggiungi una nota sopra la selezione", + "add-note-below-to-selection": "Aggiungi nota sotto la selezione", + "duplicate-subtree": "Duplica sotto-albero", + "open-new-tab": "Apri nuova scheda", + "close-active-tab": "Chiudi scheda attiva", + "reopen-last-tab": "Apri ultima scheda", + "activate-next-tab": "Attiva scheda seguente", + "activate-previous-tab": "Attiva scheda precedente", + "open-new-window": "Apri nuova finestra", + "switch-to-first-tab": "Vai alla prima scheda", + "switch-to-second-tab": "Vai alla seconda scheda", + "switch-to-third-tab": "Vai alla terza scheda", + "switch-to-fourth-tab": "Vai alla quarta scheda", + "switch-to-fifth-tab": "Vai alla quinta scheda", + "switch-to-sixth-tab": "Vai alla sesta scheda", + "switch-to-seventh-tab": "Vai alla settima scheda", + "switch-to-eighth-tab": "Vai alla ottava scheda", + "switch-to-ninth-tab": "Vai alla nona scheda", + "switch-to-last-tab": "Vai all'ultima scheda", + "show-note-source": "Mostra sorgente della nota", + "show-options": "Mostra opzioni", + "show-revisions": "Mostra revisioni", + "show-recent-changes": "Mostra cambiamenti recenti", + "show-sql-console": "Mostra console SQL", + "show-backend-log": "Mostra log del backend", + "show-help": "Mostra aiuto", + "show-cheatsheet": "Mostra scheda riassuntiva", + "add-link-to-text": "Aggiungi un collegamento al testo", + "follow-link-under-cursor": "Segui collegamento sotto il cursore", + "insert-date-and-time-to-text": "Inserisci data ed ora nel testo", + "paste-markdown-into-text": "Incolla markdown nel testo", + "cut-into-note": "Taglia in una nota", + "add-include-note-to-text": "Aggiungi una nota inclusa nel testo", + "edit-read-only-note": "Modifica nota in sola lettura", + "add-new-label": "Aggiungi una nuova etichetta", + "add-new-relation": "Aggiungi una nuova relazione", + "toggle-ribbon-tab-classic-editor": "Mostra/Nascondi il nastro delle schede nell'editor classico", + "copy-without-formatting": "Copia senza formattazione", + "force-save-revision": "Forza il salvataggio della revisione", + "toggle-ribbon-tab-basic-properties": "Mostra/Nascondi le proprietĆ  di base", + "toggle-ribbon-tab-book-properties": "Mostra/Nascondi le proprietĆ  del libro", + "toggle-ribbon-tab-file-properties": "Mostra/Nascondi le proprietĆ  del file", + "toggle-ribbon-tab-image-properties": "Mostra/Nascondi le proprietĆ  dell'immagine", + "toggle-ribbon-tab-owned-attributes": "Mostra/Nascondi le proprietĆ  proprie", + "toggle-ribbon-tab-inherited-attributes": "Mostra/Nascondi le proprietĆ  ereditate", + "toggle-ribbon-tab-promoted-attributes": "Mostra/Nascondi le proprietĆ  promosse", + "toggle-ribbon-tab-note-map": "Mostra/Nascondi la mappa delle note", + "toggle-ribbon-tab-note-info": "Mostra/Nascondi le informazioni sulla nota", + "toggle-ribbon-tab-note-paths": "Mostra/Nascondi i percorsi della nota", + "toggle-ribbon-tab-similar-notes": "Mostra/Nascondi le note simili" + }, + "hidden-subtree": { + "options-title": "Opzioni", + "appearance-title": "Aspetto", + "shortcuts-title": "Scorciatoie", + "text-notes": "Note di testo", + "code-notes-title": "Note di codice", + "images-title": "Immagini", + "spellcheck-title": "Controllo ortografico", + "password-title": "Password", + "multi-factor-authentication-title": "Autenticazione a più fattori", + "etapi-title": "ETAPI", + "backup-title": "Backup", + "sync-title": "Sincronizza", + "ai-llm-title": "IA/LLM", + "other": "Altro", + "advanced-title": "Avanzato", + "user-guide": "Guida utente", + "visible-launchers-title": "Scorciatoie visibili", + "localization": "Lingua e regione", + "inbox-title": "Posta in arrivo", + "root-title": "Note nascoste", + "search-history-title": "Storico delle ricerche", + "note-map-title": "Mappa delle note", + "sql-console-history-title": "Storico della console SQL", + "shared-notes-title": "Note condivise", + "bulk-action-title": "Azioni di gruppo", + "backend-log-title": "Log del backend", + "user-hidden-title": "Utente nascosto", + "launch-bar-templates-title": "Modelli di barra delle scorciatoie", + "base-abstract-launcher-title": "Scorciatoia di base astratta", + "command-launcher-title": "Avviatore di comandi", + "built-in-widget-title": "Widget integrato", + "spacer-title": "Separatore", + "custom-widget-title": "Widget personalizzato", + "launch-bar-title": "Barra delle scorciatoie", + "available-launchers-title": "Barre delle scorciatoie disponibili", + "go-to-previous-note-title": "Vai alla nota precedente", + "go-to-next-note-title": "Vai alla nota successiva", + "new-note-title": "Nuova nota", + "search-notes-title": "Ricerca note", + "jump-to-note-title": "Vai a...", + "calendar-title": "Calendario", + "recent-changes-title": "Cambiamenti recenti", + "bookmarks-title": "Segnalibri", + "open-today-journal-note-title": "Apri la nota di oggi", + "quick-search-title": "Ricerca rapida", + "protected-session-title": "Sessione Protetta", + "sync-status-title": "Stato della sincronizzazione", + "settings-title": "Impostazioni", + "llm-chat-title": "Parla con Notes", + "note-launcher-title": "Scorciatoie delle note", + "script-launcher-title": "Scorciatoie degli script" + }, + "notes": { + "new-note": "Nuova nota", + "duplicate-note-suffix": "(dup)", + "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" + }, + "backend_log": { + "log-does-not-exist": "Il file di log del backend '{{ fileName }}' non esiste (ancora).", + "reading-log-failed": "La lettura del file di log del backend '{{ fileName }}' ĆØ fallita." + }, + "content_renderer": { + "note-cannot-be-displayed": "Questo tipo di nota non può essere visualizzato." + }, + "pdf": { + "export_filter": "Documento PDF (*.pdf)", + "unable-to-export-message": "La nota corrente non può essere esportata come PDF.", + "unable-to-export-title": "Impossibile esportare come PDF", + "unable-to-save-message": "Il file selezionato non può essere salvato. Prova di nuovo o seleziona un'altra destinazione.", + "unable-to-print": "Impossibile stampare la nota" + }, + "tray": { + "tooltip": "Trilium Notes", + "close": "Esci da Trilium", + "recents": "Note recenti", + "bookmarks": "Segnalibri", + "today": "Apri la nota di oggi", + "new-note": "Nuova nota", + "show-windows": "Mostra le finestre", + "open_new_window": "Aprire una nuova finestra" + }, + "migration": { + "old_version": "La migrazione diretta dalla tua versione attuale non ĆØ supportata. Aggiorna prima all'ultima versione v0.60.4 e solo dopo a questa versione.", + "error_message": "Errore durante la migrazione alla versione {{version}}: {{stack}}", + "wrong_db_version": "La versione del database ({{version}}) ĆØ più recente di quanto l'applicazione si aspetti ({{targetVersion}}), il che significa che ĆØ stato creato da una versione più nuova e incompatibile di Trilium. Aggiorna Trilium all'ultima versione per risolvere questo problema." + }, + "modals": { + "error_title": "Errore" + }, + "share_theme": { + "site-theme": "Tema del sito", + "search_placeholder": "Cerca...", + "image_alt": "Immagine dell'articolo", + "last-updated": "Ultimo aggiornamento il {{- date}}", + "subpages": "Sottopagine:", + "on-this-page": "In questa pagina", + "expand": "Espandi" + }, + "keyboard_actions": { + "back-in-note-history": "Naviga alla nota precedente della cronologia", + "forward-in-note-history": "Naviga alla prossima nota della cronologia", + "open-jump-to-note-dialog": "Apri la finestra di dialogo \"Salta alla nota\"", + "open-command-palette": "Apri il menù dei comandi", + "scroll-to-active-note": "Scorri l'albero fino alla nota attiva", + "quick-search": "Attiva la barra di ricerca rapida", + "search-in-subtree": "Cerca le note nel sotto-albero della nota attiva", + "expand-subtree": "Espandi il sotto-albero della nota corrente", + "collapse-tree": "Comprime l'albero completo delle note", + "collapse-subtree": "Comprime il sotto-albero della nota corrente", + "sort-child-notes": "Ordina le note figlio", + "creating-and-moving-notes": "Crea e sposta le note", + "create-note-after": "Crea una nota dopo quella attiva", + "create-note-into": "Crea una nota come figlia di quella attiva", + "create-note-into-inbox": "Crea una nota nella casella di posta (se definita) o nella nota del giorno", + "delete-note": "Elimina la nota", + "move-note-up": "Sposta su la nota", + "move-note-down": "Sposta giù la nota", + "move-note-up-in-hierarchy": "Sposta su la nota nella gerarchia", + "move-note-down-in-hierarchy": "Sposta giù la nota nella gerarchia", + "edit-note-title": "Salta dall'albero al dettaglio della nota e modifica il titolo", + "edit-branch-prefix": "Mostra la finestra di dialogo \"Modifica il prefisso del ramo\"", + "clone-notes-to": "Clona le note selezionate", + "move-notes-to": "Sposta le note selezionate", + "note-clipboard": "Appunti delle Note", + "copy-notes-to-clipboard": "Copia le note selezionate negli appunti", + "paste-notes-from-clipboard": "Incolla le note dagli appunti nella nota attiva", + "cut-notes-to-clipboard": "Tagliare le note selezionate negli appunti", + "select-all-notes-in-parent": "Seleziona tutte le note dal livello di nota corrente", + "add-note-above-to-the-selection": "Aggiungi una nota sopra alla selezione", + "add-note-below-to-selection": "Aggiungi una nota sotto alla selezione", + "duplicate-subtree": "Duplica il sotto-albero", + "tabs-and-windows": "Schede e Finestre", + "open-new-tab": "Apri una nuova scheda", + "close-active-tab": "Chiudi la scheda attiva", + "reopen-last-tab": "Riapri l'ultima scheda chiusa", + "activate-next-tab": "Attiva la scheda sulla destra", + "activate-previous-tab": "Attiva la scheda a sinistra", + "open-new-window": "Apri una nuova finestra vuota", + "toggle-tray": "Mostra/nascondi l'applicazione dal vassoio di sistema", + "first-tab": "Attiva la prima scheda nell'elenco", + "second-tab": "Attiva la seconda scheda nell'elenco", + "third-tab": "Attiva la terza scheda nell'elenco", + "fourth-tab": "Attiva la quarta scheda nella lista", + "fifth-tab": "Attiva la quinta scheda nell'elenco", + "sixth-tab": "Attiva la sesta scheda nell'elenco", + "seventh-tab": "Attiva la settima scheda nella lista", + "eight-tab": "Attiva l'ottava scheda nell'elenco", + "ninth-tab": "Attiva la nona scheda nella lista", + "last-tab": "Attiva l'ultima scheda nell'elenco", + "dialogs": "Finestre di dialogo", + "show-note-source": "Mostra la finestra di dialogo \"Sorgente della nota\"", + "show-options": "Apri la pagina \"Opzioni\"", + "show-revisions": "Mostra la finestra di dialogo \"Revisione della nota\"", + "show-recent-changes": "Mostra la finestra di dialogo \"Modifiche recenti\"", + "show-sql-console": "Apri la pagina \"Console SQL\"", + "show-backend-log": "Apri la pagina \"Log del backend\"", + "show-help": "Apri la guida utente integrata", + "show-cheatsheet": "Mostra una finestra modale con le operazioni comuni da tastiera", + "text-note-operations": "Operazioni sulle note di testo", + "add-link-to-text": "Apri la finestra di dialogo per aggiungere il collegamento al testo", + "follow-link-under-cursor": "Segui il collegamento all'interno del quale ĆØ il cursore", + "insert-date-and-time-to-text": "Inserisci la data e l'ora corrente nel testo", + "paste-markdown-into-text": "Incolla il Markdown dagli appunti nella nota di testo", + "cut-into-note": "Taglia la selezione dalla nota corrente e crea una sotto nota col testo selezionato", + "add-include-note-to-text": "Apre la finestra di dialogo per includere una nota", + "edit-readonly-note": "Modifica una nota in sola lettura", + "attributes-labels-and-relations": "Attributi (etichette e relazioni)", + "add-new-label": "Crea una nuova etichetta", + "create-new-relation": "Crea una nuova relazione", + "ribbon-tabs": "Barra delle schede", + "toggle-basic-properties": "Mostra/Nascondi le proprietĆ  di base", + "toggle-file-properties": "Mostra/Nascondi le proprietĆ  del file", + "toggle-image-properties": "Mostra/Nascondi le proprietĆ  dell'immagine", + "toggle-owned-attributes": "Mostra/Nascondi gli attributi propri", + "toggle-inherited-attributes": "Mostra/Nascondi gli attributi ereditati", + "toggle-promoted-attributes": "Mostra/Nascondi gli attributi promossi", + "toggle-link-map": "Mostra/Nascondi la mappa dei collegamenti", + "toggle-note-info": "Mostra/Nascondi le informazioni sulla nota", + "toggle-note-paths": "Mostra/Nascondi i percorsi della nota", + "toggle-similar-notes": "Mostra/Nascondi note simili", + "other": "Altro", + "toggle-right-pane": "Attiva/Disattiva la visualizzazione del riquadro destro, che include l'indice e gli elementi evidenziati", + "print-active-note": "Stampa nota attiva", + "open-note-externally": "Apri nota come file con l'applicazione predefinita", + "reload-frontend-app": "Ricarica frontend", + "open-dev-tools": "Apri strumenti di svilippo", + "toggle-full-screen": "Attiva la modalitĆ  a schermo intero", + "zoom-out": "Rimpicciolisci", + "zoom-in": "Ingrandisci", + "render-active-note": "Elabora (ri-elabora) la nota corrente", + "run-active-note": "Esegui nota JavaScript corrente (frontend/backend)", + "toggle-note-hoisting": "Cambia l'ancoraggio della nota corrente", + "find-in-text": "Mostra/Nascondi pannello di ricerca", + "note-navigation": "Navigazione note", + "reset-zoom-level": "Reimposta il livello di ingrandimento", + "copy-without-formatting": "Copia il testo selezionato senza formattazione", + "force-save-revision": "Forza la creazione o il salvataggio di una nuova revisione della nota corrente", + "toggle-book-properties": "Mostra/Nascondi le proprietĆ  della collezione", + "export-as-pdf": "Esporta la nota corrente come PDF", + "toggle-zen-mode": "Abilita/disabilita la modalitĆ  Zen (Interfaccia minimale per una scrittura senza distrazioni)", + "toggle-left-note-tree-panel": "Mostra/Nascondi il pannello di sinistra (albero delle note)", + "toggle-classic-editor-toolbar": "Mostra/Nascondi il pannello della formattazione per l'editor con la barra degli strumenti fissa", + "unhoist": "Rimuovi qualsiasi ancoraggio" + }, + "desktop": { + "instance_already_running": "C'ĆØ giĆ  una istanza in esecuzione, verrĆ  mostrata." + }, + "login": { + "title": "Accedi", + "heading": "Trilium", + "incorrect-totp": "Il codice TOTP ĆØ errato. Riprovare.", + "incorrect-password": "Le credenziali sono errate. Riprovare.", + "password": "Password", + "remember-me": "Ricorda l'accesso", + "button": "Accedi", + "sign_in_with_sso": "Accedi con {{ ssoIssuerName }}" + }, + "set_password": { + "title": "Imposta password", + "heading": "Imposta password", + "description": "Prima di poter usare Trilium dal web, occorre impostare una password. Questa password sarĆ  necessaria per accedere.", + "password": "Password", + "password-confirmation": "Conferma della password", + "button": "Imposta password" + }, + "javascript-required": "Trilium richiede JavaScript abilitato per funzionare.", + "setup": { + "heading": "Configurazione di Trilium Notes", + "new-document": "Sono un nuovo utente, e desidero creare un nuovo documento Trilium per le mie note", + "sync-from-desktop": "Ho giĆ  una istanza desktop, e desidero configurare la sincronizzazione con quest'ultima", + "sync-from-server": "Ho giĆ  una istanza server, e desidero configurare la sincronizzazione con quest'ultima", + "next": "Avanti", + "init-in-progress": "Inizializzazione del documento in corso", + "redirecting": "Sarai reindirizzato a breve all'applicazione.", + "title": "Configurazione" + }, + "setup_sync-from-desktop": { + "heading": "Sincronizza dal desktop", + "description": "Questa configurazione deve essere iniziata dalla istanza desktop:", + "step1": "Apri la tua istanza desktop di Trilium Notes.", + "step2": "Dal menù di Trilium, seleziona \"Opzioni\".", + "step3": "Clicca sulla categoria \"Sincronizzazione\".", + "step4": "Imposta \"{{- host}}\" come l'indirizzo dell'istanza server e clicca \"Salva\".", + "step5": "Clicca \"Prova sincronizzazione\" per verificare la connessione.", + "step6": "Dopo aver completato questi passaggi, clicca {{- link}}.", + "step6-here": "qui" + }, + "setup_sync-from-server": { + "heading": "Sincronizza dal server", + "instructions": "Inserire l'indirizzo e le credenziali del server Trilium. L'intero documento Trilium verrĆ  scaricato dal server, e sarĆ  configurata la sincronizzazione allo stesso. L'operazione potrebbe impiegare un po' di tempo, in base alla velocitĆ  della connessione e alla dimensione del documento.", + "server-host": "Indirizzo del server Trilium", + "server-host-placeholder": "https://:", + "proxy-server": "Server proxy (facoltativo)", + "proxy-server-placeholder": "https://:", + "note": "Note:", + "proxy-instruction": "Se il campo del proxy viene lasciato vuoto, il proxy di sistema verrĆ  utilizzato (si applica solo all'applicazione desktop)", + "password": "Password", + "password-placeholder": "Password", + "back": "Indietro", + "finish-setup": "Termina configurazione" + }, + "setup_sync-in-progress": { + "heading": "Sincronizzazione in corso", + "successful": "La sincronizzazione ĆØ stata configurata correttamente. Ci potrebbe volere un po' di tempo prima che la sincronizzazione iniziale termini. Appena sarĆ  terminata, sarai ri-indirizzato alla pagina di accesso.", + "outstanding-items": "Elementi eccezionali in sincronizzazione:", + "outstanding-items-default": "N/A" + }, + "share_404": { + "title": "Pagina non trovata", + "heading": "Pagina non trovata" + }, + "share_page": { + "parent": "padre:", + "clipped-from": "Questa nota ĆØ stata estratta inizialmente da {{- url}}", + "child-notes": "Note figlie:", + "no-content": "Questa nota ĆØ vuota." + }, + "weekdays": { + "monday": "LunedƬ", + "tuesday": "MartedƬ", + "wednesday": "MercoledƬ", + "thursday": "GiovedƬ", + "friday": "VenerdƬ", + "saturday": "Sabato", + "sunday": "Domenica" + }, + "weekdayNumber": "Settimana n. {weekNumber}", + "months": { + "january": "Gennaio", + "february": "Febbraio", + "march": "Marzo", + "april": "Aprile", + "may": "Maggio", + "june": "Giugno", + "july": "Luglio", + "august": "Agosto", + "september": "Settembre", + "october": "Ottobre", + "november": "Novembre", + "december": "Dicembre" + }, + "quarterNumber": "Quadrimestre n. {quarterNumber}", + "special_notes": { + "search_prefix": "Ricerca:" + }, + "test_sync": { + "not-configured": "L'host del server di sincronizzazione non ĆØ impostato. Configurare prima la sincronizzazione.", + "successful": "La sessione con il server di sincronizzazione ĆØ stata stabilita con successo. La sincronizzazione ĆØ iniziata." + }, + "hidden_subtree_templates": { + "text-snippet": "Frammento di testo", + "description": "Descrizione", + "list-view": "Vista elenco", + "grid-view": "Vista griglia", + "calendar": "Calendario", + "table": "Tabella", + "geo-map": "Mappa geografica", + "start-date": "Data di inizio", + "end-date": "Data di fine", + "start-time": "Ora di inizio", + "end-time": "Ora di fine", + "geolocation": "Geolocalizzazione", + "built-in-templates": "Modelli integrati", + "board": "Tavola", + "status": "Stato", + "board_note_first": "Prima nota", + "board_note_second": "Seconda nota", + "board_note_third": "Terza nota", + "board_status_todo": "Da fare", + "board_status_progress": "In avanzamento", + "board_status_done": "Conclusi", + "presentation": "Presentazione", + "presentation_slide": "Diapositiva di presentazione", + "presentation_slide_first": "Prima diapositiva", + "presentation_slide_second": "Seconda diapositiva", + "background": "Contesto" + }, + "sql_init": { + "db_not_initialized_desktop": "Database non inizializzato, seguire le istruzioni a schermo.", + "db_not_initialized_server": "Database non inizializzato, visitare la pagina di configurazione - http://[host-del-tuo-server]:{{port}} per ricevere istruzioni su come inizializzare Trilium." + } } diff --git a/apps/server/src/assets/translations/ja/server.json b/apps/server/src/assets/translations/ja/server.json index 4bd4c089f..8ceb8a5f9 100644 --- a/apps/server/src/assets/translations/ja/server.json +++ b/apps/server/src/assets/translations/ja/server.json @@ -22,7 +22,7 @@ "move-notes-to": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆć‚’ē§»å‹•", "copy-notes-to-clipboard": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼", "paste-notes-from-clipboard": "ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć‹ć‚‰ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒŽćƒ¼ćƒˆć«ćƒŽćƒ¼ćƒˆć‚’č²¼ć‚Šä»˜ć‘", - "cut-notes-to-clipboard": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚«ćƒƒćƒˆ", + "cut-notes-to-clipboard": "éøęŠžć—ćŸćƒŽćƒ¼ćƒˆć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«åˆ‡ć‚Šå–ć‚Š", "select-all-notes-in-parent": "ē¾åœØć®ćƒŽćƒ¼ćƒˆćƒ¬ćƒ™ćƒ«ćØåŒć˜ćƒŽćƒ¼ćƒˆć‚’ć™ć¹ć¦éøęŠžć™ć‚‹", "add-note-above-to-the-selection": "äøŠć®ćƒŽćƒ¼ćƒˆć‚’éøęŠžēÆ„å›²ć«čæ½åŠ ", "add-note-below-to-selection": "äø‹ć®ćƒŽćƒ¼ćƒˆć‚’éøęŠžēÆ„å›²ć«čæ½åŠ ", @@ -46,7 +46,7 @@ "last-tab": "ęœ€å¾Œć®ć‚æćƒ–ć‚’ć‚¢ć‚Æćƒ†ć‚£ćƒ–ć«ć™ć‚‹", "dialogs": "ćƒ€ć‚¤ć‚¢ćƒ­ć‚°", "show-note-source": "ć€ŒćƒŽćƒ¼ćƒˆć®ć‚½ćƒ¼ć‚¹ć€ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‚’č”Øē¤ŗ", - "show-options": "ć€Œć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć€ćƒšćƒ¼ć‚øć‚’é–‹ć", + "show-options": "ć€ŒčØ­å®šć€ćƒšćƒ¼ć‚øć‚’é–‹ć", "show-recent-changes": "ć€Œęœ€čæ‘ć®å¤‰ę›“ć€ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‚’č”Øē¤ŗ", "show-sql-console": "怌SQLć‚³ćƒ³ć‚½ćƒ¼ćƒ«ć€ćƒšćƒ¼ć‚øć‚’é–‹ć", "show-backend-log": "ć€Œćƒćƒƒć‚Æć‚Øćƒ³ćƒ‰ćƒ­ć‚°ć€ćƒšćƒ¼ć‚øć‚’é–‹ć", @@ -88,9 +88,9 @@ "duplicate-subtree": "ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć®č¤‡č£½", "edit-branch-prefix": "ć€Œćƒ–ćƒ©ćƒ³ćƒęŽ„é ­č¾žć®ē·Øé›†ć€ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‚’č”Øē¤ŗ", "show-revisions": "ć€ŒćƒŽćƒ¼ćƒˆć®å¤‰ę›“å±„ę­“ć€ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‚’č”Øē¤ŗ", - "attributes-labels-and-relations": "å±žę€§ļ¼ˆćƒ©ćƒ™ćƒ«ćØé–¢äæ‚ļ¼‰", + "attributes-labels-and-relations": "å±žę€§ļ¼ˆćƒ©ćƒ™ćƒ«ćØćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ļ¼‰", "add-new-label": "ę–°ć—ć„ćƒ©ćƒ™ćƒ«ć‚’ä½œęˆć™ć‚‹", - "create-new-relation": "ę–°ć—ć„é–¢äæ‚ć‚’ä½œęˆć™ć‚‹", + "create-new-relation": "ę–°ć—ć„ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’ä½œęˆć™ć‚‹", "toggle-basic-properties": "åŸŗęœ¬å±žę€§åˆ‡ć‚Šę›æćˆ", "toggle-file-properties": "ćƒ•ć‚”ć‚¤ćƒ«å±žę€§åˆ‡ć‚Šę›æćˆ", "toggle-image-properties": "ē”»åƒå±žę€§åˆ‡ć‚Šę›æćˆ", @@ -101,16 +101,16 @@ "toggle-book-properties": "ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³ćƒ—ćƒ­ćƒ‘ćƒ†ć‚£åˆ‡ć‚Šę›æćˆ", "toggle-zen-mode": "ē¦…ćƒ¢ćƒ¼ćƒ‰ļ¼ˆé›†äø­ć—ćŸē·Øé›†ć®ćŸć‚ć®ęœ€å°é™ć®UIļ¼‰ć‚’ęœ‰åŠ¹/ē„”åŠ¹ć«ć™ć‚‹", "add-include-note-to-text": "ćƒŽćƒ¼ćƒˆć‚’åŸ‹ć‚č¾¼ć‚€ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‚’é–‹ć", - "toggle-promoted-attributes": "ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆć•ć‚ŒćŸå±žę€§ć‚’ćƒˆć‚°ćƒ«ć™ć‚‹", + "toggle-promoted-attributes": "ćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆå±žę€§åˆ‡ć‚Šę›æćˆ", "force-save-revision": "ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćƒŽćƒ¼ćƒˆć®ę–°ć—ć„ćƒŽćƒ¼ćƒˆćƒŖćƒ“ć‚£ć‚øćƒ§ćƒ³ć‚’å¼·åˆ¶ć™ć‚‹", - "toggle-classic-editor-toolbar": "å›ŗå®šćƒ„ćƒ¼ćƒ«ćƒćƒ¼ć‚’ęŒć£ćŸć‚Øćƒ‡ć‚£ć‚æćƒ¼ć®ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆć‚æćƒ–ć‚’ćƒˆć‚°ćƒ«ć™ć‚‹" + "toggle-classic-editor-toolbar": "å›ŗå®šćƒ„ćƒ¼ćƒ«ćƒćƒ¼ć‚Øćƒ‡ć‚£ć‚æćƒ¼ć®ę›øå¼čØ­å®šć‚æćƒ–åˆ‡ć‚Šę›æćˆ" }, "keyboard_action_names": { "back-in-note-history": "ćƒŽćƒ¼ćƒˆć®å±„ę­“ć‚’ęˆ»ć‚‹", "forward-in-note-history": "ćƒŽćƒ¼ćƒˆć®å±„ę­“ć‚’é€²ć‚€", "command-palette": "ć‚³ćƒžćƒ³ćƒ‰ćƒ‘ćƒ¬ćƒƒćƒˆ", "scroll-to-active-note": "ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćƒŽćƒ¼ćƒˆć¾ć§ć‚¹ć‚Æćƒ­ćƒ¼ćƒ«", - "quick-search": "ć‚Æć‚¤ćƒƒć‚Æć‚µćƒ¼ćƒ", + "quick-search": "ć‚Æć‚¤ćƒƒć‚Æę¤œē“¢", "search-in-subtree": "ć‚µćƒ–ćƒ„ćƒŖćƒ¼å†…ć‚’ę¤œē“¢", "expand-subtree": "ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć‚’å±•é–‹", "collapse-subtree": "ć‚µćƒ–ćƒ„ćƒŖćƒ¼ć‚’ęŠ˜ć‚ŠćŸćŸć‚€", @@ -128,7 +128,7 @@ "move-notes-to": "ćƒŽćƒ¼ćƒˆć‚’ē§»å‹•", "copy-notes-to-clipboard": "ćƒŽćƒ¼ćƒˆć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚³ćƒ”ćƒ¼", "paste-notes-from-clipboard": "ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć‹ć‚‰ćƒŽćƒ¼ćƒˆć‚’č²¼ć‚Šä»˜ć‘", - "cut-notes-to-clipboard": "ćƒŽćƒ¼ćƒˆć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«ć‚«ćƒƒćƒˆ", + "cut-notes-to-clipboard": "ćƒŽćƒ¼ćƒˆć‚’ć‚ÆćƒŖćƒƒćƒ—ćƒœćƒ¼ćƒ‰ć«åˆ‡ć‚Šå–ć‚Š", "select-all-notes-in-parent": "č¦ŖćƒŽćƒ¼ćƒˆå†…ć®ć™ć¹ć¦ć®ćƒŽćƒ¼ćƒˆć‚’éøęŠž", "add-note-above-to-selection": "éøęŠžēÆ„å›²ć«äøŠć®ćƒŽćƒ¼ćƒˆć‚’čæ½åŠ ", "add-note-below-to-selection": "éøęŠžēÆ„å›²ć«äø‹ć®ćƒŽćƒ¼ćƒˆć‚’čæ½åŠ ", @@ -184,7 +184,7 @@ "edit-branch-prefix": "ćƒ–ćƒ©ćƒ³ćƒęŽ„é ­č¾žć®ē·Øé›†", "show-revisions": "変曓屄歓を蔨示", "add-new-label": "ćƒ©ćƒ™ćƒ«ć‚’čæ½åŠ ", - "add-new-relation": "é–¢äæ‚ć‚’čæ½åŠ ", + "add-new-relation": "ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’čæ½åŠ ", "toggle-ribbon-tab-basic-properties": "ćƒŖćƒœćƒ³ć‚æćƒ–åˆ‡ć‚Šę›æćˆļ¼šåŸŗęœ¬å±žę€§", "toggle-ribbon-tab-book-properties": "ćƒŖćƒœćƒ³ć‚æćƒ–åˆ‡ć‚Šę›æćˆļ¼šę›øē±å±žę€§", "toggle-ribbon-tab-file-properties": "ćƒŖćƒœćƒ³ć‚æćƒ–åˆ‡ć‚Šę›æćˆļ¼šćƒ•ć‚”ć‚¤ćƒ«å±žę€§", @@ -198,7 +198,9 @@ "toggle-note-hoisting": "ćƒŽćƒ¼ćƒˆćƒ›ć‚¤ć‚¹ćƒˆåˆ‡ć‚Šę›æćˆ", "unhoist-note": "ćƒŽćƒ¼ćƒˆćƒ›ć‚¤ć‚¹ćƒˆć‚’ē„”åŠ¹ć«ć™ć‚‹", "force-save-revision": "å¼·åˆ¶äæå­˜ćƒŖćƒ“ć‚øćƒ§ćƒ³", - "add-include-note-to-text": "åŸ‹ć‚č¾¼ćæćƒŽćƒ¼ćƒˆć‚’čæ½åŠ " + "add-include-note-to-text": "åŸ‹ć‚č¾¼ćæćƒŽćƒ¼ćƒˆć‚’čæ½åŠ ", + "toggle-ribbon-tab-classic-editor": "ćƒŖćƒœćƒ³ć‚æćƒ–ć®ć‚Æćƒ©ć‚·ćƒƒć‚Æć‚Øćƒ‡ć‚£ć‚æćƒ¼ć«åˆ‡ć‚Šę›æćˆć‚‹", + "toggle-ribbon-tab-promoted-attributes": "ćƒŖćƒœćƒ³ć‚æćƒ–åˆ‡ć‚Šę›æćˆļ¼šćƒ—ćƒ­ćƒ¢ćƒ¼ćƒˆå±žę€§" }, "login": { "title": "ćƒ­ć‚°ć‚¤ćƒ³", @@ -251,7 +253,8 @@ "password": "ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰", "password-placeholder": "ćƒ‘ć‚¹ćƒÆćƒ¼ćƒ‰", "finish-setup": "ć‚»ćƒƒćƒˆć‚¢ćƒƒćƒ—å®Œäŗ†", - "back": "ęˆ»ć‚‹" + "back": "ęˆ»ć‚‹", + "note": "ćƒŽćƒ¼ćƒˆ:" }, "setup_sync-in-progress": { "heading": "同期中", @@ -309,7 +312,7 @@ "new-note-title": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆ", "bookmarks-title": "ćƒ–ćƒƒć‚Æćƒžćƒ¼ć‚Æ", "open-today-journal-note-title": "ä»Šę—„ć®ę—„čØ˜ć‚’é–‹ć", - "quick-search-title": "ć‚Æć‚¤ćƒƒć‚Æć‚µćƒ¼ćƒ", + "quick-search-title": "ć‚Æć‚¤ćƒƒć‚Æę¤œē“¢", "recent-changes-title": "ęœ€čæ‘ć®å¤‰ę›“", "root-title": "éš ć•ć‚ŒćŸćƒŽćƒ¼ćƒˆ", "note-map-title": "ćƒŽćƒ¼ćƒˆćƒžćƒƒćƒ—", @@ -335,13 +338,16 @@ "sync-status-title": "åŒęœŸēŠ¶ę…‹", "settings-title": "設定", "llm-chat-title": "ćƒŽćƒ¼ćƒˆćØćƒćƒ£ćƒƒćƒˆ", - "options-title": "ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³", + "options-title": "設定", "multi-factor-authentication-title": "å¤šč¦ē“ čŖčØ¼", - "etapi-title": "ETAPI" + "etapi-title": "ETAPI", + "visible-launchers-title": "åÆč¦–åŒ–ć•ć‚ŒćŸćƒ©ćƒ³ćƒćƒ£ćƒ¼", + "inbox-title": "Inbox", + "base-abstract-launcher-title": "ćƒ™ćƒ¼ć‚¹ ć‚¢ćƒ–ć‚¹ćƒˆćƒ©ć‚Æćƒˆćƒ©ćƒ³ćƒćƒ£ćƒ¼" }, "notes": { "new-note": "ę–°ć—ć„ćƒŽćƒ¼ćƒˆ", - "duplicate-note-suffix": "(重複)", + "duplicate-note-suffix": "(複製)", "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" }, "backend_log": { @@ -355,7 +361,8 @@ "export_filter": "PDFćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ (*.pdf)", "unable-to-export-message": "ē¾åœØć®ćƒŽćƒ¼ćƒˆć‚’PDFćØć—ć¦ć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆć§ćć¾ć›ć‚“ć§ć—ćŸć€‚", "unable-to-export-title": "PDFćØć—ć¦ć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆć§ćć¾ć›ć‚“", - "unable-to-save-message": "éøęŠžć•ć‚ŒćŸćƒ•ć‚”ć‚¤ćƒ«ć«ę›øćč¾¼ć‚ć¾ć›ć‚“ć§ć—ćŸć€‚ć‚‚ć†äø€åŗ¦č©¦ć™ć‹ć€åˆ„ć®äæå­˜å…ˆć‚’éøęŠžć—ć¦ćć ć•ć„ć€‚" + "unable-to-save-message": "éøęŠžć•ć‚ŒćŸćƒ•ć‚”ć‚¤ćƒ«ć«ę›øćč¾¼ć‚ć¾ć›ć‚“ć§ć—ćŸć€‚ć‚‚ć†äø€åŗ¦č©¦ć™ć‹ć€åˆ„ć®äæå­˜å…ˆć‚’éøęŠžć—ć¦ćć ć•ć„ć€‚", + "unable-to-print": "ćƒŽćƒ¼ćƒˆć‚’å°åˆ·ć§ćć¾ć›ć‚“" }, "tray": { "tooltip": "Trilium Notes", @@ -405,7 +412,12 @@ "geo-map": "ć‚øć‚Ŗćƒžćƒƒćƒ—", "geolocation": "ć‚øć‚Ŗćƒ­ć‚±ćƒ¼ć‚·ćƒ§ćƒ³", "built-in-templates": "å†…č”µć®ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆ", - "board_status_todo": "ęœŖå®Œäŗ†" + "board_status_todo": "ęœŖå®Œäŗ†", + "presentation": "ćƒ—ćƒ¬ć‚¼ćƒ³ćƒ†ćƒ¼ć‚·ćƒ§ćƒ³", + "presentation_slide": "ćƒ—ćƒ¬ć‚¼ćƒ³ćƒ†ćƒ¼ć‚·ćƒ§ćƒ³ć‚¹ćƒ©ć‚¤ćƒ‰", + "presentation_slide_first": "ęœ€åˆć®ć‚¹ćƒ©ć‚¤ćƒ‰", + "presentation_slide_second": "2ē•Ŗē›®ć®ć‚¹ćƒ©ć‚¤ćƒ‰", + "background": "čƒŒę™Æ" }, "share_404": { "title": "該当なし", @@ -413,7 +425,17 @@ }, "share_page": { "clipped-from": "ć“ć®ćƒŽćƒ¼ćƒˆćÆå…ƒć€…{{- url}}ć‹ć‚‰åˆ‡ć‚Šå–ć‚‰ć‚ŒćŸć‚‚ć®ć§ć™", - "no-content": "ć“ć®ćƒŽćƒ¼ćƒˆć«ćÆå†…å®¹ćŒć‚ć‚Šć¾ć›ć‚“ć€‚" + "no-content": "ć“ć®ćƒŽćƒ¼ćƒˆć«ćÆå†…å®¹ćŒć‚ć‚Šć¾ć›ć‚“ć€‚", + "parent": "親:", + "child-notes": "å­ćƒŽćƒ¼ćƒˆ:" }, - "weekdayNumber": "第{weekNumber}週" + "weekdayNumber": "第{weekNumber}週", + "quarterNumber": "å››åŠęœŸ {quarterNumber}", + "sql_init": { + "db_not_initialized_desktop": "DB ćŒåˆęœŸåŒ–ć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚ē”»é¢ć®ęŒ‡ē¤ŗć«å¾“ć£ć¦ćć ć•ć„ć€‚", + "db_not_initialized_server": "DB ćŒåˆęœŸåŒ–ć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚ć‚»ćƒƒćƒˆć‚¢ćƒƒćƒ— ćƒšćƒ¼ć‚ø 怌http://[your-server-host]:{{port}}怍 にアクセスして、Trilium ć‚’åˆęœŸåŒ–ć™ć‚‹ę–¹ę³•ć®čŖ¬ę˜Žć‚’ē¢ŗčŖć—ć¦ćć ć•ć„ć€‚" + }, + "desktop": { + "instance_already_running": "ć™ć§ć«ć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹ćŒå®Ÿč”Œć•ć‚Œć¦ć„ć‚‹ć®ć§ć€ä»£ć‚ć‚Šć«ćć®ć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹ć«ćƒ•ć‚©ćƒ¼ć‚«ć‚¹ć—ć¾ć™ć€‚" + } } diff --git a/apps/server/src/assets/translations/ko/server.json b/apps/server/src/assets/translations/ko/server.json index addfca0cc..a8b421e81 100644 --- a/apps/server/src/assets/translations/ko/server.json +++ b/apps/server/src/assets/translations/ko/server.json @@ -38,6 +38,7 @@ "activate-next-tab": "우츔 탭 ķ™œģ„±ķ™”", "activate-previous-tab": "좌츔 탭 ķ™œģ„±ķ™”", "open-new-window": "새 ė¹„ģ–“ģžˆėŠ” ģ°½ ģ—“źø°", - "toggle-tray": "ģ‹œģŠ¤ķ…œ ķŠøė ˆģ“ģ—ģ„œ ģ• ķ”Œė¦¬ģ¼€ģ“ģ…˜ 볓여주기/숨기기" + "toggle-tray": "ģ‹œģŠ¤ķ…œ ķŠøė ˆģ“ģ—ģ„œ ģ• ķ”Œė¦¬ģ¼€ģ“ģ…˜ 볓여주기/숨기기", + "tabs-and-windows": "탭 & ģ°½" } } diff --git a/apps/server/src/assets/translations/md/server.json b/apps/server/src/assets/translations/md/server.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/apps/server/src/assets/translations/md/server.json @@ -0,0 +1 @@ +{} diff --git a/apps/server/src/assets/translations/nb-NO/server.json b/apps/server/src/assets/translations/nb-NO/server.json new file mode 100644 index 000000000..fa11d20d6 --- /dev/null +++ b/apps/server/src/assets/translations/nb-NO/server.json @@ -0,0 +1,11 @@ +{ + "keyboard_actions": { + "back-in-note-history": "Naviger til forrige notat i historikken", + "forward-in-note-history": "Naviger til neste notat i historikken", + "open-jump-to-note-dialog": "ƅpne \"gĆ„ til notat\"-dialogboksen", + "open-command-palette": "ƅpne kommandopalett", + "scroll-to-active-note": "Skroll notat-treet til aktivt notat", + "quick-search": "Aktiver hurtigsĆøk-feltet", + "search-in-subtree": "SĆøk etter notater i det aktive notatets understruktur" + } +} diff --git a/apps/server/src/assets/translations/nl/server.json b/apps/server/src/assets/translations/nl/server.json index ffa419733..4692f40fc 100644 --- a/apps/server/src/assets/translations/nl/server.json +++ b/apps/server/src/assets/translations/nl/server.json @@ -7,6 +7,48 @@ "scroll-to-active-note": "Scroll naar actieve notitie in de notitieboom", "quick-search": "Snelle zoekbalk activeren", "search-in-subtree": "Zoek naar notities in de subboom van de actieve notitie", - "expand-subtree": "Subboom van huidige notitie uitbreiden" + "expand-subtree": "Subboom van huidige notitie uitbreiden", + "collapse-tree": "Vouwt de volledige notitieboom samen", + "collapse-subtree": "Vouwt de subboom van de huidige notitie samen", + "sort-child-notes": "Kindnotities sorteren", + "creating-and-moving-notes": "Notities maken en verplaatsen", + "create-note-after": "Maak notitie na actieve notitie", + "create-note-into": "Maak notitie als onderliggende notitie van actieve notitie", + "create-note-into-inbox": "Maak een notitie in de inbox (indien gedefinieerd) of dagnotitie", + "delete-note": "Notitie verwijderen", + "move-note-up": "Notitie naar boven verplaatsen", + "move-note-down": "Notitie naar beneden verplaatsen", + "move-note-up-in-hierarchy": "Notitie hoger in hiĆ«rarchie plaatsen", + "move-note-down-in-hierarchy": "Verplaats nota in hiĆ«rarchie", + "edit-note-title": "Spring van de boom naar de notitie en de titel", + "edit-branch-prefix": "Dialoogvenster \"Bewerk takvoorvoegsel\" weergeven", + "clone-notes-to": "Geselecteerde notities klonen", + "move-notes-to": "Geselecteerde notities verplaatsen", + "note-clipboard": "Notitieblok", + "copy-notes-to-clipboard": "Kopieer geselecteerde notities naar het klembord", + "paste-notes-from-clipboard": "Plak notities uit het klembord in de actieve notitie", + "cut-notes-to-clipboard": "Geselecteerde notities naar het klembord knippen", + "select-all-notes-in-parent": "Selecteer alle notities van het huidige notitieniveau", + "add-note-above-to-the-selection": "Voeg bovenstaande opmerking toe aan de selectie", + "add-note-below-to-selection": "Voeg onderstaande opmerking toe aan de selectie", + "duplicate-subtree": "Duplicaat subboom", + "tabs-and-windows": "Tabbladen en vensters", + "open-new-tab": "Nieuw tabblad openen", + "close-active-tab": "Sluit actief tabblad", + "reopen-last-tab": "Het laatst gesloten tabblad opnieuw openen", + "activate-next-tab": "Tabblad rechts activeren", + "activate-previous-tab": "Tabblad links activeren", + "open-new-window": "Nieuw leeg venster openen", + "toggle-tray": "De toepassing weergeven/verbergen in het systeemvak", + "first-tab": "Activeer het eerste tabblad in de lijst", + "second-tab": "Activeer het tweede tabblad in de lijst", + "third-tab": "Activeer het derde tabblad in de lijst", + "fourth-tab": "Activeer het vierde tabblad in de lijst", + "fifth-tab": "Activeer het vijfde tabblad in de lijst", + "sixth-tab": "Activeer het zesde tabblad in de lijst", + "seventh-tab": "Activeer het zevende tabblad in de lijst", + "eight-tab": "Activeer het achtste tabblad in de lijst", + "ninth-tab": "Activeer het negende tabblad in de lijst", + "last-tab": "Activeer het laatste tabblad in de lijst" } } diff --git a/apps/server/src/assets/translations/pl/server.json b/apps/server/src/assets/translations/pl/server.json index d2d72f874..2838d138c 100644 --- a/apps/server/src/assets/translations/pl/server.json +++ b/apps/server/src/assets/translations/pl/server.json @@ -13,7 +13,7 @@ "sort-child-notes": "Sortuj podnotatki", "creating-and-moving-notes": "Tworzenie oraz przestawianie notatek", "create-note-after": "Utwórz notatkę po aktywnej notatce", - "create-note-into": "Utwórz notatkę jako podnotatka aktywnej notatki", + "create-note-into": "Utwórz notatkę jako pod-notatka aktywnej notatki", "create-note-into-inbox": "Utwórz notatkę w skrzyncę (jeśli zdefiniowana) lub jako notatka dnia", "delete-note": "Usuń notatkę", "move-note-up": "Przestaw notatkę wyżej", @@ -74,7 +74,36 @@ "zoom-out": "Pomniejsz", "zoom-in": "Powiększ", "print-active-note": "Drukuj aktywną notatkę", - "toggle-full-screen": "Przełącz pełny ekran" + "toggle-full-screen": "Przełącz pełny ekran", + "cut-into-note": "Wycina zaznaczony tekst i tworzy podrzędną notatkę z tym tekstem", + "edit-readonly-note": "Edytuj notatkę tylko do odczytu", + "other": "Inne", + "toggle-basic-properties": "Przełącz podstawowe ustawienia", + "toggle-file-properties": "Przełącz ustawienia pliku", + "toggle-image-properties": "Przełącz ustawienia obrazu", + "toggle-owned-attributes": "Przełącz posiadane atrybuty", + "toggle-inherited-attributes": "Przełącz odziedziczone atrybuty", + "toggle-promoted-attributes": "Przełącz promowane atrybuty", + "render-active-note": "Wyrenderuj (ponownie) aktywną notatkę", + "find-in-text": "Włącz panel wyszukiwania", + "note-navigation": "Nawigacja notatki", + "export-as-pdf": "Wyeksportuj ta notatkę jako PDF", + "copy-without-formatting": "Skopiuj zaznaczony tekst bez formatowania", + "force-save-revision": "Wymuszanie tworzenia/zapisywania nowej wersji aktywnej notatki", + "toggle-book-properties": "Przełącz właściwości kolekcji", + "toggle-left-note-tree-panel": "Włącz panel po lewej (drzewo notatek)", + "toggle-classic-editor-toolbar": "Przełącz kartę Formatowanie dla edytora ze stałym paskiem narzędzi", + "add-include-note-to-text": "Otwiera okno dialogowe umożliwiające dodanie notatki", + "ribbon-tabs": "Karty wstążki", + "toggle-link-map": "Włącz mapę linków", + "toggle-note-info": "Włącz informacje o notatce", + "toggle-note-paths": "Włącz ścieżki notatki", + "toggle-similar-notes": "Włącz pokazywanie podobnych notatek", + "toggle-right-pane": "Przełącz wyświetlanie prawego panelu, który zawiera spis treści i najważniejsze informacje", + "run-active-note": "Uruchomienie aktywnego kodu JavaScript (frontend/backend) w notatce", + "toggle-note-hoisting": "Przełączanie podnoszenia aktywnej notatki", + "unhoist": "Odłącz ze wszystkich miejsc", + "toggle-zen-mode": "Włącz/wyłącz tryb zen (minimalny UI dla większej koncentracji)" }, "keyboard_action_names": { "zoom-in": "Powiększ", @@ -96,22 +125,90 @@ "close-active-tab": "Zamknij aktywną kartę", "reopen-last-tab": "Przywróć ostatnią kartę", "open-new-window": "Otwórz nowe okno", - "find-in-text": "Wyszukaj w tekście" + "find-in-text": "Wyszukaj w tekście", + "quick-search": "Szybkie wyszukiwanie", + "edit-note-title": "Edytuj tytuł notatki", + "copy-notes-to-clipboard": "Skopiuj Notatki do schowka", + "paste-notes-from-clipboard": "Wklej notatki ze schowka", + "cut-notes-to-clipboard": "Wytnij notatki do schowka", + "clone-notes-to": "Sklonuj notatkę do", + "move-notes-to": "Przenieś notatkę do", + "duplicate-subtree": "Duplikuj poddrzewo", + "open-developer-tools": "Otwórz narzędzia dewelopera", + "export-active-note-as-pdf": "Wyeksportuj aktywną notatkę jako PDF", + "open-note-externally": "Otwórz notatkę zewnętrznie", + "render-active-note": "Wyrenderuj aktywną notatkę", + "run-active-note": "Uruchom aktywną notatkę", + "show-revisions": "Pokaż wersje", + "show-recent-changes": "Pokaż ostatnie zmiany", + "show-sql-console": "Pokaż konsolę SQL", + "reset-zoom-level": "Zresetuj poziom zooma", + "add-link-to-text": "Dodaj link do tekstu", + "force-save-revision": "Wymuś zapis wersji", + "create-note-after": "Stwórz notatkę po", + "create-note-into": "Stwórz notatkę w", + "create-note-into-inbox": "Stwórz notatkę w skrzynce odbiorczej", + "select-all-notes-in-parent": "Zaznacz wszystkie notatki", + "add-note-above-to-selection": "Dodaj notatkę nad w selekcji", + "add-note-below-to-selection": "Dodaj notatkę pod do selekcji", + "activate-next-tab": "Aktywuj następną kartę", + "activate-previous-tab": "Aktywuj poprzednią kartę", + "toggle-system-tray-icon": "Włącz ikonę zasobnika systemowego", + "toggle-zen-mode": "Włącz tryb Zen", + "switch-to-first-tab": "Przełącz do pierwszej karty", + "switch-to-second-tab": "Przełącz do drugiej karty", + "switch-to-third-tab": "Przełącz do trzeciej karty", + "switch-to-fourth-tab": "Przełącz do czwartej karty", + "switch-to-fifth-tab": "Przełącz do piątej karty", + "switch-to-sixth-tab": "Przełącz do szóstej karty", + "switch-to-seventh-tab": "Przełącz do siódmej karty", + "switch-to-eighth-tab": "Przełącz do ósmej karty", + "switch-to-ninth-tab": "Przełącz do dziewiątej karty", + "switch-to-last-tab": "Przełącz do ostatniej karty", + "show-note-source": "Pokaż Åŗródło notatki", + "show-options": "Pokaż opcje", + "show-backend-log": "Pokaż dziennik logów", + "show-help": "Pokaż pomoc", + "show-cheatsheet": "Pokaż Cheatsheet", + "back-in-note-history": "Powrót do historii notatek", + "forward-in-note-history": "Przewiń historię notatek", + "command-palette": "Paleta komend", + "edit-branch-prefix": "Edytuj prefiks gałęzi", + "paste-markdown-into-text": "Wklej Markdown do tekstu", + "cut-into-note": "Wytnij do notatki", + "edit-read-only-note": "Edytuj notatkę tylko do odczytu", + "add-new-label": "Dodaj nową etykietę", + "add-new-relation": "Dodaj nowe powiązanie", + "print-active-note": "Wydrukuj aktywną notatkę", + "toggle-left-pane": "Włącz lewy panel", + "toggle-full-screen": "Włącz pełny ekran" }, "login": { "password": "Hasło", - "remember-me": "Zapamiętaj mnie" + "remember-me": "Zapamiętaj mnie", + "title": "Zaloguj", + "heading": "Logowanie do Trilium", + "incorrect-totp": "TOTP jest nieprawidłowe. Spróbuj ponownie.", + "incorrect-password": "Hasło jest nieprawidłowe. Spróbuj ponownie.", + "button": "Login", + "sign_in_with_sso": "Zaloguj się za pomocą {{ ssoIssuerName }}" }, "javascript-required": "Trillium wymaga włączenia JavaScript.", "setup_sync-from-server": { "server-host": "Adres serwera Trillium", "proxy-server": "Serwer proxy (opcjonalnie)", "back": "Wstecz", - "finish-setup": "Zakończ konfiguracje" + "finish-setup": "Zakończ konfiguracje", + "heading": "Sychnronizuj z serwera", + "note": "Notatka:", + "server-host-placeholder": "https://:", + "password": "Hasło", + "password-placeholder": "Hasło" }, "setup_sync-in-progress": { "heading": "Synchronizacja w toku", - "outstanding-items": "Pozostało do zsynchronizowania:" + "outstanding-items": "Pozostało do zsynchronizowania:", + "outstanding-items-default": "N/A" }, "weekdays": { "monday": "Poniedziałek", @@ -160,5 +257,72 @@ }, "notes": { "new-note": "Nowa notatka" + }, + "set_password": { + "title": "Ustaw hasło", + "heading": "Ustaw hasło", + "description": "Aby zacząć korzystać z Trilium online, musisz ustawić najpierw hasło. Hasło zostanie użyte do logowania.", + "password": "Hasło", + "password-confirmation": "PotwierdÅŗ hasło", + "button": "Ustaw nowe hasło" + }, + "setup": { + "heading": "Instalacja Trilium Notes", + "new-document": "Jestem nowym użytkownikiem i chce stworzyć nowy dokument Trilium dla moich notatek", + "sync-from-desktop": "Mam już wersję desktopową i chcę ustawić synchronizację", + "sync-from-server": "Mam już serwer i chcę skonfigurować z nią synchronizację", + "next": "Następny", + "init-in-progress": "Trwa inicjalizacja dokumentu", + "redirecting": "Zostaniesz przeniesiony do aplikacji.", + "title": "Instalacja" + }, + "setup_sync-from-desktop": { + "heading": "Synchronizuj z wersją desktopową", + "description": "Ta instalacja musi być wykonana na wersji desktopowej:", + "step1": "Otwórz aplikację Trilium Notes.", + "step2": "Z menu Trilium wybierz Opcje.", + "step3": "Kliknij na kategorię Synchronizuj.", + "step4": "Zmień adres wersji do: {{- host}} i kliknij zapisz.", + "step5": "Kliknij \"Testuj Synchronizację\" aby zweryfikować połączenie.", + "step6": "Kiedy wykonasz te kroki, kliknij {{- link}}.", + "step6-here": "tutaj" + }, + "share_page": { + "no-content": "Ta notatka nie ma treści." + }, + "share_404": { + "title": "Nie znaleziono", + "heading": "Nie znaleziono" + }, + "share_theme": { + "image_alt": "Zdjęcie artykułu", + "last-updated": "Ostatnia aktualizacja: {{- date}}", + "subpages": "Podstrony:", + "on-this-page": "Na tej stronie" + }, + "hidden_subtree_templates": { + "table": "Tabela", + "geo-map": "Geo Mapa", + "start-date": "Początek daty", + "end-date": "Koniec daty", + "start-time": "Czas od", + "end-time": "Czas do", + "geolocation": "Geolokalizacja", + "built-in-templates": "Wbudowane szablony", + "board": "Tablica", + "status": "Status", + "board_note_first": "Pierwsza notatka", + "board_note_second": "Druga notatka", + "board_note_third": "Trzecia notatka", + "board_status_todo": "Do zrobienia", + "board_status_progress": "W trakcie", + "board_status_done": "Zrobione" + }, + "sql_init": { + "db_not_initialized_desktop": "Baza danych nie została zainicjowana, postępuj zgodnie z instrukcjami wyświetlanymi na ekranie.", + "db_not_initialized_server": "Baza danych nie została zainicjowana, odwiedÅŗ stronę instalacji http://[your-server-host]:{{port}} aby zobaczyć jak uruchomić Trilium." + }, + "desktop": { + "instance_already_running": "Istnieje już uruchomiona instancja, skup się na niej." } } diff --git a/apps/server/src/assets/translations/pt/server.json b/apps/server/src/assets/translations/pt/server.json new file mode 100644 index 000000000..d2c3d0db3 --- /dev/null +++ b/apps/server/src/assets/translations/pt/server.json @@ -0,0 +1,435 @@ +{ + "keyboard_actions": { + "back-in-note-history": "Navegar para a nota anterior no histórico", + "forward-in-note-history": "Navegar para a nota seguinte no histórico", + "open-jump-to-note-dialog": "Abrir diĆ”logo \"Ir para nota\"", + "open-command-palette": "Abrir paleta de comandos", + "scroll-to-active-note": "Rolar a Ć”rvore de notas atĆ© a nota atual", + "quick-search": "Ativar barra de pesquisa rĆ”pida", + "search-in-subtree": "Pesquisar notas na sub-Ć”rvore da nota atual", + "expand-subtree": "Expandir sub-Ć”rvore da nota atual", + "collapse-tree": "Colapsar a Ć”rvore de notas completa", + "collapse-subtree": "Colapsar sub-Ć”rvore da nota atual", + "sort-child-notes": "Ordenar notas filhas", + "creating-and-moving-notes": "A criar e mover notas", + "create-note-after": "Criar nota após nota atual", + "create-note-into": "Criar nota como sub-nota da nota atual", + "create-note-into-inbox": "Criar uma nota na caixa de entrada (se definida) ou na nota do dia", + "delete-note": "Apagar nota", + "move-note-up": "Mover nota para cima", + "move-note-down": "Mover nota para baixo", + "move-note-up-in-hierarchy": "Mover nota para cima na hierarquia", + "move-note-down-in-hierarchy": "Mover nota para baixo na hierarquia", + "edit-note-title": "Saltar da Ć”rvore para os pormenores da nota e editar o tĆ­tulo", + "edit-branch-prefix": "Exibir o diĆ”logo \"Editar prefixo da ramificação\"", + "clone-notes-to": "Clonar notas selecionadas", + "move-notes-to": "Mover notas selecionadas", + "note-clipboard": "Ɓrea de transferĆŖncia de notas", + "copy-notes-to-clipboard": "Copiar notas selecionadas para Ɓrea de transferĆŖncia", + "paste-notes-from-clipboard": "Colar notas da Ć”rea de transferĆŖncia na nota atual", + "cut-notes-to-clipboard": "Recortar as notas selecionadas para a Ć”rea de transferĆŖncia", + "select-all-notes-in-parent": "Selecionar todas as notas do nĆ­vel atual da nota", + "add-note-above-to-the-selection": "Adicionar nota acima Ć  seleção", + "add-note-below-to-selection": "Adicionar nota abaixo Ć  seleção", + "duplicate-subtree": "Duplicar subĆ”rvore", + "tabs-and-windows": "Separadores & Janelas", + "open-new-tab": "Abre novo separador", + "close-active-tab": "Fechar separador ativo", + "reopen-last-tab": "Reabre o Ćŗltimo separador fechado", + "activate-next-tab": "Ativa separador Ć  direita", + "activate-previous-tab": "Ativa separador Ć  esquerda", + "open-new-window": "Abre nova janela vazia", + "toggle-tray": "Mostrar/ocultar a aplicação na bandeja do sistema", + "first-tab": "Ativar o primeiro separador na lista", + "second-tab": "Ativa o segundo separador na lista", + "third-tab": "Ativar o terceiro separador na lista", + "fourth-tab": "Ativar o quarto separador na lista", + "fifth-tab": "Ativar o quinto separador na lista", + "sixth-tab": "Ativar o sexto separador na lista", + "seventh-tab": "Ativar o sĆ©timo separador na lista", + "eight-tab": "Ativar o oitavo separador na lista", + "ninth-tab": "Ativar o novo separador na lista", + "last-tab": "Ativar o Ćŗltimo separador na lista", + "dialogs": "DiĆ”logos", + "show-note-source": "Exibe o diĆ”logo \"origem da nota\"", + "show-options": "Abrir pĆ”gina de configuraƧƵes", + "show-revisions": "Exibe diĆ”logo \"revisƵes de nota\"", + "show-recent-changes": "Exibe o diĆ”logo \"alteraƧƵes recentes\"", + "show-sql-console": "Exibe a pĆ”gina \"consola SQL\"", + "show-backend-log": "Exibe a pĆ”gina \"registo do backend\"", + "show-help": "Exibir o guia de utilizador integrado", + "show-cheatsheet": "Exibir um modal com atalhos de teclado", + "text-note-operations": "OperaƧƵes de nota de texto", + "add-link-to-text": "Abrir diĆ”logo para adicionar ligação ao texto", + "follow-link-under-cursor": "Seguir a ligação sob o cursor", + "insert-date-and-time-to-text": "Inserir data e hora atual no texto", + "paste-markdown-into-text": "Colar Markdown da Ć”rea de transferĆŖncia na nota de texto", + "cut-into-note": "Corta a seleção da nota atual e cria uma subnota com o texto selecionado", + "add-include-note-to-text": "Abre o log para incluir uma nota", + "edit-readonly-note": "Editar uma nota somente leitura", + "attributes-labels-and-relations": "Atributos (rótulos e relaƧƵes)", + "add-new-label": "Criar rótulo", + "create-new-relation": "Criar relação", + "ribbon-tabs": "Guias da faixa", + "toggle-basic-properties": "Alterar Propriedades BĆ”sicas", + "toggle-file-properties": "Alterar Propriedades do Ficheiro", + "toggle-image-properties": "Alterar Propriedades da Imagem", + "toggle-owned-attributes": "Alterar Atributos Próprios", + "toggle-inherited-attributes": "Alterar Atributos Herdados", + "toggle-promoted-attributes": "Alternar Atributos Promovidos", + "toggle-link-map": "Alternar Mapa de LigaƧƵes", + "toggle-note-info": "Alternar InformaƧƵes da Nota", + "toggle-note-paths": "Alternar Caminhos da Nota", + "toggle-similar-notes": "Alternar Notas Similares", + "other": "Outros", + "toggle-right-pane": "Alternar a exibição do painel direito, que inclui SumĆ”rio e Destaques", + "print-active-note": "Imprimir nota atual", + "open-note-externally": "Abrir nota como ficheiro na aplicação predefiinida", + "render-active-note": "Renderizar (re-renderizar) nota atual", + "run-active-note": "Executar código JavaScript (frontend/backend) da nota", + "toggle-note-hoisting": "Alternar a elevação da nota atual", + "unhoist": "Desfazer elevação de tudo", + "reload-frontend-app": "Recarregar Interface", + "open-dev-tools": "Abrir ferramentas de programador", + "find-in-text": "Alternar painel de pesquisa", + "toggle-left-note-tree-panel": "Alternar painel esquerdo (Ć”rvore de notas)", + "toggle-full-screen": "Alternar para ecrĆ£ cheio", + "zoom-out": "Diminuir zoom", + "zoom-in": "Aumentar zoom", + "note-navigation": "Navegação de notas", + "reset-zoom-level": "Redefinir nĆ­vel de zoom", + "copy-without-formatting": "Copiar texto selecionado sem formatação", + "force-save-revision": "ForƧar a criação/gravação de uma nova revisĆ£o da nota atual", + "toggle-book-properties": "Alternar propriedades do book", + "toggle-classic-editor-toolbar": "Alternar a guia de Formatação no editor com barra de ferramentas fixa", + "export-as-pdf": "Exportar a nota atual como PDF", + "toggle-zen-mode": "Ativa/desativa o modo zen (interface mĆ­nima para uma edição mais focada)" + }, + "keyboard_action_names": { + "back-in-note-history": "Voltar no histórico da nota", + "forward-in-note-history": "AvanƧar no histórico da nota", + "jump-to-note": "Ir para...", + "command-palette": "Paleta de Comandos", + "scroll-to-active-note": "Rolar atĆ© a nota atual", + "quick-search": "Pesquisa RĆ”pida", + "search-in-subtree": "Pesquisar na subĆ”rvore", + "expand-subtree": "Expandir SubĆ”rvore", + "collapse-tree": "Recolher Ɓrvore", + "collapse-subtree": "Recolher SubĆ”rvore", + "sort-child-notes": "Ordenar Notas Filhas", + "create-note-after": "Criar Nota Após", + "create-note-into": "Criar Nota Dentro", + "create-note-into-inbox": "Criar Nota na Caixa de Entrada", + "delete-notes": "Apagar Notas", + "move-note-up": "Mover Nota Para Cima", + "move-note-down": "Mover Nota Para Baixo", + "move-note-up-in-hierarchy": "Mover Nota Para Cima na Hierarquia", + "move-note-down-in-hierarchy": "Mover Nota Para Baixo na Hierarquia", + "edit-note-title": "Editar TĆ­tulo da Nota", + "edit-branch-prefix": "Editar Prefixo da Ramificação", + "clone-notes-to": "Clonar Notas Para", + "move-notes-to": "Mover Notas Para", + "copy-notes-to-clipboard": "Copiar Notas para a Ɓrea de TransferĆŖncia", + "paste-notes-from-clipboard": "Colar Notas da Ɓrea de TransferĆŖncia", + "cut-notes-to-clipboard": "Recortar Notas para a Ɓrea de TransferĆŖncia", + "select-all-notes-in-parent": "Selecionar Todas as Notas no Pai", + "add-note-above-to-selection": "Adicionar Nota Acima Ć  Seleção", + "add-note-below-to-selection": "Adicionar Nota Abaixo Ć  Seleção", + "duplicate-subtree": "Duplicar SubĆ”rvore", + "open-new-tab": "Abrir Nova Guia", + "close-active-tab": "Fechar Guia Ativa", + "reopen-last-tab": "Reabrir Última Guia", + "activate-next-tab": "Ativar Próxima Guia", + "activate-previous-tab": "Ativar Guia Anterior", + "open-new-window": "Abrir Nova Janela", + "toggle-system-tray-icon": "Alternar ƍcone da Bandeja do Sistema", + "toggle-zen-mode": "Alternar Modo Zen", + "switch-to-first-tab": "Alternar para a Primeira Guia", + "switch-to-second-tab": "Alternar para a Segunda Guia", + "switch-to-third-tab": "Alternar para a Terceira Guia", + "switch-to-fourth-tab": "Alternar para a Quarta Guia", + "switch-to-fifth-tab": "Alternar para a Quinta Guia", + "switch-to-sixth-tab": "Alternar para a Sexta Guia", + "switch-to-seventh-tab": "Alternar para a SĆ©tima Guia", + "switch-to-eighth-tab": "Alternar para a Oitava Guia", + "switch-to-ninth-tab": "Alternar para a Nona Guia", + "switch-to-last-tab": "Alternar para a Última Guia", + "show-note-source": "Exibir Fonte da Nota", + "show-options": "Exibir OpƧƵes", + "show-revisions": "Exibir RevisƵes", + "show-recent-changes": "Exibir AlteraƧƵes Recentes", + "show-sql-console": "Exibir Console SQL", + "show-backend-log": "Exibir Log do Backend", + "show-help": "Exibir Ajuda", + "show-cheatsheet": "Exibir Cheatsheet", + "add-link-to-text": "Adicionar Ligação ao Texto", + "follow-link-under-cursor": "Seguir Ligação sob o Cursor", + "insert-date-and-time-to-text": "Inserir Data e Hora ao Texto", + "paste-markdown-into-text": "Colar Markdown no Texto", + "cut-into-note": "Recortar em Nota", + "add-include-note-to-text": "Adicionar Nota de InclusĆ£o ao Texto", + "edit-read-only-note": "Editar Nota Somente-Leitura", + "add-new-label": "Adicionar Nova Etiqueta", + "add-new-relation": "Adicionar Nova Relação", + "toggle-ribbon-tab-classic-editor": "Alternar Guia da Faixa de OpƧƵes Editor ClĆ”ssico", + "toggle-ribbon-tab-basic-properties": "Alternar Guia da Faixa de OpƧƵes Propriedades BĆ”sicas", + "toggle-ribbon-tab-book-properties": "Alternar Guia da Faixa de OpƧƵes Propriedades do Livro", + "toggle-ribbon-tab-file-properties": "Alternar Guia da Faixa de OpƧƵes Propriedades do Ficheiro", + "toggle-ribbon-tab-image-properties": "Alternar Guia da Faixa de OpƧƵes Propriedades da Imagem", + "toggle-ribbon-tab-owned-attributes": "Alternar Guia da Faixa de OpƧƵes Atributos PossuĆ­dos", + "toggle-ribbon-tab-inherited-attributes": "Alternar Guia da Faixa de OpƧƵes Atributos Herdados", + "toggle-ribbon-tab-promoted-attributes": "Alternar Guia da Faixa de OpƧƵes Atributos Promovidos", + "toggle-ribbon-tab-note-map": "Alternar Guia da Faixa de OpƧƵes Mapa de Notas", + "toggle-ribbon-tab-note-info": "Alternar Guia da Faixa de OpƧƵes InformaƧƵes da Nota", + "toggle-ribbon-tab-note-paths": "Alternar Guia da Faixa de OpƧƵes Caminhos de Nota", + "toggle-ribbon-tab-similar-notes": "Alternar Guia da Faixa de OpƧƵes Notas Semelhantes", + "toggle-right-pane": "Alternar Painel Direito", + "print-active-note": "Imprimir Nota Atual", + "export-active-note-as-pdf": "Exportar Nota Atual como PDF", + "open-note-externally": "Abrir Nota Externamente", + "render-active-note": "Renderizar Nota Atual", + "run-active-note": "Executar Nota Atual", + "toggle-note-hoisting": "Alternar Elevação de Nota", + "unhoist-note": "Desfazer Elevação de Nota", + "reload-frontend-app": "Recarregar Frontend", + "open-developer-tools": "Abrir Ferramentas de Programador", + "find-in-text": "Localizar no Texto", + "toggle-left-pane": "Alternar Painel Esquerdo", + "toggle-full-screen": "Alternar EcrĆ£ Cheio", + "zoom-out": "Reduzir Zoom", + "zoom-in": "Aumentar Zoom", + "reset-zoom-level": "Redefinir NĆ­vel de Zoom", + "copy-without-formatting": "Copiar Sem Formatação", + "force-save-revision": "ForƧar Gravação da RevisĆ£o" + }, + "login": { + "title": "Login", + "heading": "Trilium login", + "incorrect-totp": "O código TOTP estĆ” incorreto. Por favor, tente novamente.", + "incorrect-password": "Palavra-passe incorreta. Tente novamente.", + "password": "Palavra-passe", + "remember-me": "Lembrar-me", + "button": "Login", + "sign_in_with_sso": "Fazer login com {{ ssoIssuerName }}" + }, + "set_password": { + "title": "Definir palavra-passe", + "heading": "Definir palavra-passe", + "description": "Antes de comeƧar a usar o Trilium web, precisa definir uma palavra-passe. UsarĆ” esta palavra-passe para fazer login.", + "password": "Palavra-passe", + "password-confirmation": "Confirmar Palavra-passe", + "button": "Definir palavra-passe" + }, + "javascript-required": "Trilium precisa que JavaScript esteja ativado.", + "setup": { + "heading": "Trilium Notes setup", + "new-document": "Sou um novo utilizador e quero criar um documento Trilium para as minhas notas", + "sync-from-desktop": "JĆ” tenho uma instĆ¢ncia no desktop e quero configurar a sincronização com ela", + "sync-from-server": "JĆ” tenho uma instĆ¢ncia no servidor e quero configurar a sincronização com ela", + "next": "AvanƧar", + "init-in-progress": "Inicialização do documento em andamento", + "redirecting": "SerĆ” redirecionado para a aplicação brevemente.", + "title": "Configuração" + }, + "setup_sync-from-desktop": { + "heading": "Sincronizar com Desktop", + "description": "Esta configuração deve ser iniciada a partir da instĆ¢ncia do desktop:", + "step1": "Abra a sua instĆ¢ncia do Trilium Notes no desktop.", + "step2": "No menu do Trilium, clique em OpƧƵes.", + "step3": "Clique na categoria Sincronização.", + "step4": "Altere o endereƧo da instĆ¢ncia do servidor para: {{- host}} e clique em Gravar.", + "step5": "Clique no botĆ£o \"Testar sincronização\" para verificar se a conexĆ£o foi bem-sucedida.", + "step6": "Depois de concluir estas etapas, clique em {{- link}}.", + "step6-here": "aqui" + }, + "setup_sync-from-server": { + "heading": "Sincronizar do Servidor", + "instructions": "Por favor, insira abaixo o endereƧo e as credenciais do servidor Trilium. Isto descarragarĆ” de todo o documento Trilium do servidor e configurarĆ” a sincronização com ele. Dependendo do tamanho do documento e da velocidade da conexĆ£o, isto pode levar algum tempo.", + "server-host": "EndereƧo do servidor Trilium", + "server-host-placeholder": "https://:", + "proxy-server": "Servidor proxy (opcional)", + "proxy-server-placeholder": "https://:", + "note": "Nota:", + "proxy-instruction": "Se deixar o campo de proxy em branco, o proxy do sistema serĆ” usado (aplicĆ”vel apenas Ć  aplicação desktop)", + "password": "Palavra-passe", + "password-placeholder": "Palavra-passe", + "back": "Voltar", + "finish-setup": "Terminar configuração" + }, + "setup_sync-in-progress": { + "heading": "Sincronização em andamento", + "successful": "A sincronização foi configurada corretamente. LevarĆ” algum tempo para que a sincronização inicial seja concluĆ­da. Quando terminar, serĆ” redirecionado para a pĆ”gina de login.", + "outstanding-items": "Elementos de sincronização pendentes:", + "outstanding-items-default": "N/A" + }, + "share_404": { + "title": "NĆ£o encontrado", + "heading": "NĆ£o encontrado" + }, + "share_page": { + "parent": "pai:", + "clipped-from": "Esta nota foi originalmente extraĆ­da de {{- url}}", + "child-notes": "Notas filhas:", + "no-content": "Esta nota nĆ£o possui conteĆŗdo." + }, + "weekdays": { + "monday": "Segunda-feira", + "tuesday": "TerƧa-feira", + "wednesday": "Quarta-feira", + "thursday": "Quinta-feira", + "friday": "Sexta-feira", + "saturday": "SĆ”bado", + "sunday": "Domingo" + }, + "weekdayNumber": "Semana {weekNumber}", + "months": { + "january": "Janeiro", + "february": "Fevereiro", + "march": "MarƧo", + "april": "Abril", + "may": "Maio", + "june": "Junho", + "july": "Julho", + "august": "Agosto", + "september": "Setembro", + "october": "Outubro", + "november": "Novembro", + "december": "Dezembro" + }, + "quarterNumber": "Trimestre {quarterNumber}", + "special_notes": { + "search_prefix": "Pesquisar:" + }, + "test_sync": { + "not-configured": "O host do servidor de sincronização nĆ£o estĆ” configurado. Por favor, configure a sincronização primeiro.", + "successful": "A comunicação com o servidor de sincronização foi bem-sucedida, a sincronização foi iniciada." + }, + "hidden-subtree": { + "root-title": "Notas Ocultas", + "search-history-title": "Histórico de Pesquisa", + "note-map-title": "Mapa de Notas", + "sql-console-history-title": "Histórico do Console SQL", + "shared-notes-title": "Notas Partilhadas", + "bulk-action-title": "Ação em Massa", + "backend-log-title": "Log do Backend", + "user-hidden-title": "Utilizador Oculto", + "launch-bar-templates-title": "Modelos da Barra de Atalhos", + "base-abstract-launcher-title": "Atalho Abstrato Base", + "command-launcher-title": "Atalho de Comando", + "note-launcher-title": "Atalho de Notas", + "script-launcher-title": "Atalho de Script", + "built-in-widget-title": "Widget Incorporado", + "spacer-title": "EspaƧador", + "custom-widget-title": "Widget Personalizado", + "launch-bar-title": "Barra de Atalhos", + "available-launchers-title": "Atalhos disponĆ­veis", + "go-to-previous-note-title": "Ir para Nota Anterior", + "go-to-next-note-title": "Ir para Próxima Nota", + "new-note-title": "Nova Nota", + "search-notes-title": "Pesquisar Notas", + "jump-to-note-title": "Ir para...", + "calendar-title": "CalendĆ”rio", + "recent-changes-title": "AlteraƧƵes Recentes", + "bookmarks-title": "Favoritos", + "open-today-journal-note-title": "Abrir Nota do DiĆ”rio de Hoje", + "quick-search-title": "Pesquisa RĆ”pida", + "protected-session-title": "SessĆ£o Protegida", + "sync-status-title": "Estado de Sincronização", + "settings-title": "ConfiguraƧƵes", + "llm-chat-title": "Conversar com as Notas", + "options-title": "OpƧƵes", + "appearance-title": "AparĆŖncia", + "shortcuts-title": "Atalhos", + "text-notes": "Notas de Texto", + "code-notes-title": "Notas de Código", + "images-title": "Imagens", + "spellcheck-title": "Verificação OrtogrĆ”fica", + "password-title": "Palavra-passe", + "multi-factor-authentication-title": "MFA", + "etapi-title": "ETAPI", + "backup-title": "Backup", + "sync-title": "Sincronizar", + "ai-llm-title": "AI/LLM", + "other": "Outros", + "advanced-title": "AvanƧado", + "visible-launchers-title": "Atalhos VisĆ­veis", + "user-guide": "Guia do Utilizador", + "localization": "Idioma e RegiĆ£o", + "inbox-title": "Caixa de Entrada" + }, + "notes": { + "new-note": "Nova nota", + "duplicate-note-suffix": "(dup)", + "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" + }, + "backend_log": { + "log-does-not-exist": "O ficheiro de log do backend '{{ fileName }}' ainda nĆ£o existe.", + "reading-log-failed": "Falha ao ler o ficheiro de log do backend '{{ fileName }}'." + }, + "content_renderer": { + "note-cannot-be-displayed": "Esta nota nĆ£o pode ser exibida." + }, + "pdf": { + "export_filter": "Documento PDF (*.pdf)", + "unable-to-export-message": "A nota atual nĆ£o pĆ“de ser exportada como PDF.", + "unable-to-export-title": "NĆ£o foi possĆ­vel exportar como PDF", + "unable-to-save-message": "O ficheiro selecionado nĆ£o pĆ“de ser gravado. Tente novamente ou selecione outro destino." + }, + "tray": { + "tooltip": "Trilium Notes", + "close": "Sair do Trilium", + "recents": "Notas recentes", + "bookmarks": "Favoritos", + "today": "Abrir a nota do diĆ”rio de hoje", + "new-note": "Nova nota", + "show-windows": "Exibir janelas", + "open_new_window": "Abrir nova janela" + }, + "migration": { + "old_version": "A migração direta da sua versĆ£o atual nĆ£o Ć© suportada. Por favor, atualize primeiro para a versĆ£o mais recente v0.60.4 e somente depois para esta versĆ£o.", + "error_message": "Erro durante a migração para a versĆ£o {{version}}: {{stack}}", + "wrong_db_version": "A versĆ£o da base de dados ({{version}}) Ć© mais recente do que a esperada pela aplicação ({{targetVersion}}), o que significa que ele foi criado por uma versĆ£o mais nova e incompatĆ­vel do Trilium. Atualize para a versĆ£o mais recente do Trilium para resolver este problema." + }, + "modals": { + "error_title": "Erro" + }, + "share_theme": { + "site-theme": "Tema do site", + "search_placeholder": "Pesquisar...", + "image_alt": "Imagem do artigo", + "last-updated": "Atualizado pela Ćŗltima vez em {{- date}}", + "subpages": "SubpĆ”ginas:", + "on-this-page": "Nesta pĆ”gina", + "expand": "Expandir" + }, + "hidden_subtree_templates": { + "text-snippet": "Trecho de texto", + "description": "Descrição", + "list-view": "Visualização em lista", + "grid-view": "Visualização em grade", + "calendar": "CalendĆ”rio", + "table": "Tabela", + "geo-map": "Mapa geogrĆ”fico", + "start-date": "Data de inĆ­cio", + "end-date": "Data de tĆ©rmino", + "start-time": "Hora de inĆ­cio", + "end-time": "Hora de tĆ©rmino", + "geolocation": "Geolocalização", + "built-in-templates": "Modelos integrados", + "board": "Quadro", + "status": "Estado", + "board_note_first": "Primeira nota", + "board_note_second": "Segunda nota", + "board_note_third": "Terceira nota", + "board_status_todo": "A fazer", + "board_status_progress": "Em andamento", + "board_status_done": "ConcluĆ­do" + }, + "sql_init": { + "db_not_initialized_desktop": "BD nĆ£o inicializada, siga as instruƧƵes no ecrĆ£.", + "db_not_initialized_server": "BD nĆ£o inicializada, visite a pĆ”gina de configuração - http://[anfitriĆ£o-do-servidor]:{{port}} para ver instruƧƵes sobre como inicializar o Trilium." + }, + "desktop": { + "instance_already_running": "JĆ” hĆ” uma instĆ¢ncia em execução, a focar essa instĆ¢ncia." + } +} diff --git a/apps/server/src/assets/translations/pt_br/server.json b/apps/server/src/assets/translations/pt_br/server.json index af2348154..d1e5f5f37 100644 --- a/apps/server/src/assets/translations/pt_br/server.json +++ b/apps/server/src/assets/translations/pt_br/server.json @@ -424,5 +424,12 @@ "board_status_todo": "A fazer", "board_status_progress": "Em andamento", "board_status_done": "ConcluĆ­do" + }, + "sql_init": { + "db_not_initialized_desktop": "DB nĆ£o inicializada, por favor siga as instruƧƵes na tela.", + "db_not_initialized_server": "DB nĆ£o inicializada, por favor visite a pĆ”gina de configuração - http://[your-server-host]:{{port}} para ver instruƧƵes de como inicializar o Trillium." + }, + "desktop": { + "instance_already_running": "JĆ” existe uma instĆ¢ncia sendo executada, em vez disso focando nesta." } } diff --git a/apps/server/src/assets/translations/ro/server.json b/apps/server/src/assets/translations/ro/server.json index b085b554e..5ed87626d 100644 --- a/apps/server/src/assets/translations/ro/server.json +++ b/apps/server/src/assets/translations/ro/server.json @@ -1,428 +1,439 @@ { - "keyboard_actions": { - "activate-next-tab": "Activează tab-ul din dreapta", - "activate-previous-tab": "Activează tab-ul din stĆ¢nga", - "add-include-note-to-text": "Deschide fereastra de includere notițe", - "add-link-to-text": "Deschide fereastra de adaugă legături Ć®n text", - "add-new-label": "Crează o nouă etichetă", - "add-note-above-to-the-selection": "Adaugă notița deasupra selecției", - "add-note-below-to-selection": "Adaugă notița deasupra selecției", - "attributes-labels-and-relations": "Atribute (etichete și relații)", - "close-active-tab": "Ǝnchide tab-ul activ", - "collapse-subtree": "Minimizează ierarhia notiței curente", - "collapse-tree": "Minimizează Ć®ntreaga ierarhie de notițe", - "copy-notes-to-clipboard": "Copiază notițele selectate Ć®n clipboard", - "copy-without-formatting": "Copiază textul selectat fără formatare", - "create-new-relation": "Crează o nouă relație", - "create-note-into-inbox": "Crează o notiță și o deschide Ć®n inbox (dacă este definit) sau notița zilnică", - "cut-notes-to-clipboard": "Decupează notițele selectate Ć®n clipboard", - "creating-and-moving-notes": "Crearea și mutarea notițelor", - "cut-into-note": "Decupează selecția din notița curentă și crează o subnotiță cu textul selectat", - "delete-note": "Șterge notița", - "dialogs": "Ferestre", - "duplicate-subtree": "Dublifică subnotițele", - "edit-branch-prefix": "Afișează ecranul ā€žEditează prefixul ramuriiā€", - "edit-note-title": "Sare de la arborele notițelor la detaliile notiței și editează titlul", - "edit-readonly-note": "Editează o notiță care este Ć®n modul doar Ć®n citire", - "eight-tab": "Activează cel de-al optelea tab din listă", - "expand-subtree": "Expandează ierarhia notiței curente", - "fifth-tab": "Activează cel de-al cincelea tab din listă", - "first-tab": "Activează cel primul tab din listă", - "follow-link-under-cursor": "Urmărește legătura de sub poziția cursorului", - "force-save-revision": "Forțează crearea/salvarea unei noi revizii ale notiției curente", - "fourth-tab": "Activează cel de-al patrulea tab din listă", - "insert-date-and-time-to-text": "Inserează data curentă și timpul Ć®n text", - "last-tab": "Activează ultimul tab din listă", - "move-note-down": "Mută notița mai jos", - "move-note-down-in-hierarchy": "Mută notița mai jos Ć®n ierarhie", - "move-note-up": "Mută notița mai sus", - "move-note-up-in-hierarchy": "Mută notița mai sus Ć®n ierarhie", - "ninth-tab": "Activează cel de-al nouălea tab din listă", - "note-clipboard": "Clipboard-ul notițelor", - "note-navigation": "Navigarea printre notițe", - "open-dev-tools": "Deschide uneltele de dezvoltator", - "open-jump-to-note-dialog": "Deschide ecranul ā€žSari la notiČ›Äƒā€", - "open-new-tab": "Deschide un tab nou", - "open-new-window": "Deschide o nouă fereastră goală", - "open-note-externally": "Deschide notița ca un fișier utilizĆ¢nd aplicația implicită", - "other": "Altele", - "paste-markdown-into-text": "Lipește text Markdown din clipboard Ć®n notița de tip text", - "paste-notes-from-clipboard": "Lipește notițele din clipboard Ć®n notița activă", - "print-active-note": "Imprimă notița activă", - "reload-frontend-app": "ReĆ®ncarcă interfața grafică", - "render-active-note": "ReĆ®mprospătează notița activă", - "reopen-last-tab": "Deschide din nou ultimul tab Ć®nchis", - "reset-zoom-level": "Resetează nivelul de magnificare", - "ribbon-tabs": "Tab-urile din panglică", - "run-active-note": "Rulează notița curentă de tip JavaScript (frontend sau backend)", - "search-in-subtree": "Caută notițe Ć®n ierarhia notiței active", - "second-tab": "Activează cel de-al doilea tab din listă", - "select-all-notes-in-parent": "Selectează toate notițele din nivelul notiței curente", - "seventh-tab": "Activează cel de-al șaptelea tab din listă", - "show-backend-log": "Afișează fereastra ā€žLog-uri din backendā€", - "show-help": "Afișează informații utile", - "show-note-source": "Afișează fereastra ā€žSursa notițeiā€", - "show-options": "Afișează fereastra de opțiuni", - "show-recent-changes": "Afișează fereastra ā€žSchimbări recenteā€", - "show-revisions": "Afișează fereastra ā€žRevizii ale notițeiā€", - "show-sql-console": "Afișează ecranul ā€žConsolă SQLā€", - "sixth-tab": "Activează cel de-al șaselea tab din listă", - "sort-child-notes": "Ordonează subnotițele", - "tabs-and-windows": "Tab-uri și ferestre", - "text-note-operations": "Operații asupra notițelor text", - "third-tab": "Activează cel de-al treilea tab din listă", - "toggle-basic-properties": "Comută tab-ul ā€žProprietăți de bazÄƒā€", - "toggle-book-properties": "Comută tab-ul ā€žProprietăți ale cărțiiā€", - "toggle-file-properties": "Comută tab-ul ā€žProprietăți fișierā€", - "toggle-full-screen": "Comută modul ecran complet", - "toggle-image-properties": "Comută tab-ul ā€žProprietăți imaginiā€", - "toggle-inherited-attributes": "Comută tab-ul ā€žAtribute moșteniteā€", - "toggle-left-note-tree-panel": "Comută panoul din stĆ¢nga (arborele notițelor)", - "toggle-link-map": "Comută harta legăturilor", - "toggle-note-hoisting": "Comută focalizarea pe notița curentă", - "toggle-note-info": "Comută tab-ul ā€žInformații despre notiČ›Äƒā€", - "toggle-note-paths": "Comută tab-ul ā€žCăile notițeiā€", - "toggle-owned-attributes": "Comută tab-ul ā€žAtribute propriiā€", - "toggle-promoted-attributes": "Comută tab-ul ā€žAtribute promovateā€", - "toggle-right-pane": "Comută afișarea panoului din dreapta, ce include tabela de conținut și evidențieri", - "toggle-similar-notes": "Comută tab-ul ā€žNotițe similareā€", - "toggle-tray": "Afișează/ascunde aplicația din tray-ul de sistem", - "unhoist": "Defocalizează complet", - "zoom-in": "Mărește zoom-ul", - "zoom-out": "Micșorează zoom-ul", - "toggle-classic-editor-toolbar": "Comută tab-ul ā€žFormatareā€ pentru editorul cu bară fixă", - "export-as-pdf": "Exportă notița curentă ca PDF", - "show-cheatsheet": "Afișează o fereastră cu scurtături de la tastatură comune", - "toggle-zen-mode": "Activează/dezactivează modul zen (o interfață minimală, fără distrageri)", - "back-in-note-history": "Mergi la notița anterioară din istoric", - "forward-in-note-history": "Mergi la următoarea notiță din istoric", - "scroll-to-active-note": "Derulează la notița activă Ć®n lista de notițe", - "quick-search": "Mergi la bara de căutare rapidă", - "create-note-after": "Crează o notiță după cea activă", - "create-note-into": "Crează notiță ca subnotiță a notiței active", - "clone-notes-to": "Clonează notițele selectate", - "move-notes-to": "Mută notițele selectate", - "find-in-text": "Afișează/ascunde panoul de căutare", - "open-command-palette": "Deschide paleta de comenzi" - }, - "login": { - "button": "Autentifică", - "heading": "Autentificare Ć®n Trilium", - "incorrect-password": "Parola nu este corectă. Ǝncercați din nou.", - "password": "Parolă", - "remember-me": "Ține-mă minte", - "title": "Autentificare", - "incorrect-totp": "TOTP-ul este incorect. Ǝncercați din nou.", - "sign_in_with_sso": "Autentificare cu {{ ssoIssuerName }}" - }, - "set_password": { - "title": "Setare parolă", - "heading": "Setare parolă", - "button": "Setează parola", - "description": "Ǝnainte de a putea utiliza Trilium din navigator, trebuie mai Ć®ntĆ¢i setată o parolă. Ulterior această parolă va fi folosită la autentificare.", - "password": "Parolă", - "password-confirmation": "Confirmarea parolei" - }, - "javascript-required": "Trilium necesită JavaScript să fie activat pentru a putea funcționa.", - "setup": { - "heading": "Instalarea Trilium Notes", - "init-in-progress": "Se inițializează documentul", - "new-document": "Sunt un utilizator nou și doresc să creez un document Trilium pentru notițele mele", - "next": "Mai departe", - "redirecting": "Ǝn scurt timp veți fi redirecționat la aplicație.", - "sync-from-desktop": "Am deja o instanță de desktop și aș dori o sincronizare cu aceasta", - "sync-from-server": "Am deja o instanță de server și doresc o sincronizare cu aceasta", - "title": "Inițializare" - }, - "setup_sync-from-desktop": { - "description": "Acești pași trebuie urmați de pe aplicația de desktop:", - "heading": "Sincronizare cu aplicația desktop", - "step1": "Deschideți aplicația Trilium Notes pentru desktop.", - "step2": "Din meniul Trilium, dați clic pe Opțiuni.", - "step3": "Clic pe categoria ā€žSincronizareā€.", - "step4": "Schimbați adresa server-ului către: {{- host}} și apăsați ā€žSalveazÄƒā€.", - "step5": "Clic pe butonul ā€žTestează sincronizareaā€ pentru a verifica dacă conexiunea a fost făcută cu succes.", - "step6": "După ce ați completat pașii, dați click {{- link}}.", - "step6-here": "aici" - }, - "setup_sync-from-server": { - "back": "Ǝnapoi", - "finish-setup": "Finalizează inițializarea", - "heading": "Sincronizare cu server-ul", - "instructions": "Introduceți adresa server-ului Trilium și credențialele Ć®n secțiunea de jos. Astfel se va descărca Ć®ntregul document Trilium de pe server și se va configura sincronizarea cu acesta. Ǝn funcție de dimensiunea documentului și viteza rețelei, acest proces poate dura.", - "note": "De remarcat:", - "password": "Parolă", - "proxy-instruction": "Dacă lăsați cĆ¢mpul de proxy nesetat, proxy-ul de sistem va fi folosit (valabil doar pentru aplicația de desktop)", - "proxy-server": "Server-ul proxy (opțional)", - "proxy-server-placeholder": "https://:", - "server-host": "Adresa server-ului Trilium", - "server-host-placeholder": "https://:", - "password-placeholder": "Parolă" - }, - "setup_sync-in-progress": { - "heading": "Sincronizare Ć®n curs", - "outstanding-items": "Elemente de sincronizat:", - "outstanding-items-default": "-", - "successful": "Sincronizarea a fost configurată cu succes. Poate dura ceva timp pentru a finaliza sincronizarea inițială. După efectuarea ei se va redirecționa către pagina de autentificare." - }, - "share_404": { - "heading": "Pagină negăsită", - "title": "Pagină negăsită" - }, - "share_page": { - "child-notes": "Subnotițe:", - "clipped-from": "Această notiță a fost decupată inițial de pe {{- url}}", - "no-content": "Această notiță nu are conținut.", - "parent": "părinte:" - }, - "weekdays": { - "monday": "Luni", - "tuesday": "Marți", - "wednesday": "Miercuri", - "thursday": "Joi", - "friday": "Vineri", - "saturday": "SĆ¢mbătă", - "sunday": "Duminică" - }, - "months": { - "january": "Ianuarie", - "february": "Februarie", - "march": "Martie", - "april": "Aprilie", - "may": "Mai", - "june": "Iunie", - "july": "Iulie", - "august": "August", - "september": "Septembrie", - "october": "Octombrie", - "november": "Noiembrie", - "december": "Decembrie" - }, - "special_notes": { - "search_prefix": "Căutare:" - }, - "test_sync": { - "not-configured": "Calea către serverul de sincronizare nu este configurată. Configurați sincronizarea Ć®nainte.", - "successful": "Comunicarea cu serverul de sincronizare a avut loc cu succes, s-a Ć®nceput sincronizarea." - }, - "hidden-subtree": { - "advanced-title": "Setări avansate", - "appearance-title": "Aspect", - "available-launchers-title": "Lansatoare disponibile", - "backup-title": "Copii de siguranță", - "base-abstract-launcher-title": "Lansator abstract de bază", - "bookmarks-title": "Semne de carte", - "built-in-widget-title": "Widget predefinit", - "bulk-action-title": "Acțiuni Ć®n masă", - "calendar-title": "Calendar", - "code-notes-title": "Notițe de cod", - "command-launcher-title": "Lansator de comenzi", - "custom-widget-title": "Widget personalizat", - "etapi-title": "ETAPI", - "go-to-previous-note-title": "Mergi la notița anterioară", - "images-title": "Imagini", - "launch-bar-title": "Bară de lansare", - "new-note-title": "Notiță nouă", - "note-launcher-title": "Lansator de notițe", - "note-map-title": "Harta notițelor", - "open-today-journal-note-title": "Deschide notița de astăzi", - "options-title": "Opțiuni", - "other": "Diverse", - "password-title": "Parolă", - "protected-session-title": "Sesiune protejată", - "recent-changes-title": "Schimbări recente", - "script-launcher-title": "Lansator de script-uri", - "search-history-title": "Istoric de căutare", - "settings-title": "Setări", - "shared-notes-title": "Notițe partajate", - "quick-search-title": "Căutare rapidă", - "root-title": "Notițe ascunse", - "search-notes-title": "Căutare notițe", - "shortcuts-title": "Scurtături", - "spellcheck-title": "Corectare gramaticală", - "sync-status-title": "Starea sincronizării", - "sync-title": "Sincronizare", - "text-notes": "Notițe text", - "user-hidden-title": "Definite de utilizator", - "backend-log-title": "Log backend", - "spacer-title": "Separator", - "sql-console-history-title": "Istoricul consolei SQL", - "go-to-next-note-title": "Mergi la notița următoare", - "launch-bar-templates-title": "Șabloane bară de lansare", - "visible-launchers-title": "Lansatoare vizibile", - "user-guide": "Ghidul de utilizare", - "jump-to-note-title": "Sari la...", - "llm-chat-title": "Ǝntreabă Notes", - "multi-factor-authentication-title": "Autentificare multi-factor", - "ai-llm-title": "AI/LLM", - "localization": "Limbă și regiune", - "inbox-title": "Inbox" - }, - "notes": { - "new-note": "Notiță nouă", - "duplicate-note-suffix": "(dupl.)", - "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" - }, - "backend_log": { - "log-does-not-exist": "Fișierul de loguri de backend ā€ž{{ fileName }}ā€ nu există (Ć®ncă).", - "reading-log-failed": "Nu s-a putut citi fișierul de loguri de backend ā€ž{{fileName}}ā€." - }, - "content_renderer": { - "note-cannot-be-displayed": "Acest tip de notiță nu poate fi afișat." - }, - "pdf": { - "export_filter": "Document PDF (*.pdf)", - "unable-to-export-message": "Notița curentă nu a putut fi exportată ca PDF.", - "unable-to-export-title": "Nu s-a putut exporta ca PDF", - "unable-to-save-message": "Nu s-a putut scrie fișierul selectat. Ǝncercați din nou sau selectați altă destinație." - }, - "tray": { - "bookmarks": "Semne de carte", - "close": "Ǝnchide Trilium", - "new-note": "Notiță nouă", - "recents": "Notițe recente", - "today": "Mergi la notița de astăzi", - "tooltip": "Trilium Notes", - "show-windows": "Afișează ferestrele", - "open_new_window": "Deschide fereastră nouă" - }, - "migration": { - "error_message": "Eroare la migrarea către versiunea {{version}}: {{stack}}", - "old_version": "Nu se poate migra la ultima versiune direct de la versiunea dvs. Actualizați mai Ć®ntĆ¢i la versiunea v0.60.4 și ulterior la această versiune.", - "wrong_db_version": "Versiunea actuală a bazei de date ({{version}}) este mai nouă decĆ¢t versiunea de bază de date suportată de aplicație ({{targetVersion}}), ceea ce Ć®nseamnă că a fost creată de către o versiune mai nouă de Trilium. Actualizați aplicația la ultima versiune pentru a putea continua." - }, - "modals": { - "error_title": "Eroare" - }, - "keyboard_action_names": { - "quick-search": "Căutare rapidă", - "back-in-note-history": "Ǝnapoi Ć®n istoricul notițelor", - "forward-in-note-history": "Ǝnainte Ć®n istoricul notițelor", - "jump-to-note": "Mergi la...", - "scroll-to-active-note": "Derulează la notița activă", - "search-in-subtree": "Caută Ć®n subnotițe", - "expand-subtree": "Expandează subnotițele", - "collapse-tree": "Minimizează arborele de notițe", - "collapse-subtree": "Ascunde subnotițele", - "sort-child-notes": "Ordonează subnotițele", - "create-note-after": "Crează notiță după", - "create-note-into": "Crează subnotiță Ć®n", - "create-note-into-inbox": "Crează notiță Ć®n inbox", - "delete-notes": "Șterge notițe", - "move-note-up": "Mută notița deasupra", - "move-note-down": "Mută notița dedesubt", - "move-note-up-in-hierarchy": "Mută notița mai sus Ć®n ierarhie", - "move-note-down-in-hierarchy": "Mută notița mai jos Ć®n ierarhie", - "edit-note-title": "Editează titlul notiței", - "edit-branch-prefix": "Editează prefixul ramurii", - "clone-notes-to": "Clonează notițele Ć®n", - "move-notes-to": "Mută notițele Ć®n", - "copy-notes-to-clipboard": "Copiază notițele Ć®n clipboard", - "paste-notes-from-clipboard": "Lipește notițele din clipboard", - "cut-notes-to-clipboard": "Decupează notițele Ć®n clipboard", - "select-all-notes-in-parent": "Selectează toate notițele din părinte", - "add-note-above-to-selection": "Adaugă notița de deasupra la selecție", - "add-note-below-to-selection": "Adaugă notița de dedesubt la selecție", - "duplicate-subtree": "Dublifică ierarhia", - "open-new-tab": "Deschide Ć®n tab nou", - "close-active-tab": "Ǝnchide tab-ul activ", - "reopen-last-tab": "Redeschide ultimul tab", - "activate-next-tab": "Activează tab-ul următorul", - "activate-previous-tab": "Activează tab-ul anterior", - "open-new-window": "Deschide Ć®n fereastră nouă", - "toggle-system-tray-icon": "Afișează/ascunde iconița din bara de sistem", - "toggle-zen-mode": "Activează/dezactivează modul zen", - "switch-to-first-tab": "Mergi la primul tab", - "switch-to-second-tab": "Mergi la al doilea tab", - "switch-to-third-tab": "Mergi la al treilea tab", - "switch-to-fourth-tab": "Mergi la al patrulea tab", - "switch-to-fifth-tab": "Mergi la al cincelea tab", - "switch-to-sixth-tab": "Mergi la al șaselea tab", - "switch-to-seventh-tab": "Mergi la al șaptelea tab", - "switch-to-eighth-tab": "Mergi la al optelea tab", - "switch-to-ninth-tab": "Mergi la al nouălea tab", - "switch-to-last-tab": "Mergi la ultimul tab", - "show-note-source": "Afișează sursa notiței", - "show-options": "Afișează opțiunile", - "show-revisions": "Afișează reviziile", - "show-recent-changes": "Afișează modificările recente", - "show-sql-console": "Afișează consola SQL", - "show-backend-log": "Afișează log-urile din backend", - "show-help": "Afișează ghidul", - "show-cheatsheet": "Afișează ghidul rapid", - "add-link-to-text": "Inserează o legătură Ć®n text", - "follow-link-under-cursor": "Urmează legătura de la poziția curentă", - "insert-date-and-time-to-text": "Inserează data și timpul Ć®n text", - "paste-markdown-into-text": "Lipește Markdown Ć®n text", - "cut-into-note": "Decupează Ć®n subnotiță", - "add-include-note-to-text": "Adaugă o includere de notiță Ć®n text", - "edit-read-only-note": "Editează notiță ce este Ć®n modul citire", - "add-new-label": "Adaugă o nouă etichetă", - "add-new-relation": "Adaugă o nouă relație", - "toggle-ribbon-tab-classic-editor": "Comută la tab-ul de panglică pentru formatare text", - "toggle-ribbon-tab-basic-properties": "Comută la tab-ul de panglică pentru proprietăți de bază", - "toggle-ribbon-tab-book-properties": "Comută la tab-ul de panglică pentru proprietăți colecție", - "toggle-ribbon-tab-file-properties": "Comută la tab-ul de panglică pentru proprietăți fișier", - "toggle-ribbon-tab-image-properties": "Comută la tab-ul de panglică pentru proprietăți imagini", - "toggle-ribbon-tab-owned-attributes": "Comută la tab-ul de panglică pentru atribute proprii", - "toggle-ribbon-tab-inherited-attributes": "Comută la tab-ul de panglică pentru atribute moștenite", - "toggle-ribbon-tab-promoted-attributes": "Comută la tab-ul de panglică pentru atribute promovate", - "toggle-ribbon-tab-note-map": "Comută la tab-ul de panglică pentru harta notiței", - "toggle-ribbon-tab-note-info": "Comută la tab-ul de panglică pentru informații despre notiță", - "toggle-ribbon-tab-note-paths": "Comută la tab-ul de panglică pentru căile notiței", - "toggle-ribbon-tab-similar-notes": "Comută la tab-ul de panglică pentru notițe similare", - "toggle-right-pane": "Comută panoul din dreapta", - "print-active-note": "Imprimă notița activă", - "export-active-note-as-pdf": "Exportă notița activă ca PDF", - "open-note-externally": "Deschide notița Ć®ntr-o aplicație externă", - "render-active-note": "Randează notița activă", - "run-active-note": "Rulează notița activă", - "toggle-note-hoisting": "Comută focalizarea notiței", - "unhoist-note": "Defocalizează notița", - "reload-frontend-app": "ReĆ®mprospătează aplicația", - "open-developer-tools": "Deschide unelete de dezvoltare", - "find-in-text": "Caută Ć®n text", - "toggle-left-pane": "Comută panoul din stĆ¢nga", - "toggle-full-screen": "Comută mod pe tot ecranul", - "zoom-out": "Micșorare", - "zoom-in": "Mărire", - "reset-zoom-level": "Resetează nivelul de zoom", - "copy-without-formatting": "Copiază fără formatare", - "force-save-revision": "Forțează salvarea unei revizii", - "command-palette": "Paleta de comenzi" - }, - "weekdayNumber": "SăptămĆ¢na {weekNumber}", - "quarterNumber": "Trimestrul {quarterNumber}", - "share_theme": { - "site-theme": "Tema site-ului", - "search_placeholder": "Caută...", - "image_alt": "Imaginea articolului", - "last-updated": "Ultima actualizare: {{- date}}", - "subpages": "Subpagini:", - "on-this-page": "Pe această pagină", - "expand": "Expandează" - }, - "hidden_subtree_templates": { - "text-snippet": "Fragment de text", - "description": "Descriere", - "list-view": "Mod listă", - "grid-view": "Mod grilă", - "calendar": "Calendar", - "table": "Tabel", - "geo-map": "Hartă geografică", - "start-date": "Dată de Ć®nceput", - "end-date": "Dată de sfĆ¢rșit", - "start-time": "Timp de Ć®nceput", - "end-time": "Timp de sfĆ¢rșit", - "geolocation": "Geolocație", - "built-in-templates": "Șabloane predefinite", - "board": "Tablă Kanban", - "status": "Stare", - "board_note_first": "Prima notiță", - "board_note_second": "A doua notiță", - "board_note_third": "A treia notiță", - "board_status_todo": "De făcut", - "board_status_progress": "Ǝn lucru", - "board_status_done": "Finalizat" - } + "keyboard_actions": { + "activate-next-tab": "Activează tab-ul din dreapta", + "activate-previous-tab": "Activează tab-ul din stĆ¢nga", + "add-include-note-to-text": "Deschide fereastra de includere notițe", + "add-link-to-text": "Deschide fereastra de adaugă legături Ć®n text", + "add-new-label": "Crează o nouă etichetă", + "add-note-above-to-the-selection": "Adaugă notița deasupra selecției", + "add-note-below-to-selection": "Adaugă notița deasupra selecției", + "attributes-labels-and-relations": "Atribute (etichete și relații)", + "close-active-tab": "Ǝnchide tab-ul activ", + "collapse-subtree": "Minimizează ierarhia notiței curente", + "collapse-tree": "Minimizează Ć®ntreaga ierarhie de notițe", + "copy-notes-to-clipboard": "Copiază notițele selectate Ć®n clipboard", + "copy-without-formatting": "Copiază textul selectat fără formatare", + "create-new-relation": "Crează o nouă relație", + "create-note-into-inbox": "Crează o notiță și o deschide Ć®n inbox (dacă este definit) sau notița zilnică", + "cut-notes-to-clipboard": "Decupează notițele selectate Ć®n clipboard", + "creating-and-moving-notes": "Crearea și mutarea notițelor", + "cut-into-note": "Decupează selecția din notița curentă și crează o subnotiță cu textul selectat", + "delete-note": "Șterge notița", + "dialogs": "Ferestre", + "duplicate-subtree": "Dublifică subnotițele", + "edit-branch-prefix": "Afișează ecranul ā€žEditează prefixul ramuriiā€", + "edit-note-title": "Sare de la arborele notițelor la detaliile notiței și editează titlul", + "edit-readonly-note": "Editează o notiță care este Ć®n modul doar Ć®n citire", + "eight-tab": "Activează cel de-al optelea tab din listă", + "expand-subtree": "Expandează ierarhia notiței curente", + "fifth-tab": "Activează cel de-al cincelea tab din listă", + "first-tab": "Activează cel primul tab din listă", + "follow-link-under-cursor": "Urmărește legătura de sub poziția cursorului", + "force-save-revision": "Forțează crearea/salvarea unei noi revizii ale notiției curente", + "fourth-tab": "Activează cel de-al patrulea tab din listă", + "insert-date-and-time-to-text": "Inserează data curentă și timpul Ć®n text", + "last-tab": "Activează ultimul tab din listă", + "move-note-down": "Mută notița mai jos", + "move-note-down-in-hierarchy": "Mută notița mai jos Ć®n ierarhie", + "move-note-up": "Mută notița mai sus", + "move-note-up-in-hierarchy": "Mută notița mai sus Ć®n ierarhie", + "ninth-tab": "Activează cel de-al nouălea tab din listă", + "note-clipboard": "Clipboard-ul notițelor", + "note-navigation": "Navigarea printre notițe", + "open-dev-tools": "Deschide uneltele de dezvoltator", + "open-jump-to-note-dialog": "Deschide ecranul ā€žSari la notiČ›Äƒā€", + "open-new-tab": "Deschide un tab nou", + "open-new-window": "Deschide o nouă fereastră goală", + "open-note-externally": "Deschide notița ca un fișier utilizĆ¢nd aplicația implicită", + "other": "Altele", + "paste-markdown-into-text": "Lipește text Markdown din clipboard Ć®n notița de tip text", + "paste-notes-from-clipboard": "Lipește notițele din clipboard Ć®n notița activă", + "print-active-note": "Imprimă notița activă", + "reload-frontend-app": "ReĆ®ncarcă interfața grafică", + "render-active-note": "ReĆ®mprospătează notița activă", + "reopen-last-tab": "Deschide din nou ultimul tab Ć®nchis", + "reset-zoom-level": "Resetează nivelul de magnificare", + "ribbon-tabs": "Tab-urile din panglică", + "run-active-note": "Rulează notița curentă de tip JavaScript (frontend sau backend)", + "search-in-subtree": "Caută notițe Ć®n ierarhia notiței active", + "second-tab": "Activează cel de-al doilea tab din listă", + "select-all-notes-in-parent": "Selectează toate notițele din nivelul notiței curente", + "seventh-tab": "Activează cel de-al șaptelea tab din listă", + "show-backend-log": "Afișează fereastra ā€žLog-uri din backendā€", + "show-help": "Afișează informații utile", + "show-note-source": "Afișează fereastra ā€žSursa notițeiā€", + "show-options": "Afișează fereastra de opțiuni", + "show-recent-changes": "Afișează fereastra ā€žSchimbări recenteā€", + "show-revisions": "Afișează fereastra ā€žRevizii ale notițeiā€", + "show-sql-console": "Afișează ecranul ā€žConsolă SQLā€", + "sixth-tab": "Activează cel de-al șaselea tab din listă", + "sort-child-notes": "Ordonează subnotițele", + "tabs-and-windows": "Tab-uri și ferestre", + "text-note-operations": "Operații asupra notițelor text", + "third-tab": "Activează cel de-al treilea tab din listă", + "toggle-basic-properties": "Comută tab-ul ā€žProprietăți de bazÄƒā€", + "toggle-book-properties": "Comută tab-ul ā€žProprietăți ale cărțiiā€", + "toggle-file-properties": "Comută tab-ul ā€žProprietăți fișierā€", + "toggle-full-screen": "Comută modul ecran complet", + "toggle-image-properties": "Comută tab-ul ā€žProprietăți imaginiā€", + "toggle-inherited-attributes": "Comută tab-ul ā€žAtribute moșteniteā€", + "toggle-left-note-tree-panel": "Comută panoul din stĆ¢nga (arborele notițelor)", + "toggle-link-map": "Comută harta legăturilor", + "toggle-note-hoisting": "Comută focalizarea pe notița curentă", + "toggle-note-info": "Comută tab-ul ā€žInformații despre notiČ›Äƒā€", + "toggle-note-paths": "Comută tab-ul ā€žCăile notițeiā€", + "toggle-owned-attributes": "Comută tab-ul ā€žAtribute propriiā€", + "toggle-promoted-attributes": "Comută tab-ul ā€žAtribute promovateā€", + "toggle-right-pane": "Comută afișarea panoului din dreapta, ce include tabela de conținut și evidențieri", + "toggle-similar-notes": "Comută tab-ul ā€žNotițe similareā€", + "toggle-tray": "Afișează/ascunde aplicația din tray-ul de sistem", + "unhoist": "Defocalizează complet", + "zoom-in": "Mărește zoom-ul", + "zoom-out": "Micșorează zoom-ul", + "toggle-classic-editor-toolbar": "Comută tab-ul ā€žFormatareā€ pentru editorul cu bară fixă", + "export-as-pdf": "Exportă notița curentă ca PDF", + "show-cheatsheet": "Afișează o fereastră cu scurtături de la tastatură comune", + "toggle-zen-mode": "Activează/dezactivează modul zen (o interfață minimală, fără distrageri)", + "back-in-note-history": "Mergi la notița anterioară din istoric", + "forward-in-note-history": "Mergi la următoarea notiță din istoric", + "scroll-to-active-note": "Derulează la notița activă Ć®n lista de notițe", + "quick-search": "Mergi la bara de căutare rapidă", + "create-note-after": "Crează o notiță după cea activă", + "create-note-into": "Crează notiță ca subnotiță a notiței active", + "clone-notes-to": "Clonează notițele selectate", + "move-notes-to": "Mută notițele selectate", + "find-in-text": "Afișează/ascunde panoul de căutare", + "open-command-palette": "Deschide paleta de comenzi" + }, + "login": { + "button": "Autentifică", + "heading": "Autentificare Ć®n Trilium", + "incorrect-password": "Parola nu este corectă. Ǝncercați din nou.", + "password": "Parolă", + "remember-me": "Ține-mă minte", + "title": "Autentificare", + "incorrect-totp": "TOTP-ul este incorect. Ǝncercați din nou.", + "sign_in_with_sso": "Autentificare cu {{ ssoIssuerName }}" + }, + "set_password": { + "title": "Setare parolă", + "heading": "Setare parolă", + "button": "Setează parola", + "description": "Ǝnainte de a putea utiliza Trilium din navigator, trebuie mai Ć®ntĆ¢i setată o parolă. Ulterior această parolă va fi folosită la autentificare.", + "password": "Parolă", + "password-confirmation": "Confirmarea parolei" + }, + "javascript-required": "Trilium necesită JavaScript să fie activat pentru a putea funcționa.", + "setup": { + "heading": "Instalarea Trilium Notes", + "init-in-progress": "Se inițializează documentul", + "new-document": "Sunt un utilizator nou și doresc să creez un document Trilium pentru notițele mele", + "next": "Mai departe", + "redirecting": "Ǝn scurt timp veți fi redirecționat la aplicație.", + "sync-from-desktop": "Am deja o instanță de desktop și aș dori o sincronizare cu aceasta", + "sync-from-server": "Am deja o instanță de server și doresc o sincronizare cu aceasta", + "title": "Inițializare" + }, + "setup_sync-from-desktop": { + "description": "Acești pași trebuie urmați de pe aplicația de desktop:", + "heading": "Sincronizare cu aplicația desktop", + "step1": "Deschideți aplicația Trilium Notes pentru desktop.", + "step2": "Din meniul Trilium, dați clic pe Opțiuni.", + "step3": "Clic pe categoria ā€žSincronizareā€.", + "step4": "Schimbați adresa server-ului către: {{- host}} și apăsați ā€žSalveazÄƒā€.", + "step5": "Clic pe butonul ā€žTestează sincronizareaā€ pentru a verifica dacă conexiunea a fost făcută cu succes.", + "step6": "După ce ați completat pașii, dați click {{- link}}.", + "step6-here": "aici" + }, + "setup_sync-from-server": { + "back": "Ǝnapoi", + "finish-setup": "Finalizează inițializarea", + "heading": "Sincronizare cu server-ul", + "instructions": "Introduceți adresa server-ului Trilium și credențialele Ć®n secțiunea de jos. Astfel se va descărca Ć®ntregul document Trilium de pe server și se va configura sincronizarea cu acesta. Ǝn funcție de dimensiunea documentului și viteza rețelei, acest proces poate dura.", + "note": "De remarcat:", + "password": "Parolă", + "proxy-instruction": "Dacă lăsați cĆ¢mpul de proxy nesetat, proxy-ul de sistem va fi folosit (valabil doar pentru aplicația de desktop)", + "proxy-server": "Server-ul proxy (opțional)", + "proxy-server-placeholder": "https://:", + "server-host": "Adresa server-ului Trilium", + "server-host-placeholder": "https://:", + "password-placeholder": "Parolă" + }, + "setup_sync-in-progress": { + "heading": "Sincronizare Ć®n curs", + "outstanding-items": "Elemente de sincronizat:", + "outstanding-items-default": "-", + "successful": "Sincronizarea a fost configurată cu succes. Poate dura ceva timp pentru a finaliza sincronizarea inițială. După efectuarea ei se va redirecționa către pagina de autentificare." + }, + "share_404": { + "heading": "Pagină negăsită", + "title": "Pagină negăsită" + }, + "share_page": { + "child-notes": "Subnotițe:", + "clipped-from": "Această notiță a fost decupată inițial de pe {{- url}}", + "no-content": "Această notiță nu are conținut.", + "parent": "părinte:" + }, + "weekdays": { + "monday": "Luni", + "tuesday": "Marți", + "wednesday": "Miercuri", + "thursday": "Joi", + "friday": "Vineri", + "saturday": "SĆ¢mbătă", + "sunday": "Duminică" + }, + "months": { + "january": "Ianuarie", + "february": "Februarie", + "march": "Martie", + "april": "Aprilie", + "may": "Mai", + "june": "Iunie", + "july": "Iulie", + "august": "August", + "september": "Septembrie", + "october": "Octombrie", + "november": "Noiembrie", + "december": "Decembrie" + }, + "special_notes": { + "search_prefix": "Căutare:" + }, + "test_sync": { + "not-configured": "Calea către serverul de sincronizare nu este configurată. Configurați sincronizarea Ć®nainte.", + "successful": "Comunicarea cu serverul de sincronizare a avut loc cu succes, s-a Ć®nceput sincronizarea." + }, + "hidden-subtree": { + "advanced-title": "Setări avansate", + "appearance-title": "Aspect", + "available-launchers-title": "Lansatoare disponibile", + "backup-title": "Copii de siguranță", + "base-abstract-launcher-title": "Lansator abstract de bază", + "bookmarks-title": "Semne de carte", + "built-in-widget-title": "Widget predefinit", + "bulk-action-title": "Acțiuni Ć®n masă", + "calendar-title": "Calendar", + "code-notes-title": "Notițe de cod", + "command-launcher-title": "Lansator de comenzi", + "custom-widget-title": "Widget personalizat", + "etapi-title": "ETAPI", + "go-to-previous-note-title": "Mergi la notița anterioară", + "images-title": "Imagini", + "launch-bar-title": "Bară de lansare", + "new-note-title": "Notiță nouă", + "note-launcher-title": "Lansator de notițe", + "note-map-title": "Harta notițelor", + "open-today-journal-note-title": "Deschide notița de astăzi", + "options-title": "Opțiuni", + "other": "Diverse", + "password-title": "Parolă", + "protected-session-title": "Sesiune protejată", + "recent-changes-title": "Schimbări recente", + "script-launcher-title": "Lansator de script-uri", + "search-history-title": "Istoric de căutare", + "settings-title": "Setări", + "shared-notes-title": "Notițe partajate", + "quick-search-title": "Căutare rapidă", + "root-title": "Notițe ascunse", + "search-notes-title": "Căutare notițe", + "shortcuts-title": "Scurtături", + "spellcheck-title": "Corectare gramaticală", + "sync-status-title": "Starea sincronizării", + "sync-title": "Sincronizare", + "text-notes": "Notițe text", + "user-hidden-title": "Definite de utilizator", + "backend-log-title": "Log backend", + "spacer-title": "Separator", + "sql-console-history-title": "Istoricul consolei SQL", + "go-to-next-note-title": "Mergi la notița următoare", + "launch-bar-templates-title": "Șabloane bară de lansare", + "visible-launchers-title": "Lansatoare vizibile", + "user-guide": "Ghidul de utilizare", + "jump-to-note-title": "Sari la...", + "llm-chat-title": "Ǝntreabă Notes", + "multi-factor-authentication-title": "Autentificare multi-factor", + "ai-llm-title": "AI/LLM", + "localization": "Limbă și regiune", + "inbox-title": "Inbox" + }, + "notes": { + "new-note": "Notiță nouă", + "duplicate-note-suffix": "(dupl.)", + "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" + }, + "backend_log": { + "log-does-not-exist": "Fișierul de loguri de backend ā€ž{{ fileName }}ā€ nu există (Ć®ncă).", + "reading-log-failed": "Nu s-a putut citi fișierul de loguri de backend ā€ž{{fileName}}ā€." + }, + "content_renderer": { + "note-cannot-be-displayed": "Acest tip de notiță nu poate fi afișat." + }, + "pdf": { + "export_filter": "Document PDF (*.pdf)", + "unable-to-export-message": "Notița curentă nu a putut fi exportată ca PDF.", + "unable-to-export-title": "Nu s-a putut exporta ca PDF", + "unable-to-save-message": "Nu s-a putut scrie fișierul selectat. Ǝncercați din nou sau selectați altă destinație." + }, + "tray": { + "bookmarks": "Semne de carte", + "close": "Ǝnchide Trilium", + "new-note": "Notiță nouă", + "recents": "Notițe recente", + "today": "Mergi la notița de astăzi", + "tooltip": "Trilium Notes", + "show-windows": "Afișează ferestrele", + "open_new_window": "Deschide fereastră nouă" + }, + "migration": { + "error_message": "Eroare la migrarea către versiunea {{version}}: {{stack}}", + "old_version": "Nu se poate migra la ultima versiune direct de la versiunea dvs. Actualizați mai Ć®ntĆ¢i la versiunea v0.60.4 și ulterior la această versiune.", + "wrong_db_version": "Versiunea actuală a bazei de date ({{version}}) este mai nouă decĆ¢t versiunea de bază de date suportată de aplicație ({{targetVersion}}), ceea ce Ć®nseamnă că a fost creată de către o versiune mai nouă de Trilium. Actualizați aplicația la ultima versiune pentru a putea continua." + }, + "modals": { + "error_title": "Eroare" + }, + "keyboard_action_names": { + "quick-search": "Căutare rapidă", + "back-in-note-history": "Ǝnapoi Ć®n istoricul notițelor", + "forward-in-note-history": "Ǝnainte Ć®n istoricul notițelor", + "jump-to-note": "Mergi la...", + "scroll-to-active-note": "Derulează la notița activă", + "search-in-subtree": "Caută Ć®n subnotițe", + "expand-subtree": "Expandează subnotițele", + "collapse-tree": "Minimizează arborele de notițe", + "collapse-subtree": "Ascunde subnotițele", + "sort-child-notes": "Ordonează subnotițele", + "create-note-after": "Crează notiță după", + "create-note-into": "Crează subnotiță Ć®n", + "create-note-into-inbox": "Crează notiță Ć®n inbox", + "delete-notes": "Șterge notițe", + "move-note-up": "Mută notița deasupra", + "move-note-down": "Mută notița dedesubt", + "move-note-up-in-hierarchy": "Mută notița mai sus Ć®n ierarhie", + "move-note-down-in-hierarchy": "Mută notița mai jos Ć®n ierarhie", + "edit-note-title": "Editează titlul notiței", + "edit-branch-prefix": "Editează prefixul ramurii", + "clone-notes-to": "Clonează notițele Ć®n", + "move-notes-to": "Mută notițele Ć®n", + "copy-notes-to-clipboard": "Copiază notițele Ć®n clipboard", + "paste-notes-from-clipboard": "Lipește notițele din clipboard", + "cut-notes-to-clipboard": "Decupează notițele Ć®n clipboard", + "select-all-notes-in-parent": "Selectează toate notițele din părinte", + "add-note-above-to-selection": "Adaugă notița de deasupra la selecție", + "add-note-below-to-selection": "Adaugă notița de dedesubt la selecție", + "duplicate-subtree": "Dublifică ierarhia", + "open-new-tab": "Deschide Ć®n tab nou", + "close-active-tab": "Ǝnchide tab-ul activ", + "reopen-last-tab": "Redeschide ultimul tab", + "activate-next-tab": "Activează tab-ul următorul", + "activate-previous-tab": "Activează tab-ul anterior", + "open-new-window": "Deschide Ć®n fereastră nouă", + "toggle-system-tray-icon": "Afișează/ascunde iconița din bara de sistem", + "toggle-zen-mode": "Activează/dezactivează modul zen", + "switch-to-first-tab": "Mergi la primul tab", + "switch-to-second-tab": "Mergi la al doilea tab", + "switch-to-third-tab": "Mergi la al treilea tab", + "switch-to-fourth-tab": "Mergi la al patrulea tab", + "switch-to-fifth-tab": "Mergi la al cincelea tab", + "switch-to-sixth-tab": "Mergi la al șaselea tab", + "switch-to-seventh-tab": "Mergi la al șaptelea tab", + "switch-to-eighth-tab": "Mergi la al optelea tab", + "switch-to-ninth-tab": "Mergi la al nouălea tab", + "switch-to-last-tab": "Mergi la ultimul tab", + "show-note-source": "Afișează sursa notiței", + "show-options": "Afișează opțiunile", + "show-revisions": "Afișează reviziile", + "show-recent-changes": "Afișează modificările recente", + "show-sql-console": "Afișează consola SQL", + "show-backend-log": "Afișează log-urile din backend", + "show-help": "Afișează ghidul", + "show-cheatsheet": "Afișează ghidul rapid", + "add-link-to-text": "Inserează o legătură Ć®n text", + "follow-link-under-cursor": "Urmează legătura de la poziția curentă", + "insert-date-and-time-to-text": "Inserează data și timpul Ć®n text", + "paste-markdown-into-text": "Lipește Markdown Ć®n text", + "cut-into-note": "Decupează Ć®n subnotiță", + "add-include-note-to-text": "Adaugă o includere de notiță Ć®n text", + "edit-read-only-note": "Editează notiță ce este Ć®n modul citire", + "add-new-label": "Adaugă o nouă etichetă", + "add-new-relation": "Adaugă o nouă relație", + "toggle-ribbon-tab-classic-editor": "Comută la tab-ul de panglică pentru formatare text", + "toggle-ribbon-tab-basic-properties": "Comută la tab-ul de panglică pentru proprietăți de bază", + "toggle-ribbon-tab-book-properties": "Comută la tab-ul de panglică pentru proprietăți colecție", + "toggle-ribbon-tab-file-properties": "Comută la tab-ul de panglică pentru proprietăți fișier", + "toggle-ribbon-tab-image-properties": "Comută la tab-ul de panglică pentru proprietăți imagini", + "toggle-ribbon-tab-owned-attributes": "Comută la tab-ul de panglică pentru atribute proprii", + "toggle-ribbon-tab-inherited-attributes": "Comută la tab-ul de panglică pentru atribute moștenite", + "toggle-ribbon-tab-promoted-attributes": "Comută la tab-ul de panglică pentru atribute promovate", + "toggle-ribbon-tab-note-map": "Comută la tab-ul de panglică pentru harta notiței", + "toggle-ribbon-tab-note-info": "Comută la tab-ul de panglică pentru informații despre notiță", + "toggle-ribbon-tab-note-paths": "Comută la tab-ul de panglică pentru căile notiței", + "toggle-ribbon-tab-similar-notes": "Comută la tab-ul de panglică pentru notițe similare", + "toggle-right-pane": "Comută panoul din dreapta", + "print-active-note": "Imprimă notița activă", + "export-active-note-as-pdf": "Exportă notița activă ca PDF", + "open-note-externally": "Deschide notița Ć®ntr-o aplicație externă", + "render-active-note": "Randează notița activă", + "run-active-note": "Rulează notița activă", + "toggle-note-hoisting": "Comută focalizarea notiței", + "unhoist-note": "Defocalizează notița", + "reload-frontend-app": "ReĆ®mprospătează aplicația", + "open-developer-tools": "Deschide unelete de dezvoltare", + "find-in-text": "Caută Ć®n text", + "toggle-left-pane": "Comută panoul din stĆ¢nga", + "toggle-full-screen": "Comută mod pe tot ecranul", + "zoom-out": "Micșorare", + "zoom-in": "Mărire", + "reset-zoom-level": "Resetează nivelul de zoom", + "copy-without-formatting": "Copiază fără formatare", + "force-save-revision": "Forțează salvarea unei revizii", + "command-palette": "Paleta de comenzi" + }, + "weekdayNumber": "SăptămĆ¢na {weekNumber}", + "quarterNumber": "Trimestrul {quarterNumber}", + "share_theme": { + "site-theme": "Tema site-ului", + "search_placeholder": "Caută...", + "image_alt": "Imaginea articolului", + "last-updated": "Ultima actualizare: {{- date}}", + "subpages": "Subpagini:", + "on-this-page": "Pe această pagină", + "expand": "Expandează" + }, + "hidden_subtree_templates": { + "text-snippet": "Fragment de text", + "description": "Descriere", + "list-view": "Mod listă", + "grid-view": "Mod grilă", + "calendar": "Calendar", + "table": "Tabel", + "geo-map": "Hartă geografică", + "start-date": "Dată de Ć®nceput", + "end-date": "Dată de sfĆ¢rșit", + "start-time": "Timp de Ć®nceput", + "end-time": "Timp de sfĆ¢rșit", + "geolocation": "Geolocație", + "built-in-templates": "Șabloane predefinite", + "board": "Tablă Kanban", + "status": "Stare", + "board_note_first": "Prima notiță", + "board_note_second": "A doua notiță", + "board_note_third": "A treia notiță", + "board_status_todo": "De făcut", + "board_status_progress": "Ǝn lucru", + "board_status_done": "Finalizat", + "presentation": "Prezentare", + "presentation_slide": "Slide de prezentare", + "presentation_slide_first": "Primul slide", + "presentation_slide_second": "Al doilea slide" + }, + "sql_init": { + "db_not_initialized_desktop": "Baza de date nu este inițializată, urmați instrucțiunile de pe ecran.", + "db_not_initialized_server": "Baza de date nu este inițializată, vizitați pagina de inițializare la http://[your-server-host]:{{port}}, ce conține instrucțiuni despre inițializarea aplicației." + }, + "desktop": { + "instance_already_running": "Se focalizează o instanță a aplicației deja existentă." + } } diff --git a/apps/server/src/assets/translations/ru/server.json b/apps/server/src/assets/translations/ru/server.json index 8d8d4eeff..ef64ef149 100644 --- a/apps/server/src/assets/translations/ru/server.json +++ b/apps/server/src/assets/translations/ru/server.json @@ -424,5 +424,12 @@ }, "content_renderer": { "note-cannot-be-displayed": "Этот тип заметки не может Š±Ń‹Ń‚ŃŒ отображен." + }, + "sql_init": { + "db_not_initialized_desktop": "База Ганных не инициализирована, ŃŠ»ŠµŠ“ŃƒŠ¹Ń‚Šµ ŠøŠ½ŃŃ‚Ń€ŃƒŠŗŃ†ŠøŃŠ¼ на ŃŠŗŃ€Š°Š½Šµ.", + "db_not_initialized_server": "База Ганных не инициализирована, ŠæŠ¾Š¶Š°Š»ŃƒŠ¹ŃŃ‚Š°, посетите ŃŃ‚Ń€Š°Š½ŠøŃ†Ńƒ настройки - http://[your-server-host]:{{port}}, чтобы ŃƒŠ²ŠøŠ“ŠµŃ‚ŃŒ ŠøŠ½ŃŃ‚Ń€ŃƒŠŗŃ†ŠøŠø по инициализации Trilium." + }, + "desktop": { + "instance_already_running": "ŠŸŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŠµ уже Š·Š°ŠæŃƒŃ‰ŠµŠ½Š¾, Ń„Š¾ŠŗŃƒŃ ŠæŠµŃ€ŠµŠŗŠ»ŃŽŃ‡ŠµŠ½ на него." } } diff --git a/apps/server/src/assets/translations/sv/server.json b/apps/server/src/assets/translations/sv/server.json new file mode 100644 index 000000000..0fc334731 --- /dev/null +++ b/apps/server/src/assets/translations/sv/server.json @@ -0,0 +1,7 @@ +{ + "keyboard_actions": { + "back-in-note-history": "GĆ„ till fƶregĆ„ende anteckning i historiken", + "forward-in-note-history": "GĆ„ till nƤsta anteckning i historiken", + "open-jump-to-note-dialog": "Ɩppna \"Hoppa till anteckning\" dialog" + } +} diff --git a/apps/server/src/assets/translations/tr/server.json b/apps/server/src/assets/translations/tr/server.json index 0967ef424..2ee2a7721 100644 --- a/apps/server/src/assets/translations/tr/server.json +++ b/apps/server/src/assets/translations/tr/server.json @@ -1 +1,6 @@ -{} +{ + "keyboard_actions": { + "back-in-note-history": "GeƧmişteki ƶnceki nota git", + "forward-in-note-history": "GeƧmişteki sonraki nota git" + } +} diff --git a/apps/server/src/assets/translations/tw/server.json b/apps/server/src/assets/translations/tw/server.json index 5b2344730..b4ad3e966 100644 --- a/apps/server/src/assets/translations/tw/server.json +++ b/apps/server/src/assets/translations/tw/server.json @@ -60,16 +60,16 @@ "add-new-label": "ę–°å¢žę–°ęØ™ē±¤", "create-new-relation": "ę–°å¢žę–°é—œčÆ", "ribbon-tabs": "åŠŸčƒ½å€åˆ†é ", - "toggle-basic-properties": "é”Æē¤ŗåŸŗęœ¬å±¬ę€§", - "toggle-file-properties": "é”Æē¤ŗęŖ”ę”ˆå±¬ę€§", - "toggle-image-properties": "é”Æē¤ŗåœ–åƒå±¬ę€§", - "toggle-owned-attributes": "é”Æē¤ŗč‡Ŗęœ‰å±¬ę€§", - "toggle-inherited-attributes": "锯示繼承屬性", - "toggle-promoted-attributes": "é”Æē¤ŗå‡ē“šēš„å±¬ę€§", - "toggle-link-map": "é”Æē¤ŗé€£ēµåœ°åœ–", - "toggle-note-info": "é”Æē¤ŗē­†čØ˜č³‡čØŠ", - "toggle-note-paths": "é”Æē¤ŗē­†čØ˜č·Æå¾‘", - "toggle-similar-notes": "é”Æē¤ŗē›øä¼¼ē­†čØ˜", + "toggle-basic-properties": "åˆ‡ę›åŸŗęœ¬å±¬ę€§", + "toggle-file-properties": "åˆ‡ę›ęŖ”ę”ˆå±¬ę€§", + "toggle-image-properties": "åˆ‡ę›åœ–åƒå±¬ę€§", + "toggle-owned-attributes": "åˆ‡ę›č‡Ŗęœ‰å±¬ę€§", + "toggle-inherited-attributes": "åˆ‡ę›ē¹¼ę‰æå±¬ę€§", + "toggle-promoted-attributes": "åˆ‡ę›å‡ē“šēš„å±¬ę€§", + "toggle-link-map": "åˆ‡ę›é€£ēµåœ°åœ–", + "toggle-note-info": "åˆ‡ę›ē­†čØ˜č³‡čØŠ", + "toggle-note-paths": "åˆ‡ę›ē­†čØ˜č·Æå¾‘", + "toggle-similar-notes": "åˆ‡ę›ē›øä¼¼ē­†čØ˜", "other": "其他", "toggle-right-pane": "åˆ‡ę›å³å“é¢ęæēš„é”Æē¤ŗļ¼ŒåŒ…ę‹¬ē›®éŒ„å’Œé«˜äŗ®", "print-active-note": "åˆ—å°ē›®å‰ē­†čØ˜", @@ -80,7 +80,7 @@ "unhoist": "å–ę¶ˆä»»ä½•čšē„¦", "reload-frontend-app": "é‡ę–°č¼‰å…„å‰ē«Æę‡‰ē”Ø", "open-dev-tools": "打開開發者巄具", - "toggle-left-note-tree-panel": "é”Æē¤ŗå·¦å“ļ¼ˆē­†čØ˜ęØ¹ļ¼‰é¢ęæ", + "toggle-left-note-tree-panel": "åˆ‡ę›å·¦å“ļ¼ˆē­†čØ˜ęØ¹ļ¼‰é¢ęæ", "toggle-full-screen": "åˆ‡ę›å…Øčž¢å¹•", "zoom-out": "ēø®å°", "zoom-in": "放大", @@ -89,7 +89,7 @@ "copy-without-formatting": "仄瓔文字複製所選文字", "force-save-revision": "å¼·åˆ¶ę–°å¢ž / å„²å­˜ē›®å‰ē­†čØ˜ēš„ę–°ē‰ˆęœ¬", "show-help": "é”Æē¤ŗē”Øęˆ¶čŖŖę˜Ž", - "toggle-book-properties": "é”Æē¤ŗé›†åˆå±¬ę€§", + "toggle-book-properties": "åˆ‡ę›é›†åˆå±¬ę€§", "back-in-note-history": "č·³č½‰č‡³ę­·å²čØ˜éŒ„äø­ēš„äøŠäø€å€‹ē­†čØ˜", "forward-in-note-history": "č·³č½‰č‡³ę­·å²čØ˜éŒ„äø­ēš„äø‹äø€å€‹ē­†čØ˜", "open-command-palette": "ę‰“é–‹å‘½ä»¤é¢ęæ", @@ -100,8 +100,8 @@ "clone-notes-to": "å…‹éš†ę‰€éøēš„ē­†čØ˜č‡³", "move-notes-to": "ē§»å‹•ę‰€éøēš„ē­†čØ˜č‡³", "show-cheatsheet": "é”Æē¤ŗåøøē”Øéµē›¤åæ«ę·éµ", - "find-in-text": "é”Æē¤ŗęœå°‹é¢ęæ", - "toggle-classic-editor-toolbar": "é”Æē¤ŗå›ŗå®šå·„å…·åˆ—ē·Øč¼Æå™Øēš„ę ¼å¼åˆ†é ", + "find-in-text": "åˆ‡ę›ęœå°‹é¢ęæ", + "toggle-classic-editor-toolbar": "åˆ‡ę›å›ŗå®šå·„å…·åˆ—ē·Øč¼Æå™Øēš„ę ¼å¼åˆ†é ", "export-as-pdf": "åŒÆå‡ŗē›®å‰ē­†čØ˜ē‚ŗ PDF", "toggle-zen-mode": "å•Ÿē”Ø / ē¦ē”Øē¦ŖęØ”å¼ļ¼ˆę„µē°”ē•Œé¢ä»„å°ˆę³Øē·Øč¼Æļ¼‰" }, @@ -275,30 +275,30 @@ "edit-read-only-note": "ē·Øč¼Æå”Æč®€ē­†čØ˜", "add-new-label": "ę–°å¢žęØ™ē±¤", "add-new-relation": "ę–°å¢žé—œčÆ", - "toggle-ribbon-tab-classic-editor": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šē¶“å…øē·Øč¼Æå™Ø", - "toggle-ribbon-tab-basic-properties": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šåŸŗęœ¬å±¬ę€§", - "toggle-ribbon-tab-book-properties": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šę›øē±å±¬ę€§", - "toggle-ribbon-tab-file-properties": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šęŖ”ę”ˆå±¬ę€§", - "toggle-ribbon-tab-image-properties": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šåœ–ē‰‡å±¬ę€§", - "toggle-ribbon-tab-owned-attributes": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šč‡Ŗęœ‰å±¬ę€§", - "toggle-ribbon-tab-inherited-attributes": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šē¹¼ę‰æå±¬ę€§", - "toggle-ribbon-tab-promoted-attributes": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šå‡ē“šå±¬ę€§", - "toggle-ribbon-tab-note-map": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šē­†čØ˜åœ°åœ–", - "toggle-ribbon-tab-note-info": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šē­†čØ˜č³‡čØŠ", - "toggle-ribbon-tab-note-paths": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šē­†čØ˜č·Æå¾‘", - "toggle-ribbon-tab-similar-notes": "é”Æē¤ŗåŠŸčƒ½å€åˆ†é ļ¼šē›øä¼¼ē­†čØ˜", - "toggle-right-pane": "ę‰“é–‹å³å“é¢ęæ", + "toggle-ribbon-tab-classic-editor": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šē¶“å…øē·Øč¼Æå™Ø", + "toggle-ribbon-tab-basic-properties": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šåŸŗęœ¬å±¬ę€§", + "toggle-ribbon-tab-book-properties": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šę›øē±å±¬ę€§", + "toggle-ribbon-tab-file-properties": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šęŖ”ę”ˆå±¬ę€§", + "toggle-ribbon-tab-image-properties": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šåœ–ē‰‡å±¬ę€§", + "toggle-ribbon-tab-owned-attributes": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šč‡Ŗęœ‰å±¬ę€§", + "toggle-ribbon-tab-inherited-attributes": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šē¹¼ę‰æå±¬ę€§", + "toggle-ribbon-tab-promoted-attributes": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šå‡ē“šå±¬ę€§", + "toggle-ribbon-tab-note-map": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šē­†čØ˜åœ°åœ–", + "toggle-ribbon-tab-note-info": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šē­†čØ˜č³‡čØŠ", + "toggle-ribbon-tab-note-paths": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šē­†čØ˜č·Æå¾‘", + "toggle-ribbon-tab-similar-notes": "åˆ‡ę›åŠŸčƒ½å€åˆ†é ļ¼šē›øä¼¼ē­†čØ˜", + "toggle-right-pane": "åˆ‡ę›å³å“é¢ęæ", "print-active-note": "åˆ—å°ē›®å‰ē­†čØ˜", "export-active-note-as-pdf": "åŒÆå‡ŗē›®å‰ē­†čØ˜ē‚ŗ PDF", "open-note-externally": "ę–¼å¤–éƒØę‰“é–‹ē­†čØ˜", "render-active-note": "ęø²ęŸ“ē›®å‰ē­†čØ˜", "run-active-note": "åŸ·č”Œē›®å‰ē­†čØ˜", - "toggle-note-hoisting": "čšē„¦ē­†čØ˜", + "toggle-note-hoisting": "åˆ‡ę›čšē„¦ē­†čØ˜", "unhoist-note": "å–ę¶ˆčšē„¦ē­†čØ˜", "reload-frontend-app": "é‡ę–°č¼‰å…„å‰ē«ÆēØ‹å¼", "open-developer-tools": "打開開發者巄具", "find-in-text": "åœØę–‡å­—äø­å°‹ę‰¾", - "toggle-left-pane": "ę‰“é–‹å·¦å“é¢ęæ", + "toggle-left-pane": "åˆ‡ę›å·¦å“é¢ęæ", "toggle-full-screen": "åˆ‡ę›å…Øčž¢å¹•", "command-palette": "å‘½ä»¤é¢ęæ" }, @@ -373,7 +373,8 @@ "export_filter": "PDF ꖇ件 (*.pdf)", "unable-to-export-message": "ē›®å‰ē­†čØ˜ē„”ę³•č¢«åŒÆå‡ŗē‚ŗ PDF 怂", "unable-to-export-title": "ē„”ę³•åŒÆå‡ŗē‚ŗ PDF", - "unable-to-save-message": "ę‰€éøęŖ”ę”ˆē„”ę³•č¢«åÆ«å…„ć€‚č«‹é‡č©¦ęˆ–éøę“‡å…¶ä»–č·Æå¾‘ć€‚" + "unable-to-save-message": "ę‰€éøęŖ”ę”ˆē„”ę³•č¢«åÆ«å…„ć€‚č«‹é‡č©¦ęˆ–éøę“‡å…¶ä»–č·Æå¾‘ć€‚", + "unable-to-print": "ē„”ę³•åˆ—å°ē­†čØ˜" }, "tray": { "tooltip": "Trilium ē­†čØ˜", @@ -423,6 +424,18 @@ "board_note_third": "ē¬¬äø‰å€‹ē­†čØ˜", "board_status_todo": "待辦", "board_status_progress": "é€²č”Œäø­", - "board_status_done": "已完成" + "board_status_done": "已完成", + "presentation": "簔報", + "presentation_slide": "ē°”å ±ęŠ•å½±ē‰‡", + "presentation_slide_first": "ē¬¬äø€å¼µęŠ•å½±ē‰‡", + "presentation_slide_second": "ē¬¬äŗŒå¼µęŠ•å½±ē‰‡", + "background": "čƒŒę™Æ" + }, + "sql_init": { + "db_not_initialized_desktop": "č³‡ę–™åŗ«å°šęœŖåˆå§‹åŒ–ļ¼Œč«‹ä¾čž¢å¹•ęŒ‡ē¤ŗę“ä½œć€‚", + "db_not_initialized_server": "č³‡ę–™åŗ«å°šęœŖåˆå§‹åŒ–ļ¼Œč«‹å‰å¾€čØ­å®šé é¢ http://[your-server-host]:{{port}} ęŸ„ēœ‹å¦‚ä½•åˆå§‹åŒ– Trilium怂" + }, + "desktop": { + "instance_already_running": "å·²ē¶“ęœ‰äø€å€‹åŸ·č”Œäø­ēš„åÆ¦ä¾‹ļ¼Œę­£åœØå°‡ē„¦é»žåˆ‡ę›åˆ°č©²åÆ¦ä¾‹ć€‚" } } diff --git a/apps/server/src/assets/translations/uk/server.json b/apps/server/src/assets/translations/uk/server.json index 26282db65..61b0cdedc 100644 --- a/apps/server/src/assets/translations/uk/server.json +++ b/apps/server/src/assets/translations/uk/server.json @@ -424,5 +424,12 @@ "board_status_todo": "Зробити", "board_status_progress": "Š£ процесі", "board_status_done": "Готово" + }, + "sql_init": { + "db_not_initialized_desktop": "DB не ініціалізовано, буГь ласка, Š“Š¾Ń‚Ń€ŠøŠ¼ŃƒŠ¹Ń‚ŠµŃŃŒ Ń–Š½ŃŃ‚Ń€ŃƒŠŗŃ†Ń–Š¹ на екрані.", + "db_not_initialized_server": "DB не ініціалізовано, буГь ласка, віГвіГайте ŃŃ‚Š¾Ń€Ń–Š½ŠŗŃƒ Š½Š°Š»Š°ŃˆŃ‚ŃƒŠ²Š°Š½Š½Ń - http://[your-server-host]:{{port}} , щоб ŠæŠµŃ€ŠµŠ³Š»ŃŠ½ŃƒŃ‚Šø Ń–Š½ŃŃ‚Ń€ŃƒŠŗŃ†Ń–Ń— щоГо ініціалізації Trilium." + }, + "desktop": { + "instance_already_running": "Š•ŠŗŠ·ŠµŠ¼ŠæŠ»ŃŃ€ вже Š·Š°ŠæŃƒŃ‰ŠµŠ½Š¾, Ń„Š¾ŠŗŃƒŃŃƒŠ²Š°Š½Š½Ń буГе на ньому." } } diff --git a/apps/server/src/assets/translations/vi/server.json b/apps/server/src/assets/translations/vi/server.json index d5c1ec1c5..ced460cb3 100644 --- a/apps/server/src/assets/translations/vi/server.json +++ b/apps/server/src/assets/translations/vi/server.json @@ -1,6 +1,23 @@ { - "keyboard_actions": { - "delete-note": "XoĆ” ghi chĆ©p", - "move-notes-to": "Di chuyển ghi chĆ©p được chį»n" - } + "keyboard_actions": { + "delete-note": "XoĆ” ghi chĆŗ", + "move-notes-to": "Di chuyển ghi chĆ©p được chį»n", + "back-in-note-history": "Điều hướng đến ghi chĆŗ trước đó trong lịch sį»­", + "forward-in-note-history": "Chuyển hướng đến ghi chĆŗ tiįŗæp theo trong lịch sį»­", + "open-jump-to-note-dialog": "Mở hį»™p thoįŗ”i \"Jump to note\"", + "open-command-palette": "Mở bįŗ£ng lệnh", + "scroll-to-active-note": "Cuį»™n cĆ¢y ghi chĆŗ đến ghi chĆŗ đang sį»­ dỄng", + "quick-search": "KĆ­ch hoįŗ”t thanh tƬm kiįŗæm nhanh", + "search-in-subtree": "TƬm kiįŗæm cĆ”c ghi chĆŗ trong cĆ¢y con cį»§a ghi chĆŗ hiện tįŗ”i", + "expand-subtree": "Mở rį»™ng cĆ¢y con cį»§a ghi chĆŗ hiện tįŗ”i", + "collapse-tree": "Thu gį»n toĆ n bį»™ cĆ¢y ghi chĆŗ", + "collapse-subtree": "Thu gį»n cĆ¢y con cį»§a ghi chĆŗ hiện tįŗ”i", + "sort-child-notes": "SįŗÆp xįŗæp cĆ”c ghi chĆŗ con", + "creating-and-moving-notes": "Tįŗ”o vĆ  di chuyển ghi chĆŗ", + "create-note-after": "Tįŗ”o ghi chĆŗ sau ghi chĆŗ hiện tįŗ”i", + "create-note-into": "Tįŗ”o ghi chĆŗ con cho ghi chĆŗ hiện tįŗ”i", + "create-note-into-inbox": "Tįŗ”o mį»™t ghi chĆŗ trong thʰ mỄc đầu vĆ o (nįŗæu được khai bĆ”o) hoįŗ·c ghi chĆŗ cį»§a ngĆ y", + "move-note-up": "Chuyển ghi chĆŗ lĆŖn", + "move-note-down": "Chuyển ghi chĆŗ xuống" + } } diff --git a/apps/server/src/assets/views/desktop.ejs b/apps/server/src/assets/views/desktop.ejs index 374ed0b8c..a86b7e7a0 100644 --- a/apps/server/src/assets/views/desktop.ejs +++ b/apps/server/src/assets/views/desktop.ejs @@ -8,8 +8,13 @@ Trilium Notes + - + - @@ -53,7 +61,6 @@ - diff --git a/apps/server/src/assets/views/login.ejs b/apps/server/src/assets/views/login.ejs index 4cd3c6a00..4ffab5101 100644 --- a/apps/server/src/assets/views/login.ejs +++ b/apps/server/src/assets/views/login.ejs @@ -7,18 +7,17 @@ - <% // TriliumNextTODO: move the css file to ${assetPath}/stylesheets/ %> - + - + - diff --git a/apps/server/src/assets/views/mobile.ejs b/apps/server/src/assets/views/mobile.ejs index d210c5ca7..b5ea77a16 100644 --- a/apps/server/src/assets/views/mobile.ejs +++ b/apps/server/src/assets/views/mobile.ejs @@ -96,8 +96,13 @@ } } + + - +
    @@ -108,11 +113,9 @@ <%- include("./partials/windowGlobal.ejs", locals) %> - - <% if (themeCssUrl) { %> diff --git a/apps/server/src/assets/views/partials/windowGlobal.ejs b/apps/server/src/assets/views/partials/windowGlobal.ejs index 1258030d1..c69351e1a 100644 --- a/apps/server/src/assets/views/partials/windowGlobal.ejs +++ b/apps/server/src/assets/views/partials/windowGlobal.ejs @@ -3,7 +3,7 @@ window.glob = { device: "<%= device %>", - baseApiUrl: 'api/', + baseApiUrl: "<%= baseApiUrl %>", activeDialog: null, maxEntityChangeIdAtLoad: <%= maxEntityChangeIdAtLoad %>, maxEntityChangeSyncIdAtLoad: <%= maxEntityChangeSyncIdAtLoad %>, @@ -18,6 +18,7 @@ appPath: "<%= appPath %>", platform: "<%= platform %>", hasNativeTitleBar: <%= hasNativeTitleBar %>, - TRILIUM_SAFE_MODE: <%= !!process.env.TRILIUM_SAFE_MODE %> + TRILIUM_SAFE_MODE: <%= !!process.env.TRILIUM_SAFE_MODE %>, + isRtl: <%= !!currentLocale.rtl %> }; \ No newline at end of file diff --git a/apps/server/src/assets/views/print.ejs b/apps/server/src/assets/views/print.ejs new file mode 100644 index 000000000..c1808e507 --- /dev/null +++ b/apps/server/src/assets/views/print.ejs @@ -0,0 +1,32 @@ + + + + + + + + + + Trilium Notes + + + + + + + +<%- include("./partials/windowGlobal.ejs", locals) %> + + + + + + + + diff --git a/apps/server/src/assets/views/set_password.ejs b/apps/server/src/assets/views/set_password.ejs index 9dddfca50..261071647 100644 --- a/apps/server/src/assets/views/set_password.ejs +++ b/apps/server/src/assets/views/set_password.ejs @@ -6,13 +6,18 @@ <%= t("set_password.title") %> - <% // TriliumNextTODO: move the css file to ${assetPath}/stylesheets/ %> - + + - +

    <%= t("set_password.heading") %>

    @@ -46,7 +51,6 @@
    - diff --git a/apps/server/src/assets/views/setup.ejs b/apps/server/src/assets/views/setup.ejs index c11368867..68ee58b51 100644 --- a/apps/server/src/assets/views/setup.ejs +++ b/apps/server/src/assets/views/setup.ejs @@ -6,10 +6,11 @@ <%= t("setup.title") %> - <% // TriliumNextTODO: move the css file to ${assetPath}/stylesheets/ %> - - + - +
    + +
    + {restDownloads.map(download => ( + + {download[1].name} + + ))} +
    +
    + + ) +} + +function reorderPlatforms(entries: [string, DownloadMatrixEntry][], platformToCenter: Platform | "") { + const entryToCenter = entries.find(x => x[0] === platformToCenter); + if (!entryToCenter) return entries; + + const others = entries.filter(x => x !== entryToCenter); + const mid = Math.floor(others.length / 2); + others.splice(mid, 0, entryToCenter); + return others; +} diff --git a/apps/website/src/pages/Home/index.css b/apps/website/src/pages/Home/index.css new file mode 100644 index 000000000..b38a94ca0 --- /dev/null +++ b/apps/website/src/pages/Home/index.css @@ -0,0 +1,252 @@ +section.hero-section { + position: relative; + + &::before { + content: ""; + position: absolute; + inset: 0; + pointer-events: none; + background: + radial-gradient(40vmax 40vmax at 15% 25%, rgba(228, 123, 25, 0.25), transparent 70%), + radial-gradient(35vmax 35vmax at 75% 20%, rgba(79, 165, 43, 0.22), transparent 70%), + radial-gradient(28vmax 28vmax at 60% 75%, rgba(227, 63, 59, 0.22), transparent 70%), + radial-gradient(20vmax 20vmax at 85% 65%, rgba(228, 123, 25, 0.18), transparent 70%), + radial-gradient(15vmax 15vmax at 40% 50%, rgba(79, 165, 43, 0.15), transparent 70%); + + @media (prefers-color-scheme: dark) { + background: + radial-gradient(40vmax 40vmax at 20% 30%, rgba(228, 123, 25, 0.25), transparent 70%), + radial-gradient(30vmax 30vmax at 75% 25%, rgba(79, 165, 43, 0.25), transparent 70%), + radial-gradient(25vmax 25vmax at 60% 75%, rgba(227, 63, 59, 0.25), transparent 70%), + radial-gradient(20vmax 20vmax at 85% 65%, rgba(228, 123, 25, 0.15), transparent 70%); + } + } + &::after { + content: ""; + position: absolute; + inset: 0; + background: radial-gradient(circle, rgba(255, 255, 255, 0) 60%, rgba(0, 0, 0, 0.06) 100%); + pointer-events: none; + + @media (prefers-color-scheme: dark) { + content: ""; + position: absolute; + inset: 0; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200' viewBox='0 0 200 200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"); + opacity: 0.04; + pointer-events: none; + } + } + + &>.content-wrapper { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + min-width: 80vw; + } + + .title-section { + flex-basis: 30%; + flex-shrink: 0; + color: var(--muted-color); + + h1 { + background-image: linear-gradient(150deg, var(--brand-1), var(--brand-3)); + background-clip: text; + color: transparent; + line-height: 1.1; + font-weight: 400; + } + } + + .screenshot-container { + flex-grow: 1; + } + + .screenshot { + position: relative; + width: 100%; + height: auto; + margin-bottom: 0; + } + + .download-wrapper { + display: flex; + flex-direction: column; + align-content: center; + } + + .download-button { + margin-bottom: 0.25em; + } + + .more-download-options { + display: inline-block; + margin-top: 1em; + color: var(--brand-1); + font-size: 0.8em; + text-align: center; + } + + .additional-options { + margin-top: 1em; + display: flex; + gap: 1em; + font-size: 0.85em; + align-items: center; + + a { + flex-grow: 1; + } + } +} + +@media (max-width: 719px) { + section.hero-section { + padding-bottom: 0; + + .content-wrapper { + width: 100%; + } + + .title-section { + max-width: 90%; + } + + .screenshot { + margin-top: 2em; + } + } +} + +@media (min-width: 720px) { + section.hero-section > .content-wrapper { + flex-direction: row; + gap: 3em; + padding: 3em; + } + + section.hero-section .download-wrapper { + display: inline-flex; + } +} + +section.accented { + background: linear-gradient(135deg, rgba(228, 123, 25, 0.08), rgba(79, 165, 43, 0.08)); +} + +.benefits-container .card { + padding: 1em; +} + +section.final-cta { + text-align: center; + padding: 6em 0; + + h2 { + margin-bottom: 0; + } + + p { + color: var(--muted-color); + } + + .buttons { + display: flex; + align-items: center; + gap: 1em; + justify-content: center; + margin-top: 2em; + + .button { + padding: 0.75em 2em; + } + } +} + +section.faq { + box-shadow: 0 0 6px rgba(0, 0, 0, 0.15); + + @media (prefers-color-scheme: dark) { + box-shadow: unset; + border-top: 1px solid var(--brand-1); + } +} + +.list-with-screenshot { + gap: 2em; + + @media (min-width: 720px) { + display: flex; + } + + ul { + list-style-type: none; + margin: 0; + padding: 0; + + li { + margin-bottom: 1em; + + &:last-of-type { + margin-bottom: 0; + } + + .card { + border: 1px solid transparent; + } + + &.selected .card { + border: 1px solid var(--brand-1); + } + } + } + + .details { + flex-basis: 50%; + flex-shrink: 0; + + @media (max-width: 719px) { + margin-top: 1em; + } + } + + &.horizontal { + flex-direction: column-reverse; + + ul { + gap: 1em; + display: grid; + + @media (min-width: 720px) { + grid-template-columns: 1fr 1fr 1fr; + } + } + + li { + margin: 0; + } + + .card { + height: 100%; + } + + h3 { + color: var(--brand-1); + } + + .details { + max-height: 35vh; + overflow: hidden; + display: flex; + flex-direction: column; + + img { + height: 100%; + width: auto; + object-fit: contain; + } + } + } +} diff --git a/apps/website/src/pages/Home/index.tsx b/apps/website/src/pages/Home/index.tsx new file mode 100644 index 000000000..0f2f879c4 --- /dev/null +++ b/apps/website/src/pages/Home/index.tsx @@ -0,0 +1,313 @@ +import { ComponentChildren } from 'preact'; +import Card from '../../components/Card.js'; +import Section from '../../components/Section.js'; +import DownloadButton from '../../components/DownloadButton.js'; +import "./index.css"; +import { useColorScheme, usePageTitle } from '../../hooks.js'; +import Button, { Link } from '../../components/Button.js'; +import gitHubIcon from "../../assets/boxicons/bx-github.svg?raw"; +import dockerIcon from "../../assets/boxicons/bx-docker.svg?raw"; +import noteStructureIcon from "../../assets/boxicons/bx-folder.svg?raw"; +import attributesIcon from "../../assets/boxicons/bx-tag.svg?raw"; +import hoistingIcon from "../../assets/boxicons/bx-chevrons-up.svg?raw"; +import revisionsIcon from "../../assets/boxicons/bx-history.svg?raw"; +import syncIcon from "../../assets/boxicons/bx-refresh-cw.svg?raw"; +import protectedNotesIcon from "../../assets/boxicons/bx-shield.svg?raw"; +import jumpToIcon from "../../assets/boxicons/bx-send-alt.svg?raw"; +import searchIcon from "../../assets/boxicons/bx-search.svg?raw"; +import webClipperIcon from "../../assets/boxicons/bx-paperclip.svg?raw"; +import importExportIcon from "../../assets/boxicons/bx-swap-horizontal.svg?raw"; +import shareIcon from "../../assets/boxicons/bx-globe.svg?raw"; +import codeIcon from "../../assets/boxicons/bx-code.svg?raw"; +import restApiIcon from "../../assets/boxicons/bx-extension.svg?raw"; +import textNoteIcon from "../../assets/boxicons/bx-note.svg?raw"; +import fileIcon from "../../assets/boxicons/bx-file.svg?raw"; +import canvasIcon from "../../assets/boxicons/bx-pen.svg?raw"; +import mermaidIcon from "../../assets/boxicons/bx-vector-square.svg?raw"; +import mindmapIcon from "../../assets/boxicons/bx-network-chart.svg?raw"; +import calendarIcon from "../../assets/boxicons/bx-calendar.svg?raw"; +import tableIcon from "../../assets/boxicons/bx-table.svg?raw"; +import boardIcon from "../../assets/boxicons/bx-columns-3.svg?raw"; +import geomapIcon from "../../assets/boxicons/bx-map.svg?raw"; +import { getPlatform } from '../../download-helper.js'; +import { useEffect, useState } from 'preact/hooks'; +import { t } from '../../i18n.js'; +import { Trans } from 'react-i18next'; + +export function Home() { + usePageTitle(""); + + return ( + <> + + + + + + + + + + ); +} + +function HeroSection() { + const platform = getPlatform(); + const colorScheme = useColorScheme(); + const [ screenshotUrl, setScreenshotUrl ] = useState(); + + useEffect(() => { + switch (platform) { + case "macos": + setScreenshotUrl(`/screenshot_desktop_mac_${colorScheme}.webp`); + break; + case "linux": + setScreenshotUrl(`/screenshot_desktop_linux_${colorScheme}.webp`); + break; + case "windows": + default: + setScreenshotUrl(`/screenshot_desktop_win_${colorScheme}.webp`); + break; + } + }, [ colorScheme ]); + + return ( +
    +
    +

    {t("hero_section.title")}

    +

    {t("hero_section.subtitle")}

    + +
    + +
    +
    + + + +
    + {screenshotUrl && {t("hero_section.screenshot_alt")}} +
    +
    + ) +} + +function OrganizationBenefitsSection() { + return ( + <> +
    +
    + {t("organization_benefits.note_structure_description")} + {t("organization_benefits.attributes_description")} + {t("organization_benefits.hoisting_description")} +
    +
    + + ); +} + +function ProductivityBenefitsSection() { + return ( + <> +
    +
    + {t("productivity_benefits.revisions_content")} + {t("productivity_benefits.sync_content")} + {t("productivity_benefits.protected_notes_content")} + {t("productivity_benefits.jump_to_content")} + {t("productivity_benefits.search_content")} + {t("productivity_benefits.web_clipper_content")} +
    +
    + + ); +} + +function NoteTypesSection() { + return ( +
    + +

    + , + , + , + , + + ]} + /> +

    +
    + ); +} + +function ExtensibilityBenefitsSection() { + return ( + <> +
    +
    + {t("extensibility_benefits.import_export_description")} + {t("extensibility_benefits.share_description")} + {t("extensibility_benefits.scripting_description")} + {t("extensibility_benefits.api_description")} +
    +
    + + ); +} + +function CollectionsSection() { + return ( +
    + +
    + ); +} + +function ListWithScreenshot({ items, horizontal, cardExtra }: { + items: { title: string, imageUrl: string, description: string, moreInfo: string, iconSvg?: string }[]; + horizontal?: boolean; + cardExtra?: ComponentChildren; +}) { + const [ selectedItem, setSelectedItem ] = useState(items[0]); + + return ( +
    +
      + {items.map(item => ( +
    • + setSelectedItem(item)} + onClick={() => setSelectedItem(item)} + moreInfoUrl={item.moreInfo} + iconSvg={item.iconSvg} + > + {item.description} + +
    • + ))} +
    + +
    + {selectedItem && ( + <> + {t("components.list_with_screenshot_alt")} + + )} +
    +
    + ) +} + +function FaqSection() { + return ( +
    +
    + {t("faq.mobile_answer")} + {t("faq.database_answer")} + {t("faq.server_answer")} + {t("faq.scaling_answer")} + {t("faq.network_share_answer")} + {t("faq.security_answer")} +
    +
    + ); +} + +function FaqItem({ question, children }: { question: string; children: ComponentChildren }) { + return ( + + {children} + + ) +} + +function FinalCta() { + return ( +
    +

    {t("final_cta.description")}

    + +
    +
    +
    + ) +} diff --git a/apps/website/src/pages/SupportUs/SupportUs.css b/apps/website/src/pages/SupportUs/SupportUs.css new file mode 100644 index 000000000..2159d9743 --- /dev/null +++ b/apps/website/src/pages/SupportUs/SupportUs.css @@ -0,0 +1,21 @@ +section.donate { + background: var(--background-color); + + ul.donate-buttons { + list-style-type: none; + display: flex; + gap: 1em; + padding: 0; + flex-direction: column; + + @media (min-width: 720px) { + gap: 0 1em; + flex-direction: row; + } + } + + h3 { + font-size: 1.5em; + color: var(--brand-1); + } +} diff --git a/apps/website/src/pages/SupportUs/SupportUs.tsx b/apps/website/src/pages/SupportUs/SupportUs.tsx new file mode 100644 index 000000000..ec3bba08f --- /dev/null +++ b/apps/website/src/pages/SupportUs/SupportUs.tsx @@ -0,0 +1,93 @@ +import Section from "../../components/Section.js"; +import "./SupportUs.css"; +import githubIcon from "../../assets/boxicons/bx-github.svg?raw"; +import paypalIcon from "../../assets/boxicons/bx-paypal.svg?raw"; +import buyMeACoffeeIcon from "../../assets/boxicons/bx-buy-me-a-coffee.svg?raw"; +import Button, { Link } from "../../components/Button.js"; +import Card from "../../components/Card.js"; +import { usePageTitle } from "../../hooks.js"; +import { t } from "../../i18n.js"; +import { Trans } from "react-i18next"; + +export default function Donate() { + usePageTitle(t("support_us.title")); + + return ( + <> +
    +
    + +

    + }} + /> +

    + +

    + }} + /> +

    + + +
    + + +
      +
    • + }} /> +
    • +
    • + , + Matrix: + }} + /> +
    • +
    • + }} + /> +
    • +
    • +
    • +
    +
    +
    +
    + + ) +} diff --git a/apps/website/src/pages/_404.css b/apps/website/src/pages/_404.css new file mode 100644 index 000000000..8eabd31e6 --- /dev/null +++ b/apps/website/src/pages/_404.css @@ -0,0 +1,9 @@ +section.section-404 { + text-align: center; + background: var(--background-color); + + h2 { + color: var(--brand-3); + margin: 1em; + } +} \ No newline at end of file diff --git a/apps/website/src/pages/_404.tsx b/apps/website/src/pages/_404.tsx new file mode 100644 index 000000000..036e5a843 --- /dev/null +++ b/apps/website/src/pages/_404.tsx @@ -0,0 +1,14 @@ +import Section from "../components/Section.js"; +import { usePageTitle } from "../hooks.js"; +import { t } from "../i18n.js"; +import "./_404.css"; + +export function NotFound() { + usePageTitle(t("404.title")); + + return ( +
    + {t("404.description")} +
    + ); +} diff --git a/apps/website/src/routes/+layout.svelte b/apps/website/src/routes/+layout.svelte deleted file mode 100644 index 98e32e276..000000000 --- a/apps/website/src/routes/+layout.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - -
    - -
    -{@render children()} -
    - - diff --git a/apps/website/src/routes/+page.svelte b/apps/website/src/routes/+page.svelte deleted file mode 100644 index a438901b5..000000000 --- a/apps/website/src/routes/+page.svelte +++ /dev/null @@ -1,176 +0,0 @@ - - - - Trilium Notes - - - -
    - -
    -
    -
    -
    -
    - -
    -
    - - -
    -

    Organize Your Thoughts.
    Build Your Knowledge.

    -

    - Trilium Notes helps you build and organize complex personal knowledge bases effortlessly. - Its unique tree structure, rich editing tools, and powerful search features make managing your information intuitive and flexible. - - -

    - -
    - - -
    - Screenshot of the app on desktop Windows -
    -
    -
    -
    - -
    -

    Beyond Text: Smarter Note Types

    - -
    - - - - - - - -
    - -

    Technical Features

    - -
    - - - - - - - -
    -
    - -
    -

    Feature Highlights

    - -
    - -
    -

    Organization & Navigation

    -
      -
    • Arbitrarily deep note tree with cloning support.
    • -
    • Fast navigation, full-text search, and note hoisting.
    • -
    • Note attributes for organization, querying, and scripting.
    • -
    • Seamless note versioning.
    • -
    -
    - - -
    -

    Editing & Content

    -
      -
    • Rich WYSIWYG editor with tables, images, math, and markdown autoformat.
    • -
    • Source code editing with syntax highlighting.
    • -
    • Evernote and Markdown import/export.
    • -
    • Web Clipper for easy saving of web content.
    • -
    -
    - - -
    -

    Security & Sync

    -
      -
    • Direct OpenID and TOTP integration for secure login.
    • -
    • Strong note encryption with per-note granularity.
    • -
    • Sharing notes publicly on the internet.
    • -
    -
    - - -
    -

    Advanced & Customization

    -
      -
    • Relation maps and link maps to visualize notes.
    • -
    • Touch-optimized mobile frontend and dark/user themes.
    • -
    • Customizable UI with sidebar buttons and user widgets.
    • -
    • Scales efficiently beyond 100,000 notes.
    • -
    -
    -
    -
    - - -
    -
    -

    Ready to get started with Trilium Notes?

    -

    Build your personal knowledge base with powerful features and full privacy.

    - - -
    -
    \ No newline at end of file diff --git a/apps/website/src/routes/demo/+page.svelte b/apps/website/src/routes/demo/+page.svelte deleted file mode 100644 index a815390c5..000000000 --- a/apps/website/src/routes/demo/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -paraglide diff --git a/apps/website/src/routes/demo/paraglide/+page.svelte b/apps/website/src/routes/demo/paraglide/+page.svelte deleted file mode 100644 index 797149f8a..000000000 --- a/apps/website/src/routes/demo/paraglide/+page.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - -

    {m.hello_world({ name: 'SvelteKit User' })}

    -
    - -

    -If you use VSCode, install the Sherlock i18n extension for a better i18n experience. -

    diff --git a/apps/website/src/routes/download-now.svelte b/apps/website/src/routes/download-now.svelte deleted file mode 100644 index 20abe9c55..000000000 --- a/apps/website/src/routes/download-now.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - -{#if url} - - Download now - - ({platform} {architecture}) - - -{/if} \ No newline at end of file diff --git a/apps/website/src/routes/download/+page.svelte b/apps/website/src/routes/download/+page.svelte deleted file mode 100644 index b09c684f9..000000000 --- a/apps/website/src/routes/download/+page.svelte +++ /dev/null @@ -1,65 +0,0 @@ - - - - Trilium Notes: Download - - - -
    -
    -

    Download the desktop application

    - - -
    - Architecture: -
    - {#each architectures as arch} - - {/each} -
    -
    - -
    - {#each Object.entries(downloadMatrix.desktop) as [platformId, platform]} - {@const textColor = (platformId === "windows" ? "text-blue-600" : platformId === "linux" ? "text-violet-600" : "text-gray-800 dark:text-gray-100")} - {@const bgColor = (platformId === "windows" ? "bg-blue-600" : platformId === "linux" ? "bg-violet-600" : "bg-gray-800")} - {@const hoverColor = (platformId === "windows" ? "hover:bg-blue-700" : platformId === "linux" ? "hover:bg-violet-700" : "hover:bg-gray-900")} - - {/each} -
    -
    - -
    -

    Set up a server for access on multiple devices

    - -
    - {#each Object.entries(downloadMatrix.server) as [platformId, platform]} - {@const textColor = (platformId === "linux" ? "text-violet-600" : "text-gray-800 dark:text-gray-100")} - {@const bgColor = (platformId === "linux" ? "bg-violet-600" : "bg-gray-800")} - {@const hoverColor = (platformId === "linux" ? "hover:bg-violet-700" : "hover:bg-gray-900")} - - {/each} -
    -
    - - - -
    diff --git a/apps/website/src/routes/download/download-card.svelte b/apps/website/src/routes/download/download-card.svelte deleted file mode 100644 index 9fd89c20f..000000000 --- a/apps/website/src/routes/download/download-card.svelte +++ /dev/null @@ -1,31 +0,0 @@ - - -
    -

    {typeof platform.title === "object" ? platform.title[architecture] : platform.title}

    -

    {typeof platform.title === "object" ? platform.description[architecture] : platform.description}

    -
    - {#if recommended} - - {recommended[1].name} - - {/if} -
    - {#each Object.entries(platform.downloads).filter((e) => !e[1].recommended) as [format, download]} - - {download.name} - - {/each} -
    -
    -
    \ No newline at end of file diff --git a/apps/website/src/routes/feature-block.svelte b/apps/website/src/routes/feature-block.svelte deleted file mode 100644 index 982eea437..000000000 --- a/apps/website/src/routes/feature-block.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - -
    - {imgAlt} -
    -

    {title}

    -

    {text}

    -
    -
    \ No newline at end of file diff --git a/apps/website/src/routes/header.svelte b/apps/website/src/routes/header.svelte deleted file mode 100644 index af1a7f057..000000000 --- a/apps/website/src/routes/header.svelte +++ /dev/null @@ -1,23 +0,0 @@ - -
    - -
    \ No newline at end of file diff --git a/apps/website/src/style.css b/apps/website/src/style.css new file mode 100644 index 000000000..ca12a73d0 --- /dev/null +++ b/apps/website/src/style.css @@ -0,0 +1,188 @@ +@font-face { + font-family: "Inter"; + src: url(./assets/fonts/Inter/Inter-VariableFont_opsz,wght.ttf); +} + +:root { + --background-color: #fff; + --foreground-color: black; + --muted-color: #606060; + --card-background-color: white; + --card-box-shadow: 0 0 3px rgba(0, 0, 0, 0.25); + --header-background-color: rgba(255, 255, 255, 0.75); + --brand-1: #e47b19; + --brand-2: #4fa52b; + --brand-3: #e33f3b; + --brand-foreground-color: white; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-color: #fff; + --background-color: #0a0e14; + --muted-color: #c5c5c5; + --header-background-color: rgba(0, 0, 0, 0.75); + --card-background-color: #ffffff12; + --card-box-shadow: 0 0 12px rgba(0, 0, 0, 0.15); + } +} + +html, +body { + margin: 0; + line-height: 1.5; + font-family: Inter, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial; + min-height: 100vh; +} + +main { + min-height: calc(100vh - 80px - 90px); + display: flex; + flex-direction: column; +} + +body { + background: var(--background-color); + color: var(--foreground-color); +} + +a { + color: var(--brand-3); + text-decoration: none; + + &:not(.button):hover { + text-decoration: underline; + } +} + +.content-wrapper { + max-width: 1200px; + width: 90%; + margin: auto; +} + +section { + padding: 1em 0; + justify-content: center; + align-items: stretch; + + &.fill { + flex-grow: 1; + display: flex; + } + + h2 { + text-align: center; + font-weight: 300; + margin-top: 0; + margin-bottom: 1em; + } +} + +img { + width: 100%; + height: auto; +} + +.card { + border: 0; + box-shadow: var(--card-box-shadow); + background-color: var(--card-background-color); + border-radius: 16px; + overflow: hidden; + display: flex; + flex-direction: column; + + h3 { + font-size: 1.1rem; + font-weight: 300; + margin: 0; + color: var(--brand-1); + margin-bottom: 0.5em; + + &> span { + vertical-align: middle; + } + } + + &> .image { + height: 200px; + object-fit: cover; + } + + .card-content { + margin: 0; + padding: 1em; + color: var(--muted-color); + display: flex; + flex-direction: column; + flex-grow: 1; + + .more-info-container { + margin-top: 0.5em; + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: flex-end; + + .more-info { + font-size: 0.9em; + } + } + } +} + +.bx { + display: inline-block; + width: 24px; + height: 24px; + vertical-align: middle; + + svg { + fill: currentColor; + } +} + +@media (max-width: 719px) { + .grid-4-cols > *, + .grid-3-cols > *, + .grid-2-cols > * { + margin-bottom: 1em; + } + + .desktop-only { + display: none !important; + } +} + +@media (min-width: 720px) { + section { + padding: 3em 0; + + h2 { + margin-bottom: 2em; + } + } + + .grid-4-cols { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: 1em; + } + + .grid-3-cols { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + gap: 1em; + } + + .grid-2-cols { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1em; + } + + .mobile-only { + display: none !important; + } +} \ No newline at end of file diff --git a/apps/website/src/types.d.ts b/apps/website/src/types.d.ts new file mode 100644 index 000000000..c779c89c7 --- /dev/null +++ b/apps/website/src/types.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/website/static/favicon.png b/apps/website/static/favicon.png deleted file mode 120000 index 17ded225a..000000000 --- a/apps/website/static/favicon.png +++ /dev/null @@ -1 +0,0 @@ -../../../apps/client/src/assets/icon.png \ No newline at end of file diff --git a/apps/website/static/note-types/canvas.png b/apps/website/static/note-types/canvas.png deleted file mode 100644 index ad5c74b36..000000000 Binary files a/apps/website/static/note-types/canvas.png and /dev/null differ diff --git a/apps/website/static/note-types/geo-map.png b/apps/website/static/note-types/geo-map.png deleted file mode 100644 index cd891b646..000000000 Binary files a/apps/website/static/note-types/geo-map.png and /dev/null differ diff --git a/apps/website/static/note-types/mermaid.png b/apps/website/static/note-types/mermaid.png deleted file mode 100644 index 1e8bd7386..000000000 Binary files a/apps/website/static/note-types/mermaid.png and /dev/null differ diff --git a/apps/website/static/note-types/mind-map.png b/apps/website/static/note-types/mind-map.png deleted file mode 100644 index a970d485f..000000000 Binary files a/apps/website/static/note-types/mind-map.png and /dev/null differ diff --git a/apps/website/static/screenshots/desktop-win.png b/apps/website/static/screenshots/desktop-win.png deleted file mode 100644 index ab6ee05ec..000000000 Binary files a/apps/website/static/screenshots/desktop-win.png and /dev/null differ diff --git a/apps/website/static/screenshots/macos/dark.png b/apps/website/static/screenshots/macos/dark.png deleted file mode 100644 index 2eae66f18..000000000 Binary files a/apps/website/static/screenshots/macos/dark.png and /dev/null differ diff --git a/apps/website/static/screenshots/macos/light.png b/apps/website/static/screenshots/macos/light.png deleted file mode 100644 index a2b64b7fb..000000000 Binary files a/apps/website/static/screenshots/macos/light.png and /dev/null differ diff --git a/apps/website/static/technical-features/grafana-metrics.png b/apps/website/static/technical-features/grafana-metrics.png deleted file mode 120000 index 1dd11db67..000000000 --- a/apps/website/static/technical-features/grafana-metrics.png +++ /dev/null @@ -1 +0,0 @@ -../../../../docs/User Guide/User Guide/Advanced Usage/1_Metrics_image.png \ No newline at end of file diff --git a/apps/website/svelte.config.js b/apps/website/svelte.config.js deleted file mode 100644 index 0cd57a52d..000000000 --- a/apps/website/svelte.config.js +++ /dev/null @@ -1,11 +0,0 @@ -import { mdsvex } from 'mdsvex'; -import adapter from '@sveltejs/adapter-auto'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -const config = { - preprocess: [vitePreprocess(), mdsvex()], - kit: { adapter: adapter() }, - extensions: ['.svelte', '.svx'] -}; - -export default config; diff --git a/apps/website/tsconfig.json b/apps/website/tsconfig.json index 5adb685c0..48581e18c 100644 --- a/apps/website/tsconfig.json +++ b/apps/website/tsconfig.json @@ -1,20 +1,19 @@ { - "extends": "./.svelte-kit/tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, + "composite": true, + "target": "ES2020", + "module": "ESNext", "moduleResolution": "bundler", - "composite": true - } - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files - // - // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes - // from the referenced tsconfig.json - TypeScript does not merge them in + /* Preact Config */ + "jsx": "react-jsx", + "jsxImportSource": "preact", + "skipLibCheck": true, + "paths": { + "react": ["../../node_modules/preact/compat/"], + "react-dom": ["../../node_modules/preact/compat/"] + } + }, + "include": ["node_modules/vite/client.d.ts", "**/*"], + "exclude": ["dist"] } diff --git a/apps/website/types-assets.d.ts b/apps/website/types-assets.d.ts new file mode 100644 index 000000000..32e744839 --- /dev/null +++ b/apps/website/types-assets.d.ts @@ -0,0 +1,9 @@ +declare module "*?raw" { + var content: string; + export default content; +} + +declare module "*.svg" { + var path: string; + export default path; +} diff --git a/apps/website/vite.config.ts b/apps/website/vite.config.ts index 135fc634d..078ef4529 100644 --- a/apps/website/vite.config.ts +++ b/apps/website/vite.config.ts @@ -1,24 +1,17 @@ -import tailwindcss from '@tailwindcss/vite'; -import { paraglideVitePlugin } from '@inlang/paraglide-js'; -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig, type Plugin } from 'vite'; +import { defineConfig } from 'vite'; +import preact from '@preact/preset-vite'; -export default () => { - // See https://github.com/nrwl/nx/issues/28978. - const cwd = process.cwd(); - process.chdir(__dirname); // Temporarily change the working directory - - const config = defineConfig({ - plugins: [ - tailwindcss(), - sveltekit(), - paraglideVitePlugin({ - project: './project.inlang', - outdir: './src/lib/paraglide' - }) - ] as Plugin[] - }); - - process.chdir(cwd); // Restore the original working directory - return config; -}; +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + preact({ + prerender: { + enabled: true, + renderTarget: '#app', + additionalPrerenderRoutes: ['/404'], + previewMiddlewareEnabled: true, + previewMiddlewareFallback: '/404', + }, + }), + ], +}); diff --git a/docs/.pages b/docs/.pages new file mode 100644 index 000000000..7ebf7a9e2 --- /dev/null +++ b/docs/.pages @@ -0,0 +1,7 @@ +# Navigation order for top-level sections +nav: + - index.md + - User Guide + - Developer Guide + - Script API + - Release Notes \ No newline at end of file diff --git a/docs/Developer Guide/!!!meta.json b/docs/Developer Guide/!!!meta.json index 2117cdac6..c039b67ef 100644 --- a/docs/Developer Guide/!!!meta.json +++ b/docs/Developer Guide/!!!meta.json @@ -1,6 +1,6 @@ { "formatVersion": 2, - "appVersion": "0.98.0", + "appVersion": "0.99.1", "files": [ { "isClone": false, diff --git a/docs/README-ZH_CN.md b/docs/README-ZH_CN.md index a23a24acd..5ce69c1a8 100644 --- a/docs/README-ZH_CN.md +++ b/docs/README-ZH_CN.md @@ -1,100 +1,155 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + # Trilium Notes -![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) ![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran) -![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/notes) -![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/notes/total) -[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) [![Translation status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads +(ę‰€ęœ‰čµ„äŗ§ļ¼Œę‰€ęœ‰åŽ†å²ē‰ˆęœ¬)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![ēæ»čÆ‘ēŠ¶ę€](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) -[英ꖇ](../README.md) | [简体中文](./README-ZH_CN.md) | [正体中文](./README-ZH_TW.md) | [俄文](./README.ru.md) | [ę—„ę–‡](./README.ja.md) | [ę„å¤§åˆ©ę–‡](./README.it.md) | [č„æē­ē‰™ę–‡](./README.es.md) +[英ꖇ](./README.md) | [简体中文](./docs/README-ZH_CN.md) | +[正体中文](./docs/README-ZH_TW.md) | [俄文](./docs/README-ru.md) | +[ę—„ę–‡](./docs/README-ja.md) | [ę„å¤§åˆ©ę–‡](./docs/README-it.md) | +[č„æē­ē‰™ę–‡](./docs/README-es.md) Trilium Notes ę˜Æäø€ę¬¾å…č“¹äø”å¼€ęŗć€č·Øå¹³å°ēš„é˜¶å±‚å¼ē¬”č®°åŗ”ē”ØēØ‹åŗļ¼Œäø“ę³ØäŗŽå»ŗē«‹å¤§åž‹äøŖäŗŗēŸ„čÆ†åŗ“ć€‚ -ęƒ³åæ«é€Ÿäŗ†č§£ļ¼ŒčÆ·ęŸ„ēœ‹[å±å¹•ęˆŖå›¾](https://triliumnext.github.io/Docs/Wiki/screenshot-tour): +ęƒ³åæ«é€Ÿäŗ†č§£ļ¼ŒčÆ·ęŸ„ēœ‹[screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour): -Trilium Screenshot +Trilium Screenshot -## šŸŽ 功能 - -* ē¬”č®°åÆē»„ē»‡ęˆä»»ę„ę·±åŗ¦ēš„ę ‘å½¢ē»“ęž„ć€‚å•äø€ē¬”č®°åÆę”¾åœØę ‘äø­ēš„å¤šäøŖä½ē½®ļ¼ˆå‚č§[ē¬”č®°å¤åˆ¶/克隆](https://triliumnext.github.io/Docs/Wiki/cloning-notes))。 -* äø°åÆŒēš„ę‰€č§å³ę‰€å¾—ļ¼ˆWYSIWYGļ¼‰ē¬”č®°ē¼–č¾‘å™Øļ¼Œę”ÆęŒč”Øę ¼ć€å›¾ē‰‡äøŽ[ę•°å­¦å…¬å¼](https://triliumnext.github.io/Docs/Wiki/text-notes)ļ¼Œå¹¶å…·å¤‡ Markdown ēš„[č‡ŖåŠØę ¼å¼](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)怂 -* ę”ÆęŒē¼–č¾‘[ēØ‹åŗä»£ē ē¬”č®°](https://triliumnext.github.io/Docs/Wiki/code-notes)ļ¼ŒåŒ…å«čÆ­ę³•é«˜äŗ®ć€‚ -* åæ«é€Ÿć€č½»ę¾åœ°åœØē¬”č®°é—“[导航](https://triliumnext.github.io/Docs/Wiki/note-navigation)ć€å…Øę–‡ęœē“¢ļ¼Œä»„åŠ[ē¬”č®°čšē„¦ļ¼ˆhoisting)](https://triliumnext.github.io/Docs/Wiki/note-hoisting)怂 -* ę— ē¼ēš„[ē¬”č®°ē‰ˆęœ¬ē®”ē†](https://triliumnext.github.io/Docs/Wiki/note-revisions)怂 -* 笔记[å±žę€§](https://triliumnext.github.io/Docs/Wiki/attributes)åÆē”ØäŗŽē¬”č®°ēš„ē»„ē»‡ć€ęŸ„čÆ¢äøŽé«˜ēŗ§[č„šęœ¬](https://triliumnext.github.io/Docs/Wiki/scripts)怂 -* ęŽ„å£ęä¾›č‹±ę–‡ć€å¾·ę–‡ć€č„æē­ē‰™ę–‡ć€ę³•ę–‡ć€ē½—é©¬å°¼äŗšę–‡äøŽäø­ę–‡ļ¼ˆē®€ä½“äøŽę­£ä½“ļ¼‰ć€‚ -* ē›“ęŽ„ę•“åˆ [OpenID äøŽ TOTP](./User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) ä»„å®žēŽ°ę›“å®‰å…Øēš„ē™»å½•ć€‚ -* äøŽč‡Ŗęž¶ēš„åŒę­„ęœåŠ”å™Øčæ›č”Œ[同歄](https://triliumnext.github.io/Docs/Wiki/synchronization) - * å¦ęœ‰[ē¬¬äø‰ę–¹åŒę­„ęœåŠ”å™Øę‰˜ē®”ęœåŠ”](https://trilium.cc/paid-hosting)怂 -* 将笔记[åˆ†äŗ«](https://triliumnext.github.io/Docs/Wiki/sharing)ļ¼ˆå…¬å¼€å‘åøƒļ¼‰åˆ°äŗ’č”ē½‘ć€‚ -* ä»„ęÆåˆ™ē¬”č®°äøŗē²’åŗ¦ēš„å¼ŗå¤§[ē¬”č®°åŠ åÆ†](https://triliumnext.github.io/Docs/Wiki/protected-notes)怂 -* ę‰‹ē»˜/ē¤ŗę„å›¾ļ¼šåŸŗäŗŽ [Excalidraw](https://excalidraw.com/)ļ¼ˆē¬”č®°ē±»åž‹äøŗć€Œcanvasć€ļ¼‰ć€‚ -* ē”ØäŗŽåÆč§†åŒ–ē¬”č®°åŠå…¶å…³ē³»ēš„[关系图](https://triliumnext.github.io/Docs/Wiki/relation-map)äøŽ[é“¾ęŽ„å›¾](https://triliumnext.github.io/Docs/Wiki/link-map)怂 -* ę€ē»“åÆ¼å›¾ļ¼šåŸŗäŗŽ [Mind Elixir](https://docs.mind-elixir.com/)怂 -* å…·ęœ‰å®šä½é’‰äøŽ GPX č½Øčæ¹ēš„[地图](./User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md)怂 -* [č„šęœ¬](https://triliumnext.github.io/Docs/Wiki/scripts)ā€”ā€”å‚č§[é«˜ēŗ§å±•ē¤ŗ](https://triliumnext.github.io/Docs/Wiki/advanced-showcases)怂 -* ē”ØäŗŽč‡ŖåŠØåŒ–ēš„ [REST API](https://triliumnext.github.io/Docs/Wiki/etapi)怂 -* åœØåÆē”Øę€§äøŽę•ˆčƒ½äøŠå‡åÆč‰Æå„½ę‰©å±•ļ¼Œę”ÆęŒč¶…čæ‡ 100,000 笔笔记。 -* äøŗę‰‹ęœŗäøŽå¹³ęæä¼˜åŒ–ēš„[ē§»åŠØå‰ē«Æ](https://triliumnext.github.io/Docs/Wiki/mobile-frontend)怂 -* 内置[ę·±č‰²äø»é¢˜](https://triliumnext.github.io/Docs/Wiki/themes)ļ¼Œå¹¶ę”ÆęŒē”Øęˆ·äø»é¢˜ć€‚ -* [Evernote 导兄](https://triliumnext.github.io/Docs/Wiki/evernote-import)äøŽ [Markdown åÆ¼å…„äøŽåÆ¼å‡ŗ](https://triliumnext.github.io/Docs/Wiki/markdown)怂 -* ē”ØäŗŽåæ«é€Ÿäæå­˜ē½‘é”µå†…å®¹ēš„ [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper)怂 -* åÆč‡Ŗå®šä¹‰ēš„ UIļ¼ˆä¾§č¾¹ę ęŒ‰é’®ć€ē”Øęˆ·č‡Ŗå®šä¹‰å°ē»„ä»¶ē­‰ļ¼‰ć€‚ -* [åŗ¦é‡ęŒ‡ę ‡ļ¼ˆMetrics)](./User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md)ļ¼Œå¹¶é™„ęœ‰ [Grafana ä»Ŗč”Øęæ](./User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json)怂 - -✨ ęƒ³č¦ę›“å¤š TriliumNext ēš„äø»é¢˜ć€č„šęœ¬ć€å¤–ęŒ‚äøŽčµ„ęŗļ¼Œäŗ¦åÆå‚č€ƒä»„äø‹ē¬¬äø‰ę–¹čµ„ęŗļ¼ē¤¾ē¾¤ļ¼š - -- [awesome-trilium](https://github.com/Nriver/awesome-trilium)ļ¼ˆē¬¬äø‰ę–¹äø»é¢˜ć€č„šęœ¬ć€å¤–ęŒ‚äøŽę›“å¤šļ¼‰ć€‚ -- [TriliumRocks!](https://trilium.rocks/)ļ¼ˆę•™å­¦ć€ęŒ‡å—ē­‰ē­‰ļ¼‰ć€‚ - -## āš ļø äøŗä»€ä¹ˆę˜Æ TriliumNext? - -[åŽŸęœ¬ēš„ Trilium é”¹ē›®ē›®å‰å¤„äŗŽē»“ęŠ¤ęØ”å¼](https://github.com/zadam/trilium/issues/4620)怂 - -### 从 Trilium 迁移? - -ä»Žę—¢ęœ‰ēš„ zadam/Trilium ä¾‹é”¹čæē§»åˆ° TriliumNext/Notes äøéœ€č¦ē‰¹åˆ«ēš„čæē§»ę­„éŖ¤ć€‚åŖč¦[ē…§äø€čˆ¬ę–¹å¼å®‰č£… TriliumNext/Notes](#-安装)ļ¼Œå®ƒå°±ä¼šē›“ęŽ„ä½æē”Øä½ ēŽ°ęœ‰ēš„ę•°ę®åŗ“ć€‚ - -ē‰ˆęœ¬č‡³å¤šč‡³ [v0.90.4](https://github.com/TriliumNext/Notes/releases/tag/v0.90.4) äøŽ zadam/trilium ęœ€ę–°ē‰ˆęœ¬ [v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7) å…¼å®¹ć€‚ä¹‹åŽēš„ TriliumNext ē‰ˆęœ¬å·²ęå‡åŒę­„ē‰ˆęœ¬å·ļ¼ˆäøŽäøŠčæ°äøå†å…¼å®¹ļ¼‰ć€‚ +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. ## šŸ“– ꖇ件 -ęˆ‘ä»¬ē›®å‰ę­£å°†ę–‡ä»¶ę¬ē§»č‡³åŗ”ē”ØēØ‹åŗå†…ļ¼ˆåœØ Trilium äø­ęŒ‰ `F1`ļ¼‰ć€‚åœØå®Œęˆå‰ļ¼Œę–‡ä»¶äø­åÆčƒ½ä¼šęœ‰ē¼ŗę¼ć€‚å¦‚ęžœä½ ęƒ³åœØ GitHub äøŠęŸ„ēœ‹ļ¼Œä¹ŸåÆä»„ē›“ęŽ„ęŸ„ēœ‹[ä½æē”ØčÆ“ę˜Ž](./User%20Guide/User%20Guide/)怂 +**čÆ·č®æé—®ęˆ‘ä»¬å®Œę•“ēš„ę–‡ę”£ļ¼š[docs.triliumnotes.org](https://docs.triliumnotes.org/)** -ä»„äø‹ęä¾›äø€äŗ›åæ«é€Ÿčæžē»“ļ¼Œę–¹ä¾æä½ åÆ¼č§ˆę–‡ä»¶ļ¼š -- [ęœåŠ”å™Øå®‰č£…](./User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) - - [Docker 安装](./User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) -- [å‡ēŗ§ TriliumNext](./User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) -- [åŸŗęœ¬ę¦‚åæµäøŽåŠŸčƒ½ļ¼ē¬”č®°](./User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) -- [äøŖäŗŗēŸ„čÆ†åŗ“ēš„ęØ”å¼](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) +ęˆ‘ä»¬ēš„ę–‡ę”£ęœ‰å¤šē§ę ¼å¼åÆä¾›ä½æē”Øļ¼š +- **åœØēŗæę–‡ę”£**ļ¼ščÆ·č®æé—®ęˆ‘ä»¬å®Œę•“ēš„ę–‡ę”£ļ¼š[docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository -åœØęˆ‘ä»¬å®Œęˆé‡ę–°ę•“ē†ę–‡ä»¶ęž¶ęž„ä¹‹å‰ļ¼Œä½ ä¹ŸåÆä»„[ęŸ„ēœ‹ę—§ē‰ˆę–‡ä»¶](https://triliumnext.github.io/Docs)怂 +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 功能 + +* ē¬”č®°åÆē»„ē»‡ęˆä»»ę„ę·±åŗ¦ēš„ę ‘å½¢ē»“ęž„ć€‚å•äø€ē¬”č®°åÆę”¾åœØę ‘äø­ēš„å¤šäøŖä½ē½®ļ¼ˆå‚č§ + [ē¬”č®°å¤åˆ¶/克隆](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* äø°åÆŒēš„ę‰€č§å³ę‰€å¾—ļ¼ˆWYSIWYGļ¼‰ē¬”č®°ē¼–č¾‘å™Øļ¼Œę”ÆęŒč”Øę ¼ć€å›¾ē‰‡äøŽ[ę•°å­¦å…¬å¼](https://triliumnext.github.io/Docs/Wiki/text-notes)ļ¼Œå¹¶å…·å¤‡ + Markdown + ēš„[č‡ŖåŠØę ¼å¼](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* ę”ÆęŒē¼–č¾‘[ēØ‹åŗä»£ē ē¬”č®°](https://triliumnext.github.io/Docs/Wiki/code-notes), ļ¼ŒåŒ…å«čÆ­ę³•é«˜äŗ® +* åæ«é€Ÿć€č½»ę¾åœ°åœØē¬”č®°é—“[导航](https://triliumnext.github.io/Docs/Wiki/note-navigation)ć€å…Øę–‡ęœē“¢ļ¼Œä»„åŠ[ē¬”č®°čšē„¦ļ¼ˆhoisting)](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* ę— ē¼ēš„[ē¬”č®°ē‰ˆęœ¬ē®”ē†](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* 笔记[å±žę€§](https://triliumnext.github.io/Docs/Wiki/attributes)åÆē”ØäŗŽē¬”č®°ēš„ē»„ē»‡ć€ęŸ„čÆ¢äøŽé«˜ēŗ§[č„šęœ¬](https://triliumnext.github.io/Docs/Wiki/scripts) +* ęŽ„å£ęä¾›č‹±ę–‡ć€å¾·ę–‡ć€č„æē­ē‰™ę–‡ć€ę³•ę–‡ć€ē½—é©¬å°¼äŗšę–‡äøŽäø­ę–‡ļ¼ˆē®€ä½“äøŽę­£ä½“ļ¼‰ +* ē›“ęŽ„ę•“åˆ[OpenID äøŽ + TOTP](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + ä»„å®žēŽ°ę›“å®‰å…Øēš„ē™»å½• +* äøŽč‡Ŗęž¶ēš„åŒę­„ęœåŠ”å™Øčæ›č”Œ[同歄](https://triliumnext.github.io/Docs/Wiki/synchronization) + * å¦ęœ‰[3rd party service for hosting synchronisation + server](https://trilium.cc/paid-hosting) +* 将笔记[åˆ†äŗ«](https://triliumnext.github.io/Docs/Wiki/sharing)ļ¼ˆå…¬å¼€å‘åøƒļ¼‰åˆ°äŗ’č”ē½‘ +* ä»„ęÆåˆ™ē¬”č®°äøŗē²’åŗ¦ēš„å¼ŗå¤§ [ē¬”č®°åŠ åÆ†](https://triliumnext.github.io/Docs/Wiki/protected-notes) +* ę‰‹ē»˜/ē¤ŗę„å›¾ļ¼šåŸŗäŗŽ [Excalidraw](https://excalidraw.com/) ļ¼ˆē¬”č®°ē±»åž‹äøŗć€Œcanvasć€ļ¼‰ +* ē”ØäŗŽåÆč§†åŒ–ē¬”č®°åŠå…¶å…³ē³»ēš„[关系图](https://triliumnext.github.io/Docs/Wiki/relation-map)äøŽ[é“¾ęŽ„å›¾](https://triliumnext.github.io/Docs/Wiki/link-map) +* ę€ē»“åÆ¼å›¾ļ¼šåŸŗäŗŽ[Mind Elixir](https://docs.mind-elixir.com/) +* å…·ęœ‰å®šä½é’‰äøŽ GPX č½Øčæ¹ēš„[地图](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) +* [č„šęœ¬](https://triliumnext.github.io/Docs/Wiki/scripts) - å‚č§ + [é«˜ēŗ§å±•ē¤ŗ](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* ē”ØäŗŽč‡ŖåŠØåŒ–ēš„ [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) +* åœØåÆē”Øę€§äøŽę•ˆčƒ½äøŠå‡åÆč‰Æå„½ę‰©å±•ļ¼Œę”ÆęŒč¶…čæ‡ 100,000 笔笔记 +* äøŗę‰‹ęœŗäøŽå¹³ęæä¼˜åŒ–ēš„[ē§»åŠØå‰ē«Æ](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) +* 内置[ę·±č‰²äø»é¢˜](https://triliumnext.github.io/Docs/Wiki/themes) +* [Evernote 导兄](https://triliumnext.github.io/Docs/Wiki/evernote-import)äøŽ + [Markdown åÆ¼å…„äøŽåÆ¼å‡ŗ](https://triliumnext.github.io/Docs/Wiki/markdown) +* ē”ØäŗŽåæ«é€Ÿäæå­˜ē½‘é”µå†…å®¹ēš„ [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) +* åÆč‡Ŗå®šä¹‰ēš„ UIļ¼ˆä¾§č¾¹ę ęŒ‰é’®ć€ē”Øęˆ·č‡Ŗå®šä¹‰å°ē»„ä»¶ē­‰ļ¼‰ +* [åŗ¦é‡ęŒ‡ę ‡ļ¼ˆMetrics)](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md)ļ¼Œå¹¶é™„ęœ‰ + [Grafana + ä»Ŗč”Øęæ](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ ęƒ³č¦ę›“å¤š TriliumNext ēš„äø»é¢˜ć€č„šęœ¬ć€å¤–ęŒ‚äøŽčµ„ęŗļ¼Œäŗ¦åÆå‚č€ƒä»„äø‹ē¬¬äø‰ę–¹čµ„ęŗļ¼ē¤¾ē¾¤ļ¼š + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) ļ¼ˆē¬¬äø‰ę–¹äø»é¢˜ć€č„šęœ¬ć€å¤–ęŒ‚äøŽę›“å¤šļ¼‰ć€‚ +- [TriliumRocks!](https://trilium.rocks/) ļ¼ˆę•™å­¦ć€ęŒ‡å—ē­‰ē­‰ļ¼‰ć€‚ + +## āš ļø äøŗä»€ä¹ˆę˜Æ TriliumNext? + +The original Trilium developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļø 从 Trilium 迁移? + +ä»Žę—¢ęœ‰ēš„ zadam/Trilium ä¾‹é”¹čæē§»åˆ° TriliumNext/Notes äøéœ€č¦ē‰¹åˆ«ēš„čæē§»ę­„éŖ¤ć€‚åŖč¦[ē…§äø€čˆ¬ę–¹å¼å®‰č£… +TriliumNext/Notes](#-installation)(#-安装)ļ¼Œå®ƒå°±ä¼šē›“ęŽ„ä½æē”Øä½ ēŽ°ęœ‰ēš„ę•°ę®åŗ“ć€‚ + +ē‰ˆęœ¬č‡³å¤šč‡³ [v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) äøŽ +zadam/trilium ęœ€ę–°ē‰ˆęœ¬ +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7)å…¼å®¹ć€‚ä¹‹åŽēš„ +TriliumNext ē‰ˆęœ¬å·²ęå‡åŒę­„ē‰ˆęœ¬å·ļ¼ˆäøŽäøŠčæ°äøå†å…¼å®¹ļ¼‰ć€‚ ## šŸ’¬ äøŽęˆ‘ä»¬äŗ¤ęµ ę¬¢čæŽåŠ å…„å®˜ę–¹ē¤¾ē¾¤ć€‚ęˆ‘ä»¬å¾ˆä¹ę„å¬åˆ°ä½ åÆ¹åŠŸčƒ½ć€å»ŗč®®ęˆ–é—®é¢˜ēš„ęƒ³ę³•ļ¼ -- [Matrix](https://matrix.to/#/#triliumnext:matrix.org)ļ¼ˆåŒę­„č®Øč®ŗļ¼‰ +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org)ļ¼ˆåŒę­„č®Øč®ŗļ¼‰ - `General` Matrix ęˆæé—“ä¹Ÿę”„ęŽ„åˆ° [XMPP](xmpp:discuss@trilium.thisgreat.party?join) -- [GitHub Discussions](https://github.com/TriliumNext/Notes/discussions)ļ¼ˆå¼‚ę­„č®Øč®ŗļ¼‰ć€‚ -- [GitHub Issues](https://github.com/TriliumNext/Notes/issues)ļ¼ˆå›žęŠ„é”™čÆÆäøŽęå‡ŗåŠŸčƒ½éœ€ę±‚ļ¼‰ć€‚ +- [GitHub + Discussions](https://github.com/TriliumNext/Trilium/discussions)ļ¼ˆå¼‚ę­„č®Øč®ŗļ¼‰ć€‚ +- [GitHub Issues](https://github.com/TriliumNext/Trilium/issues)ļ¼ˆå›žęŠ„é”™čÆÆäøŽęå‡ŗåŠŸčƒ½éœ€ę±‚ļ¼‰ć€‚ ## šŸ— 安装 ### Windows / macOS -从[ęœ€ę–°é‡Šå‡ŗé”µé¢](https://github.com/TriliumNext/Trilium/releases/latest)äø‹č½½ä½ å¹³å°ēš„äŗŒčæ›åˆ¶ę–‡ä»¶ļ¼Œč§£åŽ‹ē¼©åŽę‰§č”Œ `trilium` åÆę‰§č”Œę–‡ä»¶ć€‚ +从[ęœ€ę–°é‡Šå‡ŗé”µé¢](https://github.com/TriliumNext/Trilium/releases/latest)äø‹č½½ä½ å¹³å°ēš„äŗŒčæ›åˆ¶ę–‡ä»¶ļ¼Œč§£åŽ‹ē¼©åŽę‰§č”Œ +`trilium` åÆę‰§č”Œę–‡ä»¶ć€‚ ### Linux å¦‚ęžœä½ ēš„å‘č”Œē‰ˆå¦‚äø‹č”Øę‰€åˆ—ļ¼ŒčÆ·ä½æē”ØčÆ„å‘č”Œē‰ˆēš„å„—ä»¶ć€‚ -[![Packaging status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) -ä½ ä¹ŸåÆä»„ä»Ž[ęœ€ę–°é‡Šå‡ŗé”µé¢](https://github.com/TriliumNext/Trilium/releases/latest)äø‹č½½åÆ¹åŗ”å¹³å°ēš„äŗŒčæ›åˆ¶ę–‡ä»¶ļ¼Œč§£åŽ‹ē¼©åŽę‰§č”Œ `trilium` åÆę‰§č”Œę–‡ä»¶ć€‚ +ä½ ä¹ŸåÆä»„ä»Ž[ęœ€ę–°é‡Šå‡ŗé”µé¢](https://github.com/TriliumNext/Trilium/releases/latest)äø‹č½½åÆ¹åŗ”å¹³å°ēš„äŗŒčæ›åˆ¶ę–‡ä»¶ļ¼Œč§£åŽ‹ē¼©åŽę‰§č”Œ +`trilium` åÆę‰§č”Œę–‡ä»¶ć€‚ TriliumNext ä¹Ÿęä¾› Flatpakļ¼ŒęƒŸå°šęœŖå‘åøƒåˆ° FlatHub怂 -### ęŸ„ēœ‹å™Øļ¼ˆä»»ä½•ę“ä½œē³»ē»Ÿļ¼‰ +### ęµč§ˆå™Øļ¼ˆä»»ä½•ę“ä½œē³»ē»Ÿļ¼‰ č‹„ä½ ęœ‰ļ¼ˆå¦‚äø‹ę‰€čæ°ēš„ļ¼‰ęœåŠ”å™Øå®‰č£…ļ¼Œä¾æåÆē›“ęŽ„å­˜å–ē½‘é”µē•Œé¢ļ¼ˆå…¶äøŽę”Œé¢åŗ”ē”Øå‡ ä¹Žē›øåŒļ¼‰ć€‚ @@ -104,23 +159,30 @@ TriliumNext ä¹Ÿęä¾› Flatpakļ¼ŒęƒŸå°šęœŖå‘åøƒåˆ° FlatHub怂 č‹„č¦åœØč”ŒåŠØč£…ē½®äøŠä½æē”Ø TriliumNextļ¼Œä½ åÆä»„é€čæ‡ē§»åŠØęŸ„ēœ‹å™Øå­˜å–ęœåŠ”å™Øå®‰č£…ēš„ē§»åŠØē‰ˆęŽ„å£ļ¼ˆč§äø‹ļ¼‰ć€‚ -å¦‚ęžœä½ åå„½åŽŸē”Ÿ Android åŗ”ē”Øļ¼ŒåÆä½æē”Ø [TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid)ć€‚å›žęŠ„é—®é¢˜ęˆ–ē¼ŗå°‘ēš„åŠŸčƒ½ļ¼ŒčÆ·č‡³[å…¶å‚Øå­˜åŗ“](https://github.com/FliegendeWurst/TriliumDroid)怂 +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. -ę›“å¤šå…³äŗŽē§»åŠØåŗ”ē”Øę”ÆęŒēš„äæ”ęÆļ¼ŒčÆ·č§č®®é¢˜ļ¼šhttps://github.com/TriliumNext/Notes/issues/72怂 +å¦‚ęžœä½ åå„½åŽŸē”Ÿ Android åŗ”ē”Øļ¼ŒåÆä½æē”Ø +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid)ć€‚å›žęŠ„é—®é¢˜ęˆ–ē¼ŗå°‘ēš„åŠŸčƒ½ļ¼ŒčÆ·č‡³[å…¶å‚Øå­˜åŗ“](https://github.com/FliegendeWurst/TriliumDroid)怂 ### ęœåŠ”å™Ø -č‹„č¦åœØä½ č‡Ŗå·±ēš„ęœåŠ”å™ØäøŠå®‰č£… TriliumNextļ¼ˆåŒ…ę‹¬ä»Ž [Docker Hub](https://hub.docker.com/r/triliumnext/trilium) 使用 Docker éƒØē½²ļ¼‰ļ¼ŒčÆ·éµå¾Ŗ[ęœåŠ”å™Øå®‰č£…ę–‡ä»¶](https://triliumnext.github.io/Docs/Wiki/server-installation)怂 +č‹„č¦åœØä½ č‡Ŗå·±ēš„ęœåŠ”å™ØäøŠå®‰č£… TriliumNextļ¼ˆåŒ…ę‹¬ä»Ž [Docker +Hub](https://hub.docker.com/r/triliumnext/trilium) 使用 Docker +éƒØē½²ļ¼‰ļ¼ŒčÆ·éµå¾Ŗ[ęœåŠ”å™Øå®‰č£…ę–‡ä»¶](https://triliumnext.github.io/Docs/Wiki/server-installation)怂 + ## šŸ’» 蓔献 ### 翻译 -å¦‚ęžœä½ ę˜ÆęÆčÆ­äŗŗå£«ļ¼Œę¬¢čæŽå‰å¾€ęˆ‘ä»¬ēš„ [Weblate 锵面](https://hosted.weblate.org/engage/trilium/)ååŠ©ēæ»čÆ‘ Trilium怂 +å¦‚ęžœä½ ę˜ÆęÆčÆ­äŗŗå£«ļ¼Œę¬¢čæŽå‰å¾€ęˆ‘ä»¬ēš„ [Weblate 锵面](https://hosted.weblate.org/engage/trilium/)ååŠ©ēæ»čÆ‘ +Trilium怂 ä»„äø‹ę˜Æē›®å‰ēš„čÆ­čØ€č¦†ē›–ēŠ¶ę€ļ¼š -[![Translation status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) ### ēØ‹åŗä»£ē  @@ -139,40 +201,79 @@ pnpm run server:start git clone https://github.com/TriliumNext/Trilium.git cd Trilium pnpm install -pnpm nx run edit-docs:edit-docs +pnpm edit-docs:edit-docs ``` ### å»ŗē½®ę”Œé¢åÆę‰§č”Œę–‡ä»¶ - äø‹č½½å‚Øå­˜åŗ“ļ¼Œä½æē”Ø `pnpm` å®‰č£…ē›øä¾å„—ä»¶ļ¼Œē„¶åŽäøŗ Windows å»ŗē½®ę”Œé¢åŗ”ē”Øļ¼š ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium pnpm install -pnpm nx --project=desktop electron-forge:make -- --arch=x64 --platform=win32 +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 ``` -ę›“å¤šē»†čŠ‚čÆ·å‚č§[å¼€å‘ę–‡ä»¶](https://github.com/TriliumNext/Notes/blob/develop/docs/Developer%20Guide/Developer%20Guide/Building%20and%20deployment/Running%20a%20development%20build.md)怂 +ę›“å¤šē»†čŠ‚čÆ·å‚č§[å¼€å‘ę–‡ä»¶](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide)怂 -### å¼€å‘č€…ę–‡ä»¶ +### Developer Documentation -čÆ·å‚é˜…[ēŽÆå¢ƒč®¾å®šęŒ‡å—](./Developer%20Guide/Developer%20Guide/Environment%20Setup.md)ć€‚č‹„ęœ‰ę›“å¤šē–‘é—®ļ¼Œę¬¢čæŽé€čæ‡äøŠę–¹ć€ŒäøŽęˆ‘ä»¬äŗ¤ęµć€ē« čŠ‚ę‰€åˆ—čæžē»“äøŽęˆ‘ä»¬č”ē³»ć€‚ +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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. ## šŸ‘ 鸣谢 -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) —— äøšē•Œęœ€ä½³ēš„ę‰€č§å³ę‰€å¾—ē¼–č¾‘å™Øļ¼Œå›¢é˜Ÿäŗ’åŠØē§Æęžć€‚ -* [FancyTree](https://github.com/mar10/fancytree) —— åŠŸčƒ½éžåøøäø°åÆŒēš„ę ‘ēŠ¶å…ƒä»¶ļ¼Œå‡ ä¹Žę²”ęœ‰åÆ¹ę‰‹ć€‚ę²”ęœ‰å®ƒļ¼ŒTrilium Notes å°†äøä¼šę˜Æä»Šå¤©ēš„ę ·å­ć€‚ -* [CodeMirror](https://github.com/codemirror/CodeMirror) —— ę”ÆęŒå¤§é‡čÆ­čØ€ēš„ēØ‹åŗä»£ē ē¼–č¾‘å™Øć€‚ -* [jsPlumb](https://github.com/jsplumb/jsplumb) —— ę— åÆåŒ¹ę•Œēš„č§†č§‰č”ęœŗå‡½å¼åŗ“ć€‚ē”ØäŗŽ[关系图](https://triliumnext.github.io/Docs/Wiki/relation-map.html)äøŽ[čæžē»“å›¾](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)怂 +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) ## šŸ¤ ę”ÆęŒęˆ‘ä»¬ -ē›®å‰å°šę— ę³•ē›“ęŽ„čµžåŠ© TriliumNext ē»„ē»‡ć€‚äøčæ‡ä½ åÆä»„ļ¼š -- é€čæ‡čµžåŠ©ęˆ‘ä»¬ēš„å¼€å‘č€…ę„ę”ÆęŒ TriliumNext ēš„ęŒē»­å¼€å‘ļ¼š[eliandoran](https://github.com/sponsors/eliandoran)ļ¼ˆå®Œę•“ęø…å•čÆ·č§ [repository insights]([developers]([url](https://github.com/TriliumNext/Notes/graphs/contributors)))) -- é€čæ‡ [PayPal](https://paypal.me/za4am) ęˆ–ęÆ”ē‰¹åøļ¼ˆbitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2ļ¼‰å‘åŽŸå§‹ēš„ Trilium å¼€å‘č€…ļ¼ˆ[zadam](https://github.com/sponsors/zadam)ļ¼‰č”Øč¾¾ę”ÆęŒć€‚ +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) ## šŸ”‘ ęŽˆęƒę”ę¬¾ -Copyright 2017–2025 zadam态Elian Doran äøŽå…¶ä»–č“”ēŒ®č€…ć€‚ +Copyright 2017–2025 zadam态Elian Doran äøŽå…¶ä»–č“”ēŒ®č€… -ęœ¬ēØ‹åŗē³»č‡Ŗē”±č½Æä»¶ļ¼šä½ åÆä»„åœØč‡Ŗē”±č½Æä»¶åŸŗé‡‘ä¼šļ¼ˆFree Software Foundationļ¼‰ę‰€å‘åøƒēš„ GNU Affero é€šē”Øå…¬ä¼—ęŽˆęƒę”ę¬¾ļ¼ˆGNU AGPL)第 3 ē‰ˆęˆ–ļ¼ˆē”±ä½ é€‰ę‹©ļ¼‰ä»»ä½•åŽē»­ē‰ˆęœ¬ä¹‹ę”ę¬¾äø‹é‡ę–°ę•£åøƒęˆ–äæ®ę”¹ęœ¬ēØ‹åŗć€‚ +ęœ¬ēØ‹åŗē³»č‡Ŗē”±č½Æä»¶ļ¼šä½ åÆä»„åœØč‡Ŗē”±č½Æä»¶åŸŗé‡‘ä¼šļ¼ˆFree Software Foundationļ¼‰ę‰€å‘åøƒēš„ GNU Affero é€šē”Øå…¬ä¼—ęŽˆęƒę”ę¬¾ļ¼ˆGNU +AGPL)第 3 ē‰ˆęˆ–ļ¼ˆē”±ä½ é€‰ę‹©ļ¼‰ä»»ä½•åŽē»­ē‰ˆęœ¬ä¹‹ę”ę¬¾äø‹é‡ę–°ę•£åøƒęˆ–äæ®ę”¹ęœ¬ēØ‹åŗć€‚ diff --git a/docs/README-ZH_TW.md b/docs/README-ZH_TW.md index d471bfce3..2a323c02d 100644 --- a/docs/README-ZH_TW.md +++ b/docs/README-ZH_TW.md @@ -1,102 +1,146 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + # Trilium Notes -![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) ![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran) -![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/notes) -![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/notes/total) -[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) [![Translation status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (ꉀ꜉ assets 及 +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![翻譯狀態](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) -[英ꖇ](../README.md) | [簔體中文](./README-ZH_CN.md) | [正體中文](./README-ZH_TW.md) | [俄文](./README.ru.md) | [ę—„ę–‡](./README.ja.md) | [ē¾©å¤§åˆ©ę–‡](./README.it.md) | [č„æē­ē‰™ę–‡](./README.es.md) +[英ꖇ](./README.md) | [簔體中文](./docs/README-ZH_CN.md) | +[正體中文](./docs/README-ZH_TW.md) | [俄文](./docs/README-ru.md) | +[ę—„ę–‡](./docs/README-ja.md) | [ē¾©å¤§åˆ©ę–‡](./docs/README-it.md) | +[č„æē­ē‰™ę–‡](./docs/README-es.md) Trilium Notes ę˜Æäø€ę¬¾å…č²»äø”é–‹ęŗć€č·Øå¹³å°ēš„éšŽå±¤å¼ē­†čØ˜ę‡‰ē”ØēØ‹å¼ļ¼Œå°ˆę³Øę–¼å»ŗē«‹å¤§åž‹å€‹äŗŗēŸ„č­˜åŗ«ć€‚ ęƒ³åæ«é€Ÿäŗ†č§£ļ¼Œč«‹ęŸ„ēœ‹[čž¢å¹•ęˆŖåœ–](https://triliumnext.github.io/Docs/Wiki/screenshot-tour): -Trilium Screenshot +Trilium Screenshot + +## ā¬ 下載 +- [ęœ€ę–°ē‰ˆęœ¬](https://github.com/TriliumNext/Trilium/releases/latest) – + ē©©å®šē‰ˆęœ¬ļ¼ŒęŽØč–¦ēµ¦å¤§å¤šę•øä½æē”Øč€…ć€‚ +- [å¤œé–“ę§‹å»ŗ](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + äøē©©å®šé–‹ē™¼ē‰ˆęœ¬ļ¼ŒęÆę—„ę›“ę–°ęœ€ę–°åŠŸčƒ½čˆ‡äæ®å¾©å…§å®¹ć€‚ + +## šŸ“š ꖇ件 + +**åÆä»„åœØ [docs.triliumnotes.org](https://docs.triliumnotes.org/) ęŸ„ēœ‹å®Œę•“ä½æē”ØčŖŖę˜Ž** + +ęˆ‘å€‘ēš„ä½æē”ØčŖŖę˜ŽåŒ…å«å¤šēØ®ę ¼å¼ļ¼š +- **ē·šäøŠę–‡ä»¶**ļ¼šåÆę–¼ [docs.triliumnotes.org](https://docs.triliumnotes.org/) ęŸ„ēœ‹å®Œę•“ä½æē”ØčŖŖę˜Ž +- **ę‡‰ē”ØēØ‹å¼å…§čŖŖę˜Ž**:在 Trilium äø­ęŒ‰äø‹ `F1` å³åÆē›“ęŽ„ę–¼ę‡‰ē”ØēØ‹å¼å…§å­˜å–ē›øåŒę–‡ä»¶ +- **GitHub**ļ¼šč«‹åƒé–±ę­¤å„²å­˜åŗ«äø­ēš„[ä½æē”ØčŖŖę˜Ž](./docs/User%20Guide/User%20Guide/) + +### åæ«é€Ÿé€£ēµ +- [äøŠę‰‹ęŒ‡å—](https://docs.triliumnotes.org/) +- [å®‰č£čŖŖę˜Ž](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + 設定](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [å‡ē“š + TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [åŸŗē¤Žč§€åæµčˆ‡åŠŸčƒ½](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [å€‹äŗŗēŸ„č­˜åŗ«ēš„ęØ”å¼](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) ## šŸŽ 功能 -* ē­†čØ˜åÆēµ„ē¹”ęˆä»»ę„ę·±åŗ¦ēš„ęØ¹ē‹€ēµę§‹ć€‚å–®äø€ē­†čØ˜åÆę”¾åœØęØ¹äø­ēš„å¤šå€‹ä½ē½®ļ¼ˆåƒč¦‹[ē­†čØ˜č¤‡č£½/克隆](https://triliumnext.github.io/Docs/Wiki/cloning-notes))。 -* č±åÆŒēš„ę‰€č¦‹å³ę‰€å¾—ļ¼ˆWYSIWYGļ¼‰ē­†čØ˜ē·Øč¼Æå™Øļ¼Œę”Æę“č”Øę ¼ć€åœ–ē‰‡čˆ‡[ę•øå­øå…¬å¼](https://triliumnext.github.io/Docs/Wiki/text-notes)ļ¼Œäø¦å…·å‚™ Markdown ēš„[č‡Ŗå‹•ę ¼å¼åŒ–](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)怂 -* ę”Æę“ē·Øč¼Æ[ēØ‹å¼ē¢¼ē­†čØ˜](https://triliumnext.github.io/Docs/Wiki/code-notes)ļ¼ŒåŒ…å«čŖžę³•é«˜äŗ®ć€‚ -* åæ«é€Ÿć€č¼•é¬†åœ°åœØē­†čØ˜é–“[å°ŽčˆŖ](https://triliumnext.github.io/Docs/Wiki/note-navigation)ć€å…Øę–‡ęœå°‹ļ¼Œä»„åŠ[ē­†čØ˜čšē„¦ļ¼ˆhoisting)](https://triliumnext.github.io/Docs/Wiki/note-hoisting)怂 -* ē„”ēø«ēš„[ē­†čØ˜ē‰ˆęœ¬ē®”ē†](https://triliumnext.github.io/Docs/Wiki/note-revisions)怂 -* ē­†čØ˜[屬性](https://triliumnext.github.io/Docs/Wiki/attributes)åÆē”Øę–¼ē­†čØ˜ēš„ēµ„ē¹”ć€ęŸ„č©¢čˆ‡é€²éšŽ[č…³ęœ¬](https://triliumnext.github.io/Docs/Wiki/scripts)怂 -* ä»‹é¢ęä¾›č‹±ę–‡ć€å¾·ę–‡ć€č„æē­ē‰™ę–‡ć€ę³•ę–‡ć€ē¾…é¦¬å°¼äŗžę–‡čˆ‡äø­ę–‡ļ¼ˆē°”é«”čˆ‡ę­£é«”ļ¼‰ć€‚ -* ē›“ęŽ„ę•“åˆ [OpenID 與 TOTP](./User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) ä»„åÆ¦ē¾ę›“å®‰å…Øēš„ē™»å…„ć€‚ -* čˆ‡č‡Ŗęž¶ēš„åŒę­„ä¼ŗęœå™Øé€²č”Œ[同歄](https://triliumnext.github.io/Docs/Wiki/synchronization) - * å¦ęœ‰[ē¬¬äø‰ę–¹åŒę­„ä¼ŗęœå™ØčØ—ē®”ęœå‹™](https://trilium.cc/paid-hosting)怂 -* å°‡ē­†čØ˜[åˆ†äŗ«](https://triliumnext.github.io/Docs/Wiki/sharing)ļ¼ˆå…¬é–‹ē™¼åøƒļ¼‰åˆ°ē¶²éš›ē¶²č·Æć€‚ -* ä»„ęÆå‰‡ē­†čØ˜ē‚ŗē²’åŗ¦ēš„å¼·å¤§[ē­†čØ˜åŠ åÆ†](https://triliumnext.github.io/Docs/Wiki/protected-notes)怂 -* 手繪/ē¤ŗę„åœ–ļ¼šåŸŗę–¼ [Excalidraw](https://excalidraw.com/)ļ¼ˆē­†čØ˜é”žåž‹ē‚ŗć€Œcanvasć€ļ¼‰ć€‚ -* ē”Øę–¼č¦–č¦ŗåŒ–ē­†čØ˜åŠå…¶é—œäæ‚ēš„[é—œčÆåœ–](https://triliumnext.github.io/Docs/Wiki/relation-map)與[é€£ēµåœ–](https://triliumnext.github.io/Docs/Wiki/link-map)怂 -* åæƒę™ŗåœ–ļ¼šåŸŗę–¼ [Mind Elixir](https://docs.mind-elixir.com/)怂 -* å…·ęœ‰å®šä½é‡˜čˆ‡ GPX č»Œč·”ēš„[地圖](./User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md)怂 -* [č…³ęœ¬](https://triliumnext.github.io/Docs/Wiki/scripts)ā€”ā€”åƒč¦‹[é€²éšŽå±•ē¤ŗ](https://triliumnext.github.io/Docs/Wiki/advanced-showcases)怂 -* ē”Øę–¼č‡Ŗå‹•åŒ–ēš„ [REST API](https://triliumnext.github.io/Docs/Wiki/etapi)怂 -* åœØåÆē”Øę€§čˆ‡ę•ˆčƒ½äøŠå‡åÆč‰Æå„½ę““å±•ļ¼Œę”Æę“č¶…éŽ 100,000 ē­†ē­†čØ˜ć€‚ -* ē‚ŗę‰‹ę©Ÿčˆ‡å¹³ęæęœ€ä½³åŒ–ēš„[č”Œå‹•å‰ē«Æ](https://triliumnext.github.io/Docs/Wiki/mobile-frontend)怂 -* 內建[ę·±č‰²äø»é”Œ](https://triliumnext.github.io/Docs/Wiki/themes)ļ¼Œäø¦ę”Æę“ä½æē”Øč€…äø»é”Œć€‚ -* [Evernote åŒÆå…„](https://triliumnext.github.io/Docs/Wiki/evernote-import)與 [Markdown åŒÆå…„čˆ‡åŒÆå‡ŗ](https://triliumnext.github.io/Docs/Wiki/markdown)怂 -* ē”Øę–¼åæ«é€Ÿäæå­˜ē¶²é å…§å®¹ēš„ [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper)怂 -* åÆč‡ŖčØ‚ēš„ UIļ¼ˆå“é‚Šę¬„ęŒ‰éˆ•ć€ä½æē”Øč€…č‡ŖčØ‚å°å·„å…·ē­‰ļ¼‰ć€‚ -* [åŗ¦é‡ęŒ‡ęØ™ļ¼ˆMetrics)](./User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md)ļ¼Œäø¦é™„ęœ‰ [Grafana å„€č”Øęæ](./User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json)怂 +* ē­†čØ˜åÆēµ„ē¹”ęˆä»»ę„ę·±åŗ¦ēš„ęØ¹ē‹€ēµę§‹ć€‚å–®äø€ē­†čØ˜åÆę”¾åœØęØ¹äø­ēš„å¤šå€‹ä½ē½®ļ¼ˆåƒč¦‹[ē­†čØ˜å…‹éš†](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* č±åÆŒēš„ę‰€č¦‹å³ę‰€å¾—ļ¼ˆWYSIWYGļ¼‰ē­†čØ˜ē·Øč¼Æå™Øļ¼Œę”Æę“č”Øę ¼ć€åœ–ē‰‡čˆ‡[ę•øå­øå…¬å¼](https://triliumnext.github.io/Docs/Wiki/text-notes)ļ¼Œäø¦å…·å‚™ + Markdown + ēš„[č‡Ŗå‹•ę ¼å¼åŒ–](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* ę”Æę“ē·Øč¼Æ[ēØ‹å¼ē¢¼ē­†čØ˜](https://triliumnext.github.io/Docs/Wiki/code-notes)ļ¼ŒåŒ…å«čŖžę³•é«˜äŗ® +* åæ«é€Ÿć€č¼•é¬†åœ°åœØē­†čØ˜é–“[å°ŽčˆŖ](https://triliumnext.github.io/Docs/Wiki/note-navigation)ć€å…Øę–‡ęœå°‹ļ¼Œä»„åŠ[ē­†čØ˜čšē„¦ļ¼ˆhoisting)](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* ē„”ēø«ēš„[ē­†čØ˜ē‰ˆęœ¬ē®”ē†](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* ē­†čØ˜[屬性](https://triliumnext.github.io/Docs/Wiki/attributes)åÆē”Øę–¼ē­†čØ˜ēš„ēµ„ē¹”ć€ęŸ„č©¢čˆ‡é€²éšŽ[č…³ęœ¬](https://triliumnext.github.io/Docs/Wiki/scripts) +* ä»‹é¢ęä¾›č‹±ę–‡ć€å¾·ę–‡ć€č„æē­ē‰™ę–‡ć€ę³•ę–‡ć€ē¾…é¦¬å°¼äŗžę–‡čˆ‡äø­ę–‡ļ¼ˆē°”é«”čˆ‡ę­£é«”ļ¼‰ +* ē›“ęŽ„[ę•“åˆ OpenID 與 + TOTP](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + ä»„åÆ¦ē¾ę›“å®‰å…Øēš„ē™»å…„ +* čˆ‡č‡Ŗęž¶ēš„åŒę­„ä¼ŗęœå™Øé€²č”Œ[同歄](https://triliumnext.github.io/Docs/Wiki/synchronization) + * å¦ęœ‰[ē¬¬äø‰ę–¹åŒę­„ä¼ŗęœå™ØčØ—ē®”ęœå‹™](https://trilium.cc/paid-hosting) +* å°‡ē­†čØ˜[åˆ†äŗ«](https://triliumnext.github.io/Docs/Wiki/sharing)ļ¼ˆå…¬é–‹ē™¼åøƒļ¼‰åˆ°ē¶²éš›ē¶²č·Æ +* ä»„ęÆå‰‡ē­†čØ˜ē‚ŗē²’åŗ¦ēš„å¼·å¤§[ē­†čØ˜åŠ åÆ†](https://triliumnext.github.io/Docs/Wiki/protected-notes) +* 手繪/ē¤ŗę„åœ–ļ¼šåŸŗę–¼ [Excalidraw](https://excalidraw.com/)ļ¼ˆē­†čØ˜é”žåž‹ē‚ŗć€Œcanvasć€ļ¼‰ +* ē”Øę–¼č¦–č¦ŗåŒ–ē­†čØ˜åŠå…¶é—œäæ‚ēš„[é—œčÆåœ–](https://triliumnext.github.io/Docs/Wiki/relation-map)與[é€£ēµåœ–](https://triliumnext.github.io/Docs/Wiki/link-map) +* åæƒę™ŗåœ–ļ¼šåŸŗę–¼ [Mind Elixir](https://docs.mind-elixir.com/) +* å…·ęœ‰å®šä½é‡˜čˆ‡ GPX č»Œč·”ēš„[地圖](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) +* [č…³ęœ¬](https://triliumnext.github.io/Docs/Wiki/scripts)ā€”ā€”åƒč¦‹[é€²éšŽå±•ē¤ŗ](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* ē”Øę–¼č‡Ŗå‹•åŒ–ēš„ [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) +* åœØåÆē”Øę€§čˆ‡ę•ˆčƒ½äøŠå‡åÆč‰Æå„½ę““å±•ļ¼Œę”Æę“č¶…éŽåč¬ē­†ē­†čØ˜ +* ē‚ŗę‰‹ę©Ÿčˆ‡å¹³ęæęœ€ä½³åŒ–ēš„[č”Œå‹•å‰ē«Æ](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) +* 內建[ę·±č‰²äø»é”Œ](https://triliumnext.github.io/Docs/Wiki/themes)ļ¼Œäø¦ę”Æę“č‡ŖčØ‚äø»é”Œ +* [Evernote åŒÆå…„](https://triliumnext.github.io/Docs/Wiki/evernote-import)與 + [Markdown åŒÆå…„čˆ‡åŒÆå‡ŗ](https://triliumnext.github.io/Docs/Wiki/markdown) +* ē”Øę–¼åæ«é€Ÿäæå­˜ē¶²é å…§å®¹ēš„ [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) +* åÆč‡ŖčØ‚ēš„ UIļ¼ˆå“é‚Šę¬„ęŒ‰éˆ•ć€ä½æē”Øč€…č‡ŖčØ‚å°å·„å…·ē­‰ļ¼‰ +* [åŗ¦é‡ęŒ‡ęØ™ļ¼ˆMetrics)](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md)ļ¼Œäø¦é™„ęœ‰ + [Grafana + å„€č”Øęæ](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) -✨ ęƒ³č¦ę›“å¤š TriliumNext ēš„äø»é”Œć€č…³ęœ¬ć€å¤–ęŽ›čˆ‡č³‡ęŗļ¼Œäŗ¦åÆåƒč€ƒä»„äø‹ē¬¬äø‰ę–¹č³‡ęŗļ¼ē¤¾ē¾¤ļ¼š +✨ ęƒ³č¦ę›“å¤š Trilium Notes ēš„äø»é”Œć€č…³ęœ¬ć€å¤–ęŽ›čˆ‡č³‡ęŗļ¼Œäŗ¦åÆåƒč€ƒä»„äø‹ē¬¬äø‰ę–¹č³‡ęŗ / 社群: - [awesome-trilium](https://github.com/Nriver/awesome-trilium)ļ¼ˆē¬¬äø‰ę–¹äø»é”Œć€č…³ęœ¬ć€å¤–ęŽ›čˆ‡ę›“å¤šļ¼‰ć€‚ - [TriliumRocks!](https://trilium.rocks/)ļ¼ˆę•™å­øć€ęŒ‡å—ē­‰ē­‰ļ¼‰ć€‚ -## āš ļø ē‚ŗä»€éŗ¼ę˜Æ TriliumNext? +## ā“ē‚ŗä»€éŗ¼ę˜Æ TriliumNext? -[åŽŸęœ¬ēš„ Trilium å°ˆę”ˆē›®å‰č™•ę–¼ē¶­č­·ęØ”å¼](https://github.com/zadam/trilium/issues/4620)怂 +åŽŸå§‹ēš„ Trilium 開發者 ([Zadam](https://github.com/zadam)) å·²ę…·ę…Øåœ°å°‡ Trilium +å„²å­˜åŗ«ē§»äŗ¤ēµ¦ē¤¾ē¾¤å°ˆę”ˆļ¼Œč©²å°ˆę”ˆē¾å­˜ę”¾ę–¼ https://github.com/TriliumNext -### 從 Trilium 遷移? +### ā¬†ļøå¾ž Zadam/Trilium 遷移? -å¾žę—¢ęœ‰ēš„ zadam/Trilium ä¾‹é …é·ē§»åˆ° TriliumNext/Notes äøéœ€č¦ē‰¹åˆ„ēš„é·ē§»ę­„é©Ÿć€‚åŖč¦[ē…§äø€čˆ¬ę–¹å¼å®‰č£ TriliumNext/Notes](#-å®‰č£)ļ¼Œå®ƒå°±ęœƒē›“ęŽ„ä½æē”Øä½ ē¾ęœ‰ēš„č³‡ę–™åŗ«ć€‚ +å¾žę—¢ęœ‰ēš„ zadam/Trilium ä¾‹é …é·ē§»åˆ° TriliumNext/Notes äøéœ€č¦ē‰¹åˆ„ēš„é·ē§»ę­„é©Ÿć€‚åŖč¦ē…§äø€čˆ¬ę–¹å¼[å®‰č£ +TriliumNext/Notes](#-installation)ļ¼Œå®ƒå°±ęœƒē›“ęŽ„ä½æē”Øä½ ē¾ęœ‰ēš„č³‡ę–™åŗ«ć€‚ -ē‰ˆęœ¬č‡³å¤šč‡³ [v0.90.4](https://github.com/TriliumNext/Notes/releases/tag/v0.90.4) 與 zadam/trilium ęœ€ę–°ē‰ˆęœ¬ [v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7) ē›øå®¹ć€‚ä¹‹å¾Œēš„ TriliumNext ē‰ˆęœ¬å·²ęå‡åŒę­„ē‰ˆęœ¬č™Ÿļ¼ˆčˆ‡äøŠčæ°äøå†ē›øå®¹ļ¼‰ć€‚ - -## šŸ“– ꖇ件 - -ęˆ‘å€‘ē›®å‰ę­£å°‡ę–‡ä»¶ę¬ē§»č‡³ę‡‰ē”ØēØ‹å¼å…§ļ¼ˆåœØ Trilium äø­ęŒ‰ `F1`ļ¼‰ć€‚åœØå®Œęˆå‰ļ¼Œę–‡ä»¶äø­åÆčƒ½ęœƒęœ‰ē¼ŗę¼ć€‚å¦‚ęžœä½ ęƒ³åœØ GitHub äøŠē€č¦½ļ¼Œä¹ŸåÆä»„ē›“ęŽ„ęŸ„ēœ‹[ä½æē”ØčŖŖę˜Ž](./User%20Guide/User%20Guide/)怂 - -ä»„äø‹ęä¾›äø€äŗ›åæ«é€Ÿé€£ēµļ¼Œę–¹ä¾æä½ å°Žč¦½ę–‡ä»¶ļ¼š -- [ä¼ŗęœå™Øå®‰č£](./User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) - - [Docker å®‰č£](./User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) -- [å‡ē“š TriliumNext](./User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) -- [åŸŗęœ¬ę¦‚åæµčˆ‡åŠŸčƒ½ļ¼ē­†čØ˜](./User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) -- [å€‹äŗŗēŸ„č­˜åŗ«ēš„ęØ”å¼](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) - -åœØęˆ‘å€‘å®Œęˆé‡ę–°ę•“ē†ę–‡ä»¶ęž¶ę§‹ä¹‹å‰ļ¼Œä½ ä¹ŸåÆä»„[ē€č¦½čˆŠē‰ˆę–‡ä»¶](https://triliumnext.github.io/Docs)怂 +ē‰ˆęœ¬ęœ€é«˜č‡³ [v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) 與 +zadam/trilium ęœ€ę–°ē‰ˆęœ¬ +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7) ē›øå®¹ć€‚ä¹‹å¾Œēš„ +TriliumNext ē‰ˆęœ¬å·²ęå‡åŒę­„ē‰ˆęœ¬č™Ÿļ¼ˆčˆ‡äøŠčæ°äøå†ē›øå®¹ļ¼‰ć€‚ ## šŸ’¬ čˆ‡ęˆ‘å€‘äŗ¤ęµ ę­”čæŽåŠ å…„å®˜ę–¹ē¤¾ē¾¤ć€‚ęˆ‘å€‘å¾ˆęØ‚ę„č½åˆ°ä½ å°åŠŸčƒ½ć€å»ŗč­°ęˆ–å•é”Œēš„ęƒ³ę³•ļ¼ -- [Matrix](https://matrix.to/#/#triliumnext:matrix.org)ļ¼ˆåŒę­„čØŽč«–ļ¼‰ +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org)ļ¼ˆåŒę­„čØŽč«–ļ¼‰ - `General` Matrix ęˆæé–“ä¹Ÿę©‹ęŽ„åˆ° [XMPP](xmpp:discuss@trilium.thisgreat.party?join) -- [GitHub Discussions](https://github.com/TriliumNext/Notes/discussions)ļ¼ˆéžåŒę­„čØŽč«–ļ¼‰ć€‚ -- [GitHub Issues](https://github.com/TriliumNext/Notes/issues)ļ¼ˆå›žå ±éŒÆčŖ¤čˆ‡ęå‡ŗåŠŸčƒ½éœ€ę±‚ļ¼‰ć€‚ +- [GitHub + Discussions](https://github.com/TriliumNext/Trilium/discussions)ļ¼ˆéžåŒę­„čØŽč«–ć€‚ļ¼‰ +- [GitHub Issues](https://github.com/TriliumNext/Trilium/issues)ļ¼ˆå›žå ±éŒÆčŖ¤čˆ‡ęå‡ŗåŠŸčƒ½éœ€ę±‚ć€‚ļ¼‰ ## šŸ— å®‰č£ -### Windows / macOS +### Windows / MacOS -從[ęœ€ę–°é‡‹å‡ŗé é¢](https://github.com/TriliumNext/Trilium/releases/latest)äø‹č¼‰ä½ å¹³å°ēš„äŗŒé€²ä½ęŖ”ļ¼Œč§£å£“ēø®å¾ŒåŸ·č”Œ `trilium` åÆåŸ·č”ŒęŖ”ć€‚ +從[ęœ€ę–°é‡‹å‡ŗé é¢](https://github.com/TriliumNext/Trilium/releases/latest)äø‹č¼‰ę‚Øå¹³å°ēš„äŗŒé€²ä½ęŖ”ļ¼Œč§£å£“ēø®å¾ŒåŸ·č”Œ +`trilium` åÆåŸ·č”ŒęŖ”ć€‚ ### Linux -å¦‚ęžœä½ ēš„ē™¼č”Œē‰ˆå¦‚äø‹č”Øę‰€åˆ—ļ¼Œč«‹ä½æē”Øč©²ē™¼č”Œē‰ˆēš„å„—ä»¶ć€‚ +å¦‚ęžœę‚Øēš„ē™¼č”Œē‰ˆå¦‚äø‹č”Øę‰€åˆ—ļ¼Œč«‹ä½æē”Øč©²ē™¼č”Œē‰ˆēš„å„—ä»¶ć€‚ -[![Packaging status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) +[![ę‰“åŒ…ē‹€ę…‹](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) -ä½ ä¹ŸåÆä»„å¾ž[ęœ€ę–°é‡‹å‡ŗé é¢](https://github.com/TriliumNext/Trilium/releases/latest)äø‹č¼‰å°ę‡‰å¹³å°ēš„äŗŒé€²ä½ęŖ”ļ¼Œč§£å£“ēø®å¾ŒåŸ·č”Œ `trilium` åÆåŸ·č”ŒęŖ”ć€‚ +ę‚Øä¹ŸåÆä»„å¾ž[ęœ€ę–°é‡‹å‡ŗé é¢](https://github.com/TriliumNext/Trilium/releases/latest)äø‹č¼‰å°ę‡‰å¹³å°ēš„äŗŒé€²ä½ęŖ”ļ¼Œč§£å£“ēø®å¾ŒåŸ·č”Œ +`trilium` åÆåŸ·č”ŒęŖ”ć€‚ TriliumNext ä¹Ÿęä¾› Flatpakļ¼ŒęƒŸå°šęœŖē™¼ä½ˆåˆ° FlatHub怂 ### ē€č¦½å™Øļ¼ˆä»»ä½•ä½œę„­ē³»ēµ±ļ¼‰ -č‹„ä½ ęœ‰ļ¼ˆå¦‚äø‹ę‰€čæ°ēš„ļ¼‰ä¼ŗęœå™Øå®‰č£ļ¼Œä¾æåÆē›“ęŽ„å­˜å–ē¶²é ä»‹é¢ļ¼ˆå…¶čˆ‡ę”Œé¢ę‡‰ē”Øå¹¾ä¹Žē›øåŒļ¼‰ć€‚ +č‹„ę‚Øęœ‰ļ¼ˆå¦‚äø‹ę‰€čæ°ēš„ļ¼‰ä¼ŗęœå™Øå®‰č£ļ¼Œä¾æåÆē›“ęŽ„å­˜å–ē¶²é ä»‹é¢ļ¼ˆå…¶čˆ‡ę”Œé¢ę‡‰ē”Øå¹¾ä¹Žē›øåŒļ¼‰ć€‚ ē›®å‰åƒ…ę”Æę“ļ¼ˆäø¦åÆ¦ęø¬ļ¼‰ęœ€ę–°ē‰ˆēš„ Chrome 與 Firefox怂 @@ -104,23 +148,30 @@ TriliumNext ä¹Ÿęä¾› Flatpakļ¼ŒęƒŸå°šęœŖē™¼ä½ˆåˆ° FlatHub怂 č‹„č¦åœØč”Œå‹•č£ē½®äøŠä½æē”Ø TriliumNextļ¼Œä½ åÆä»„é€éŽč”Œå‹•ē€č¦½å™Øå­˜å–ä¼ŗęœå™Øå®‰č£ēš„č”Œå‹•ē‰ˆä»‹é¢ļ¼ˆč¦‹äø‹ļ¼‰ć€‚ -å¦‚ęžœä½ åå„½åŽŸē”Ÿ Android ę‡‰ē”Øļ¼ŒåÆä½æē”Ø [TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid)ć€‚å›žå ±å•é”Œęˆ–ē¼ŗå°‘ēš„åŠŸčƒ½ļ¼Œč«‹č‡³[å…¶å„²å­˜åŗ«](https://github.com/FliegendeWurst/TriliumDroid)怂 +ę›“å¤šé—œę–¼č”Œå‹•ę‡‰ē”Øę”Æę“ēš„č³‡čØŠļ¼Œč«‹č¦‹č­°é”Œļ¼šhttps://github.com/TriliumNext/Trilium/issues/4962怂 -ę›“å¤šé—œę–¼č”Œå‹•ę‡‰ē”Øę”Æę“ēš„č³‡čØŠļ¼Œč«‹č¦‹č­°é”Œļ¼šhttps://github.com/TriliumNext/Notes/issues/72怂 +č‹„ę‚Øåå„½åŽŸē”Ÿ Android ę‡‰ē”ØēØ‹å¼ļ¼ŒåÆä½æē”Ø +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid)。請至 +[å…¶å„²å­˜åŗ«](https://github.com/FliegendeWurst/TriliumDroid) å›žå ±éŒÆčŖ¤čˆ‡åŠŸčƒ½ē¼ŗå¤±ć€‚ę³Øę„ļ¼šä½æē”Ø +TriliumDroid ę™‚ļ¼Œå»ŗč­°åœē”Øä¼ŗęœå™Øå®‰č£ē‰ˆęœ¬ēš„č‡Ŗå‹•ę›“ę–°åŠŸčƒ½ļ¼ˆč©³č¦‹äø‹ę–‡ļ¼‰ļ¼Œå›  Trilium 與 TriliumDroid é–“ēš„åŒę­„ē‰ˆęœ¬åæ…é ˆäæęŒäø€č‡“ć€‚ ### ä¼ŗęœå™Ø -č‹„č¦åœØä½ č‡Ŗå·±ēš„ä¼ŗęœå™ØäøŠå®‰č£ TriliumNextļ¼ˆåŒ…ę‹¬å¾ž [Docker Hub](https://hub.docker.com/r/triliumnext/trilium) 使用 Docker éƒØē½²ļ¼‰ļ¼Œč«‹éµå¾Ŗ[ä¼ŗęœå™Øå®‰č£ę–‡ä»¶](https://triliumnext.github.io/Docs/Wiki/server-installation)怂 +č‹„č¦åœØę‚Øč‡Ŗå·±ēš„ä¼ŗęœå™ØäøŠå®‰č£ TriliumNextļ¼ˆåŒ…ę‹¬å¾ž [Docker +Hub](https://hub.docker.com/r/triliumnext/trilium) 使用 Docker +éƒØē½²ļ¼‰ļ¼Œč«‹éµå¾Ŗ[ä¼ŗęœå™Øå®‰č£ę–‡ä»¶](https://triliumnext.github.io/Docs/Wiki/server-installation)怂 + ## šŸ’» č²¢ē» ### 翻譯 -å¦‚ęžœä½ ę˜ÆęÆčŖžäŗŗå£«ļ¼Œę­”čæŽå‰å¾€ęˆ‘å€‘ēš„ [Weblate 頁面](https://hosted.weblate.org/engage/trilium/)å”åŠ©ēæ»č­Æ Trilium怂 +å¦‚ęžœę‚Øę˜ÆęÆčŖžäŗŗå£«ļ¼Œę­”čæŽå‰å¾€ęˆ‘å€‘ēš„ [Weblate 頁面](https://hosted.weblate.org/engage/trilium/)å”åŠ©ēæ»č­Æ +Trilium怂 ä»„äø‹ę˜Æē›®å‰ēš„čŖžčØ€č¦†č“‹ē‹€ę…‹ļ¼š -[![Translation status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) +[![翻譯狀態](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) ### ēØ‹å¼ē¢¼ @@ -139,40 +190,61 @@ pnpm run server:start git clone https://github.com/TriliumNext/Trilium.git cd Trilium pnpm install -pnpm nx run edit-docs:edit-docs +pnpm edit-docs:edit-docs ``` ### å»ŗē½®ę”Œé¢åÆåŸ·č”ŒęŖ” - äø‹č¼‰å„²å­˜åŗ«ļ¼Œä½æē”Ø `pnpm` å®‰č£ē›øä¾å„—ä»¶ļ¼Œē„¶å¾Œē‚ŗ Windows å»ŗē½®ę”Œé¢ę‡‰ē”Øļ¼š ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium pnpm install -pnpm nx --project=desktop electron-forge:make -- --arch=x64 --platform=win32 +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 ``` -ę›“å¤šē“°ēÆ€č«‹åƒč¦‹[開發文件](https://github.com/TriliumNext/Notes/blob/develop/docs/Developer%20Guide/Developer%20Guide/Building%20and%20deployment/Running%20a%20development%20build.md)怂 +ę›“å¤šē“°ēÆ€č«‹åƒč¦‹[開發者文件](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide)怂 ### 開發者文件 -č«‹åƒé–±[ē’°å¢ƒčØ­å®šęŒ‡å—](./Developer%20Guide/Developer%20Guide/Environment%20Setup.md)ć€‚č‹„ęœ‰ę›“å¤šē–‘å•ļ¼Œę­”čæŽé€éŽäøŠę–¹ć€Œčˆ‡ęˆ‘å€‘äŗ¤ęµć€ē« ēÆ€ę‰€åˆ—é€£ēµčˆ‡ęˆ‘å€‘čÆē¹«ć€‚ +č«‹åƒé–±[ē’°å¢ƒčØ­å®šęŒ‡å—](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md)ć€‚č‹„ęœ‰ę›“å¤šē–‘å•ļ¼Œę­”čæŽé€éŽäøŠę–¹ć€Œčˆ‡ęˆ‘å€‘äŗ¤ęµć€ē« ēÆ€ę‰€åˆ—é€£ēµčˆ‡ęˆ‘å€‘čÆē¹«ć€‚ ## šŸ‘ é³“č¬ -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) —— ę„­ē•Œęœ€ä½³ēš„ę‰€č¦‹å³ę‰€å¾—ē·Øč¼Æå™Øļ¼Œåœ˜éšŠäŗ’å‹•ē©ę„µć€‚ -* [FancyTree](https://github.com/mar10/fancytree) —— åŠŸčƒ½éžåøøč±åÆŒēš„ęØ¹ē‹€å…ƒä»¶ļ¼Œå¹¾ä¹Žę²’ęœ‰å°ę‰‹ć€‚ę²’ęœ‰å®ƒļ¼ŒTrilium Notes å°‡äøęœƒę˜Æä»Šå¤©ēš„ęØ£å­ć€‚ +* [zadam](https://github.com/zadam) ē‚ŗęœ¬ę‡‰ē”ØēØ‹å¼ēš„åŽŸå§‹ę¦‚åæµčˆ‡åÆ¦ä½œć€‚ +* [Sarah Hussein](https://github.com/Sarah-Hussein) ē‚ŗę‡‰ē”ØēØ‹å¼čØ­čØˆåœ–ē¤ŗć€‚ +* [nriver](https://github.com/nriver) å°å…¶åœØåœ‹éš›åŒ–ę–¹é¢ēš„č²¢ē»ć€‚ +* [Thomas Frei](https://github.com/thfrei) 對 Canvas åŽŸå§‹ä½œå“ēš„č²¢ē»ć€‚ +* [antoniotejada](https://github.com/nriver) ē‚ŗåŽŸå§‹čŖžę³•é«˜äŗ®å°å·„å…·ēš„č²¢ē»ć€‚ +* [Dosu](https://dosu.dev/) ē‚ŗęˆ‘å€‘ęä¾› GitHub å•é”Œčˆ‡čØŽč«–ēš„č‡Ŗå‹•åŒ–å›žę‡‰ć€‚ +* [Tabler Icons](https://tabler.io/icons) ē”Øę–¼ē³»ēµ±åŒ£åœ–ē¤ŗć€‚ + +č‹„ē„”å…¶čƒŒå¾Œēš„ęŠ€č”“ę”Æę’ļ¼ŒTrilium ä¾æē„”ę³•é–‹ē™¼å®Œęˆļ¼š + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - + ę–‡å­—ē­†čØ˜čƒŒå¾Œēš„č¦–č¦ŗåŒ–ē·Øč¼Æå™Øć€‚ęˆ‘å€‘č”·åæƒę„Ÿč¬ē²č“ˆé€™å„—é€²éšŽåŠŸčƒ½å„—ä»¶ć€‚ * [CodeMirror](https://github.com/codemirror/CodeMirror) —— ę”Æę“å¤§é‡čŖžčØ€ēš„ēØ‹å¼ē¢¼ē·Øč¼Æå™Øć€‚ -* [jsPlumb](https://github.com/jsplumb/jsplumb) —— ē„”åÆåŒ¹ę•µēš„č¦–č¦ŗé€£ē·šå‡½å¼åŗ«ć€‚ē”Øę–¼[é—œčÆåœ–](https://triliumnext.github.io/Docs/Wiki/relation-map.html)與[é€£ēµåœ–](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)怂 +* [Excalidraw](https://github.com/excalidraw/excalidraw) - ē•«åøƒē­†čØ˜äø­ä½æē”Øēš„ē„”é™ē™½ęæć€‚ +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - ęä¾›åæƒę™ŗåœ–åŠŸčƒ½ć€‚ +* [Leaflet](https://github.com/Leaflet/Leaflet) - ē”Øę–¼ęø²ęŸ“åœ°ē†åœ°åœ–ć€‚ +* [Tabulator](https://github.com/olifolkerd/tabulator) - ē”Øę–¼é›†åˆäø­ēš„äŗ’å‹•å¼č”Øę ¼ć€‚ +* [FancyTree](https://github.com/mar10/fancytree) —— åŠŸčƒ½éžåøøč±åÆŒēš„ęØ¹ē‹€å…ƒä»¶ļ¼Œå¹¾ä¹Žę²’ęœ‰å°ę‰‹ć€‚ +* [jsPlumb](https://github.com/jsplumb/jsplumb) —— + č¦–č¦ŗé€£ē·šå‡½å¼åŗ«ć€‚ē”Øę–¼[é—œčÆåœ–](https://triliumnext.github.io/Docs/Wiki/relation-map.html)與[é€£ēµåœ–](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) ## šŸ¤ ę”Æę“ęˆ‘å€‘ -ē›®å‰å°šē„”ę³•ē›“ęŽ„č“ŠåŠ© TriliumNext ēµ„ē¹”ć€‚äøéŽä½ åÆä»„ļ¼š -- é€éŽč“ŠåŠ©ęˆ‘å€‘ēš„é–‹ē™¼č€…ä¾†ę”ÆęŒ TriliumNext ēš„ęŒēŗŒé–‹ē™¼ļ¼š[eliandoran](https://github.com/sponsors/eliandoran)ļ¼ˆå®Œę•“ęø…å–®č«‹č¦‹ [repository insights]([developers]([url](https://github.com/TriliumNext/Notes/graphs/contributors)))) -- 透過 [PayPal](https://paypal.me/za4am) ęˆ–ęÆ”ē‰¹å¹£ļ¼ˆbitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2ļ¼‰å‘åŽŸå§‹ēš„ Trilium é–‹ē™¼č€…ļ¼ˆ[zadam](https://github.com/sponsors/zadam)ļ¼‰č”Øé”ę”ÆęŒć€‚ +Trilium +ēš„é–‹ē™¼čˆ‡ē¶­č­·č€—č²»äŗ†[ę•øē™¾å°ę™‚ēš„å·„ä½œę™‚é–“](https://github.com/TriliumNext/Trilium/graphs/commit-activity)ć€‚ę‚Øēš„ę”ÆęŒčƒ½ē¢ŗäæå…¶é–‹ęŗę€§č³Ŗć€ęå‡åŠŸčƒ½å“č³Ŗļ¼Œäø¦ę”Æä»˜ä¼ŗęœå™ØčØ—ē®”ē­‰ē›øé—œęˆęœ¬ć€‚ + +č«‹č€ƒę…®é€éŽä»„äø‹ę–¹å¼ę”ÆęŒęœ¬ę‡‰ē”ØēØ‹å¼ēš„äø»č¦é–‹ē™¼č€… ([eliandoran](https://github.com/eliandoran)): + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) ## šŸ”‘ ęŽˆę¬Šę¢ę¬¾ -Copyright 2017–2025 zadam态Elian Doran čˆ‡å…¶ä»–č²¢ē»č€…ć€‚ +Copyright 2017–2025 zadam态Elian Doran čˆ‡å…¶ä»–č²¢ē»č€… -ęœ¬ēØ‹å¼äæ‚č‡Ŗē”±č»Ÿé«”ļ¼šä½ åÆä»„åœØč‡Ŗē”±č»Ÿé«”åŸŗé‡‘ęœƒļ¼ˆFree Software Foundationļ¼‰ę‰€ē™¼ä½ˆēš„ GNU Affero é€šē”Øå…¬ēœ¾ęŽˆę¬Šę¢ę¬¾ļ¼ˆGNU AGPL)第 3 ē‰ˆęˆ–ļ¼ˆē”±ä½ éøę“‡ļ¼‰ä»»ä½•å¾ŒēŗŒē‰ˆęœ¬ä¹‹ę¢ę¬¾äø‹é‡ę–°ę•£åøƒęˆ–äæ®ę”¹ęœ¬ēØ‹å¼ć€‚ +ęœ¬ēØ‹å¼äæ‚č‡Ŗē”±č»Ÿé«”ļ¼šę‚ØåÆä»„åœØč‡Ŗē”±č»Ÿé«”åŸŗé‡‘ęœƒļ¼ˆFree Software Foundationļ¼‰ę‰€ē™¼ä½ˆēš„ GNU Affero é€šē”Øå…¬ēœ¾ęŽˆę¬Šę¢ę¬¾ļ¼ˆGNU +AGPL)第 3 ē‰ˆęˆ–ļ¼ˆē”±ä½ éøę“‡ļ¼‰ä»»ä½•å¾ŒēŗŒē‰ˆęœ¬ä¹‹ę¢ę¬¾äø‹é‡ę–°ę•£åøƒęˆ–äæ®ę”¹ęœ¬ēØ‹å¼ć€‚ diff --git a/docs/README-ar.md b/docs/README-ar.md new file mode 100644 index 000000000..bf82c914b --- /dev/null +++ b/docs/README-ar.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# ملاحظات ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ… + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬‡ļø ŲŖŁ†Ų²ŁŠŁ„ +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“šŲŖŁˆŲ«ŁŠŁ‚ + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +يتوفر Ų§Ł„ŲŖŁˆŲ«ŁŠŁ‚ Ł„ŲÆŁŠŁ†Ų§ بصيغ Ł…ŲŖŲ¹ŲÆŲÆŲ©: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### روابط سريعة +- [ŲÆŁ„ŁŠŁ„ البدؔ Ų§Ł„Ų³Ų±ŁŠŲ¹](https://docs.triliumnotes.org/) +- [ŲŖŲ¹Ł„ŁŠŁ…Ų§ŲŖ + Ų§Ł„ŲŖŲ«ŲØŁŠŲŖ](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Ų§Ų¹ŲÆŲ§ŲÆ + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [ŲŖŲ±Ł‚ŁŠŲ© ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ… + للملاحظات](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Basic Concepts and + Features](./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) + +## šŸŽŲ§Ł„Ł…ŁŠŲ²Ų§ŲŖ + +* 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. + +## ā“Ł„Ł…Ų§Ų°Ų§ ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ… Ų§Ł„ŲŖŲ§Ł„ŁŠŲŸ + +The original Trilium developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļø الهجرة من Zadam الى ŲŖŲ±ŁŠŁ„ŁŠŁˆŁ…ŲŸ + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ŲŖŲ­ŲÆŲ« معنا + +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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ—ļø تثبيت + +### ŁˆŁŠŁ†ŲÆŁˆŲ² / نظام ŲŖŲ“ŲŗŁŠŁ„ Ł…Ų§Łƒ + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Ł„ŁŠŁ†ŁƒŲ³ + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/releases/latest), unzip the +package and run the `trilium` executable. + +TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. + +### Ł…Ų³ŲŖŲ¹Ų±Ų¶( اي نظام ŲŖŲ“ŲŗŁŠŁ„) + +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). + +### هاتف Ų§Ł„Ł…Ų­Ł…ŁˆŁ„ + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### الخادم + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» المساهمة + +### ترجمات + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### كود + +Download the repository, install dependencies using `pnpm` and then run the +server (available at http://localhost:8080): +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### Ų§Ł„ŲŖŁˆŲ«ŁŠŁ‚ + +Download the repository, install dependencies using `pnpm` and then run the +environment required to edit the documentation: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### بناؔ الملف Ų§Ł„ŲŖŁ†ŁŁŠŲ°ŁŠ +Download the repository, install dependencies using `pnpm` and then build the +desktop app for Windows: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### ŲŖŁˆŲ«ŁŠŁ‚ Ų§Ł„Ł…Ų·ŁˆŲ± + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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. + +## šŸ‘ Ų§Ų“Ų§ŲÆŲ§ŲŖ + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ الدعم + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ Ų§Ł„ŲŖŲ±Ų®ŁŠŲµ + +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/docs/README-ca.md b/docs/README-ca.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-ca.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-cs.md b/docs/README-cs.md new file mode 100644 index 000000000..00f8e0130 --- /dev/null +++ b/docs/README-cs.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ StĆ”hnout +- [NejnovějŔí verze](https://github.com/TriliumNext/Trilium/releases/latest) – + stabilnĆ­ verze, doporučena pro větÅ”inu uživatelÅÆ. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ Funkce + +* 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-de.md b/docs/README-de.md new file mode 100644 index 000000000..7cf8846b3 --- /dev/null +++ b/docs/README-de.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[Englisch](./README.md) | [Chinesisch (Vereinfacht)](./docs/README-ZH_CN.md) | +[Chinesisch (Traditionell)](./docs/README-ZH_TW.md) | +[Russisch](./docs/README-ru.md) | [Japanisch](./docs/README-ja.md) | +[Italienisch](./docs/README-it.md) | [Spanisch](./docs/README-es.md) + +Trilium Notes ist eine freie, open-source, plattformfreie, hierarchische +Notiz-Anwendung mit Fokus auf die Erstellung großer persƶnlicher +Wissenssammlungen. + +Siehe [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) für +einen schnellen Überblick: + +Trilium Screenshot + +## ā¬ Download +- [Neueste Version](https://github.com/TriliumNext/Trilium/releases/latest) – + stabile Version, für die meisten Benutzer empfohlen. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + instabile Entwicklungsversion, die tƤglich mit den neuesten Funktionen und + Fehlerbehebungen aktualisiert wird. + +## šŸ“š Dokumentation + +**Besuche unsere umfassende Dokumentation unter +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Unsere Dokumentation ist verfügbar in mehreren Formaten: +- **Online-Dokumentation**: Die vollstƤndige Dokumentation finden man unter + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Durchsuche das + [Benutzerhandbuch](./docs/User%20Guide/User%20Guide/) in diesem Repository + +### Schnellzugriff +- [Erste Schritte](https://docs.triliumnotes.org/) +- [Installationsanleitung](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [TriliumNext + aktualisieren](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Grundkonzepte und + Funktionen](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Muster persƶnlicher + Wissensdatenbanken](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ Funktionen + +* 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### Migration von Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Status der +Übersetzung](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Unterstützer](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ Lizenz + +Copyright 2017-2025 zadam, Elian Doran, und andere Unterstützer + +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/docs/README-el.md b/docs/README-el.md new file mode 100644 index 000000000..ae936c8a4 --- /dev/null +++ b/docs/README-el.md @@ -0,0 +1,333 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +Το Trilium Notes είναι μια Γωρεάν και Ī±Ī½ĪæĪ¹Ļ‡Ļ„ĪæĻ ĪŗĻŽĪ“Ī¹ĪŗĪ±, ιεραρχική εφαρμογή +ĻƒĪ·Ī¼ĪµĪ¹ĻŽĻƒĪµĻ‰Ī½ Ļ€ĪæĪ»Ī»Ī±Ļ€Ī»ĻŽĪ½ Ļ€Ī»Ī±Ļ„Ļ†ĪæĻĪ¼ĻŽĪ½ με Ī­Ī¼Ļ†Ī±ĻƒĪ· ĻƒĻ„Ī· Γημιουργία μεγάλων Ļ€ĻĪæĻƒĻ‰Ļ€Ī¹ĪŗĻŽĪ½ +Ī²Ī¬ĻƒĪµĻ‰Ī½ Ī³Ī½ĻŽĻƒĪµĻ‰Ī½. + +See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for +quick overview: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-es.md b/docs/README-es.md new file mode 100644 index 000000000..b345940a7 --- /dev/null +++ b/docs/README-es.md @@ -0,0 +1,347 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![Patrocinadores en GitHub](https://img.shields.io/github/sponsors/eliandoran) +![Patrocinadores en +LiberaPay](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Descargas en Docker](https://img.shields.io/docker/pulls/triliumnext/trilium) +![Descargas en GitHub (todos los recursos, todas las +versiones)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Estado de la +traducción](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[InglĆ©s](./README.md) | [Chino (simplificado)](./docs/README-ZH_CN.md) | [Chino +(tradicional)](./docs/README-ZH_TW.md) | [Ruso](./docs/README-ru.md) | +[JaponĆ©s](./docs/README-ja.md) | [Italiano](./docs/README-it.md) | +[EspaƱol](./docs/README-es.md) + +Trilium Notes es una aplicación gratuita, de código abierto y multiplataforma +para notas jerĆ”rquicas, orientada a crear amplias bases de conocimiento +personal. + +Ver [capturas de +pantalla](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) para un +resumen rĆ”pido: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentación + +**Accede a la documentación completa en +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +La documentación estĆ” disponible en varios formatos: +- **Documentación en lĆ­nea**: Consulta la documentación completa en + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **Ayuda en la aplicación**: Presiona `F1` dentro de Trilium para acceder a la + misma documentación directamente en la aplicación +- **GitHub**: Navega por la [GuĆ­a del + Usuario](./docs/User%20Guide/User%20Guide/) en este repositorio + +### Enlaces rĆ”pidos +- [GuĆ­a de inicio](https://docs.triliumnotes.org/) +- [Instrucciones de + instalación](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Configuración de + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Actualización de + TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Conceptos bĆ”sicos y + funciones](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Patrones para una base de conocimiento + personal](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ CaracterĆ­sticas + +* Las notas se pueden organizar en un Ć”rbol de profundidad arbitraria. Una sola + nota puede colocarse en varios lugares del Ć”rbol (ver + [clonado](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Editor de notas WYSIWYG completo, que incluye, por ejemplo, tablas, imĆ”genes y + [matemĆ”ticas](https://triliumnext.github.io/Docs/Wiki/text-notes) con + [autoformato](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) + en Markdown +* Soporte para editar [notas con código + fuente](https://triliumnext.github.io/Docs/Wiki/code-notes), incluyendo + resaltado de sintaxis +* [Navegación entre + notas](https://triliumnext.github.io/Docs/Wiki/note-navigation) rĆ”pida y + sencilla, bĆŗsqueda de texto completo y [elevación de + notas](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Flujo continuo de [versionado de + notas](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Los [atributos](https://triliumnext.github.io/Docs/Wiki/attributes) de las + notas se pueden usar para organización, consultas y + [scripting](https://triliumnext.github.io/Docs/Wiki/scripts) avanzado +* Interfaz disponible en inglĆ©s, alemĆ”n, espaƱol, francĆ©s, rumano y chino + (simplificado y tradicional) +* Integración directa de [OpenID y + TOTP](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + para un inicio de sesión mĆ”s seguro +* [Sincronización](https://triliumnext.github.io/Docs/Wiki/synchronization) con + servidor de sincronización autohospedado + * existe un [servicio de terceros para alojar el servidor de + sincronización](https://trilium.cc/paid-hosting) +* [Compartir](https://triliumnext.github.io/Docs/Wiki/sharing) (publicar) notas + en Internet pĆŗblico +* Fuerte [cifrado de + notas](https://triliumnext.github.io/Docs/Wiki/protected-notes) con + granularidad por nota +* Esbozo de diagramas, basado en [Excalidraw](https://excalidraw.com/) (tipo de + nota "lienzo") +* [Mapas de relaciones](https://triliumnext.github.io/Docs/Wiki/relation-map) y + [mapas de enlaces](https://triliumnext.github.io/Docs/Wiki/link-map) para + visualizar las notas y sus relaciones +* Mapas mentales, basados en [Mind Elixir](https://docs.mind-elixir.com/) +* [Mapas + geogrĆ”ficos](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) con + marcadores de ubicación y rutas GPX +* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - ver [Casos de + uso avanzados](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) para automatización +* Escala bien tanto en usabilidad como en rendimiento, incluso con mĆ”s de + 100.000 notas +* [Interfaz móvil](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) + optimizada para pantallas tĆ”ctiles, móviles y tabletas +* [Tema oscuro](https://triliumnext.github.io/Docs/Wiki/themes) integrado, con + soporte para temas personalizados +* Importación y exportación de + [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) y + [Markdown](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) para + guardar fĆ”cilmente contenido web +* Interfaz personalizable (botones de la barra lateral, widgets definidos por el + usuario, …) +* [MĆ©tricas](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), + junto con un [Dashboard de + Grafana](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ Consulta los siguientes recursos y comunidades de terceros para obtener mĆ”s +contenido relacionado con TriliumNext: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) para acceder a + temas, scripts, complementos y otros recursos de terceros. +- [TriliumRocks!](https://trilium.rocks/) para tutoriales, guĆ­as y mucho mĆ”s. + +## ā“ĀæPor quĆ© TriliumNext? + +El desarrollador original de Trilium ([Zadam](https://github.com/zadam)) ha +cedido amablemente el repositorio de Trilium al proyecto comunitario, disponible +en https://github.com/TriliumNext + +### ā¬†ļø ĀæMigrando desde Zadam/Trilium? + +No se requieren pasos especiales para migrar de una instancia de Zadam/Trilium a +TriliumNext/Trilium. Simplemente [instala TriliumNext/Trilium](#-installation) +como de costumbre, y utilizarĆ” la base de datos existente. + +Las versiones hasta +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4), +inclusive, son compatibles con la Ćŗltima versión de Zadam/Trilium +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Las versiones +posteriores de TriliumNext/Trilium incrementan su versión de sincronización, lo +que impide migrar directamente. + +## šŸ’¬ Únete a la conversación + +SiĆ©ntete libre de unirte a nuestras conversaciones oficiales. Ā”Nos interesa +mucho conocer tus funciones favoritas, sugerencias o posibles incidencias! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Para discusiones + sĆ­ncronas.) + - La sala `General` de Matrix tambiĆ©n estĆ” enlazada con + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Discusiones de GitHub](https://github.com/TriliumNext/Trilium/discussions) + (para discusiones asincrónicas.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (para reportes + de errores y solicitudes de funciones.) + +## šŸ— Instalación + +### Windows / macOS + +Descarga la versión binaria para tu plataforma desde la [pĆ”gina de la Ćŗltima +versión](https://github.com/TriliumNext/Trilium/releases/latest), descomprime el +paquete y ejecuta el archivo `trilium`. + +### Linux + +Si tu distribución aparece en la siguiente tabla, utiliza el paquete +correspondiente a tu distribución. + +[![Estado del +paquete](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) + +TambiĆ©n puedes descargar la versión binaria para la plataforma correspondiente +desde la [pĆ”gina de la Ćŗltima +versión](https://github.com/TriliumNext/Trilium/releases/latest), descomprimir +el paquete y ejecutar el archivo `trilium`. + +TriliumNext tambiĆ©n estĆ” disponible como paquete Flatpak, aunque aĆŗn no se ha +publicado en FlatHub. + +### Navegador (cualquier sistema operativo) + +Si utilizas una instalación en servidor (ver mĆ”s abajo), puedes acceder +directamente a la interfaz web (que es prĆ”cticamente idĆ©ntica a la aplicación de +escritorio). + +Actualmente, solo se soportan (y han sido probadas) las Ćŗltimas versiones de +Chrome y Firefox. + +### Móvil + +Para usar TriliumNext en un dispositivo móvil, puedes utilizar un navegador web +móvil para acceder a la interfaz móvil de una instalación en servidor (ver mĆ”s +abajo). + +Consulta el issue https://github.com/TriliumNext/Trilium/issues/4962 para mĆ”s +información sobre el soporte de la aplicación móvil. + +Si prefieres una aplicación nativa para Android, puedes usar +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Puedes reportar errores y funciones faltantes en [su +repositorio](https://github.com/FliegendeWurst/TriliumDroid). Nota: al usar +TriliumDroid, es recomendable desactivar las actualizaciones automĆ”ticas en la +instalación del servidor (ver mĆ”s abajo), ya que la versión de sincronización +debe coincidir entre Trilium y TriliumDroid. + +### Servidor + +Para instalar TriliumNext en tu propio servidor (incluido mediante Docker desde +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)), sigue las +[instrucciones de instalación del +servidor](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribuir + +### Traducciones + +Si eres hablante nativo, puedes ayudar a traducir Trilium visitando nuestra +[pĆ”gina de Weblate](https://hosted.weblate.org/engage/trilium/). + +Cobertura de idiomas hasta el momento: + +[![Estado de la +traducción](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### Código + +Descarga el repositorio, instala las dependencias usando `pnpm` y luego ejecuta +el servidor (disponible en http://localhost:8080): +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### Documentación + +Descarga el repositorio, instala las dependencias usando `pnpm` y luego ejecuta +el entorno necesario para editar la documentación: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### Compilación del ejecutable +Descarga el repositorio, instala las dependencias usando `pnpm` y luego compila +la aplicación de escritorio para Windows: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +Para mĆ”s información, consulta la [documentación de +desarrollo](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Documentación para desarrolladores + +Consulta la [guĆ­a de +documentación](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +para mĆ”s información. Si tienes mĆ”s preguntas, siĆ©ntete libre de contactarnos a +travĆ©s de los enlaces de la sección "Únete a la conversación" mĆ”s arriba. + +## šŸ‘ Reconocimientos + +* [Zadam](https://github.com/zadam) por la idea original y la implementación de + la aplicación. +* [Sarah Hussein](https://github.com/Sarah-Hussein) por diseƱar el icono de la + aplicación. +* [nriver](https://github.com/nriver) por su trabajo en la internacionalización. +* [Thomas Frei](https://github.com/thfrei) por su trabajo original en el Canvas. +* [antoniotejada](https://github.com/nriver) por el widget original de resaltado + de sintaxis. +* [Dosu](https://dosu.dev/) por ofrecernos las respuestas automĆ”ticas para los + issues y discusiones de GitHub. +* [Tabler Icons](https://tabler.io/icons) por los iconos de la bandeja del + sistema. + +Trilium no serĆ­a posible sin las tecnologĆ­as que lo sustentan: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - el editor visual detrĆ”s + de las notas de texto. Agradecemos que se nos haya ofrecido un conjunto de + funciones premium. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - editor de código con + soporte para numerosos lenguajes. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - la pizarra infinita + utilizada en las notas tipo Canvas. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - proporciona la + funcionalidad de mapas mentales. +* [Leaflet](https://github.com/Leaflet/Leaflet) - para mostrar mapas + geogrĆ”ficos. +* [Tabulator](https://github.com/olifolkerd/tabulator) - para la tabla + interactiva utilizada en las colecciones. +* [FancyTree](https://github.com/mar10/fancytree) - biblioteca de Ć”rboles con + muchas funcionalidades y sin competencia destacable. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - biblioteca de conectividad + visual. Usada en [mapas de + relaciones](https://triliumnext.github.io/Docs/Wiki/relation-map.html) y + [mapas de + enlaces](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) + +## šŸ¤ Soporte + +Trilium se desarrolla y mantiene con [cientos de horas de +trabajo](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Tu +apoyo ayuda a mantenerlo de código abierto, mejorar sus funciones y cubrir +gastos como el alojamiento. + +Considera apoyar al desarrollador principal +([eliandoran](https://github.com/eliandoran)) de la aplicación a travĆ©s de: + +- [Patrocinadores de GitHub](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Compra un cafĆ©](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ Licencia + +Copyright 2017-2025 zadam, Elian Doran y otros colaboradores + +Este programa es software libre: puede redistribuirse, modificarse o ambas +acciones bajo los tĆ©rminos de la Licencia PĆŗblica General Affero de GNU, +publicada por la Free Software Foundation, ya sea la versión 3 de la licencia o, +a elección del usuario, cualquier versión posterior. diff --git a/docs/README-fa.md b/docs/README-fa.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-fa.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-fi.md b/docs/README-fi.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-fi.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-fr.md b/docs/README-fr.md new file mode 100644 index 000000000..962db0f81 --- /dev/null +++ b/docs/README-fr.md @@ -0,0 +1,352 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[Anglais](./README.md) | [Chinois (simplifiĆ©)](./docs/README-ZH_CN.md) | +[Chinois (Traditionnel)](./docs/README-ZH_TW.md) | [Russe](./docs/README-ru.md) +| [Japonais](./docs/README-ja.md) | [Italien](./docs/README-it.md) | +[Espagnol](./docs/README-es.md) + +Trilium Notes est une application gratuite, open-source et multiplateforme de +prise de notes hiĆ©rarchique, conƧue pour crĆ©er et gĆ©rer de vastes bases de +connaissances personnelles. + +Voir [les captures d'Ć©cran] +(https://triliumnext.github.io/Docs/Wiki/screenshot-tour) pour un aperƧu rapide +: + +Trilium Screenshot + +## ā¬ TĆ©lĆ©charger +- [DerniĆØre version](https://github.com/TriliumNext/Trilium/releases/latest) – + version stable, recommandĆ©e pour la plupart des utilisateurs. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + version de dĆ©veloppement instable, mise Ć  jour quotidiennement avec les + derniĆØres fonctionnalitĆ©s et corrections. + +## šŸ“š Documentation + +**Visitez notre documentation complĆØte sur +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Notre documentation est disponible sous plusieurs formats : +- **Documentation en ligne**: Parcourez la documentation complĆØte sur + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **Aide intĆ©grĆ©e**: Appuyez sur `F1` dans Trilium pour accĆ©der Ć  la mĆŖme + documentation directement dans l'application +- **GitHub**: Naviguer dans le [Guide utilisateur] + (./docs/User%20Guide/User%20Guide/) dans ce dĆ©pĆ“t + +### Liens rapides +- [Guide de dĆ©marrage](https://docs.triliumnotes.org/) +- [Instructions + d'installation](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Configuration + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Mise Ć  jour de TriliumNext] + (./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Concepts et fonctionnalitĆ©s de + base](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [ModĆØles de base de connaissances + personnelles](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ FonctionnalitĆ©s + +* Les notes peuvent ĆŖtre organisĆ©es selon une arborescence de profondeur + arbitraire. Une mĆŖme note peut ĆŖtre placĆ©e Ć  plusieurs endroits de + l'arborescence (voir + [clonage](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Ɖditeur de notes WYSIWYG enrichi comprenant par exemple des tableaux, des + images et [des formules + mathĆ©matiques](https://triliumnext.github.io/Docs/Wiki/text-notes) avec + [formatage automatique en + Markdown](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* Prise en charge de l'Ć©dition [de notes avec code + source](https://triliumnext.github.io/Docs/Wiki/code-notes), incluant la + coloration syntaxique +* Navigation rapide et facile entre les + notes(https://triliumnext.github.io/Docs/Wiki/note-navigation), recherche en + texte intĆ©gral et [focalisation de + notes](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Gestion transparente des [versions de + notes](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Les [attributs] de note(https://triliumnext.github.io/Docs/Wiki/attributes) + peuvent ĆŖtre utilisĆ©s pour l'organisation, l'interrogation et les [scripts] + avancĆ©s(https://triliumnext.github.io/Docs/Wiki/scripts) +* Interface utilisateur disponible en anglais, allemand, espagnol, franƧais, + roumain et chinois (simplifiĆ© et traditionnel) +* [IntĆ©gration directe d'OpenID et + TOTP](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + pour une connexion plus sĆ©curisĆ©e +* [Synchronisation](https://triliumnext.github.io/Docs/Wiki/synchronization) + avec un serveur de synchronisation auto-hĆ©bergĆ© + * il existe un [service tiers pour l'hĆ©bergement du serveur de + synchronisation](https://trilium.cc/paid-hosting) +* [Partage](https://triliumnext.github.io/Docs/Wiki/sharing) (publication) de + notes sur Internet +* [Cryptage de note](https://triliumnext.github.io/Docs/Wiki/protected-notes) + fort avec granularitĆ© par note +* Diagrammes d'esquisse, basĆ©s sur [Excalidraw](https://excalidraw.com/) (type + de note "canvas")) +* [Cartes de relations](https://triliumnext.github.io/Docs/Wiki/relation-map) et + [cartes de liens](https://triliumnext.github.io/Docs/Wiki/link-map) pour + visualiser les notes et leurs relations +* Cartes mentales, basĆ©es sur [Mind Elixir] (https://docs.mind-elixir.com/) +* [Cartes + gĆ©ographiques](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) + avec repĆØres de localisation et pistes GPX +* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - voir [Vitrines + avancĆ©es](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [API REST](https://triliumnext.github.io/Docs/Wiki/etapi) pour + l'automatisation +* OptimisĆ© en termes d’ergonomie et de performances, mĆŖme au-delĆ  de 100 000 + notes +* [Interface mobile](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) + optimisĆ©e pour le tactile sur smartphones et tablettes +* [ThĆØme sombre](https://triliumnext.github.io/Docs/Wiki/themes) intĆ©grĆ©, prise + en charge des thĆØmes utilisateur +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) et + [Importation et exportation + Markdown](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) pour une + sauvegarde facile du contenu web +* Interface utilisateur personnalisable (boutons de la barre latĆ©rale, widgets + dĆ©finis par l'utilisateur, ...) +* [MĆ©triques](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), + ainsi que [Tableau de bord + Grafana](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ Consultez les ressources/communautĆ©s tierces suivantes pour plus de +fonctionnalitĆ©s liĆ©es Ć  TriliumNext : + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) pour des thĆØmes, + scripts, plugins et plus encore tiers. +- [TriliumRocks!](https://trilium.rocks/) pour des tutoriels, des guides et bien + plus encore. + +## ā“Pourquoi TriliumNext ? + +Le dĆ©veloppeur original de Trilium ([Zadam](https://github.com/zadam)) a +gracieusement donnĆ© le rĆ©fĆ©rentiel Trilium au projet communautaire hĆ©bergĆ© sur +https://github.com/TriliumNext + +### ā¬†ļøMigration depuis Zadam/Trilium ? + +Il n'y a aucune Ć©tape de migration spĆ©cifique pour migrer d'une instance +zadam/Trilium vers une instance TriliumNext/Trilium. Installez simplement +TriliumNext/Trilium comme d'habitude et votre base de donnĆ©es existante sera +utilisĆ©e. + +Les versions jusqu'Ć  +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) incluses +sont compatibles avec la derniĆØre version de zadam/trilium +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Les versions +ultĆ©rieures de TriliumNext/Trilium voient leurs versions synchronisĆ©es +incrĆ©mentĆ©es, ce qui empĆŖche toute migration directe. + +## šŸ’¬ Discutez avec nous + +N'hĆ©sitez pas Ć  participer Ć  nos discussions officielles. Nous serions ravis de +connaĆ®tre vos idĆ©es, suggestions ou problĆØmes ! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Pour les discussions + synchrones.) + - L'espace Matrix `GĆ©nĆ©ral` est Ć©galement reliĆ©e Ć  + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Discussions Github](https://github.com/TriliumNext/Trilium/discussions) (Pour + les discussions asynchrones.) +- [ProblĆØmes Github](https://github.com/TriliumNext/Trilium/issues) (Pour les + rapports de bogues et les demandes de fonctionnalitĆ©s.) + +## šŸ— Installation + +### Windows / MacOS + +TĆ©lĆ©chargez la version binaire pour votre plateforme Ć  partir de la [derniĆØre +page de version](https://github.com/TriliumNext/Trilium/releases/latest), +dĆ©compressez le package et exĆ©cutez l'exĆ©cutable `trilium`. + +### Linux + +Si votre distribution est rĆ©pertoriĆ©e dans le tableau ci-dessous, utilisez le +package de votre distribution. + +[![Statut du +Packaging](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) + +Vous pouvez Ć©galement tĆ©lĆ©charger la version binaire pour votre plateforme Ć  +partir de la [derniĆØre page de +version](https://github.com/TriliumNext/Trilium/releases/latest), dĆ©compresser +le package et lancer l'exĆ©cutable `trilium`. + +TriliumNext est Ć©galement fourni sous forme de Flatpak, mais pas encore publiĆ© +sur FlatHub. + +### Navigateur (tout systĆØme d'exploitation) + +Si vous utilisez une installation serveur (voir ci-dessous), vous pouvez accĆ©der +directement Ć  l'interface Web (qui est presque identique Ć  l'application de +bureau). + +Actuellement, seules les derniĆØres versions de Chrome & Firefox sont supportĆ©es +(et testĆ©es). + +### Mobile + +Pour utiliser TriliumNext sur un appareil mobile, vous pouvez utiliser un +navigateur Web afin d' accĆ©der Ć  l'interface d'une installation serveur (voir +ci-dessous). + +Pour plus d’informations sur le support de l’application mobile, consultez le +ticket https://github.com/TriliumNext/Trilium/issues/4962. + +Si vous prĆ©fĆ©rez une application Android native, vous pouvez utiliser +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Signalez les bugs et les fonctionnalitĆ©s manquantes sur [leur +dĆ©pĆ“t](https://github.com/FliegendeWurst/TriliumDroid). Remarque : Il est +prĆ©fĆ©rable de dĆ©sactiver les mises Ć  jour automatiques sur votre serveur (voir +ci-dessous) lorsque vous utilisez TriliumDroid, car les versions doivent rester +synchronisĆ©es entre Trilium et TriliumDroid. + +### Serveur + +Pour installer TriliumNext sur votre propre serveur (y compris via Docker depuis +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)), suivez [les +documents d'installation du +serveur](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribuer + +### Traductions + +Si vous ĆŖtes un locuteur natif, aidez-nous Ć  traduire Trilium en vous rendant +sur notre [page Weblate](https://hosted.weblate.org/engage/trilium/). + +Voici la couverture linguistique dont nous disposons jusqu'Ć  prĆ©sent : + +[ ![Statut de la +traduction](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### Code + +TĆ©lĆ©chargez le rĆ©fĆ©rentiel, installez les dĆ©pendances Ć  l'aide de `pnpm` puis +exĆ©cutez le serveur (disponible sur http://localhost:8080) : +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### Documentation + +TĆ©lĆ©chargez le rĆ©fĆ©rentiel, installez les dĆ©pendances Ć  l'aide de `pnpm`, puis +exĆ©cutez l'environnement requis pour modifier la documentation : +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### GĆ©nĆ©rer l'exĆ©cutable +TĆ©lĆ©chargez le rĆ©fĆ©rentiel, installez les dĆ©pendances Ć  l'aide de `pnpm`, puis +crĆ©ez l'application de bureau pour Windows : +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +Pour plus de dĆ©tails, consultez la [documentation de +dĆ©veloppement](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Documentation du dĆ©veloppeur + +Veuillez consulter le [guide de +documentation](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +pour plus de dĆ©tails. Pour toute question, n'hĆ©sitez pas Ć  nous contacter via +les liens dĆ©crits dans la section "Discuter avec nous" ci-dessus. + +## šŸ‘ DĆ©dicaces + +* [zadam](https://github.com/zadam) pour le concept original et la mise en œuvre + de l'application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) pour la conception de + l'icĆ“ne de l'application. +* [nriver](https://github.com/nriver) pour son travail sur + l’internationalisation. +* [Thomas Frei](https://github.com/thfrei) pour son travail original sur le + Canvas. +* [antoniotejada](https://github.com/nriver) pour le widget de coloration + syntaxique original. +* [Dosu](https://dosu.dev/) pour nous avoir fourni des rĆ©ponses automatisĆ©es aux + problĆØmes et aux discussions sur GitHub. +* [Tabler Icons](https://tabler.io/icons) pour les icĆ“nes de la barre d'Ć©tat + systĆØme. + +Trilium ne serait pas possible sans les technologies qui le sous-tendent : + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - est l’éditeur visuel + utilisĆ© pour les notes textuelles. Nous remercions l’équipe pour la mise Ć  + disposition d’un ensemble de fonctionnalitĆ©s premium. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - Ć©diteur de code + prenant en charge un grand nombre de langages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - le tableau blanc + infini utilisĆ© dans les notes Canvas. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - fournit la + fonctionnalitĆ© de carte mentale. +* [Leaflet](https://github.com/Leaflet/Leaflet) - pour le rendu des cartes + gĆ©ographiques. +* [Tabulator](https://github.com/olifolkerd/tabulator) - pour le tableau + interactif utilisĆ© dans les collections. +* [FancyTree](https://github.com/mar10/fancytree) - bibliothĆØque d'arborescence + riche en fonctionnalitĆ©s sans rĆ©elle concurrence. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - BibliothĆØque de connectivitĆ© + visuelle. UtilisĆ©e dans les [cartes de + relations](https://triliumnext.github.io/Docs/Wiki/relation-map.html) et les + [cartes de + liens](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) + +## šŸ¤ Support + +Trilium est dĆ©veloppĆ© et maintenu grĆ¢ce Ć  [des centaines d'heures de +travail](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Votre +soutien permet son maintien en open-source, d'amĆ©liorer ses fonctionnalitĆ©s et +de couvrir des coĆ»ts tels que l'hĆ©bergement. + +Envisagez de soutenir le dĆ©veloppeur principal +([eliandoran](https://github.com/eliandoran)) de l'application via : + +- [Sponsors GitHub](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Offrez-moi un cafĆ©](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ License + +Copyright 2017-2025 zadam, Elian Doran et autres contributeurs + +Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le +modifier selon les termes de la licence publique gĆ©nĆ©rale GNU Affero telle que +publiĆ©e par la Free Software Foundation, soit la version 3 de la licence, soit +(Ć  votre choix) toute version ultĆ©rieure. diff --git a/docs/README-hr.md b/docs/README-hr.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-hr.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-hu.md b/docs/README-hu.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-hu.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-id.md b/docs/README-id.md new file mode 100644 index 000000000..f1a7a02d0 --- /dev/null +++ b/docs/README-id.md @@ -0,0 +1,333 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![Unduhan GitHub (semua aset, semua +rilis)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Status +terjemahan](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[Inggris](./README.md) | [Tiongkok (Sederhana)](./docs/README-ZH_CN.md) | +[Tiongkok (Tradisional)](./docs/README-ZH_TW.md) | [Rusia](./docs/README-ru.md) +| [Jepang](./docs/README-ja.md) | [Italia](./docs/README-it.md) | +[Spanyol](./docs/README-es.md) + +Trilium Notes adalah aplikasi pencatatan hierarkis lintas platform yang gratis +dan sumber terbuka dengan fokus untuk mengembangkan pengetahuan pribadi yang +luas. + +Lihat [tangkapan layar](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) +untuk ikhtisar cepat: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Dokumentasi + +**Kunjungi dokumentasi lengkap kami di +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Dokumentasi kami tersedia dalam berbagai format: +- **Dokumentasi Online**: Telusuri dokumentasi lengkap di + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **Bantuan Dalam Aplikasi**: Tekan `F1` di dalam Trilium untuk mengakses + dokumentasi yang sama langsung di aplikasi +- **GitHub**: Navigasi melalui [Panduan + Pengguna](./docs/User%20Guide/User%20Guide/) di repositori ini + +### Tautan Cepat +- [Panduan Memulai](https://docs.triliumnotes.org/) +- [Petunjuk + Instalasi](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Pengaturan + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Pembaharuan + TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Konsep dan Fitur + Dasar](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Pola Basis Pengetahuan + Pribadi](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ Fitur + +* 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-it.md b/docs/README-it.md new file mode 100644 index 000000000..eb6a365e6 --- /dev/null +++ b/docs/README-it.md @@ -0,0 +1,346 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![Sponsor GitHub](https://img.shields.io/github/sponsors/eliandoran) +![Sostenitori LiberaPay](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Pull Docker](https://img.shields.io/docker/pulls/triliumnext/trilium) +![Download GitHub (tutte le risorse, tutte le +versioni)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Stato della +traduzione](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[Inglese](./README.md) | [Cinese (semplificato)](./docs/README-ZH_CN.md) | +[Cinese (tradizionale)](./docs/README-ZH_TW.md) | [Russo](./docs/README-ru.md) | +[Giapponese](./docs/README-ja.md) | [Italiano](./docs/README-it.md) | +[Spagnolo](./docs/README-es.md) + +Trilium Notes ĆØ un'applicazione per appunti ad organizzazione gerarchica, +studiata per la costruzione di archivi di conoscenza personali di grandi +dimensioni. + +Vedi [fotografie](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) per +una panoramica veloce: + +Trilium Screenshot + +## ā¬ Scarica +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + versione stabile, consigliata per la maggior parte degli utenti. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + versione di sviluppo instabile, aggiornata quotidianamente con le ultime + funzionalitĆ  e correzioni. + +## šŸ“š Documentazione + +**Vedi tutta la documentazione su +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +La nostra documentazione ĆØ disponibile in diversi formati: +- **Documentazione online**: consulta la documentazione completa all'indirizzo + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **Guida in-app**: premi `F1` all'interno di Trilium per accedere alla stessa + documentazione direttamente nell'applicazione +- **GitHub**: consulta la [Guida utente](./docs/User%20Guide/User%20Guide/) in + questo repository + +### Collegamenti rapidi +- [Guida introduttiva](https://docs.triliumnotes.org/) +- [Istruzioni per + l'installazione](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Configurazione + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Aggiornamento di + TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Concetti e caratteristiche di + base](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Modelli di base di conoscenza + personale](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ Caratteristiche + +* Le note possono essere organizzate in una struttura ad albero con profonditĆ  + arbitrarie. Una singola nota può essere inserita in più posizioni all'interno + della struttura (vedi + [clonazione](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Editor di note WYSIWYG avanzato che include, ad esempio, tabelle, immagini e + [math](https://triliumnext.github.io/Docs/Wiki/text-notes) con markdown + [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* Supporto per la modifica di [note con codice + sorgente](https://triliumnext.github.io/Docs/Wiki/code-notes), inclusa + l'evidenziazione della sintassi +* Navigazione veloce e facile tra le note, ricerca full-text e ancoraggio delle + note +* Senza soluzione di continuitĆ  [nota + versione](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Nota [attributi](https://triliumnext.github.io/Docs/Wiki/attributes) può + essere utilizzato per l'organizzazione delle note, l'esecuzione di query e lo + [scripting](https://triliumnext.github.io/Docs/Wiki/scripts) avanzato +* Interfaccia utente disponibile in inglese, tedesco, spagnolo, francese, rumeno + e cinese (semplificato e tradizionale) +* Integrazione diretta [OpenID e + TOTP](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + per un accesso più sicuro +* [Sincronizzazione](https://triliumnext.github.io/Docs/Wiki/synchronization) + con server di sincronizzazione self-hosted + * esiste un [servizio di terze parti per l'hosting del server di + sincronizzazione](https://trilium.cc/paid-hosting) +* [Condivisione](https://triliumnext.github.io/Docs/Wiki/sharing) + (pubblicazione) di note su Internet pubblicamente +* Crittografia forte + [note](https://triliumnext.github.io/Docs/Wiki/protected-notes) con + granularitĆ  per singola nota +* Disegnare diagrammi, basati su [Excalidraw](https://excalidraw.com/) (tipo di + nota ā€œcanvasā€) +* [Mappe relazionali](https://triliumnext.github.io/Docs/Wiki/relation-map) e + [mappe di collegamento](https://triliumnext.github.io/Docs/Wiki/link-map) per + visualizzare le note e le loro relazioni +* Mappe mentali, basate su [Mind Elixir](https://docs.mind-elixir.com/) +* [Mappe + geografiche](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) con + indicatori di posizione e tracciati GPX +* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - vedi [Esempi + avanzati](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) per l'automazione +* Ottima scalabilitĆ  sia in termini di usabilitĆ  che di prestazioni fino a oltre + 100.000 note +* Frontend mobile ottimizzato per il touch [mobile + frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) per + smartphone e tablet +* Tema scuro integrato (https://triliumnext.github.io/Docs/Wiki/themes), + supporto per temi utente +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) e + [Importazione ed esportazione + Markdown](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) per salvare + facilmente i contenuti web +* Interfaccia utente personalizzabile (pulsanti della barra laterale, widget + definiti dall'utente, ...) +* [Metriche](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), + insieme a una [dashboard + Grafana](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ Dai un'occhiata alle seguenti risorse/comunitĆ  di terze parti per ulteriori +informazioni su TriliumNext: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) per temi, script, + plugin e altro di terze parti. +- [TriliumRocks!](https://trilium.rocks/) per tutorial, guide e molto altro + ancora. + +## ā“PerchĆ© TriliumNext? + +Lo sviluppatore originale di Trilium ([Zadam](https://github.com/zadam)) ha +gentilmente fornito il repository Trilium al progetto comunitario che risiede +all'indirizzo https://github.com/TriliumNext + +### ā¬†ļøMigrazione da Zadam/Trilium? + +Non sono necessarie procedure di migrazione particolari per passare da +un'istanza zadam/Trilium a un'istanza TriliumNext/Trilium. ƈ sufficiente +[installare TriliumNext/Trilium](#-installation) come di consueto e verrĆ  +utilizzato il database esistente. + +Le versioni fino alla +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) inclusa +sono compatibili con l'ultima versione zadam/trilium +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Tutte le +versioni successive di TriliumNext/Trilium hanno versioni di sincronizzazione +incrementate che impediscono la migrazione diretta. + +## šŸ’¬ Discuti con noi + +Non esitare a partecipare alle nostre conversazioni ufficiali. Ci piacerebbe +conoscere le tue opinioni su funzionalitĆ , suggerimenti o problemi! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Per discussioni + sincronizzate.) + - La stanza Matrix `Generale` ĆØ anche collegata a + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Discussioni su GitHub](https://github.com/TriliumNext/Trilium/discussions) + (Per discussioni asincrone.) +- [Problemi su GitHub](https://github.com/TriliumNext/Trilium/issues) (Per + segnalazioni di bug e richieste di funzionalitĆ .) + +## šŸ— Installazione + +### Windows / MacOS + +Scarica la versione binaria per la tua piattaforma dalla [pagina delle ultime +versioni](https://github.com/TriliumNext/Trilium/releases/latest), decomprimi il +pacchetto ed esegui il file eseguibile `trilium`. + +### Linux + +Se la tua distribuzione ĆØ elencata nella tabella sottostante, utilizza il +pacchetto della tua distribuzione. + +[![Stato del +Packaging](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) + +ƈ anche possibile scaricare la versione binaria per la propria piattaforma dalla +[pagina delle ultime +versioni](https://github.com/TriliumNext/Trilium/releases/latest), decomprimere +il pacchetto ed eseguire il file eseguibile `trilium`. + +TriliumNext ĆØ disponibile anche come Flatpak, ma non ĆØ ancora stato pubblicato +su FlatHub. + +### Browser (qualsiasi sistema operativo) + +Se utilizzi un'installazione server (vedi sotto), puoi accedere direttamente +all'interfaccia web (che ĆØ quasi identica all'applicazione desktop). + +Attualmente sono supportate (e testate) solo le ultime versioni di Chrome e +Firefox. + +### Cellulare + +Per utilizzare TriliumNext su un dispositivo mobile, ĆØ possibile utilizzare un +browser web mobile per accedere all'interfaccia mobile di un'installazione +server (vedere sotto). + +Per ulteriori informazioni sul supporto delle app mobili, consultare il numero +https://github.com/TriliumNext/Trilium/issues/4962. + +Se preferisci un'app Android nativa, puoi utilizzare +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Segnala bug e funzionalitĆ  mancanti al [loro +repository](https://github.com/FliegendeWurst/TriliumDroid). Nota: quando +utilizzi TriliumDroid, ĆØ consigliabile disabilitare gli aggiornamenti automatici +sull'installazione del server (vedi sotto), poichĆ© la versione di +sincronizzazione deve corrispondere tra Trilium e TriliumDroid. + +### Server + +Per installare TriliumNext sul proprio server (anche tramite Docker da +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)), seguire [le +istruzioni per l'installazione sul +server](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribuire + +### Traduzioni + +Se sei un madrelingua, aiutaci a tradurre Trilium visitando la nostra [pagina +Weblate](https://hosted.weblate.org/engage/trilium/). + +Ecco le lingue attualmente disponibili: + +[![Stato della +traduzione](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### Codice + +Scarica il repository, installa le dipendenze utilizzando `pnpm` e quindi avvia +il server (disponibile all'indirizzo http://localhost:8080): +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### Documentazione + +Scarica il repository, installa le dipendenze utilizzando `pnpm` e quindi esegui +l'ambiente necessario per modificare la documentazione: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### Compilare l'eseguibile +Scarica la repository, installa le dipendenze eseguendo `pnpm` e compila +l'applicazione desktop per Windows: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +Per più dettagli, consulta la [documentazione di +sviluppo](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Documentazione per sviluppatori + +Visualizza la [guida sulla +documentazione](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +per i dettagli. Se hai altre domande, sentiti libero di contattarci tramite i +collegamenti presenti nella precedente sezione "Discuti con noi". + +## šŸ‘ Riconoscimenti + +* [zadam](https://github.com/zadam) per l'idea originale e l'implementazione + della applicazione. +* [Sarah Hussein](https://github.com/Sarah-Hussein) per il design della icona + della applicazione. +* [nriver](https://github.com/nriver) per il suo lavoro + sull'internazionalizzazione. +* [Thomas Frei](https://github.com/thfrei) per il suo lavoro originale sul + canvas. +* [antoniotejada](https://github.com/nriver) per lo strumento originale di + colorazione della sintassi. +* [Dosu](https://dosu.dev/) per averci fornito le risposte automatiche alle + questioni e alle discussioni su GitHub. +* [Tabler Icons](https://tabler.io/icons) per le icone della barra delle + applicazioni. + +Trilium non sarebbe possibile senza le tecnologie che lo supportano: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - l'editor visivo dietro + le note di testo. Siamo grati per averci offerto una serie di funzionalitĆ  + premium. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - editor di codice con + supporto per un'ampia gamma di linguaggi. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - la lavagna infinita + utilizzata nelle note di Canvas. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - fornendo la + funzionalitĆ  di mappa mentale. +* [Leaflet](https://github.com/Leaflet/Leaflet) - per la rappresentazione di + mappe geografiche. +* [Tabulator](https://github.com/olifolkerd/tabulator) - per la tabella + interattiva utilizzata nelle raccolte. +* [FancyTree](https://github.com/mar10/fancytree) - libreria ad albero ricca di + funzionalitĆ  senza reale concorrenza. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - libreria di connettivitĆ  + visiva. Utilizzata in [relation + maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) e [link + maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) + +## šŸ¤ Supporto + +Trilium ĆØ realizzato e gestito con [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Il tuo +sostegno contribuisce a mantenerlo open source, a migliorarne le funzionalitĆ  e +a coprire i costi, come quelli di hosting. + +Considera la possibilitĆ  di sostenere lo sviluppatore principale +([eliandoran](https://github.com/eliandoran)) dell'applicazione tramite: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ Licenza + +Copyright 2017-2025 zadam, Elian Doran, e altri collaboratori + +Questo programma ĆØ software libero: ĆØ possibile redistribuirlo e/o modificarlo +nei termini della GNU Affero General Public License come pubblicata dalla Free +Software Foundation, sia la versione 3 della Licenza, o (a propria scelta) +qualsiasi versione successiva. diff --git a/docs/README-ja.md b/docs/README-ja.md new file mode 100644 index 000000000..4fdea3056 --- /dev/null +++ b/docs/README-ja.md @@ -0,0 +1,280 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ +(å…Øć‚¢ć‚»ćƒƒćƒˆć€å…ØćƒŖćƒŖćƒ¼ć‚¹)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![翻訳状況](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[č‹±čŖž](./README.md) | [äø­å›½čŖžļ¼ˆē°”ä½“ļ¼‰](./docs/README-ZH_CN.md) | +[äø­å›½čŖžļ¼ˆē¹ä½“ļ¼‰](./docs/README-ZH_TW.md) | [ćƒ­ć‚·ć‚¢čŖž](./docs/README-ru.md) | +[ę—„ęœ¬čŖž](./docs/README-ja.md) | [ć‚¤ć‚æćƒŖć‚¢čŖž](./docs/README-it.md) | +[ć‚¹ćƒšć‚¤ćƒ³čŖž](./docs/README-es.md) + +Trilium Notes +ćÆć€å¤§č¦ęØ”ćŖå€‹äŗŗēŸ„č­˜ćƒ™ćƒ¼ć‚¹ć®ę§‹ēÆ‰ć«é‡ē‚¹ć‚’ē½®ć„ćŸć€ē„”ę–™ć‹ć¤ć‚Ŗćƒ¼ćƒ—ćƒ³ć‚½ćƒ¼ć‚¹ć®ć‚Æćƒ­ć‚¹ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ć®éšŽå±¤åž‹ćƒŽćƒ¼ćƒˆä½œęˆć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć§ć™ć€‚ + +概要については [ć‚¹ć‚ÆćƒŖćƒ¼ćƒ³ć‚·ćƒ§ćƒƒćƒˆ](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) +ć‚’å‚ē…§ć—ć¦ćć ć•ć„: + +Trilium Screenshot + +## ā¬ ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ +- [ęœ€ę–°ćƒŖćƒŖćƒ¼ć‚¹](https://github.com/TriliumNext/Trilium/releases/latest) – + å®‰å®šćƒćƒ¼ć‚øćƒ§ćƒ³ć€‚ć»ćØć‚“ć©ć®ćƒ¦ćƒ¼ć‚¶ćƒ¼ć«ęŽØå„Øć•ć‚Œć¾ć™ć€‚ +- [ćƒŠć‚¤ćƒˆćƒŖćƒ¼ćƒ“ćƒ«ćƒ‰](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + äøå®‰å®šćŖé–‹ē™ŗćƒćƒ¼ć‚øćƒ§ćƒ³ć€‚ęœ€ę–°ć®ę©Ÿčƒ½ćØäæ®ę­£ćŒęÆŽę—„ę›“ę–°ć•ć‚Œć¾ć™ć€‚ + +## šŸ“š ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ + +**åŒ…ę‹¬ēš„ćŖćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆćÆ [docs.triliumnotes.org](https://docs.triliumnotes.org/) ć§ć”č¦§ćć ć•ć„** + +å½“ē¤¾ć®ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆćÆč¤‡ę•°ć®å½¢å¼ć§ć”åˆ©ē”Øć„ćŸć ć‘ć¾ć™: +- **ć‚Ŗćƒ³ćƒ©ć‚¤ćƒ³ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ**: [docs.triliumnotes.org](https://docs.triliumnotes.org/) + ć§å®Œå…ØćŖćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚’å‚ē…§ć—ć¦ćć ć•ć„ +- **ć‚¢ćƒ—ćƒŖå†…ćƒ˜ćƒ«ćƒ—**: Trilium内で `F1` ć‚­ćƒ¼ć‚’ęŠ¼ć™ćØć€ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³å†…ć§åŒć˜ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć«ē›“ęŽ„ć‚¢ć‚Æć‚»ć‚¹ć§ćć¾ć™ +- **GitHub**: ć“ć®ćƒŖćƒć‚øćƒˆćƒŖć® [ćƒ¦ćƒ¼ć‚¶ćƒ¼ć‚¬ć‚¤ćƒ‰](./docs/User%20Guide/User%20Guide/) ć‚’å‚ē…§ć—ć¦ćć ć•ć„ + +### ć‚Æć‚¤ćƒƒć‚ÆćƒŖćƒ³ć‚Æ +- [ć‚¹ć‚æćƒ¼ćƒˆć‚¬ć‚¤ćƒ‰](https://docs.triliumnotes.org/) +- [ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ę‰‹é †](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + ć®ć‚»ćƒƒćƒˆć‚¢ćƒƒćƒ—](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [TriliumNext + ć®ć‚¢ćƒƒćƒ—ć‚°ćƒ¬ćƒ¼ćƒ‰](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [åŸŗęœ¬ę¦‚åæµćØę©Ÿčƒ½](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [å€‹äŗŗćƒŠćƒ¬ćƒƒć‚øćƒ™ćƒ¼ć‚¹ć®ćƒ‘ć‚æćƒ¼ćƒ³](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ 機能 + +* ćƒŽćƒ¼ćƒˆćÆä»»ę„ć®ę·±ć•ć®ćƒ„ćƒŖćƒ¼ć«é…ē½®ć§ćć¾ć™ć€‚1ć¤ć®ćƒŽćƒ¼ćƒˆć‚’ćƒ„ćƒŖćƒ¼å†…ć®č¤‡ę•°ć®å “ę‰€ć«é…ē½®ć§ćć¾ć™ļ¼ˆ[ć‚Æćƒ­ćƒ¼ćƒ³](https://triliumnext.github.io/Docs/Wiki/cloning-notes)ć‚’å‚ē…§ļ¼‰ +* 豊富な WYSIWYG ćƒŽćƒ¼ćƒˆć‚Øćƒ‡ć‚£ć‚æćƒ¼ 例: + č”Øć€ē”»åƒć€[ę•°å¼](https://triliumnext.github.io/Docs/Wiki/text-notes) ćØćƒžćƒ¼ć‚Æćƒ€ć‚¦ćƒ³ + [č‡Ŗå‹•ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆ](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) など +* 構文の強調蔨示を含む [ć‚½ćƒ¼ć‚¹ć‚³ćƒ¼ćƒ‰ä»˜ććƒŽćƒ¼ćƒˆ](https://triliumnext.github.io/Docs/Wiki/code-notes) + ć®ē·Øé›†ć‚’ć‚µćƒćƒ¼ćƒˆ +* [ćƒŽćƒ¼ćƒˆé–“ć®ćƒŠćƒ“ć‚²ćƒ¼ć‚·ćƒ§ćƒ³](https://triliumnext.github.io/Docs/Wiki/note-navigation)ć€å…Øę–‡ę¤œē“¢ć€[ćƒŽćƒ¼ćƒˆć®ćƒ›ć‚¤ć‚¹ćƒˆ](https://triliumnext.github.io/Docs/Wiki/note-hoisting) + ćŒé«˜é€Ÿć‹ć¤ē°”å˜ć«č”Œćˆć¾ć™ +* ć‚·ćƒ¼ćƒ ćƒ¬ć‚¹ćŖ [ćƒŽćƒ¼ćƒˆć®ćƒćƒ¼ć‚øćƒ§ćƒ³ē®”ē†](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* ćƒŽćƒ¼ćƒˆ[å±žę€§](https://triliumnext.github.io/Docs/Wiki/attributes) ćÆć€ćƒŽćƒ¼ćƒˆć®ę•“ē†ć€ć‚Æć‚ØćƒŖć€é«˜åŗ¦ćŖ + [ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ](https://triliumnext.github.io/Docs/Wiki/scripts) ć«ä½æē”Øć§ćć¾ć™ +* UI ćÆč‹±čŖžć€ćƒ‰ć‚¤ćƒ„čŖžć€ć‚¹ćƒšć‚¤ćƒ³čŖžć€ćƒ•ćƒ©ćƒ³ć‚¹čŖžć€ćƒ«ćƒ¼ćƒžćƒ‹ć‚¢čŖžć€äø­å›½čŖžļ¼ˆē°”ä½“å­—ćŠć‚ˆć³ē¹ä½“å­—ļ¼‰ć§ć”åˆ©ē”Øć„ćŸć ć‘ć¾ć™ +* ć‚ˆć‚Šå®‰å…ØćŖćƒ­ć‚°ć‚¤ćƒ³ć®ćŸć‚ć®ē›“ęŽ„ēš„ćŖ + [OpenIDとTOTPの統合](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) +* ć‚»ćƒ«ćƒ•ćƒ›ć‚¹ćƒˆåŒęœŸć‚µćƒ¼ćƒćƒ¼ćØć® [同期](https://triliumnext.github.io/Docs/Wiki/synchronization) + * [åŒęœŸć‚µćƒ¼ćƒćƒ¼ć‚’ćƒ›ć‚¹ćƒˆć™ć‚‹ćŸć‚ć®ć‚µćƒ¼ćƒ‰ćƒ‘ćƒ¼ćƒ†ć‚£ć‚µćƒ¼ćƒ“ć‚¹](https://trilium.cc/paid-hosting) ćŒć‚ć‚Šć¾ć™ +* ć‚¤ćƒ³ć‚æćƒ¼ćƒćƒƒćƒˆäøŠć§ćƒŽćƒ¼ćƒˆć® [å…±ęœ‰](https://triliumnext.github.io/Docs/Wiki/sharing)ļ¼ˆå…¬é–‹ļ¼‰ +* ćƒŽćƒ¼ćƒˆć”ćØć«čŖæę•“åÆčƒ½ć§å¼·åŠ›ćŖ + [ćƒŽćƒ¼ćƒˆęš—å·åŒ–](https://triliumnext.github.io/Docs/Wiki/protected-notes) +* [Excalidraw](https://excalidraw.com/) ć‚’ćƒ™ćƒ¼ć‚¹ć«ć—ćŸå›³ć®ć‚¹ć‚±ćƒƒćƒļ¼ˆćƒŽćƒ¼ćƒˆć‚æć‚¤ćƒ—ć€Œć‚­ćƒ£ćƒ³ćƒć‚¹ć€ļ¼‰ +* ćƒŽćƒ¼ćƒˆćØćć®ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ć‚’č¦–č¦šåŒ–ć™ć‚‹ćŸć‚ć® + [ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćƒžćƒƒćƒ—](https://triliumnext.github.io/Docs/Wiki/relation-map) と + [ćƒŖćƒ³ć‚Æćƒžćƒƒćƒ—](https://triliumnext.github.io/Docs/Wiki/link-map) +* [Mind Elixir](https://docs.mind-elixir.com/) ć‚’ćƒ™ćƒ¼ć‚¹ćØć—ćŸćƒžć‚¤ćƒ³ćƒ‰ćƒžćƒƒćƒ— +* ä½ē½®ćƒ”ćƒ³ćØ GPX ćƒˆćƒ©ćƒƒć‚Æä»˜ćć® + [ć‚øć‚Ŗćƒžćƒƒćƒ—](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) +* [ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ](https://triliumnext.github.io/Docs/Wiki/scripts) - + [é«˜åŗ¦ćŖć‚·ćƒ§ćƒ¼ć‚±ćƒ¼ć‚¹](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) ć‚’å‚ē…§ +* č‡Ŗå‹•åŒ–ć®ćŸć‚ć® [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) +* 10äø‡ä»¶ä»„äøŠć®ćƒŽćƒ¼ćƒˆć§ć‚‚ć€ä½æć„ć‚„ć™ć•ćØćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ć®äø”é¢ć«å„Ŗć‚ŒćŸę‹”å¼µę€§ć‚’å®Ÿē¾ +* ć‚¹ćƒžćƒ¼ćƒˆćƒ•ć‚©ćƒ³ćØć‚æćƒ–ćƒ¬ćƒƒćƒˆå‘ć‘ć«ć‚æćƒƒćƒę“ä½œć«ęœ€é©åŒ–ć•ć‚ŒćŸ + [ćƒ¢ćƒć‚¤ćƒ«ćƒ•ćƒ­ćƒ³ćƒˆć‚Øćƒ³ćƒ‰](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) +* 組み込みの [ćƒ€ćƒ¼ć‚Æćƒ†ćƒ¼ćƒž](https://triliumnext.github.io/Docs/Wiki/themes)ć€ćƒ¦ćƒ¼ć‚¶ćƒ¼ćƒ†ćƒ¼ćƒžć®ć‚µćƒćƒ¼ćƒˆ +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) と + [Markdown ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆćØć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆ](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) + 恧Webć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’ē°”å˜ć«äæå­˜ +* ć‚«ć‚¹ć‚æćƒžć‚¤ć‚ŗåÆčƒ½ćŖ UI (ć‚µć‚¤ćƒ‰ćƒćƒ¼ ćƒœć‚æćƒ³ć€ćƒ¦ćƒ¼ć‚¶ćƒ¼å®šē¾©ć®ć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆćŖć©) +* [ćƒ”ćƒˆćƒŖć‚Æć‚¹(Metrics)](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md) + と [Grafana + ćƒ€ćƒƒć‚·ćƒ„ćƒœćƒ¼ćƒ‰](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ TriliumNext é–¢é€£ć®ćć®ä»–ć®ęƒ…å ±ć«ć¤ć„ć¦ćÆć€ę¬”ć®ć‚µćƒ¼ćƒ‰ćƒ‘ćƒ¼ćƒ†ć‚£ć®ćƒŖć‚½ćƒ¼ć‚¹/ć‚³ćƒŸćƒ„ćƒ‹ćƒ†ć‚£ć‚’ć”č¦§ćć ć•ć„: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) + ć‚µćƒ¼ćƒ‰ćƒ‘ćƒ¼ćƒ†ć‚£ć®ćƒ†ćƒ¼ćƒžć€ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć€ćƒ—ćƒ©ć‚°ć‚¤ćƒ³ćŖć©ć€‚ +- [TriliumRocks!](https://trilium.rocks/) ć§ćÆćƒćƒ„ćƒ¼ćƒˆćƒŖć‚¢ćƒ«ć‚„ć‚¬ć‚¤ćƒ‰ćŖć©ć€ćć®ä»–å¤šę•°ć€‚ + +## ā“ćŖćœTriliumNext ćŖć®ć‹ļ¼Ÿ + +ć‚ŖćƒŖć‚øćƒŠćƒ«ć® Trilium 開発者 ([Zadam](https://github.com/zadam)) +は、https://github.com/TriliumNext ć«ć‚ć‚‹ć‚³ćƒŸćƒ„ćƒ‹ćƒ†ć‚£ćƒ—ćƒ­ć‚øć‚§ć‚Æćƒˆć« Trilium ćƒŖćƒć‚øćƒˆćƒŖć‚’åæ«ćęä¾›ć—ć¦ćć‚Œć¾ć—ćŸ + +### ā¬†ļøZadam/Trilium ć‹ć‚‰ē§»č”Œć—ć¾ć™ć‹? + +zadam/Trilium ć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹ć‹ć‚‰ TriliumNext/Trilium ć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹ćøć®ē§»č”Œć«ćÆē‰¹åˆ„ćŖę‰‹é †ćÆć‚ć‚Šć¾ć›ć‚“ć€‚é€šåøøé€šć‚Š +[TriliumNext/Triliumć‚’ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«](#-installation) ć™ć‚‹ć ć‘ć§ć€ę—¢å­˜ć®ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ćŒä½æē”Øć•ć‚Œć¾ć™ć€‚ + +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) +ć¾ć§ć®ćƒćƒ¼ć‚øćƒ§ćƒ³ćÆć€ęœ€ę–°ć® zadam/trilium ćƒćƒ¼ć‚øćƒ§ćƒ³ +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7) +ćØäŗ’ę›ę€§ćŒć‚ć‚Šć¾ć™ć€‚ćć‚Œä»„é™ć®ćƒćƒ¼ć‚øćƒ§ćƒ³ć® TriliumNext/Trilium ć§ćÆåŒęœŸćƒćƒ¼ć‚øćƒ§ćƒ³ćŒć‚¤ćƒ³ć‚ÆćƒŖćƒ”ćƒ³ćƒˆć•ć‚Œć‚‹ćŸć‚ć€ē›“ęŽ„ē§»č”Œć™ć‚‹ć“ćØćÆć§ćć¾ć›ć‚“ć€‚ + +## šŸ’¬ ē§ćŸć”ćØč­°č«–ć—ć¾ć—ć‚‡ć† + +ćœć²å…¬å¼ć®ä¼šč©±ć«ć”å‚åŠ ćć ć•ć„ć€‚ę©Ÿčƒ½ć«é–¢ć™ć‚‹ć”ę„č¦‹ć€ć”ęę”ˆć€å•é”ŒćŖć©ć€ćœć²ćŠčžć‹ć›ćć ć•ć„ļ¼ + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) ļ¼ˆåŒęœŸćƒ‡ć‚£ć‚¹ć‚«ćƒƒć‚·ćƒ§ćƒ³ē”Øļ¼‰ + - `General`ćƒžćƒˆćƒŖćƒƒć‚Æć‚¹ćƒ«ćƒ¼ćƒ ć‚‚ [XMPP](xmpp:discuss@trilium.thisgreat.party?join) + ć«ćƒ–ćƒŖćƒƒć‚øć•ć‚Œć¦ć„ć¾ć™ +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) + (éžåŒęœŸćƒ‡ć‚£ć‚¹ć‚«ćƒƒć‚·ćƒ§ćƒ³ē”Ø) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) + (ćƒć‚°ćƒ¬ćƒćƒ¼ćƒˆć‚„ę©Ÿčƒ½ćƒŖć‚Æć‚Øć‚¹ćƒˆē”Ø) + +## šŸ— ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ« + +### Windows / MacOS + +[ęœ€ę–°ćƒŖćƒŖćƒ¼ć‚¹ ćƒšćƒ¼ć‚ø](https://github.com/TriliumNext/Trilium/releases/latest) +ć‹ć‚‰ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ē”Øć®ćƒć‚¤ćƒŠćƒŖ ćƒŖćƒŖćƒ¼ć‚¹ć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć€ćƒ‘ćƒƒć‚±ćƒ¼ć‚øć‚’č§£å‡ć—ć¦ `trilium` å®Ÿč”ŒåÆčƒ½ćƒ•ć‚”ć‚¤ćƒ«ć‚’å®Ÿč”Œć—ć¾ć™ć€‚ + +### Linux + +ćƒ‡ć‚£ć‚¹ćƒˆćƒŖćƒ“ćƒ„ćƒ¼ć‚·ćƒ§ćƒ³ćŒä»„äø‹ć®č”Øć«čØ˜č¼‰ć•ć‚Œć¦ć„ć‚‹å “åˆćÆć€ćƒ‡ć‚£ć‚¹ćƒˆćƒŖćƒ“ćƒ„ćƒ¼ć‚·ćƒ§ćƒ³ć®ćƒ‘ćƒƒć‚±ćƒ¼ć‚øć‚’ä½æē”Øć—ć¦ćć ć•ć„ć€‚ + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) + +[ęœ€ę–°ćƒŖćƒŖćƒ¼ć‚¹ ćƒšćƒ¼ć‚ø](https://github.com/TriliumNext/Trilium/releases/latest) +ć‹ć‚‰ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ē”Øć®ćƒć‚¤ćƒŠćƒŖ ćƒŖćƒŖćƒ¼ć‚¹ć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć€ćƒ‘ćƒƒć‚±ćƒ¼ć‚øć‚’č§£å‡ć—ć¦ `trilium` å®Ÿč”ŒåÆčƒ½ćƒ•ć‚”ć‚¤ćƒ«ć‚’å®Ÿč”Œć™ć‚‹ć“ćØć‚‚ć§ćć¾ć™ć€‚ + +TriliumNext は Flatpak ćØć—ć¦ć‚‚ęä¾›ć•ć‚Œć¦ć„ć¾ć™ćŒć€FlatHub ć§ćÆć¾ć å…¬é–‹ć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚ + +### ćƒ–ćƒ©ć‚¦ć‚¶ļ¼ˆć©ć®OSでも) + +ć‚µćƒ¼ćƒćƒ¼ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ« (äø‹čØ˜å‚ē…§) ć‚’ä½æē”Øć™ć‚‹å “åˆćÆć€Web ć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ć‚¤ć‚¹ (ćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ—ć‚¢ćƒ—ćƒŖćØć»ć¼åŒć˜) ć«ē›“ęŽ„ć‚¢ć‚Æć‚»ć‚¹ć§ćć¾ć™ć€‚ + +ē¾åœØć€Chrome と Firefox ć®ęœ€ę–°ćƒćƒ¼ć‚øćƒ§ćƒ³ć®ćæćŒć‚µćƒćƒ¼ćƒˆ (ćŠć‚ˆć³ćƒ†ć‚¹ćƒˆ) ć•ć‚Œć¦ć„ć¾ć™ć€‚ + +### ćƒ¢ćƒć‚¤ćƒ« + +ćƒ¢ćƒć‚¤ćƒ«ćƒ‡ćƒć‚¤ć‚¹ć§ TriliumNext ć‚’ä½æē”Øć™ć‚‹ć«ćÆć€ćƒ¢ćƒć‚¤ćƒ« Web +ćƒ–ćƒ©ć‚¦ć‚¶ćƒ¼ć‚’ä½æē”Øć—ć¦ć€ć‚µćƒ¼ćƒćƒ¼ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć®ćƒ¢ćƒć‚¤ćƒ«ć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ć‚¤ć‚¹ć«ć‚¢ć‚Æć‚»ć‚¹ć§ćć¾ć™ (ä»„äø‹ć‚’å‚ē…§)怂 + +ćƒ¢ćƒć‚¤ćƒ«ć‚¢ćƒ—ćƒŖć®ć‚µćƒćƒ¼ćƒˆć®č©³ē“°ć«ć¤ć„ć¦ćÆć€issue https://github.com/TriliumNext/Trilium/issues/4962 +ć‚’å‚ē…§ć—ć¦ćć ć•ć„ć€‚ + +ćƒć‚¤ćƒ†ć‚£ćƒ–Androidć‚¢ćƒ—ćƒŖć‚’ć”åøŒęœ›ć®å “åˆćÆć€[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid) +ć‚’ć”åˆ©ē”Øć„ćŸć ć‘ć¾ć™ć€‚ćƒć‚°ć‚„äøč¶³ć—ć¦ć„ć‚‹ę©Ÿčƒ½ćÆ [ćƒŖćƒć‚øćƒˆćƒŖ](https://github.com/FliegendeWurst/TriliumDroid) +ć§ć”å ±å‘Šćć ć•ć„ć€‚ę³Øļ¼šTriliumDroidć‚’ä½æē”Øć™ć‚‹å “åˆćÆć€TriliumとTriliumDroidć®åŒęœŸćƒćƒ¼ć‚øćƒ§ćƒ³ćŒäø€č‡“ć—ć¦ć„ć‚‹åæ…č¦ćŒć‚ć‚‹ćŸć‚ć€ć‚µćƒ¼ćƒćƒ¼ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć§č‡Ŗå‹•ę›“ę–°ć‚’ē„”åŠ¹ć«ć™ć‚‹ć“ćØć‚’ćŠå‹§ć‚ć—ć¾ć™ļ¼ˆäø‹čØ˜å‚ē…§ļ¼‰ć€‚ + +### ć‚µćƒ¼ćƒćƒ¼ + +ē‹¬č‡Ŗć®ć‚µćƒ¼ćƒćƒ¼ć« TriliumNext ć‚’ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć™ć‚‹ć«ćÆ +([Dockerhub](https://hub.docker.com/r/triliumnext/trilium) 恋悉 Docker +ēµŒē”±ć§ć‚‚å«ć‚€)态[ć‚µćƒ¼ćƒćƒ¼ć®ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ« +ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ](https://triliumnext.github.io/Docs/Wiki/server-installation) ć«å¾“ć£ć¦ćć ć•ć„ć€‚ + + +## šŸ’» č²¢ēŒ®ć™ć‚‹ + +### 翻訳 + +ćƒć‚¤ćƒ†ć‚£ćƒ–ć‚¹ćƒ”ćƒ¼ć‚«ćƒ¼ć®ę–¹ćÆć€[Weblate ćƒšćƒ¼ć‚ø](https://hosted.weblate.org/engage/trilium/) +にアクセスして、Trilium ć®ēæ»čØ³ć«ć”å”åŠ›ćć ć•ć„ć€‚ + +ć“ć‚Œć¾ć§ć«ć‚«ćƒćƒ¼ć•ć‚Œć¦ć„ć‚‹čØ€čŖžćÆę¬”ć®ćØćŠć‚Šć§ć™: + +[![翻訳状況](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### ć‚³ćƒ¼ćƒ‰ + +ćƒŖćƒć‚øćƒˆćƒŖć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć€`pnpm` ć‚’ä½æē”Øć—ć¦ä¾å­˜é–¢äæ‚ć‚’ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć—ć¦ć‹ć‚‰ć€ć‚µćƒ¼ćƒćƒ¼ć‚’å®Ÿč”Œć—ć¾ć™ (http://localhost:8080 +ć§åˆ©ē”ØåÆčƒ½): +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ + +ćƒŖćƒć‚øćƒˆćƒŖć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć€`pnpm` ć‚’ä½æē”Øć—ć¦ä¾å­˜é–¢äæ‚ć‚’ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć—ć€ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚’ē·Øé›†ć™ć‚‹ćŸć‚ć«åæ…č¦ćŖē’°å¢ƒć‚’å®Ÿč”Œć—ć¾ć™: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### å®Ÿč”Œćƒ•ć‚”ć‚¤ćƒ«ć®ę§‹ēÆ‰ +ćƒŖćƒć‚øćƒˆćƒŖć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć€`pnpm` ć‚’ä½æē”Øć—ć¦ä¾å­˜é–¢äæ‚ć‚’ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć—ć€Windows ē”Øć®ćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ—ć‚¢ćƒ—ćƒŖć‚’ćƒ“ćƒ«ćƒ‰ć—ć¾ć™: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +詳瓰については、[é–‹ē™ŗćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide) +ć‚’å‚ē…§ć—ć¦ćć ć•ć„ć€‚ + +### é–‹ē™ŗč€…å‘ć‘ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ + +詳瓰については、[ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆć‚¬ć‚¤ćƒ‰](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +ć‚’ć”č¦§ćć ć•ć„ć€‚ć”č³Ŗå•ćŒć”ć–ć„ć¾ć—ćŸć‚‰ć€äøŠčØ˜ć®ć€Œē§ćŸć”ćØč­°č«–ć—ć¾ć—ć‚‡ć†ć€ć‚»ć‚Æć‚·ćƒ§ćƒ³ć«čØ˜č¼‰ć•ć‚Œć¦ć„ć‚‹ćƒŖćƒ³ć‚Æć‹ć‚‰ćŠę°—č»½ć«ćŠå•ć„åˆć‚ć›ćć ć•ć„ć€‚ + +## šŸ‘ ć‚·ćƒ£ć‚¦ćƒˆć‚¢ć‚¦ćƒˆ + +* [zadam](https://github.com/zadam) ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®ć‚ŖćƒŖć‚øćƒŠćƒ«ć®ć‚³ćƒ³ć‚»ćƒ—ćƒˆćØå®Ÿč£…ć«åÆ¾ć—ć¦ę„Ÿč¬ć—ć¾ć™ć€‚ +* [Sarah Hussein](https://github.com/Sarah-Hussein) ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć‚¢ć‚¤ć‚³ćƒ³ć‚’ćƒ‡ć‚¶ć‚¤ćƒ³ć€‚ +* [nriver](https://github.com/nriver) å›½éš›åŒ–ćøć®å–ć‚Šēµ„ćæć€‚ +* [Thomas Frei](https://github.com/thfrei) Canvasćøć®ć‚ŖćƒŖć‚øćƒŠćƒ«ćŖå–ć‚Šēµ„ćæć€‚ +* [antoniotejada](https://github.com/nriver) ć‚ŖćƒŖć‚øćƒŠćƒ«ć®ę§‹ę–‡ćƒć‚¤ćƒ©ć‚¤ćƒˆć‚¦ć‚£ć‚øć‚§ćƒƒćƒˆć€‚ +* [Dosu](https://dosu.dev/) GitHub ć®å•é”Œć‚„ćƒ‡ć‚£ć‚¹ć‚«ćƒƒć‚·ćƒ§ćƒ³ć«åÆ¾ć™ć‚‹č‡Ŗå‹•åæœē­”ć‚’ęä¾›ć—ć¦ćć‚Œć¾ć—ćŸć€‚ +* [Tabler Icons](https://tabler.io/icons) ć‚·ć‚¹ćƒ†ćƒ ćƒˆćƒ¬ć‚¤ć‚¢ć‚¤ć‚³ćƒ³ć€‚ + +Trilium ćÆć€ćć®åŸŗē›¤ćØćŖć‚‹ęŠ€č”“ćŖć—ć«ćÆå®Ÿē¾ć§ćć¾ć›ć‚“ć§ć—ćŸ: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - + ćƒ†ć‚­ć‚¹ćƒˆćƒŽćƒ¼ćƒˆć‚’č£œå®Œć™ć‚‹ćƒ“ć‚øćƒ„ć‚¢ćƒ«ć‚Øćƒ‡ć‚£ć‚æć€‚ćƒ—ćƒ¬ćƒŸć‚¢ćƒ ę©Ÿčƒ½ć‚’ęä¾›ć—ć¦ć„ćŸć ćć€ę„Ÿč¬ć„ćŸć—ć¾ć™ć€‚ +* [CodeMirror](https://github.com/codemirror/CodeMirror) - + č†Øå¤§ćŖę•°ć®čØ€čŖžć‚’ć‚µćƒćƒ¼ćƒˆć™ć‚‹ć‚³ćƒ¼ćƒ‰ć‚Øćƒ‡ć‚£ć‚æćƒ¼ć€‚ +* [Excalidraw](https://github.com/excalidraw/excalidraw) - Canvas + ćƒŽćƒ¼ćƒˆć§ä½æē”Øć•ć‚Œć‚‹ē„”é™ć®ćƒ›ćƒÆć‚¤ćƒˆćƒœćƒ¼ćƒ‰ć€‚ +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - + ćƒžć‚¤ćƒ³ćƒ‰ćƒžćƒƒćƒ—ę©Ÿčƒ½ć‚’ęä¾›ć—ć¾ć™ć€‚ +* [Leaflet](https://github.com/Leaflet/Leaflet) - åœ°ē†ćƒžćƒƒćƒ—ć‚’ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć—ć¾ć™ć€‚ +* Tabulator](https://github.com/olifolkerd/tabulator) - + ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³ć§ä½æē”Øć•ć‚Œć‚‹ć‚¤ćƒ³ć‚æćƒ©ć‚Æćƒ†ć‚£ćƒ–ćŖćƒ†ćƒ¼ćƒ–ćƒ«ć€‚ +* [FancyTree](https://github.com/mar10/fancytree) - ä»–ć«é”žć‚’č¦‹ćŖć„ę©Ÿčƒ½č±ŠåÆŒćŖćƒ„ćƒŖćƒ¼ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć€‚ +* [jsPlumb](https://github.com/jsplumb/jsplumb) - + č¦–č¦šēš„ćŖęŽ„ē¶šćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć€‚[ćƒŖćƒ¬ćƒ¼ć‚·ćƒ§ćƒ³ćƒžćƒƒćƒ—](https://triliumnext.github.io/Docs/Wiki/relation-map.html) + と [ćƒŖćƒ³ć‚Æćƒžćƒƒćƒ—](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) + ć§ä½æē”Øć•ć‚Œć¾ć™ + +## šŸ¤ ć‚µćƒćƒ¼ćƒˆ + +Triliumは +[ę•°ē™¾ę™‚é–“ć‚‚ć®ä½œę„­](https://github.com/TriliumNext/Trilium/graphs/commit-activity) +ć«ć‚ˆć£ć¦ę§‹ēÆ‰ćƒ»ē¶­ęŒć•ć‚Œć¦ć„ć¾ć™ć€‚ēš†ę§˜ć®ć”ę”Æę“ć«ć‚ˆć‚Šć€ć‚Ŗćƒ¼ćƒ—ćƒ³ć‚½ćƒ¼ć‚¹ćØć—ć¦ć®ē¶­ęŒć€ę©Ÿčƒ½ć®å‘äøŠć€ćƒ›ć‚¹ćƒ†ć‚£ćƒ³ć‚°ćŖć©ć®č²»ē”Øć‚’č³„ć†ć“ćØćŒć§ćć¾ć™ć€‚ + +ę¬”ć®ę–¹ę³•ć§ć€ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®äø»ćŖé–‹ē™ŗč€… ([eliandoran](https://github.com/eliandoran)) +ć‚’ć‚µćƒćƒ¼ćƒˆć™ć‚‹ć“ćØć‚’ę¤œčØŽć—ć¦ćć ć•ć„: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ ćƒ©ć‚¤ć‚»ćƒ³ć‚¹ + +č‘—ä½œęØ© 2017-2025 zadam态Elian Doranć€ćć®ä»–åÆ„ēØæč€… + +ć“ć®ćƒ—ćƒ­ć‚°ćƒ©ćƒ ćÆćƒ•ćƒŖćƒ¼ć‚½ćƒ•ćƒˆć‚¦ć‚§ć‚¢ć§ć™: ćƒ•ćƒŖćƒ¼ć‚½ćƒ•ćƒˆć‚¦ć‚§ć‚¢č²”å›£(Software Foundation) ćŒē™ŗč”Œć™ć‚‹ GNU Affero +äø€čˆ¬å…¬č”†åˆ©ē”ØčØ±č«¾ę›ø(GNU Affero General Public License) ć®ćƒćƒ¼ć‚øćƒ§ćƒ³ 3ć€ć¾ćŸćÆ (éøęŠžć«ć‚ˆć‚Š) +ćć‚Œä»„é™ć®ćƒćƒ¼ć‚øćƒ§ćƒ³ć®č¦ē“„ć«å¾“ć£ć¦ć€ć“ć®ćƒ—ćƒ­ć‚°ćƒ©ćƒ ć‚’å†é…åøƒćŠć‚ˆć³/ć¾ćŸćÆę”¹å¤‰ć™ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚ diff --git a/docs/README-ko.md b/docs/README-ko.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-ko.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-md.md b/docs/README-md.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-md.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-nb_NO.md b/docs/README-nb_NO.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-nb_NO.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-nl.md b/docs/README-nl.md new file mode 100644 index 000000000..4212c518a --- /dev/null +++ b/docs/README-nl.md @@ -0,0 +1,333 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsoren](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay supporters](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (alle bestanden, alle +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Vertaling +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[Engels](./README.md) [Chinees (Versimpeld)](./docs/README-ZH_CN.md) [Chinees +(Traditioneel)](./docs/README-ZH_TW.md) [Russisch](./docs/README-ru.md) +[Japans](./docs/README-ja.md) [Italiaans](./docs/README-it.md) +[Spaans](./docs/README-es.md) + +Trillium Notes is een gratis en open-source, platformonafhankelijke, +hiĆ«rarchische notitie-applicatie die zich richt op het opbouwen van grote +persoonlijke kennisbanken. + +Bekijk [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) +voor een snel overzicht: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentatie + +**Bekijk onze beknopte documentatie op +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Onze documentatie is beschikbaar in meerdere formaten: +- **Online Documentatie**: Blader door de volledige documentatie op + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Toets`F1` binnen Trilium om dezelfde documentatie direct in + de applicatie te bekijken +- **GitHub**: Navigeer door de [User Guide](./docs/User%20Guide/User%20Guide/) + in deze repository + +### Quick Links +- [Getting Started Gids](https://docs.triliumnotes.org/) +- [Vertaal + Instructies](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [TriliumNext + Upgraden](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Basis Concepten en + Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Patronen van Personal Knowledge + Base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ Features + +* Notes kunnen in een diepe boomstructuur geplaatst worden. Een enkele note kan + op meerdere plekken in de boom geplaatst worden. (zie + [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Rijke WYSIWYG note editor inclusief e.g. tabellen, afbeeldingen en + [math](https://triliumnext.github.io/Docs/Wiki/text-notes) met markdown + [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* Ondersteuning voor bewerken van [notes met source + code](https://triliumnext.github.io/Docs/Wiki/code-notes), inclusief 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-pl.md b/docs/README-pl.md new file mode 100644 index 000000000..dd68a1240 --- /dev/null +++ b/docs/README-pl.md @@ -0,0 +1,334 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +Trilium Notes to darmowa, otwarto-Åŗródłowa i wieloplatformowa aplikacja do +tworzenia hierarchicznych notatek, skoncentrowana na budowaniu dużych osobistych +baz wiedzy. + +See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for +quick overview: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) - + niestabilna wersja deweloperska, aktualizowana codziennie o najnowsze funkcje + i poprawki. + +## šŸ“šDokumentacja + +**OdwiedÅŗ naszą obszerną dokumentację na +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Nasza dokumentacja jest dostępna w wielu formatach: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **Pomoc w aplikacji**: Naciśnij `F1` w Trilium, aby uzyskać dostęp do tej + samej dokumentacji bezpośrednio w aplikacji +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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)) +* Bogaty edytor notatek WYSIWYG, zawierający np. tabele, obrazy i + [math](https://triliumnext.github.io/Docs/Wiki/text-notes) z + [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) + Markdown +* 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-pt.md b/docs/README-pt.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-pt.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-pt_BR.md b/docs/README-pt_BR.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-pt_BR.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-ro.md b/docs/README-ro.md new file mode 100644 index 000000000..9842cb319 --- /dev/null +++ b/docs/README-ro.md @@ -0,0 +1,338 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![Sponsori prin GitHub](https://img.shields.io/github/sponsors/eliandoran) +![Sponsori prin LiberaPay](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Descărcări pe Docker](https://img.shields.io/docker/pulls/triliumnext/trilium) +![Descărcări pe GitHub (toate variantele, toate +release-urile)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Starea +traducerilor](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[Engleză](./README.md) | [Chineză (Simplificată)](./docs/README-ZH_CN.md) | +[Chineză (Tradițională)](./docs/README-ZH_TW.md) | [Rusă](./docs/README-ru.md) | +[Japoneză](./docs/README-ja.md) | [Italiană](./docs/README-it.md) | +[Spaniolă](./docs/README-es.md) + +Trilium Notes este o aplicație gratuită și open-source pentru notițe structurate +ierarhic cu scopul de a crea o bază de date de cunoștințe personală, de mari +dimensiuni. + +Prezentare generală prin [capturi de +ecran](https://triliumnext.github.io/Docs/Wiki/screenshot-tour): + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentație + +**Vizitați documentația noastră detaliată la +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Documentația este disponibilă Ć®n mai multe formate: +- **Documentație online**: vizualizați Ć®ntreaga documentație la + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **Ghid Ć®n aplicație**: Apăsați `F1` Ć®n Trilium pentru a accesa aceeași + documentație local, direct din aplicație +- **GitHub**: Navigați [ghidul de utilizator](./docs/User%20Guide/User%20Guide/) + direct din acest repository + +### Linkuri rapide +- [Ghid rapid](https://docs.triliumnotes.org/) +- [Instrucțiuni de + instalare](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Instalare prin + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Procesul de + actualizare](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Concepte de bază și + funcții](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Concepte pentru o bază de date de cunoștințe + personală](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ Funcții + +* Notițele pot fi aranjate Ć®ntr-o structură ierarhică cu o adĆ¢ncime nelimitată. + O singură notiță poate fi plasată Ć®n mai multe locuri Ć®n abore (vedeți + [procesul de clonare](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Editor vizual de notițe cu suport de tabele, imagini și [ecuații + matematice](https://triliumnext.github.io/Docs/Wiki/text-notes) cu + [auto-formatare Ć®n stil + Markdown](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* Suport for editarea [notițelor de tip cod + sursă](https://triliumnext.github.io/Docs/Wiki/code-notes), inclusiv cu + evidențierea sintaxei +* [Navigare rapidă printre + notițe](https://triliumnext.github.io/Docs/Wiki/note-navigation), căutare Ć®n + conținutul notițelor și [focalizarea + notițelor](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Salvarea transparentă a [reviziilor + notițelor](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* [Attribute](https://triliumnext.github.io/Docs/Wiki/attributes) pentru + organizarea și căutarea notițelor, dar și posibilitatea de [script-uri + avansate](https://triliumnext.github.io/Docs/Wiki/scripts) +* Interfața grafică este disponibilă Ć®n mai multe limbi, dintre care și limba + romĆ¢nă +* [Integrare directă cu OpenID and + TOTP](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + pentru o autentificare mai sigură +* [Sincronizare](https://triliumnext.github.io/Docs/Wiki/synchronization) cu un + server propriu + * există și un [serviciu terț pentru + sincronizare](https://trilium.cc/paid-hosting) +* [Partajarea](https://triliumnext.github.io/Docs/Wiki/sharing) (publicarea) + notițelor pe Internet +* [Criptare puternică](https://triliumnext.github.io/Docs/Wiki/protected-notes) + la nivel de notițe +* Desenare liberă, folosind [Excalidraw](https://excalidraw.com/) (notițe de tip + ā€žschiČ›Äƒā€) +* [Hărți de relații](https://triliumnext.github.io/Docs/Wiki/relation-map) and + [hărți de legături](https://triliumnext.github.io/Docs/Wiki/link-map) pentru + vizualizarea notițelor și a relațiilor acestora +* Hărți mentale, bazate pe [Mind Elixir](https://docs.mind-elixir.com/) +* [Hărți geografice](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) + cu marcaje și trasee GPX +* [Scriptare](https://triliumnext.github.io/Docs/Wiki/scripts) - vedeți + [Prezentare + avansată](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [API-uri REST](https://triliumnext.github.io/Docs/Wiki/etapi) pentru + automatizare +* Suportă peste 100 de mii de notițe fără impact de performanță +* [Interfață de mobil optimizată pentru touch + screen](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) pentru + telefoane mobile și tablete +* [Temă Ć®ntunecată](https://triliumnext.github.io/Docs/Wiki/themes) predefinită, + dar și suport pentru teme personalizate +* Import și export pentru + [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) și + [Markdown](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) pentru + salvarea rapidă a conținutului de pe Internet +* Interfață grafică personalizabilă (butoane, widget-uri definite de utilizator, + ...) +* [Metrice](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), + inclusiv un [dashboard + Grafana](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ Consultați următoarele resurse din partea comunității Trilium: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) pentru teme + adiționale, script-uri, plugin-uri și altele. +- [TriliumRocks!](https://trilium.rocks/) pentru tutoriale, ghiduri și altele. + +## ā“De ce TriliumNext? + +Primul dezvoltator ([Zadam](https://github.com/zadam)) a oferit repository-ul +original către fork-ul TriliumNext aflat la https://github.com/TriliumNext + +### ā¬†ļø Migrare de la versiunea originală (Zadam/Trilium)? + +Nu există pași speciali de a migra de la o instanță de zadam/Trilium. Pur și +simplu [instalați TriliumNext/Trilium](#-installation) Ć®n mod obișnuit și va +utiliza baza de date existentă. + +Versiunile pĆ¢nă la +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) inclusiv +sunt compatibile cu ultima versiune zadam/trilium, anume +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Toate +versiunile mai noi au versiune de sincronizare mai mare, ce previn migrarea +directă. + +## šŸ’¬ Discută cu noi + +Participați la canalele noastre oficiale. Ne-ar plăcea să știm ce funcții, +sugestii sau probleme aveți! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (pentru discuții Ć®n timp + real.) + - Camera de chat `General` se partajează și prin + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Discuții pe GitHub](https://github.com/TriliumNext/Trilium/discussions) + (pentru discuții de tip forum) +- [GitHub Issues](https://github.com/TriliumNext/Trilium/issues) (pentru + rapoarte de bug-uri și cereri de funcționalități.) + +## šŸ— Procesul de instalare + +### Windows / macOS + +Descărcați release-ul binar pentru platforma dvs. de pe pagina [ultimului +release](https://github.com/TriliumNext/Trilium/releases/latest), dezarhivați și +rulați executabilul `trilium`. + +### Linux + +Dacă distribuția dvs. de Linux este listată Ć®n tabelul de mai jos, puteți folosi +pachetul specific acelei distribuții. + +[![Stare +Ć®mpachetare](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) + +De asemenea puteți descărca release-ul binar de pe [pagina ultimului +release](https://github.com/TriliumNext/Trilium/releases/latest), dezarhivați +pachetul și rulați executabilul `trilium`. + +Trilium vine și sub formă de Flatpak, dar nu este Ć®ncă publicată pe FlatHub. + +### Navigator web (orice sistem de operare) + +Dacă folosiți varianta de server (vedeți mai jos), puteți accesa direct +interfața web (care este aproape identică aplicației desktop). + +Doar ultimele versiuni de Chrome și Firefox sunt suportate și testate. + +### Mobil + +Pentru a putea folosi Trilium pe mobil, puteți folosi un navigator web pentru a +putea accesa interfața de mobil a unei instalări server (vedeți mai jos). + +Consultați https://github.com/TriliumNext/Trilium/issues/4962 pentru mai multe +informații despre suportul aplicației de mobil. + +Dacă preferați o aplicație nativă de Android, puteți folosi +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Bug-urile și cererile de funcționalități pentru această aplicație trebuie +reportate la [repository-ul +lor](https://github.com/FliegendeWurst/TriliumDroid). Notă: este recomandat să +se dezactiveze update-urile automatizate la server (vedeți mai jos) deoarece +versiunea de sincronizare uneori rămĆ¢ne Ć®n urmă la aplicația de mobil. + +### Server + +Pentru a instala Trilium pe server (inclusiv prin Docker din +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)), urmați [documentația +de instalare a +server-ului](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Moduri de a contribui + +### Traduceri + +Dacă sunteți un vorbitor experimentat al unei alte limbi, ne puteți ajuta să +traduceți Trilium prin intermediul +[Weblate](https://hosted.weblate.org/engage/trilium/). + +Aceasta este acoperirea traducerilor per limbă: + +[![Starea +traducerilor](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### Cod + +Descărcați repository-ul, instalați dependențele folosind `pnpm` și apoi rulați +server-ul (disponibil la http://localhost:8080): +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### Documentație + +Descărcați repository-ul, instalați dependințele folosind `pnpm` și apoi rulați +mediul de editare a documentației: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### Compilarea executabilului +Descărcați repository-ul, instalați dependințele utilizĆ¢nd `pnpm` și compilați +aplicația de desktop pentru Windows: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +Pentru mai multe detalii, vedeți [documentația pentru +dezvoltare](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Documentația pentru dezvoltatori + +Urmărți +[documentația](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +pentru mai multe detalii. Dacă aveți Ć®ntrebări, puteți să ne contactați folosind +legăturile descrise Ć®n secțiunea ā€žDiscutați cu noiā€ de mai sus. + +## šŸ‘ Mențiuni + +* [zadam](https://github.com/zadam) pentru conceptul și implementarea originală + a aplicației. +* [Sarah Hussein](https://github.com/Sarah-Hussein) pentru proiectarea + pictogramei aplicației. +* [nriver](https://github.com/nriver) pentru sistemul de internaționalizare. +* [Thomas Frei](https://github.com/thfrei) pentru munca sa originală pentru + notițele de tip schiță. +* [antoniotejada](https://github.com/nriver) pentru implementarea originală a + widget-ului de evidențiere al sintaxei. +* [Dosu](https://dosu.dev/) pentru răspunsurile automate la issue-urile de pe + GitHub și discuții. +* [Tabler Icons](https://tabler.io/icons) pentru iconițele din bara de sistem. + +Trilium nu ar fi fost posibil fără tehnologiile pe care este bazat: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - editorul vizual din + spatele notițelor de tip text. Suntem recunoscători pentru setul de + funcționalități premium. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - editorul de cod cu + suport pentru foarte multe limbaje de programare. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - tehnologia de + desenare folosită Ć®n notițele de tip schiță. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - pentru + funcționalitatea de tip hartă mentală. +* [Leaflet](https://github.com/Leaflet/Leaflet) - pentru randarea hărților + geografice. +* [Tabulator](https://github.com/olifolkerd/tabulator) - pentru tabele + interactive folosite Ć®n colecții. +* [FancyTree](https://github.com/mar10/fancytree) - bibliotecă pentru + vizualizare de tip arbore. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - bibliotecă de conectivitate + vizuală. Folosită Ć®n [hărți de tip + relație](https://triliumnext.github.io/Docs/Wiki/relation-map.html) și [hărți + de legături](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) + +## šŸ¤ Sprijiniți proiectul + +Trilium este construit și menținut prin efortul [a sute de ore de +muncă](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Sprijinul +dvs. permite să-l menținem open-source, să Ć®mbunătățim funcționalitățile și să +acoperim costuri suplimentare precum găzduirea. + +Considerați sprijinirea dezvoltatorului principal al aplicației +([eliandoran](https://github.com/eliandoran)) prin intermediul: + +- [Sponsori GitHub](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ Licență + +Copyright 2017-2025 zadam, Elian Doran și alți contribuitori + +Acest program este liber: se poate redistribui și se poate modifica sub termenii +licenței GNU Affero General Public License publicată de către Free Software +Foundation, fie versiunea 3 a licenței sau (Ć®n funcție de preferință) orice +versiune ulterioară. diff --git a/docs/README-ru.md b/docs/README-ru.md new file mode 100644 index 000000000..d7d5af43f --- /dev/null +++ b/docs/README-ru.md @@ -0,0 +1,334 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +Trilium Notes – ŃŃ‚Š¾ приложение Š“Š»Ń заметок с иерархической ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Š¾Š¹, +ориентированное на созГание Š±Š¾Š»ŃŒŃˆŠøŃ… ŠæŠµŃ€ŃŠ¾Š½Š°Š»ŃŒŠ½Ń‹Ń… баз знаний. + +Š”Š»Ń быстрого Š¾Š·Š½Š°ŠŗŠ¾Š¼Š»ŠµŠ½ŠøŃ посмотрите +[ŃŠŗŃ€ŠøŠ½ŃˆŠ¾Ń‚-тур](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Š”Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†ŠøŃ + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ Возможности + +* Заметки можно Ń€Š°ŃŠæŠ¾Š»Š¾Š¶ŠøŃ‚ŃŒ в виГе Герева ŠæŃ€Š¾ŠøŠ·Š²Š¾Š»ŃŒŠ½Š¾Š¹ Š³Š»ŃƒŠ±ŠøŠ½Ń‹. ŠžŃ‚Š“ŠµŠ»ŃŒŠ½ŃƒŃŽ + Š·Š°Š¼ŠµŃ‚ŠŗŃƒ можно Ń€Š°Š·Š¼ŠµŃŃ‚ŠøŃ‚ŃŒ в Š½ŠµŃŠŗŠ¾Š»ŃŒŠŗŠøŃ… местах Герева (см. + [клонирование](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* ŠŸŃ€Š¾Š“Š²ŠøŠ½ŃƒŃ‚Ń‹Š¹ Š²ŠøŠ·ŃƒŠ°Š»ŃŒŠ½Ń‹Š¹ реГактор (WYSIWYG) ŠæŠ¾Š·Š²Š¾Š»ŃŠµŃ‚ Ń€Š°Š±Š¾Ń‚Š°Ń‚ŃŒ с таблицами, + ŠøŠ·Š¾Š±Ń€Š°Š¶ŠµŠ½ŠøŃŠ¼Šø, [Ń„Š¾Ń€Š¼ŃƒŠ»Š°Š¼Šø](https://triliumnext.github.io/Docs/Wiki/text-notes) + Šø разметкой markdown, имеет + [автоформатирование](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* РеГактирование [заметок с исхоГным + коГом](https://triliumnext.github.io/Docs/Wiki/code-notes), Š²ŠŗŠ»ŃŽŃ‡Š°Ń ŠæŠ¾Š“ŃŠ²ŠµŃ‚ŠŗŃƒ + синтаксиса +* Š‘Ń‹ŃŃ‚Ń€Š°Ń Šø ŠæŃ€Š¾ŃŃ‚Š°Ń [Š½Š°Š²ŠøŠ³Š°Ń†ŠøŃ межГу + заметками](https://triliumnext.github.io/Docs/Wiki/note-navigation), + полнотекстовый поиск Šø [выГеление + заметок](https://triliumnext.github.io/Docs/Wiki/note-hoisting) в Š¾Ń‚Š“ŠµŠ»ŃŒŠ½Ń‹Š¹ + блок +* Š‘ŠµŃŃˆŠ¾Š²Š½Š¾Šµ [версионирование + заметки](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Š”ŠæŠµŃ†ŠøŠ°Š»ŃŒŠ½Ń‹Šµ [Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Ń‹](https://triliumnext.github.io/Docs/Wiki/attributes) + ŠæŠ¾Š·Š²Š¾Š»ŃŃŽŃ‚ гибко Š¾Ń€Š³Š°Š½ŠøŠ·Š¾Š²Š°Ń‚ŃŒ ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Ńƒ, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃŽŃ‚ŃŃ Š“Š»Ń поиска Šø ŠæŃ€Š¾Š“Š²ŠøŠ½ŃƒŃ‚Š¾Š³Š¾ + [скриптинга](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 +* [Š”ŠøŠ½Ń…Ń€Š¾Š½ŠøŠ·Š°Ń†ŠøŃ](https://triliumnext.github.io/Docs/Wiki/synchronization) + заметок со своим сервером + * 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 +* ŠŠ°Š“Ń‘Š¶Š½Š¾Šµ [ŃˆŠøŃ„Ń€Š¾Š²Š°Š½ŠøŠµ](https://triliumnext.github.io/Docs/Wiki/protected-notes) + с Гетализацией по кажГой заметке +* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type + "canvas") +* [ŠšŠ°Ń€Ń‚Ń‹ ŃŠ²ŃŠ·ŠµŠ¹](https://triliumnext.github.io/Docs/Wiki/relation-map) Šø [карты + ссылок](https://triliumnext.github.io/Docs/Wiki/link-map) Š“Š»Ń Š²ŠøŠ·ŃƒŠ°Š»ŠøŠ·Š°Ń†ŠøŠø ŠøŃ… + Š²Š·ŃŠøŠ¼Š¾ŃŠ²ŃŠ·ŠµŠ¹ +* 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 +* [Дкрипты](https://triliumnext.github.io/Docs/Wiki/scripts) - см. [ŠæŃ€Š¾Š“Š²ŠøŠ½ŃƒŃ‚Ń‹Šµ + примеры](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation +* Š„Š¾Ń€Š¾ŃˆŠ¾ Š¼Š°ŃŃˆŃ‚Š°Š±ŠøŃ€ŃƒŠµŃ‚ŃŃ, как по ŃƒŠ“Š¾Š±ŃŃ‚Š²Ńƒ ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Š½ŠøŃ, так Šø по + ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚Šø Го 100000 заметок +* ŠžŠæŃ‚ŠøŠ¼ŠøŠ·ŠøŃ€Š¾Š²Š°Š½Š½Ń‹Š¹ [Š¼Š¾Š±ŠøŠ»ŃŒŠ½Ń‹Š¹ + фронтенГ](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) смартфонов + Šø ŠæŠ»Š°Š½ŃˆŠµŃ‚Š¾Š² +* [Š¢ŠµŠ¼Š½Š°Ń тема](https://triliumnext.github.io/Docs/Wiki/themes) +* Š˜Š¼ŠæŠ¾Ń€Ń‚ Šø ŃŠŗŠæŠ¾Ń€Ń‚ + [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) Šø Ганных в + [markdown](https://triliumnext.github.io/Docs/Wiki/markdown) формате +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) Š“Š»Ń + уГобного ŃŠ¾Ń…Ń€Š°Š½ŠµŠ½ŠøŃ веб-контента +* 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Дборки + +### Windows / macOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Š£Ń‡Š°ŃŃ‚Š²ŃƒŠ¹Ń‚Šµ в разработке + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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. + +## šŸ‘ БлагоГарности + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ Š›ŠøŃ†ŠµŠ½Š·ŠøŃ + +Copyright 2017-2025 zadam, Elian Doran Šø Š“Ń€ŃƒŠ³ŠøŠµ авторы + +Эта программа ŃŠ²Š»ŃŠµŃ‚ŃŃ бесплатным программным обеспечением: вы можете +Ń€Š°ŃŠæŃ€Š¾ŃŃ‚Ń€Š°Š½ŃŃ‚ŃŒ Šø/или ŠøŠ·Š¼ŠµŠ½ŃŃ‚ŃŒ ее в соответствии с ŃƒŃŠ»Š¾Š²ŠøŃŠ¼Šø GNU Affero General +Public License, опубликованной Free Software Foundation, либо версии 3 Лицензии, +либо (по вашему Š²Ń‹Š±Š¾Ń€Ńƒ) Š»ŃŽŠ±Š¾Š¹ более позГней версии. diff --git a/docs/README-sl.md b/docs/README-sl.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-sl.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-sr.md b/docs/README-sr.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-sr.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-sv.md b/docs/README-sv.md new file mode 100644 index 000000000..262f13a24 --- /dev/null +++ b/docs/README-sv.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[Engelska](./README.md) | [Kinesiska (Fƶrenklad)](./docs/README-ZH_CN.md) | +[Kinesiska (Traditionell)](./docs/README-ZH_TW.md) | +[Ryska](./docs/README-ru.md) | [Japanska](./docs/README-ja.md) | +[Italienska](./docs/README-it.md) | [Spanska](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-tr.md b/docs/README-tr.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-tr.md @@ -0,0 +1,332 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +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: + +Trilium Screenshot + +## ā¬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## šŸ“š Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./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) +- [Basic Concepts and + Features](./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) + +## šŸŽ 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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-uk.md b/docs/README-uk.md new file mode 100644 index 000000000..e9981d471 --- /dev/null +++ b/docs/README-uk.md @@ -0,0 +1,333 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![Дпонсори GitHub](https://img.shields.io/github/sponsors/eliandoran) +![ŠšŠ¾Ń€ŠøŃŃ‚ŃƒŠ²Š°Ń‡Ń– LiberaPay](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![Š—Š°Š²Š°Š½Ń‚Š°Š¶ŠµŠ½Š½Ń GitHub (всі Ń€ŠµŃŃƒŃ€ŃŠø, всі +релізи)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Š”Ń‚Š°Ń‚ŃƒŃ +ŠæŠµŃ€ŠµŠŗŠ»Š°Š“Ńƒ](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +Trilium Notes — це Š±ŠµŠ·ŠŗŠ¾ŃˆŃ‚овний кросплатформний ієрархічний ГоГаток Š“Š»Ń Š²ŠµŠ“ŠµŠ½Š½Ń +нотаток Š· віГкритим коГом, орієнтований на ŃŃ‚Š²Š¾Ń€ŠµŠ½Š½Ń великих ŠæŠµŃ€ŃŠ¾Š½Š°Š»ŃŒŠ½ŠøŃ… баз +знань. + +Див. [ŃŠŗŃ€Ń–Š½ŃˆŠ¾Ń‚Šø](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) Š“Š»Ń +швиГкого ŠæŠµŃ€ŠµŠ³Š»ŃŠ“Ńƒ: + +Trilium Screenshot + +## ā¬ Завантажити +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + ŃŃ‚Š°Š±Ń–Š»ŃŒŠ½Š° Š²ŠµŃ€ŃŃ–Ń, рекоменГована Š“Š»Ń Š±Ń–Š»ŃŒŃˆŠ¾ŃŃ‚Ń– ŠŗŠ¾Ń€ŠøŃŃ‚ŃƒŠ²Š°Ń‡Ń–Š². +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + Š½ŠµŃŃ‚Š°Š±Ń–Š»ŃŒŠ½Š° Š²ŠµŃ€ŃŃ–Ń Š“Š»Ń розробників, Ń‰Š¾Š“Š½Ń Š¾Š½Š¾Š²Š»ŃŽŃ”Ń‚ŃŒŃŃ Š½Š°Š¹Š½Š¾Š²Ń–ŃˆŠøŠ¼Šø Ń„ŃƒŠ½ŠŗŃ†Ń–ŃŠ¼Šø та + Š²ŠøŠæŃ€Š°Š²Š»ŠµŠ½Š½ŃŠ¼Šø. + +## šŸ“š Š”Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†Ń–Ń + +**ВіГвіГайте нашу Š²ŠøŃ‡ŠµŃ€ŠæŠ½Ńƒ Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†Ń–ŃŽ за Š°Š“Ń€ŠµŃŠ¾ŃŽ +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +ŠŠ°ŃˆŠ° Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†Ń–Ń Š“Š¾ŃŃ‚ŃƒŠæŠ½Š° в ŠŗŃ–Š»ŃŒŠŗŠ¾Ń… форматах: +- **ŠžŠ½Š»Š°Š¹Š½-Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†Ń–Ń**: ŠŸŠµŃ€ŠµŠ³Š»ŃŠ½ŃŒŃ‚Šµ повну Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†Ń–ŃŽ на сайті + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **ДовіГка в Š“Š¾Š“Š°Ń‚ŠŗŃƒ**: ŠŠ°Ń‚ŠøŃŠ½Ń–Ń‚ŃŒ `F1` у Trilium, щоб отримати Š“Š¾ŃŃ‚ŃƒŠæ Го тієї ж + Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†Ń–Ń— Š±ŠµŠ·ŠæŠ¾ŃŠµŃ€ŠµŠ“Š½ŃŒŠ¾ в Š“Š¾Š“Š°Ń‚ŠŗŃƒ +- **GitHub**: ŠŸŠµŃ€ŠµŠ³Š»ŃŠ“ [ŠŸŠ¾ŃŃ–Š±Š½ŠøŠŗŠ° + ŠŗŠ¾Ń€ŠøŃŃ‚ŃƒŠ²Š°Ń‡Š°](./docs/User%20Guide/User%20Guide/) у Ń†ŃŒŠ¾Š¼Ńƒ репозиторії + +### ШвиГкі ŠæŠ¾ŃŠøŠ»Š°Š½Š½Ń +- [ŠŸŠ¾ŃŃ–Š±Š½ŠøŠŗ Ń–Š· ŠæŠ¾Ń‡Š°Ń‚ŠŗŃƒ роботи](https://docs.triliumnotes.org/) +- [Š†Š½ŃŃ‚Ń€ŃƒŠŗŃ†Ń–Ń— Š· + Š²ŃŃ‚Š°Š½Š¾Š²Š»ŠµŠ½Š½Ń](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [ŠŠ°Š»Š°ŃˆŃ‚ŃƒŠ²Š°Š½Š½Ń + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [ŠžŠ½Š¾Š²Š»ŠµŠ½Š½Ń + TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [ŠžŃŠ½Š¾Š²Š½Ń– ŠæŠ¾Š½ŃŃ‚Ń‚Ń та + Ń„ŃƒŠ½ŠŗŃ†Ń–Ń—](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Шаблони особистої бази + знань](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ ŠœŠ¾Š¶Š»ŠøŠ²Š¾ŃŃ‚Ń– + +* ŠŠ¾Ń‚Š°Ń‚ŠŗŠø можна Ń€Š¾Š·Ń‚Š°ŃˆŃƒŠ²Š°Ń‚Šø в Герево Š“Š¾Š²Ń–Š»ŃŒŠ½Š¾Ń— глибини. ŠžŠ“Š½Ńƒ Š½Š¾Ń‚Š°Ń‚ŠŗŃƒ можна + розмістити в ŠŗŃ–Š»ŃŒŠŗŠ¾Ń… Š¼Ń–ŃŃ†ŃŃ… Герева (Гив. + [ŠŗŠ»Š¾Š½ŃƒŠ²Š°Š½Š½Ń](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Багатий WYSIWYG-реГактор нотаток, Š²ŠŗŠ»ŃŽŃ‡Š°ŃŽŃ‡Šø, наприклаГ, таблиці, Š·Š¾Š±Ń€Š°Š¶ŠµŠ½Š½Ń та + [Š¼Š°Ń‚ŠµŠ¼Š°Ń‚ŠøŠŗŃƒ](https://triliumnext.github.io/Docs/Wiki/text-notes) Š· markdown + [автоформат](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* ŠŸŃ–Š“Ń‚Ń€ŠøŠ¼ŠŗŠ° Ń€ŠµŠ“Š°Š³ŃƒŠ²Š°Š½Š½Ń [нотатки Š· вихіГним + коГом](https://triliumnext.github.io/Docs/Wiki/code-notes), Š²ŠŗŠ»ŃŽŃ‡Š°ŃŽŃ‡Šø + ŠæŃ–Š“ŃŠ²Ń–Ń‡ŃƒŠ²Š°Š½Š½Ń ŃŠøŠ½Ń‚Š°ŠŗŃŠøŃŃƒ +* ШвиГка та проста [Š½Š°Š²Ń–Š³Š°Ń†Ń–Ń між + нотатками](https://triliumnext.github.io/Docs/Wiki/note-navigation), + повнотекстовий пошук та [хостінг + нотаток](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Š‘ŠµŠ·ŃˆŠ¾Š²Š½Šµ [ŠŗŠµŃ€ŃƒŠ²Š°Š½Š½Ń Š²ŠµŃ€ŃŃ–ŃŠ¼Šø + нотаток](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* [ŠŃ‚Ń€ŠøŠ±ŃƒŃ‚Šø](https://triliumnext.github.io/Docs/Wiki/attributes) нотатки можна + Š²ŠøŠŗŠ¾Ń€ŠøŃŃ‚Š¾Š²ŃƒŠ²Š°Ń‚Šø Š“Š»Ń організації нотаток, запитів та Ń€Š¾Š·ŃˆŠøŃ€ŠµŠ½Š¾Š³Š¾ + [ŃŃ€ŠøŠæŃ‚Ń–Š½Š³Ńƒ](https://triliumnext.github.io/Docs/Wiki/scripts) +* Інтерфейс ŠŗŠ¾Ń€ŠøŃŃ‚ŃƒŠ²Š°Ń‡Š° Š“Š¾ŃŃ‚ŃƒŠæŠ½ŠøŠ¹ Š°Š½Š³Š»Ń–Š¹ŃŃŒŠŗŠ¾ŃŽ, Š½Ń–Š¼ŠµŃ†ŃŒŠŗŠ¾ŃŽ, Ń–ŃŠæŠ°Š½ŃŃŒŠŗŠ¾ŃŽ, + Ń„Ń€Š°Š½Ń†ŃƒŠ·ŃŒŠŗŠ¾ŃŽ, Ń€ŃƒŠ¼ŃƒŠ½ŃŃŒŠŗŠ¾ŃŽ та ŠŗŠøŃ‚Š°Š¹ŃŃŒŠŗŠ¾ŃŽ (ŃŠæŃ€Š¾Ń‰ŠµŠ½Š¾ŃŽ та Ń‚Ń€Š°Š“ŠøŃ†Ń–Š¹Š½Š¾ŃŽ) мовами +* ŠŸŃ€ŃŠ¼Š° [OpenID та TOTP + Ń–Š½Ń‚ŠµŠ³Ń€Š°Ń†Ń–Ń](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + Š“Š»Ń Š±ŠµŠ·ŠæŠµŃ‡Š½Ń–ŃˆŠ¾Š³Š¾ Š²Ń…Š¾Š“Ńƒ +* [Š”ŠøŠ½Ń…Ń€Š¾Š½Ń–Š·Š°Ń†Ń–Ń](https://triliumnext.github.io/Docs/Wiki/synchronization) Ń–Š· + власним сервером синхронізації + * Ń–ŃŠ½ŃƒŃ” [сторонній сервіс Š“Š»Ń Ń€Š¾Š·Š¼Ń–Ń‰ŠµŠ½Š½Ń сервера + синхронізації](https://trilium.cc/paid-hosting) +* [Š”ŠæŃ–Š»ŃŒŠ½Šµ Š²ŠøŠŗŠ¾Ń€ŠøŃŃ‚Š°Š½Š½Ń](https://triliumnext.github.io/Docs/Wiki/sharing) + (ŠæŃƒŠ±Š»Ń–ŠŗŠ°Ń†Ń–Ń) нотаток у Š·Š°Š³Š°Š»ŃŒŠ½Š¾Š“Š¾ŃŃ‚ŃƒŠæŠ½Š¾Š¼Ńƒ інтернеті +* ŠŠ°Š“Ń–Š¹Š½Šµ [ŃˆŠøŃ„Ń€ŃƒŠ²Š°Š½Š½Ń + нотаток](https://triliumnext.github.io/Docs/Wiki/protected-notes) Š· + Š“ŠµŃ‚Š°Š»Ń–Š·Š°Ń†Ń–Ń”ŃŽ Š“Š»Ń кожної нотатки +* Š”Ń‚Š²Š¾Ń€ŠµŠ½Š½Ń ескізних схем на основі [Excalidraw](https://excalidraw.com/) (тип + нотатки "полотно") +* [ŠšŠ°Ń€Ń‚Šø зв'ŃŠ·ŠŗŃ–Š²](https://triliumnext.github.io/Docs/Wiki/relation-map) та + [карти посилань](https://triliumnext.github.io/Docs/Wiki/link-map) Š“Š»Ń + Š²Ń–Š·ŃƒŠ°Š»Ń–Š·Š°Ń†Ń–Ń— нотаток та їх зв'ŃŠ·ŠŗŃ–Š² +* Інтелект-карти, засновані на [Mind Elixir](https://docs.mind-elixir.com/) +* [Геокарти](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) Š· + географічними позначками та GPX-треками +* [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 developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ā¬†ļøMigrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/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/Trilium have their sync versions incremented which +prevents direct migration. + +## šŸ’¬ 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.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## šŸ— Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README-vi.md b/docs/README-vi.md new file mode 100644 index 000000000..b2a507a27 --- /dev/null +++ b/docs/README-vi.md @@ -0,0 +1,335 @@ +
    + Special thanks to:
    + + Warp sponsorship
    + Warp, built for coding with multiple AI agents
    +
    + Available for macOS, Linux and Windows +
    + +
    + +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (mį»i tĆ i nguyĆŖn, mį»i bįŗ£n phĆ”t +hĆ nh)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![TƬnh trįŗ”ng dịch +thuįŗ­t](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[Tiįŗæng Anh](./README.md) | [Tiįŗæng Trung (Giįŗ£n thể)](./docs/README-ZH_CN.md) | +[Tiįŗæng Trung (Phồn thể)](./docs/README-ZH_TW.md) | [Tiįŗæng +Nga](./docs/README-ru.md) | [Tiįŗæng Nhįŗ­t](./docs/README-ja.md) | [Tiįŗæng +Ɲ](./docs/README-it.md) | [Tiįŗæng TĆ¢y Ban Nha](./docs/README-es.md) + +Trilium Notes lĆ  mį»™t ứng dỄng ghi chĆŗ phĆ¢n cįŗ„p miį»…n phĆ­, mĆ£ nguồn mở, đa nền +tįŗ£ng tįŗ­p trung vĆ o việc xĆ¢y dį»±ng cĘ” sở tri thức cĆ” nhĆ¢n lį»›n. + +Xem [įŗ£nh chỄp mĆ n hƬnh](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) +Ä‘į»ƒ tổng quan nhanh: + +Trilium Screenshot + +## ā¬ Tįŗ£i xuống +- [Bįŗ£n phĆ”t hĆ nh mį»›i + nhįŗ„t](https://github.com/TriliumNext/Trilium/releases/latest) – phiĆŖn bįŗ£n ổn + định, được khuyĆŖn dùng cho hįŗ§u hįŗæt ngĘ°į»i dùng. +- [Bįŗ£n dį»±ng + nightly](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – phiĆŖn + bįŗ£n phĆ”t triển kĆ©m ổn định, được cįŗ­p nhįŗ­t hĆ ng ngĆ y vį»›i cĆ”c tĆ­nh năng mį»›i nhįŗ„t + vĆ  sį»­a lį»—i. + +## šŸ“š TĆ i Liệu + +**Truy cįŗ­p tĆ i liệu toĆ n diện cį»§a chĆŗng tĆ“i tįŗ”i +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +TĆ i liệu cį»§a chĆŗng tĆ“i có sįŗµn ở nhiều định dįŗ”ng: +- **TĆ i liệu trį»±c tuyįŗæn**: Xem tĆ i liệu đầy đủ tįŗ”i + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **Trợ giĆŗp trong ứng dỄng**: Nhįŗ„n `F1` trong Trilium Ä‘į»ƒ truy cįŗ­p tĆ i liệu + tʰʔng tį»± trį»±c tiįŗæp trong ứng dỄng +- **Github**: Đi đến [Hướng dįŗ«n sį»­ dỄng] trong kho lʰu trữ nĆ y + +### LiĆŖn Kįŗæt Nhanh +- [Hướng Dįŗ«n BįŗÆt Đầu](https://docs.triliumnotes.org/) +- [Hướng Dįŗ«n CĆ i + Đặt](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Thiįŗæt Lįŗ­p + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Cįŗ­p Nhįŗ­t + TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [KhĆ”i Niệm VĆ  Chức Năng CĘ” + Bįŗ£n](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [CĆ”c Mįŗ«u CĘ” Sở Tri Thức CĆ” + NhĆ¢n](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## šŸŽ Chức Năng + +* CĆ”c ghi chĆŗ có thể được sįŗÆp xįŗæp thĆ nh cĆ¢y có độ sĆ¢u bįŗ„t kỳ. Mį»™t ghi chĆŗ có thể + được đặt vĆ o nhiều nĘ”i trong cĆ¢y (xem + [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* TrƬnh soįŗ”n thįŗ£o ghi chĆŗ WYSIWYG đầy đủ tĆ­nh năng, hį»— trợ bįŗ£ng, hƬnh įŗ£nh, vĆ  + [toĆ”n hį»c](https://triliumnext.github.io/Docs/Wiki/text-notes); đồng thį»i [tį»± + động định dįŗ”ng](https://triliumnext.github.io/Docs/Wiki/text-notes) sang + markdown +* Hį»— trợ chỉnh sį»­a [ghi chĆŗ chứa mĆ£ + nguồn](https://triliumnext.github.io/Docs/Wiki/code-notes), kĆØm tĆ“ sĆ”ng cĆŗ + phĆ”p +* [Điều hướng giữa cĆ”c ghi + chĆŗ](https://triliumnext.github.io/Docs/Wiki/note-navigation) nhanh vĆ  dį»… + dĆ ng, tƬm kiįŗæm toĆ n văn vĆ  [note + hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Quįŗ£n lý [phiĆŖn bįŗ£n ghi + chĆŗ](https://triliumnext.github.io/Docs/Wiki/note-revisions) mượt mĆ  +* [CĆ”c thuį»™c tĆ­nh](https://triliumnext.github.io/Docs/Wiki/attributes) ghi chĆŗ + có thể được dùng cho việc tổ chức, truy xuįŗ„t vĆ  [viįŗæt + script](https://triliumnext.github.io/Docs/Wiki/scripts) nĆ¢ng cao +* Giao diện sįŗµn có cho Tiįŗæng Anh, Tiįŗæng Đức, Tiįŗæng TĆ¢y Ban Nha, Tiįŗæng PhĆ”p, + Tiįŗæng Rumani, vĆ  Tiįŗæng Trung (giįŗ£n thể vĆ  phồn thể) +* [TĆ­ch hợp OpenID vĆ  + TOTP](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + trį»±c tiįŗæp Ä‘į»ƒ đăng nhįŗ­p bįŗ£o mįŗ­t hĘ”n +* [Đồng bį»™ hóa](https://triliumnext.github.io/Docs/Wiki/synchronization) vį»›i mĆ”y + chį»§ đồng bį»™ tį»± triển khai + * có mį»™t [dịch vỄ bĆŖn thứ ba Ä‘į»ƒ lʰu trữ mĆ”y chį»§ đồng bį»™ + hóa](https://trilium.cc/paid-hosting) +* [Chia sįŗ»](https://triliumnext.github.io/Docs/Wiki/sharing) (cĆ“ng bố) cĆ”c ghi + chĆŗ lĆŖn mįŗ”ng Internet cĆ“ng cį»™ng +* [MĆ£ hóa ghi chĆŗ](https://triliumnext.github.io/Docs/Wiki/protected-notes) mįŗ”nh + mįŗ½ vį»›i mức chi tiįŗæt đến từng ghi chĆŗ +* PhĆ”c thįŗ£o sĘ” đồ, dį»±a trĆŖn [Excalidraw](https://excalidraw.com/) (loįŗ”i ghi chĆŗ + "canvas") +* [Bįŗ£n đồ quan hệ](https://triliumnext.github.io/Docs/Wiki/relation-map) vĆ  [bįŗ£n + đồ liĆŖn kįŗæt](https://triliumnext.github.io/Docs/Wiki/link-map) Ä‘į»ƒ trį»±c quan + hóa cĆ”c ghi chĆŗ vĆ  mối quan hệ giữa chĆŗng +* SĘ” đồ tʰ duy, dį»±a trĆŖn [Mind Elixir](https://docs.mind-elixir.com/) +* [Bįŗ£n đồ địa lý](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) + vį»›i cĆ”c chįŗ„m chỉ vị trĆ­ vĆ  cĆ”c Ä‘Ę°į»ng GPX +* [Viįŗæt script](https://triliumnext.github.io/Docs/Wiki/scripts) - xem [MỄc + trʰng bĆ y nĆ¢ng + cao](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) cho tį»± động hóa +* Mở rį»™ng tốt về cįŗ£ khįŗ£ năng sį»­ dỄng vĆ  hiệu năng lĆŖn đến 100.000 ghi chĆŗ +* Tối ʰu hóa cįŗ£m ứng [mobile + frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) cho điện + thoįŗ”i thĆ“ng minh vĆ  mĆ”y tĆ­nh bįŗ£ng +* TĆ­ch hợp sįŗµn [giao diện tối](https://triliumnext.github.io/Docs/Wiki/themes), + hį»— trợ giao diện do ngĘ°į»i dùng tùy chỉnh +* Hį»— trợ nhįŗ­p, xuįŗ„t cho + [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) vĆ  + [Markdown](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) Ä‘į»ƒ lʰu trữ + nį»™i dung web dį»… dĆ ng +* Giao diện tùy biįŗæn (nĆŗt thanh bĆŖn, widget do ngĘ°į»i dùng tį»± tįŗ”o,...) +* [CĆ”c thĆ“ng số](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), + cùng vį»›i mį»™t [Bįŗ£ng điều khiển + Grafana](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ HĆ£y xem thį»­ cĆ”c nguồn tĆ i nguyĆŖn/cį»™ng đồng bĆŖn thứ ba dưới đây Ä‘į»ƒ tƬm thĆŖm +nhiều tiện Ć­ch liĆŖn quan đến TriliumNext: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) cho cĆ”c chį»§ đề, + script, plugin vĆ  nhiều hĘ”n nữa. +- [TriliumRocks!](https://trilium.rocks/) cho những hướng dįŗ«n, vĆ  nhiều hĘ”n. + +## ā“Tįŗ”i sao lĆ  TriliumNext? + +NgĘ°į»i phĆ”t triển ban đầu cį»§a Trilium ([Zadam](https://github.com/zadam)) đã hĆ o +phóng tįŗ·ng kho lʰu trữ Trilium cho dį»± Ć”n cį»™ng đồng, hiện đang đặt tįŗ”i +https://github.com/TriliumNext + +### ā¬†ļø Chuyển từ Zadam/Trilium? + +KhĆ“ng cįŗ§n những bước chuyển đặc biệt nĆ o Ä‘į»ƒ chuyển từ zadam/Trilium sang +TriliumNext/Trilium. Đʔn giįŗ£n chỉ cįŗ§n [cĆ i đặt +TriliumNext/Trilium](#-installation) nhʰ thĆ“ng thĘ°į»ng vĆ  nó sįŗ½ sį»­ dỄng cĘ” sở dữ +liệu sįŗµn có cį»§a bįŗ”n. + +CĆ”c phiĆŖn bįŗ£n trước vĆ  bao gồm +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) đều tʰʔng +thĆ­ch vį»›i phiĆŖn bįŗ£n mį»›i nhįŗ„t cį»§a zadam/trilium +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). CĆ”c phiĆŖn bįŗ£n +sau đó cį»§a TriliumNext/Trilium đã tăng phiĆŖn bįŗ£n đồng bį»™, khiįŗæn việc chuyển sang +trį»±c tiįŗæp khĆ“ng còn khįŗ£ thi. + +## šŸ’¬ Thįŗ£o luįŗ­n cùng chĆŗng tĆ“i + +HĆ£y thoįŗ£i mĆ”i tham gia cĆ”c cuį»™c trò chuyện chĆ­nh thức. ChĆŗng tĆ“i luĆ“n muốn lįŗÆng +nghe cĆ”c tĆ­nh năng, đề xuįŗ„t hoįŗ·c vįŗ„n đề mĆ  bįŗ”n đʰa ra! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Cho những thįŗ£o luįŗ­n + đồng bį»™ thį»i gian thį»±c.) + - Phòng `General` trong Matrix cÅ©ng được kįŗæt nối tį»›i + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (Cho + những thįŗ£o luįŗ­n khĆ“ng đồng bį»™.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (Cho việc bĆ”o + cĆ”o lį»—i vĆ  yĆŖu cįŗ§u tĆ­nh năng.) + +## šŸ— CĆ i Đặt + +### Windows / MacOS + +Tįŗ£i bįŗ£n phĆ”t hĆ nh nhị phĆ¢n cho nền tįŗ£ng cį»§a bįŗ”n từ [trang phĆ”t hĆ nh mį»›i +nhįŗ„t](https://github.com/TriliumNext/Trilium/releases/latest), giįŗ£i nĆ©n gói vĆ  +chįŗ”y tệp thį»±c thi `trilium`. + +### Linux + +Nįŗæu bįŗ£n phĆ¢n phối cį»§a bįŗ”n được liệt kĆŖ trong bįŗ£ng dưới đẄy, hĆ£y dùng gói cĆ i đặt +cį»§a nó. + +[![TƬnh trįŗ”ng đóng +gói](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](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/Trilium/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 + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## šŸ’» Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### 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/Trilium.git +cd Trilium +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/Trilium.git +cd Trilium +pnpm install +pnpm 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/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/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 + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + 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) + +## šŸ¤ Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## šŸ”‘ 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/docs/README.es.md b/docs/README.es.md deleted file mode 100644 index 474239a8d..000000000 --- a/docs/README.es.md +++ /dev/null @@ -1,106 +0,0 @@ -# Trilium Notes - -[English](../README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) - -Trilium Notes es una aplicación de toma de notas jerĆ”rquicas multi-plataforma y de código libre con un enfoque en la construcción de grandes bases de conocimiento personal. - -Vea estas [capturas de pantalla](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) para un vistazo rĆ”pido: - -Trilium Screenshot - -## āš ļø ĀæPor quĆ© usar TriliumNext? - -[El proyecto Trilium original estĆ” en modo de mantenimiento](https://github.com/zadam/trilium/issues/4620) - -### ĀæCómo migrar desde Trilium? - -No hay pasos de migración especiales para migrar de una instancia de zadam/Trilium a una instancia de TriliumNext/Trilium. Simplemente actualice su instancia de Trilium a la Ćŗltima versión e [instale TriliumNext/Trilium como de costumbre](#-Instalación) - -## šŸ’¬ Discuta con nosotros - -SiĆ©ntase libre de unirse a nuestras conversaciones oficiales. Ā”Nos encantarĆ­a escuchar de las caracterĆ­sticas, sugerencias o problemas que pueda tener! - -- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Para discusiones sĆ­ncronas) - - La sala `General` es replicada a [XMPP](xmpp:discuss@trilium.thisgreat.party?join) -- [Discusiones de GitHub](https://github.com/TriliumNext/Trilium/discussions) (Para discusiones asĆ­ncronas) -- [Wiki](https://triliumnext.github.io/Docs/) (Para preguntas frecuentes y guĆ­as de usuario) - -## šŸŽ CaracterĆ­sticas - -- Las notas pueden ser acomodadas en un Ć”rbol de profundidad arbitraria. Una sola nota puede ser colocada en mĆŗltiples lugares del Ć”rbol (vea [clonar](https://triliumnext.github.io/Docs/Wiki/cloning-notes) -- Edición de notas WYSIWYG enriquecida que incluye, por ejemplo, tablas, imĆ”genes y [matemĆ”ticas](https://triliumnext.github.io/Docs/Wiki/text-notes) con [autoformato](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) markdown -- Soporte para editar [notas con código fuente](https://triliumnext.github.io/Docs/Wiki/code-notes), incluyendo resaltado de sintaxis -- RĆ”pida y sencilla [navegación entre notas](https://triliumnext.github.io/Docs/Wiki/note-navigation), bĆŗsqueda de texto completo y [elevación de notas](https://triliumnext.github.io/Docs/Wiki/note-hoisting) -- [Versionado de notas](https://triliumnext.github.io/Docs/Wiki/note-revisions) sutil -- Los [atributos](https://triliumnext.github.io/Docs/Wiki/attributes) de las notas pueden utilizarse para organización, realizar consultas y [scripts](https://triliumnext.github.io/Docs/Wiki/scripts) avanzados -- [Sincronización](https://triliumnext.github.io/Docs/Wiki/synchronization) con servidor de sincronización propio - - existe un [servicio de terceros para alojar el servidor de sincronización](https://trilium.cc/paid-hosting) -- [Compartir](https://triliumnext.github.io/Docs/Wiki/sharing) (publicar) notas al Internet pĆŗblico -- Fuerte [encriptación de notas](https://triliumnext.github.io/Docs/Wiki/protected-notes) con granularidad para cada nota -- Esbozo de diagramas con Excalidraw incorporado (tipo de nota Ā«canvasĀ») -- [Mapas de relaciones]() y [mapas de enlaces](https://triliumnext.github.io/Docs/Wiki/link-map) para visualizar las notas y sus relaciones -- [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - vea [casos de uso avanzados](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) -- [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) para automatización -- Escala bien tanto en uso como en rendimiento a partir de 100,000 notas -- [Interfaz móvil](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) optimizada para telĆ©fonos inteligentes y tabletas -- [Tema nocturno](https://triliumnext.github.io/Docs/Wiki/themes) -- Importación y exportación de [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) y [Markdown](https://triliumnext.github.io/Docs/Wiki/markdown) -- [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) para guardar fĆ”cilmente contenido web - -✨ Consulte los/las siguientes recursos/comunidades de terceros para obtener mĆ”s información sobre complementos para TriliumNext: - -- [awesome-trilium](https://github.com/Nriver/awesome-trilium) para temas, scripts, plugins y mĆ”s de terceros. -- [TriliumRocks!](https://trilium.rocks/) para tutoriales, guĆ­as y mucho mĆ”s. - -## šŸ— Instalación - -### Escritorio - -Para usar TriliumNext en su mĆ”quina de escritorio (Linux, MacOS y Windows) tiene algunas opciones: - -- Descargue la versión binaria para su plataforma desde la [pĆ”gina de lanzamientos](https://github.com/TriliumNext/Trilium/releases/latest), descomprima el paquete y ejecute el ejecutable `trilium`. -- Acceda a TriliumNext a travĆ©s de la interfaz web de una instalación de servidor (ver mĆ”s abajo) - - Actualmente solo las Ćŗltimas versiones de Chrome y Firefox son compatibles (y estĆ”n probadas). -- (Próximamente) TriliumNext tambiĆ©n se proporcionarĆ” como un Flatpak - -### Móvil - -Para usar TriliumNext en un dispositivo móvil: - -- Utilice un navegador web móvil para acceder a la interfaz móvil de una instalación de servidor (ver mĆ”s abajo) -- El uso de una aplicación móvil aĆŗn no estĆ” soportado ([vea aquĆ­](https://github.com/TriliumNext/Trilium/issues/72)) para seguir las mejoras móviles. - -### Servidor - -Para instalar TriliumNext en su servidor (incluyendo vĆ­a Docker desde [Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) siga la [documentación de instalación de servidor](https://triliumnext.github.io/Docs/Wiki/server-installation). - -## šŸ“ Documentación - -[Vea la Wiki para la lista completa de pĆ”ginas de documentación.](https://triliumnext.github.io/Docs) - -TambiĆ©n puede leer [Patrones para una base de conocimiento personal](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) para obtener un poco de inspiración de como podrĆ­a usar TriliumNext. - -## šŸ’» Contribuir - -Clone localmente y ejecute - -```shell -npm install -npm run server:start -``` - -## šŸ‘ Reconocimientos - -- [CKEditor 5](https://github.com/ckeditor/ckeditor5) - el mejor editor WYSIWYG en el mercado, equipo muy interactivo y atento -- [FancyTree](https://github.com/mar10/fancytree) - biblioteca de Ć”rbol muy rica en funciones sin competencia real. Trilium Notes no serĆ­a lo mismo sin esta. -- [CodeMirror](https://github.com/codemirror/CodeMirror) - editor de código con soporte para una gran cantidad de lenguajes -- [jsPlumb](https://github.com/jsplumb/jsplumb) - biblioteca de conectividad visual sin competencia. Usado en [mapas de relación](https://triliumnext.github.io/Docs/Wiki/Relation-map) y [mapas de enlace](https://triliumnext.github.io/Docs/Wiki/Link-map) - -## šŸ¤ Soporte - -Puede apoyar al desarrollador original de Trilium usando GitHub Sponsors, [PayPal](https://paypal.me/za4am) o Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). -Apoyo para la organización TriliumNext serĆ” posible en un futuro próximo. - -## šŸ”‘ Licencia - -Este programa es software libre: puede redistribuirlo y/o modificarlo bajo los tĆ©rminos de la Licencia PĆŗblica General de Affero GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia, o (a su elección) cualquier versión posterior. diff --git a/docs/README.it.md b/docs/README.it.md deleted file mode 100644 index 5c8a15424..000000000 --- a/docs/README.it.md +++ /dev/null @@ -1,93 +0,0 @@ -# Trilium Notes - -[English](../README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) - -Trilium Notes ĆØ un'applicazione per appunti ad organizzazione gerarchica, studiata per la costruzione di archivi di conoscenza personali di grandi dimensioni. - -Vedi [fotografie](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) per una panoramica veloce: - -Trilium Screenshot - -## āš ļø PerchĆØ TriliumNext? -[Il progetto originale Trilium ĆØ in modalitĆ  di manutenzione](https://github.com/zadam/trilium/issues/4620) - -## šŸ—­ Discuti con noi -Sentiti libero di unirti alle nostre discussioni ufficiali e alla nostra comunitĆ . Siamo concentrati sullo sviluppo di Trilium e ci piacerebbe sapere quali funzioni, suggerimenti o eventuali problemi hai! - -- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (Per discussioni sincrone) -- [Discussioni Github](https://github.com/TriliumNext/Trilium/discussions) (Per discussioni asincrone) -- [Wiki](https://triliumnext.github.io/Docs/) (Per le domande più comuni e le guide per l'utente) - -Le due stanze linkate sopra sono connesse e contengono gli stessi messaggi, quindi puoi usare XMPP o Matrix da qualsiasi client tu preferisca, praticamente su qualsiasi piattaforma! -### ComunitĆ  non ufficiali - -[Trilium Rocks](https://discord.gg/aqdX9mXX4r) -## šŸŽ FunzionalitĆ  - -* Gli appunti possono essere organizzati in un albero di profonditĆ  arbitraria. Un singolo appunto può essere collocato in più posti nell'albero (vedi [clonazione](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) -* Ricco editor visuale (WYSIWYG), con supporto -tra l'altro- per tabelle, immagini ed [espressioni matematiche](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support) e con [formattazione automatica](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) per markdown -* Supporto per la modifica di [appunti con codice sorgente](https://triliumnext.github.io/Docs/Wiki/code-notes), con evidenziazione della sintassi -* [Navigazione veloce](https://triliumnext.github.io/Docs/Wiki/note-navigation) tra gli appunti, ricerca testuale completa e [fissaggio degli appunti](https://triliumnext.github.io/Docs/Wiki/note-hoisting) -* Supporto integrato ed automatico per le [revisioni degli appunti](https://triliumnext.github.io/Docs/Wiki/note-revisions) -* Gli [attributi](https://triliumnext.github.io/Docs/Wiki/attributes) degli appunti possono essere utilizzati per l'organizzazione, per l'interrogazione e per lo scripting avanzato (prorgrammazione). -* [Sincronizzazione](https://triliumnext.github.io/Docs/Wiki/synchronization) con un server di sincronizzazione auto-ospitato - * c'ĆØ un [servizio di terze parti per ospitare server di sincronizzazione](https://trilium.cc/paid-hosting) -* [Condivisione](https://triliumnext.github.io/Docs/Wiki/sharing) (pubblicazione) di appunti sull'internet pubblico -* Robusta [crittografia](https://triliumnext.github.io/Docs/Wiki/protected-notes) configurabile singolarmente per ogni appunto -* Disegno di diagrammi con Excalidraw (tipo di appunto "canvas") -* [Mappe relazionali](https://triliumnext.github.io/Docs/Wiki/relation-map) e [mappe di collegamenti](https://triliumnext.github.io/Docs/Wiki/link-map) per visualizzare gli appunti e le loro relazioni -* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - vedi [Esempi avanzati](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) -* [API REST](https://triliumnext.github.io/Docs/Wiki/etapi) per l'automazione -* Si adatta bene sia in termini di usabilitĆ  che di prestazioni fino ad oltre 100 000 appunti -* Interfaccia utente ottimizzata per il [mobile](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) (smartphone e tablet) -* [Tema Notturno](https://triliumnext.github.io/Docs/Wiki/themes) -* Supporto per importazione ed esportazione da e per [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) e [Markdown import](https://triliumnext.github.io/Docs/Wiki/markdown) -* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) per il salvataggio facile di contenuti web - -✨ Dai un'occhiata alle seguenti risorse di terze parti per scoprire altre bellezze legate a TriliumNext: - --[awesome-trilium](https://github.com/Nriver/awesome-trilium) per temi, script, plugin e altro di terze parti. -- [TriliumRocks!](https://trilium.rocks/) per tutorial, guide e molto altro. -## šŸ— Rilasci - - -Trilium ĆØ fornito come applicazione desktop (Linux e Windows) o come applicazione web ospitata sul tuo server (Linux). La versione desktop per Mac OS ĆØ disponibile, ma [non ĆØ supportata](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support). - -* Se vuoi usare Trilium sul tuo desktop, scarica il rilascio binario per la tua piattaforma dall'[ultimo rilascio](https://github.com/TriliumNext/Trilium/releases/latest), decomprimi l'archivio e avvia l'eseguibile ```trilium```. -* Se vuoi installare Trilium su un server, segui [questa pagina](https://triliumnext.github.io/Docs/Wiki/server-installation). - * Per ora solo Chrome e Firefox sono i browser supportati (testati). - -TriliumNext sarĆ  fornito anche come Flatpak: - - - -## šŸ“ Documentazione - -[Vedi la wiki per una lista completa delle pagine di documentazione.](https://triliumnext.github.io/Docs/) - -Puoi anche leggere ["Patterns of personal knowledge base"](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) per avere un'ispirazione su come potresti utilizzare Trilium. - -## šŸ’» Contribuire - -Clona localmente ed esegui - -```shell -npm install -npm run server:start -``` - -## šŸ‘ Riconoscimenti - -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - miglior editor visuale (WYSIWYG) sul mercato, squadra di sviluppo attenta e reattiva -* [FancyTree](https://github.com/mar10/fancytree) - libreria per alberi molto ricca di funzionalitĆ , senza pari. Trilium Notes non sarebbe lo stesso senza di essa. -* [CodeMirror](https://github.com/codemirror/CodeMirror) - editor di codice con supporto per un'enorme quantitĆ  di linguaggi. -* [jsPlumb](https://github.com/jsplumb/jsplumb) - libreria per la connettivitĆ  visuale senza pari. Utilizzata per [mappe relazionali](https://triliumnext.github.io/Docs/Wiki/relation-map) e [mappe di collegamenti](https://triliumnext.github.io/Docs/Wiki/link-map). - -## šŸ¤ Supporto - -Puoi sostenere lo sviluppatore originale di Trilium utilizzando gli sponsor di GitHub, [PayPal](https://paypal.me/za4am) o Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2). -Il supporto all'organizzazione TriliumNext sarĆ  possibile nel prossimo futuro. - -## šŸ”‘ Licenza - -Questo programma ĆØ software libero: ĆØ possibile redistribuirlo e/o modificarlo nei termini della GNU Affero General Public License come pubblicata dalla Free Software Foundation, sia la versione 3 della Licenza, o (a propria scelta) qualsiasi versione successiva. diff --git a/docs/README.ja.md b/docs/README.ja.md deleted file mode 100644 index 47ff29059..000000000 --- a/docs/README.ja.md +++ /dev/null @@ -1,73 +0,0 @@ -# Trilium Notes - -[English](../README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) - -Trilium Notes ćÆć€å¤§č¦ęØ”ćŖå€‹äŗŗēŸ„č­˜ćƒ™ćƒ¼ć‚¹ć®ę§‹ēÆ‰ć«ē„¦ē‚¹ć‚’å½“ć¦ćŸć€éšŽå±¤åž‹ćƒŽćƒ¼ćƒˆć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć§ć™ć€‚ę¦‚č¦ćÆ[ć‚¹ć‚ÆćƒŖćƒ¼ćƒ³ć‚·ćƒ§ćƒƒćƒˆ](https://triliumnext.github.io/Docs/Wiki/screenshot-tour)ć‚’ć”č¦§ćć ć•ć„ļ¼š - -Trilium Screenshot - -## šŸŽ 特従 - -* ćƒŽćƒ¼ćƒˆćÆć€ä»»ę„ć®ę·±ć•ć®ćƒ„ćƒŖćƒ¼ć«é…ē½®ć§ćć¾ć™ć€‚å˜äø€ć®ćƒŽćƒ¼ćƒˆć‚’ćƒ„ćƒŖćƒ¼å†…ć®č¤‡ę•°ć®å “ę‰€ć«é…ē½®ć§ćć¾ć™ ([cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes) ć‚’å‚ē…§) -* ćƒžćƒ¼ć‚Æćƒ€ć‚¦ćƒ³[ć‚Ŗćƒ¼ćƒˆćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆ](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)ć«ć‚ˆć‚‹ć€č”Øć€ē”»åƒć€[ę•°å­¦](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support)などの豊富な WYSIWYG ćƒŽćƒ¼ćƒˆē·Øé›†ę©Ÿčƒ½ -* ć‚·ćƒ³ć‚æćƒƒć‚Æć‚¹ćƒć‚¤ćƒ©ć‚¤ćƒˆć‚’å«ć‚€[ć‚½ćƒ¼ć‚¹ć‚³ćƒ¼ćƒ‰ä»˜ććƒŽćƒ¼ćƒˆ](https://triliumnext.github.io/Docs/Wiki/code-notes)ć®ē·Øé›†ć‚’ć‚µćƒćƒ¼ćƒˆ -* [ćƒŽćƒ¼ćƒˆé–“ć®ćƒŠćƒ“ć‚²ćƒ¼ć‚·ćƒ§ćƒ³](https://triliumnext.github.io/Docs/Wiki/note-navigation)ć€å…Øę–‡ę¤œē“¢ć€[ćƒŽćƒ¼ćƒˆćƒ›ć‚¤ć‚¹ćƒˆ](https://triliumnext.github.io/Docs/Wiki/note-hoisting)ćŒé«˜é€Ÿć‹ć¤ē°”å˜ć«č”Œćˆć¾ć™ -* ć‚·ćƒ¼ćƒ ćƒ¬ć‚¹ćŖ[ćƒŽćƒ¼ćƒˆć®ćƒćƒ¼ć‚øćƒ§ćƒ³ē®”ē†](https://triliumnext.github.io/Docs/Wiki/note-revisions) -* ćƒŽćƒ¼ćƒˆ[å±žę€§](https://triliumnext.github.io/Docs/Wiki/Attributes)ćÆć€ćƒŽćƒ¼ćƒˆę•“ē†ć€ć‚Æć‚ØćƒŖć€é«˜åŗ¦ćŖ[ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ](https://triliumnext.github.io/Docs/Wiki/scripts)ć«ä½æē”Øć§ćć¾ć™ -* č‡Ŗå·±ćƒ›ć‚¹ćƒˆåž‹åŒęœŸć‚µćƒ¼ćƒćƒ¼ćØć®[同期](https://triliumnext.github.io/Docs/Wiki/synchronization) - * [åŒęœŸć‚µćƒ¼ćƒćƒ¼ć‚’ćƒ›ć‚¹ćƒˆć™ć‚‹ć‚µćƒ¼ćƒ‰ćƒ‘ćƒ¼ćƒ†ć‚£ćƒ»ć‚µćƒ¼ćƒ“ć‚¹](https://trilium.cc/paid-hosting)ćŒć‚ć‚Šć¾ć™ -* å…¬é–‹ć‚¤ćƒ³ć‚æćƒ¼ćƒćƒƒćƒˆćøć®ćƒŽćƒ¼ćƒˆć®[å…±ęœ‰](https://triliumnext.github.io/Docs/Wiki/sharing)(公開) -* ćƒŽćƒ¼ćƒˆć”ćØć®ē²’åŗ¦ć‚’ęŒć¤å¼·åŠ›ćŖ[ćƒŽćƒ¼ćƒˆęš—å·åŒ–](https://triliumnext.github.io/Docs/Wiki/protected-notes) -* 組み込みの Excalidraw ć‚’ä½æē”Øć—ćŸå›³ć®ć‚¹ć‚±ćƒƒćƒ (ćƒŽćƒ¼ćƒˆ ć‚æć‚¤ćƒ—"ć‚­ćƒ£ćƒ³ćƒć‚¹") -* ćƒŽćƒ¼ćƒˆćØćć®é–¢äæ‚ć‚’åÆč¦–åŒ–ć™ć‚‹ćŸć‚ć®[関係図](https://triliumnext.github.io/Docs/Wiki/relation-map)と[ćƒŖćƒ³ć‚Æćƒžćƒƒćƒ—](https://triliumnext.github.io/Docs/Wiki/link-map) -* [ć‚¹ć‚ÆćƒŖćƒ—ćƒ†ć‚£ćƒ³ć‚°](https://triliumnext.github.io/Docs/Wiki/scripts) - [é«˜åŗ¦ćŖć‚·ćƒ§ćƒ¼ć‚±ćƒ¼ć‚¹](https://triliumnext.github.io/Docs/Wiki/advanced-showcases)ć‚’å‚ē…§ -* č‡Ŗå‹•åŒ–ć®ćŸć‚ć® [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) -* ćƒ¦ćƒ¼ć‚¶ćƒ“ćƒŖćƒ†ć‚£ćØćƒ‘ćƒ•ć‚©ćƒ¼ćƒžćƒ³ć‚¹ć®äø”ę–¹ć§ 100 000 ćƒŽćƒ¼ćƒˆä»„äøŠć«ę‹”å¼µåÆčƒ½ -* ć‚¹ćƒžćƒ¼ćƒˆćƒ•ć‚©ćƒ³ćØć‚æćƒ–ćƒ¬ćƒƒćƒˆå‘ć‘ć®ć‚æćƒƒćƒęœ€é©åŒ–[ćƒ¢ćƒć‚¤ćƒ«ćƒ•ćƒ­ćƒ³ćƒˆć‚Øćƒ³ćƒ‰](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) -* [ćƒŠć‚¤ćƒˆćƒ†ćƒ¼ćƒž](https://triliumnext.github.io/Docs/Wiki/themes) -* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) と [Markdown ć®ć‚¤ćƒ³ćƒćƒ¼ćƒˆćØć‚Øć‚Æć‚¹ćƒćƒ¼ćƒˆ](https://triliumnext.github.io/Docs/Wiki/Markdown) -* Web ć‚³ćƒ³ćƒ†ćƒ³ćƒ„ć‚’ē°”å˜ć«äæå­˜ć™ć‚‹ćŸć‚ć® [Web ć‚ÆćƒŖćƒƒćƒ‘ćƒ¼](https://triliumnext.github.io/Docs/Wiki/web-clipper) - -ć‚µćƒ¼ćƒ‰ćƒ‘ćƒ¼ćƒ†ć‚£ć®ćƒ†ćƒ¼ćƒžć€ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć€ćƒ—ćƒ©ć‚°ć‚¤ćƒ³ćŖć©ćÆć€ [awesome-trilium](https://github.com/Nriver/awesome-trilium) ć‚’ćƒć‚§ćƒƒć‚Æć—ć¦ćć ć•ć„ć€‚ - -## šŸ— ćƒ“ćƒ«ćƒ‰ - -Trilium ćÆć€ćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ—ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ļ¼ˆLinux态Windowsļ¼‰ć¾ćŸćÆć‚µćƒ¼ćƒćƒ¼äøŠć§ćƒ›ć‚¹ćƒˆć•ć‚Œć‚‹ć‚¦ć‚§ćƒ–ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ļ¼ˆLinuxļ¼‰ćØć—ć¦ęä¾›ć•ć‚Œć¾ć™ć€‚ Mac OS ć®ćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ—ćƒ“ćƒ«ćƒ‰ć‚‚åˆ©ē”ØåÆčƒ½ć§ć™ćŒć€ [unsupported](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support) となっています。 - -* ćƒ‡ć‚¹ć‚Æćƒˆćƒƒćƒ—ć§ Trilium ć‚’ä½æē”Øć—ćŸć„å “åˆćÆć€ [latest release](https://github.com/TriliumNext/Trilium/releases/latest) ć‹ć‚‰ćŠä½æć„ć®ćƒ—ćƒ©ćƒƒćƒˆćƒ•ć‚©ćƒ¼ćƒ ć®ćƒć‚¤ćƒŠćƒŖćƒŖćƒŖćƒ¼ć‚¹ć‚’ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ć€ćƒ‘ćƒƒć‚±ćƒ¼ć‚øć‚’č§£å‡ć—ć¦ ``trilium`` ć®å®Ÿč”Œćƒ•ć‚”ć‚¤ćƒ«ć‚’å®Ÿč”Œć—ć¦ćć ć•ć„ć€‚ -* ć‚µćƒ¼ćƒćƒ¼ć« Trilium ć‚’ć‚¤ćƒ³ć‚¹ćƒˆćƒ¼ćƒ«ć™ć‚‹å “åˆćÆć€[ć“ć®ćƒšćƒ¼ć‚ø](https://triliumnext.github.io/Docs/Wiki/server-installation)ć«å¾“ć£ć¦ćć ć•ć„ć€‚ - * ē¾åœØć€åÆ¾åæœļ¼ˆå‹•ä½œē¢ŗčŖļ¼‰ć—ć¦ć„ć‚‹ćƒ–ćƒ©ć‚¦ć‚¶ćÆć€ęœ€čæ‘ć® Chrome と Firefox のみです。 - -Trilium は Flatpak ćØć—ć¦ć‚‚ęä¾›ć•ć‚Œć¾ć™ļ¼š - -[](https://flathub.org/apps/details/com.github.zadam.trilium) - -## šŸ“ ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ - -[ćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆćƒšćƒ¼ć‚øć®å…ØćƒŖć‚¹ćƒˆćÆwikić‚’ć”č¦§ćć ć•ć„ć€‚](https://triliumnext.github.io/Docs/) - -ć¾ćŸć€[å€‹äŗŗēš„ćŖēŸ„č­˜åŸŗē›¤ć®ćƒ‘ć‚æćƒ¼ćƒ³](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge)を読むと、 Trilium ć®ä½æć„ę–¹ć®ćƒ’ćƒ³ćƒˆć‚’å¾—ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚ - -## šŸ’» ć‚³ćƒ³ćƒˆćƒŖćƒ“ćƒ„ćƒ¼ćƒˆ - -ć¾ćŸćÆć€ćƒ­ćƒ¼ć‚«ćƒ«ć«ć‚Æćƒ­ćƒ¼ćƒ³ć—ć¦å®Ÿč”Œ - -```shell -npm install -npm run server:start -``` - -## šŸ“¢ ć‚·ćƒ£ć‚¦ćƒˆć‚¢ć‚¦ćƒˆ - -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - åø‚å “ć§ęœ€é«˜ć® WYSIWYG ć‚Øćƒ‡ć‚£ć‚æćƒ¼ć€éžåøøć«ć‚¤ćƒ³ć‚æćƒ©ć‚Æćƒ†ć‚£ćƒ–ć§čžćäøŠę‰‹ćŖćƒćƒ¼ćƒ  -* [FancyTree](https://github.com/mar10/fancytree) - ēœŸć®ē«¶äŗ‰ē›øę‰‹ćŒć„ćŖć„ć€éžåøøć«ę©Ÿčƒ½č±ŠåÆŒćŖćƒ„ćƒŖćƒ¼ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć§ć™ć€‚ Trilium Notes ćÆć€ć“ć‚ŒćŖć—ć§ćÆęˆć‚Šē«‹ćŸćŖć„ć§ć—ć‚‡ć†ć€‚ -* [CodeMirror](https://github.com/codemirror/CodeMirror) - č†Øå¤§ćŖę•°ć®čØ€čŖžć‚’ć‚µćƒćƒ¼ćƒˆć™ć‚‹ć‚³ćƒ¼ćƒ‰ć‚Øćƒ‡ć‚£ć‚æ -* [jsPlumb](https://github.com/jsplumb/jsplumb) - ē«¶åˆć®ćŖć„ćƒ“ć‚øćƒ„ć‚¢ćƒ«ć‚³ćƒć‚Æćƒ†ć‚£ćƒ“ćƒ†ć‚£ćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć§ć™ć€‚[関係図](https://triliumnext.github.io/Docs/Wiki/relation-map)态[ćƒŖćƒ³ć‚Æå›³](https://triliumnext.github.io/Docs/Wiki/link-map)で使用。 - -## šŸ¤ ć‚µćƒćƒ¼ćƒˆ - -GitHub ć‚¹ćƒćƒ³ć‚µćƒ¼ć€[PayPal](https://paypal.me/za4am)ć‚‚ć—ććÆ Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2) 恫恦 Trilium ć‚’ć‚µćƒćƒ¼ćƒˆć™ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚ - -## šŸ”‘ ćƒ©ć‚¤ć‚»ćƒ³ć‚¹ - -ć“ć®ćƒ—ćƒ­ć‚°ćƒ©ćƒ ćÆćƒ•ćƒŖćƒ¼ć‚½ćƒ•ćƒˆć‚¦ć‚§ć‚¢ć§ć™ļ¼šćƒ•ćƒŖćƒ¼ć‚½ćƒ•ćƒˆć‚¦ć‚§ć‚¢č²”å›£ćŒē™ŗč”Œć—ćŸ GNU Affero General Public License ć®ćƒćƒ¼ć‚øćƒ§ćƒ³3ć€ć¾ćŸćÆćć‚Œä»„é™ć®ćƒćƒ¼ć‚øćƒ§ćƒ³ć®ć„ćšć‚Œć‹ć«å¾“ć£ć¦ć€å†é…åøƒćŠć‚ˆć³/ć¾ćŸćÆę”¹å¤‰ć™ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚ diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..be65024ee --- /dev/null +++ b/docs/README.md @@ -0,0 +1,12 @@ +# Trilium Notes + +Please see the [main documentation](index.md) or visit one of our translated versions: + +- [EspaƱol](README-es.md) +- [Italiano](README-it.md) +- [ę—„ęœ¬čŖž](README-ja.md) +- [Русский](README-ru.md) +- [简体中文](README-ZH_CN.md) +- [繁體中文](README-ZH_TW.md) + +For the full application README, please visit our [GitHub repository](https://github.com/triliumnext/trilium). \ No newline at end of file diff --git a/docs/README.ru.md b/docs/README.ru.md deleted file mode 100644 index af15fcab9..000000000 --- a/docs/README.ru.md +++ /dev/null @@ -1,59 +0,0 @@ -# Trilium Notes - -[English](../README.md) | [Chinese](./README-ZH_CN.md) | [Russian](./README.ru.md) | [Japanese](./README.ja.md) | [Italian](./README.it.md) | [Spanish](./README.es.md) - -Trilium Notes – ŃŃ‚Š¾ приложение Š“Š»Ń заметок с иерархической ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Š¾Š¹, ориентированное на созГание Š±Š¾Š»ŃŒŃˆŠøŃ… ŠæŠµŃ€ŃŠ¾Š½Š°Š»ŃŒŠ½Ń‹Ń… баз знаний. Š”Š»Ń быстрого Š¾Š·Š½Š°ŠŗŠ¾Š¼Š»ŠµŠ½ŠøŃ посмотрите [ŃŠŗŃ€ŠøŠ½ŃˆŠ¾Ń‚-тур](https://triliumnext.github.io/Docs/Wiki/screenshot-tour): - -Trilium Screenshot - -## šŸŽ Возможности - -* Заметки можно Ń€Š°ŃŠæŠ¾Š»Š¾Š¶ŠøŃ‚ŃŒ в виГе Герева ŠæŃ€Š¾ŠøŠ·Š²Š¾Š»ŃŒŠ½Š¾Š¹ Š³Š»ŃƒŠ±ŠøŠ½Ń‹. ŠžŃ‚Š“ŠµŠ»ŃŒŠ½ŃƒŃŽ Š·Š°Š¼ŠµŃ‚ŠŗŃƒ можно Ń€Š°Š·Š¼ŠµŃŃ‚ŠøŃ‚ŃŒ в Š½ŠµŃŠŗŠ¾Š»ŃŒŠŗŠøŃ… местах Герева (см. [клонирование](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) -* ŠŸŃ€Š¾Š“Š²ŠøŠ½ŃƒŃ‚Ń‹Š¹ Š²ŠøŠ·ŃƒŠ°Š»ŃŒŠ½Ń‹Š¹ реГактор (WYSIWYG) ŠæŠ¾Š·Š²Š¾Š»ŃŠµŃ‚ Ń€Š°Š±Š¾Ń‚Š°Ń‚ŃŒ с таблицами, ŠøŠ·Š¾Š±Ń€Š°Š¶ŠµŠ½ŠøŃŠ¼Šø, [Ń„Š¾Ń€Š¼ŃƒŠ»Š°Š¼Šø](https://triliumnext.github.io/Docs/Wiki/text-notes#math-support) Šø разметкой markdown, имеет [автоформатирование](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) -* РеГактирование [заметок с исхоГным коГом](https://triliumnext.github.io/Docs/Wiki/code-notes), Š²ŠŗŠ»ŃŽŃ‡Š°Ń ŠæŠ¾Š“ŃŠ²ŠµŃ‚ŠŗŃƒ синтаксиса -* Š‘Ń‹ŃŃ‚Ń€Š°Ń Šø ŠæŃ€Š¾ŃŃ‚Š°Ń [Š½Š°Š²ŠøŠ³Š°Ń†ŠøŃ межГу заметками](https://triliumnext.github.io/Docs/Wiki/note-navigation), полнотекстовый поиск Šø [выГеление заметок](https://triliumnext.github.io/Docs/Wiki/note-hoisting) в Š¾Ń‚Š“ŠµŠ»ŃŒŠ½Ń‹Š¹ блок -* Š‘ŠµŃŃˆŠ¾Š²Š½Š¾Šµ [версионирование заметки](https://triliumnext.github.io/Docs/Wiki/note-revisions) -* Š”ŠæŠµŃ†ŠøŠ°Š»ŃŒŠ½Ń‹Šµ [Š°Ń‚Ń€ŠøŠ±ŃƒŃ‚Ń‹](https://triliumnext.github.io/Docs/Wiki/attributes) ŠæŠ¾Š·Š²Š¾Š»ŃŃŽŃ‚ гибко Š¾Ń€Š³Š°Š½ŠøŠ·Š¾Š²Š°Ń‚ŃŒ ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Ńƒ, ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃŽŃ‚ŃŃ Š“Š»Ń поиска Šø ŠæŃ€Š¾Š“Š²ŠøŠ½ŃƒŃ‚Š¾Š³Š¾ [скриптинга](https://triliumnext.github.io/Docs/Wiki/scripts) -* [Š”ŠøŠ½Ń…Ń€Š¾Š½ŠøŠ·Š°Ń†ŠøŃ](https://triliumnext.github.io/Docs/Wiki/synchronization) заметок со своим сервером -* ŠŠ°Š“Ń‘Š¶Š½Š¾Šµ [ŃˆŠøŃ„Ń€Š¾Š²Š°Š½ŠøŠµ](https://triliumnext.github.io/Docs/Wiki/protected-notes) с Гетализацией по кажГой заметке -* [ŠšŠ°Ń€Ń‚Ń‹ ŃŠ²ŃŠ·ŠµŠ¹](https://triliumnext.github.io/Docs/Wiki/relation-map) Šø [карты ссылок](https://triliumnext.github.io/Docs/Wiki/link-map) Š“Š»Ń Š²ŠøŠ·ŃƒŠ°Š»ŠøŠ·Š°Ń†ŠøŠø ŠøŃ… Š²Š·ŃŠøŠ¼Š¾ŃŠ²ŃŠ·ŠµŠ¹ -* [Дкрипты](https://triliumnext.github.io/Docs/Wiki/scripts) - см. [ŠæŃ€Š¾Š“Š²ŠøŠ½ŃƒŃ‚Ń‹Šµ примеры](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) -* Š„Š¾Ń€Š¾ŃˆŠ¾ Š¼Š°ŃŃˆŃ‚Š°Š±ŠøŃ€ŃƒŠµŃ‚ŃŃ, как по ŃƒŠ“Š¾Š±ŃŃ‚Š²Ńƒ ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Š½ŠøŃ, так Šø по ŠæŃ€Š¾ŠøŠ·Š²Š¾Š“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚Šø Го 100000 заметок -* ŠžŠæŃ‚ŠøŠ¼ŠøŠ·ŠøŃ€Š¾Š²Š°Š½Š½Ń‹Š¹ [Š¼Š¾Š±ŠøŠ»ŃŒŠ½Ń‹Š¹ фронтенГ](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) смартфонов Šø ŠæŠ»Š°Š½ŃˆŠµŃ‚Š¾Š² -* [Š¢ŠµŠ¼Š½Š°Ń тема](https://triliumnext.github.io/Docs/Wiki/themes) -* Š˜Š¼ŠæŠ¾Ń€Ń‚ Šø ŃŠŗŠæŠ¾Ń€Ń‚ [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) Šø Ганных в [markdown](https://triliumnext.github.io/Docs/Wiki/markdown) формате -* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) Š“Š»Ń уГобного ŃŠ¾Ń…Ń€Š°Š½ŠµŠ½ŠøŃ веб-контента - -## šŸ— Дборки - -Trilium ŠæŃ€ŠµŠ“Š¾ŃŃ‚Š°Š²Š»ŃŠµŃ‚ŃŃ в виГе Гесктопного ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ (Linux Šø Windows) или веб-ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ, размещенного на вашем сервере (Linux). Š”Š¾ŃŃ‚ŃƒŠæŠ½Š° сборка Mac OS, но она [не ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŠµŃ‚ŃŃ](https://triliumnext.github.io/Docs/Wiki/faq#mac-os-support). - -* Если вы хотите ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ Trilium на Гесктопе, скачайте архив Š“Š»Ń своей платформы со страницы [релизов](https://github.com/TriliumNext/Trilium/releases/latest), Ń€Š°ŃŠæŠ°ŠŗŃƒŠ¹Ń‚Šµ Šø Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚Šµ ŠøŃŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ файл ```trilium```. -* Если вы хотите ŃƒŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ Trilium на сервере, ŃŠ»ŠµŠ“ŃƒŠ¹Ń‚Šµ ŃŃ‚Š¾Š¹ [ŠøŠ½ŃŃ‚Ń€ŃƒŠŗŃ†ŠøŠø](https://triliumnext.github.io/Docs/Wiki/server-installation). - * Š’ Ганный момент ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŃŽŃ‚ŃŃ (протестированы) послеГние версии Š±Ń€Š°ŃƒŠ·ŠµŃ€Š¾Š² Chrome Šø Firefox. - -## šŸ“ Š”Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†ŠøŃ - -[ŠŸŠ¾Š»Š½Ń‹Š¹ список страниц Š“Š¾ŠŗŃƒŠ¼ŠµŠ½Ń‚Š°Ń†ŠøŠø Š“Š¾ŃŃ‚ŃƒŠæŠµŠ½ в Wiki.](https://triliumnext.github.io/Docs/) - -Š’Ń‹ также можете Š¾Š·Š½Š°ŠŗŠ¾Š¼ŠøŃ‚ŃŒŃŃ с [шаблонами ŠæŠµŃ€ŃŠ¾Š½Š°Š»ŃŒŠ½Ń‹Ń… баз знаний](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge), чтобы ŠæŠ¾Š»ŃƒŃ‡ŠøŃ‚ŃŒ преГставление о том, как можно ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ Trilium. - -## šŸ’» Š£Ń‡Š°ŃŃ‚Š²ŃƒŠ¹Ń‚Šµ в разработке - -Или ŃŠŗŠ»Š¾Š½ŠøŃ€ŃƒŠ¹Ń‚Šµ на своё ŃƒŃŃ‚Ń€Š¾Š¹ŃŃ‚Š²Š¾ Šø Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚Šµ - -```shell -npm install -npm run server:start -``` - -## šŸ‘ БлагоГарности - -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - Š»ŃƒŃ‡ŃˆŠøŠ¹ WYSIWYG реГактор, Š¾Ń‡ŠµŠ½ŃŒ Š°ŠŗŃ‚ŠøŠ²Š½Š°Ń Šø Š²Š½ŠøŠ¼Š°Ń‚ŠµŠ»ŃŒŠ½Š°Ń команГа. -* [FancyTree](https://github.com/mar10/fancytree) - Š¼Š½Š¾Š³Š¾Ń„ŃƒŠ½ŠŗŃ†ŠøŠ¾Š½Š°Š»ŃŒŠ½Š°Ń библиотека Š“Š»Ń ŃŠ¾Š·Š“Š°Š½ŠøŃ ГревовиГных ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€. Вне ŠŗŠ¾Š½ŠŗŃƒŃ€ŠµŠ½Ń†ŠøŠø. Без него Trilium Notes не были бы таким. -* [CodeMirror](https://github.com/codemirror/CodeMirror) - реГактор коГа с поГГержкой огромного количество ŃŠ·Ń‹ŠŗŠ¾Š². -* [jsPlumb](https://github.com/jsplumb/jsplumb) - библиотека Š“Š»Ń Š²ŠøŠ·ŃƒŠ°Š»ŠøŠ·Š°Ń†ŠøŠø ŃŠ²ŃŠ·ŠµŠ¹. Вне ŠŗŠ¾Š½ŠŗŃƒŃ€ŠµŠ½Ń†ŠøŠø. Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ в [картах ŃŠ²ŃŠ·ŠµŠ¹](https://triliumnext.github.io/Docs/Wiki/relation-map) Šø [картах ссылок](https://triliumnext.github.io/Docs/Wiki/link-map). - -## šŸ”‘ Š›ŠøŃ†ŠµŠ½Š·ŠøŃ - -Эта программа ŃŠ²Š»ŃŠµŃ‚ŃŃ бесплатным программным обеспечением: вы можете Ń€Š°ŃŠæŃ€Š¾ŃŃ‚Ń€Š°Š½ŃŃ‚ŃŒ Šø/или ŠøŠ·Š¼ŠµŠ½ŃŃ‚ŃŒ ее в соответствии с ŃƒŃŠ»Š¾Š²ŠøŃŠ¼Šø GNU Affero General Public License, опубликованной Free Software Foundation, либо версии 3 Лицензии, либо (по вашему Š²Ń‹Š±Š¾Ń€Ńƒ) Š»ŃŽŠ±Š¾Š¹ более позГней версии. diff --git a/docs/Release Notes/!!!meta.json b/docs/Release Notes/!!!meta.json index f2e31b84c..57e84dc42 100644 --- a/docs/Release Notes/!!!meta.json +++ b/docs/Release Notes/!!!meta.json @@ -1,6 +1,6 @@ { "formatVersion": 2, - "appVersion": "0.98.0", + "appVersion": "0.99.2", "files": [ { "isClone": false, @@ -61,6 +61,110 @@ "attachments": [], "dirFileName": "Release Notes", "children": [ + { + "isClone": false, + "noteId": "yuroLztFfpu5", + "notePath": [ + "hD3V4hiu2VW4", + "yuroLztFfpu5" + ], + "title": "v0.99.3", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "template", + "value": "wyurrlcDl416", + "isInheritable": false, + "position": 60 + } + ], + "format": "markdown", + "dataFileName": "v0.99.3.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "z207sehwMJ6C", + "notePath": [ + "hD3V4hiu2VW4", + "z207sehwMJ6C" + ], + "title": "v0.99.2", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "template", + "value": "wyurrlcDl416", + "isInheritable": false, + "position": 60 + } + ], + "format": "markdown", + "dataFileName": "v0.99.2.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "WGQsXq2jNyTi", + "notePath": [ + "hD3V4hiu2VW4", + "WGQsXq2jNyTi" + ], + "title": "v0.99.1", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "template", + "value": "wyurrlcDl416", + "isInheritable": false, + "position": 60 + } + ], + "format": "markdown", + "dataFileName": "v0.99.1.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "cyw2Yue9vXf3", + "notePath": [ + "hD3V4hiu2VW4", + "cyw2Yue9vXf3" + ], + "title": "v0.99.0", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "template", + "value": "wyurrlcDl416", + "isInheritable": false, + "position": 60 + } + ], + "format": "markdown", + "dataFileName": "v0.99.0.md", + "attachments": [] + }, { "isClone": false, "noteId": "QOJwjruOUr4k", @@ -69,7 +173,7 @@ "QOJwjruOUr4k" ], "title": "v0.98.1", - "notePosition": 10, + "notePosition": 50, "prefix": null, "isExpanded": false, "type": "text", @@ -95,7 +199,7 @@ "PLUoryywi0BC" ], "title": "v0.98.0", - "notePosition": 20, + "notePosition": 60, "prefix": null, "isExpanded": false, "type": "text", @@ -121,7 +225,7 @@ "lvOuiWsLDv8F" ], "title": "v0.97.2", - "notePosition": 30, + "notePosition": 70, "prefix": null, "isExpanded": false, "type": "text", @@ -147,7 +251,7 @@ "OtFZ6Nd9vM3n" ], "title": "v0.97.1", - "notePosition": 40, + "notePosition": 80, "prefix": null, "isExpanded": false, "type": "text", @@ -173,7 +277,7 @@ "SJZ5PwfzHSQ1" ], "title": "v0.97.0", - "notePosition": 50, + "notePosition": 90, "prefix": null, "isExpanded": false, "type": "text", @@ -199,7 +303,7 @@ "mYXFde3LuNR7" ], "title": "v0.96.0", - "notePosition": 60, + "notePosition": 100, "prefix": null, "isExpanded": false, "type": "text", @@ -225,7 +329,7 @@ "jthwbL0FdaeU" ], "title": "v0.95.0", - "notePosition": 70, + "notePosition": 110, "prefix": null, "isExpanded": false, "type": "text", @@ -251,7 +355,7 @@ "7HGYsJbLuhnv" ], "title": "v0.94.1", - "notePosition": 80, + "notePosition": 120, "prefix": null, "isExpanded": false, "type": "text", @@ -277,7 +381,7 @@ "Neq53ujRGBqv" ], "title": "v0.94.0", - "notePosition": 90, + "notePosition": 130, "prefix": null, "isExpanded": false, "type": "text", @@ -303,7 +407,7 @@ "VN3xnce1vLkX" ], "title": "v0.93.0", - "notePosition": 100, + "notePosition": 140, "prefix": null, "isExpanded": false, "type": "text", @@ -321,7 +425,7 @@ "WRaBfQqPr6qo" ], "title": "v0.92.7", - "notePosition": 110, + "notePosition": 150, "prefix": null, "isExpanded": false, "type": "text", @@ -347,7 +451,7 @@ "a2rwfKNmUFU1" ], "title": "v0.92.6", - "notePosition": 120, + "notePosition": 160, "prefix": null, "isExpanded": false, "type": "text", @@ -365,7 +469,7 @@ "fEJ8qErr0BKL" ], "title": "v0.92.5-beta", - "notePosition": 130, + "notePosition": 170, "prefix": null, "isExpanded": false, "type": "text", @@ -383,7 +487,7 @@ "kkkZQQGSXjwy" ], "title": "v0.92.4", - "notePosition": 140, + "notePosition": 180, "prefix": null, "isExpanded": false, "type": "text", @@ -401,7 +505,7 @@ "vAroNixiezaH" ], "title": "v0.92.3-beta", - "notePosition": 150, + "notePosition": 190, "prefix": null, "isExpanded": false, "type": "text", @@ -419,7 +523,7 @@ "mHEq1wxAKNZd" ], "title": "v0.92.2-beta", - "notePosition": 160, + "notePosition": 200, "prefix": null, "isExpanded": false, "type": "text", @@ -437,7 +541,7 @@ "IykjoAmBpc61" ], "title": "v0.92.1-beta", - "notePosition": 170, + "notePosition": 210, "prefix": null, "isExpanded": false, "type": "text", @@ -455,7 +559,7 @@ "dq2AJ9vSBX4Y" ], "title": "v0.92.0-beta", - "notePosition": 180, + "notePosition": 220, "prefix": null, "isExpanded": false, "type": "text", @@ -473,7 +577,7 @@ "3a8aMe4jz4yM" ], "title": "v0.91.6", - "notePosition": 190, + "notePosition": 230, "prefix": null, "isExpanded": false, "type": "text", @@ -491,7 +595,7 @@ "8djQjkiDGESe" ], "title": "v0.91.5", - "notePosition": 200, + "notePosition": 240, "prefix": null, "isExpanded": false, "type": "text", @@ -509,7 +613,7 @@ "OylxVoVJqNmr" ], "title": "v0.91.4-beta", - "notePosition": 210, + "notePosition": 250, "prefix": null, "isExpanded": false, "type": "text", @@ -527,7 +631,7 @@ "tANGQDvnyhrj" ], "title": "v0.91.3-beta", - "notePosition": 220, + "notePosition": 260, "prefix": null, "isExpanded": false, "type": "text", @@ -545,7 +649,7 @@ "hMoBfwSoj1SC" ], "title": "v0.91.2-beta", - "notePosition": 230, + "notePosition": 270, "prefix": null, "isExpanded": false, "type": "text", @@ -563,7 +667,7 @@ "a2XMSKROCl9z" ], "title": "v0.91.1-beta", - "notePosition": 240, + "notePosition": 280, "prefix": null, "isExpanded": false, "type": "text", @@ -581,7 +685,7 @@ "yqXFvWbLkuMD" ], "title": "v0.90.12", - "notePosition": 250, + "notePosition": 290, "prefix": null, "isExpanded": false, "type": "text", @@ -599,7 +703,7 @@ "veS7pg311yJP" ], "title": "v0.90.11-beta", - "notePosition": 260, + "notePosition": 300, "prefix": null, "isExpanded": false, "type": "text", @@ -617,7 +721,7 @@ "sq5W9TQxRqMq" ], "title": "v0.90.10-beta", - "notePosition": 270, + "notePosition": 310, "prefix": null, "isExpanded": false, "type": "text", @@ -635,7 +739,7 @@ "yFEGVCUM9tPx" ], "title": "v0.90.9-beta", - "notePosition": 280, + "notePosition": 320, "prefix": null, "isExpanded": false, "type": "text", @@ -653,7 +757,7 @@ "o4wAGqOQuJtV" ], "title": "v0.90.8", - "notePosition": 290, + "notePosition": 330, "prefix": null, "isExpanded": false, "type": "text", @@ -686,7 +790,7 @@ "i4A5g9iOg9I0" ], "title": "v0.90.7-beta", - "notePosition": 300, + "notePosition": 340, "prefix": null, "isExpanded": false, "type": "text", @@ -704,7 +808,7 @@ "ThNf2GaKgXUs" ], "title": "v0.90.6-beta", - "notePosition": 310, + "notePosition": 350, "prefix": null, "isExpanded": false, "type": "text", @@ -722,7 +826,7 @@ "G4PAi554kQUr" ], "title": "v0.90.5-beta", - "notePosition": 320, + "notePosition": 360, "prefix": null, "isExpanded": false, "type": "text", @@ -749,7 +853,7 @@ "zATRobGRCmBn" ], "title": "v0.90.4", - "notePosition": 330, + "notePosition": 370, "prefix": null, "isExpanded": false, "type": "text", @@ -767,7 +871,7 @@ "sCDLf8IKn3Iz" ], "title": "v0.90.3", - "notePosition": 340, + "notePosition": 380, "prefix": null, "isExpanded": false, "type": "text", @@ -785,7 +889,7 @@ "VqqyBu4AuTjC" ], "title": "v0.90.2-beta", - "notePosition": 350, + "notePosition": 390, "prefix": null, "isExpanded": false, "type": "text", @@ -803,7 +907,7 @@ "RX3Nl7wInLsA" ], "title": "v0.90.1-beta", - "notePosition": 360, + "notePosition": 400, "prefix": null, "isExpanded": false, "type": "text", @@ -821,7 +925,7 @@ "GyueACukPWjk" ], "title": "v0.90.0-beta", - "notePosition": 370, + "notePosition": 410, "prefix": null, "isExpanded": false, "type": "text", @@ -839,7 +943,7 @@ "wyurrlcDl416" ], "title": "Release Template", - "notePosition": 380, + "notePosition": 420, "prefix": null, "isExpanded": false, "type": "text", diff --git a/docs/Release Notes/Release Notes/Release Template.md b/docs/Release Notes/Release Notes/Release Template.md index acba4dc76..d1371c558 100644 --- a/docs/Release Notes/Release Notes/Release Template.md +++ b/docs/Release Notes/Release Notes/Release Template.md @@ -1,4 +1,7 @@ # Release Template +> [!NOTE] +> If you are interested in an [official mobile application](https://oss.issuehunt.io/r/TriliumNext/Trilium/issues/7447) Ā ([#7447](https://github.com/TriliumNext/Trilium/issues/7447)) or [multi-user support](https://oss.issuehunt.io/r/TriliumNext/Trilium/issues/4956) ([#4956](https://github.com/TriliumNext/Trilium/issues/4956)), consider offering financial support via IssueHunt (see links). + > [!IMPORTANT] > If you enjoyed this release, consider showing a token of appreciation by: > diff --git a/docs/Release Notes/Release Notes/v0.99.0.md b/docs/Release Notes/Release Notes/v0.99.0.md new file mode 100644 index 000000000..758c814a7 --- /dev/null +++ b/docs/Release Notes/Release Notes/v0.99.0.md @@ -0,0 +1,87 @@ +# v0.99.0 +> [!IMPORTANT] +> If you enjoyed this release, consider showing a token of appreciation by: +> +> * Pressing the ā€œStarā€ button on [GitHub](https://github.com/TriliumNext/Trilium) (top-right). +> * Considering a one-time or recurrent donation to the [lead developer](https://github.com/eliandoran) via [GitHub Sponsors](https://github.com/sponsors/eliandoran) or [PayPal](https://paypal.me/eliandoran). + +## šŸ’” Key highlights + +* The documentation is now available at [docs.triliumnotes.org](https://docs.triliumnotes.org/). (by @perfectra1n). + +## šŸž Bugfixes + +* Revisions show the wrong note. +* Revision list exiting out of bounds. +* Various minor fixes to settings & modals following the porting to React. +* [Newly created child note may not show-up when the tree has sorting overrides](https://github.com/TriliumNext/Trilium/issues/6820) by @rom1dep +* The context menu of history navigation buttons (back/next) for the desktop application didn't work. +* Background effects causing black background on Windows 10. +* [#cssClass isn't applied to note content in mobile layout](https://github.com/TriliumNext/Trilium/issues/6798) by @Papierkorb2292 +* [Hotkeys interfering with IME composition](https://github.com/TriliumNext/Trilium/issues/6846) by @perfectra1n +* [Right-clicking the note tree buttons triggered their action instead of context menu](https://github.com/TriliumNext/Trilium/pull/6903) by @SiriusXT +* [Include note size not taken into account](https://github.com/TriliumNext/Trilium/issues/6947) +* [Shrink images is always displayed when importing notes](https://github.com/TriliumNext/Trilium/issues/6930) +* [Redirect bare domain not working properly when two-factor authentication is on](https://github.com/TriliumNext/Trilium/pull/6961) by @EnBandit +* Importing files doesn't update collections +* Background effects breaking if native title bar is enabled. +* Promoting the note source tab to a new window, brings the note editor instead. +* PDF preview card: ā€œDownloadā€ and ā€œOpenā€ buttons would also open the note instead of just doing their action. +* ā€œGeo Mapā€ in the Trilium Demo section would not show up properly. +* Printing/exporting to PDF triggers twice. +* Desktop: ā€œPort is already usedā€ when opening multiple instances of Trilium. +* .deb for ARM is not opening by @linull24 +* Branch prefix initial value not shown +* Blur not working properly for the global menu. +* [Note content replaced by Excalidraw JSON when switching notes](https://github.com/TriliumNext/Trilium/issues/6788) + +## ✨ Improvements + +* In Basic Properties: + * Added a modal to easily configure the code note types from the note type dropdown, without going through settings. + * Added a modal to content languages to easily configure the languages, without going through settings. +* The list of text snippets now displays the actual note icon and color. +* Minor improvements to the API log. +* Improve window background effects by @adoriandoran +* Theme improvements by @adoriandoran +* Add an option to disable smooth scrolling for the Electron app by @adoriandoran +* [Revisions dialog can optionally display the source diff between revisions](https://github.com/TriliumNext/Trilium/pull/6887) by @SiriusXT +* Splits are now resizable by @SiriusXT +* Improvements to collections: + * Geomap: Add a notification if book is locked while dragging. + * Table: Disable insert at position if sorting. + * Board + * Improve dragging experience for both columns and notes. + * Adding notes has been reworked so that it doesn't add the note first. + * Pressing escape while adding a note will dismiss it instead of adding an empty note. + * Note titles can be edited directly from the board by hovering the card with the mouse and clicking the edit button next to them. + * When editing, the note titles will now be displayed multi-line, to better match the end result. + * Slight style improvements (smoother shadows, no shift). + * Context menu option to archive/unarchive current item. + * All the collections (geo map, calendar, board, table) now indicate archived notes by greying out the item. + * Added an option to display archived notes in collection via the Collection Properties tab in the ribbon. +* The note ID in the Note info tab is now shown in monospace font. +* Context menu option in the note tree to archive/unarchive a note. +* Improve performance of collapsing subtrees by @werererer +* Create a more seamless PWA top bar by @qwreey +* [Default to hiding file details when opening a PDF note](https://github.com/TriliumNext/Trilium/issues/6873) +* Disable bold and italic from the highlights list for new users. +* Slash commands can now be disabled from Options → Text Notes → Features. +* Added a description for the editor features in Text Note options. + +## šŸŒ Internationalization + +* Various translation updates. + +## šŸ› ļø Technical updates + +* We've made some changes to our development environment as **we moved away from NX**. If you are developer working on Trilium, check [the PR](https://github.com/TriliumNext/Trilium/pull/6842) for more information. +* Some important UI components such as the ribbon, note actions, floating buttons and the note title, SQL console, search results, some menus have been ported to React. **Please report any issues you might encounter.** +* [Fixed missing TOTP verification for /login/token](https://github.com/TriliumNext/Trilium/pull/6823) by @Nriver +* Improved the format of the server startup message. +* Thanks to @FliegendeWurst for helping with fixing the Nix flakes after we changed our development environment. + +## šŸ”’ļø Security fixes + +* [CVE-2025-58754](https://redirect.github.com/axios/axios/security/advisories/GHSA-4hjh-wcwx-xvwj) affecting Axios (currently only used for backend scripts). +* CVE-2025-58064 in the text editor (CKEditor) \ No newline at end of file diff --git a/docs/Release Notes/Release Notes/v0.99.1.md b/docs/Release Notes/Release Notes/v0.99.1.md new file mode 100644 index 000000000..6c7d0d629 --- /dev/null +++ b/docs/Release Notes/Release Notes/v0.99.1.md @@ -0,0 +1,37 @@ +# v0.99.1 +> [!IMPORTANT] +> If you enjoyed this release, consider showing a token of appreciation by: +> +> * Pressing the ā€œStarā€ button on [GitHub](https://github.com/TriliumNext/Trilium) (top-right). +> * Considering a one-time or recurrent donation to the [lead developer](https://github.com/eliandoran) via [GitHub Sponsors](https://github.com/sponsors/eliandoran) or [PayPal](https://paypal.me/eliandoran). + +## šŸ’” Key highlights + +* Trilium now has an official homepage: [https://triliumnotes.org/](https://triliumnotes.org/). Suggestions and bug reports are welcome. + +## šŸž Bugfixes + +* Zen mode: note buttons visible in zen mode. +* Deleting a bulk action would execute all bulk actions +* [Focus resets to start of note after adding inline link](https://github.com/TriliumNext/Trilium/issues/7115) +* [Zen mode doesn't increase web view size](https://github.com/TriliumNext/Trilium/issues/6972) by @Papierkorb2292 +* [Shortcut keys without modifiers affecting normal usage](https://github.com/TriliumNext/Trilium/issues/7121) +* Missing ribbon widgets section in Appearance +* Split button visible while printing +* Unable to search in read-only code notes +* [LLM chat: conversation not visible on Firefox](https://github.com/TriliumNext/Trilium/issues/5762) +* [Mind map affecting the use of the space bar in the entire app](https://github.com/TriliumNext/Trilium/issues/7170) + +## ✨ Improvements + +* [Make splits resizable while in Zen Mode](https://github.com/TriliumNext/Trilium/issues/7093) +* [Use number sorting for number columns in Table view](https://github.com/TriliumNext/Trilium/pull/7094) by @Mystler +* Improvements to the display of the toast notifications. +* Websocket connection errors are now displayed as a toast. +* Math equations can be customised, in text size, text color and background color. + +## šŸ› ļø Technical updates + +* Update Electron to v38 +* Fixed an event leak in modals. +* Replace `jsdom` with `node-html-parser` \ No newline at end of file diff --git a/docs/Release Notes/Release Notes/v0.99.2.md b/docs/Release Notes/Release Notes/v0.99.2.md new file mode 100644 index 000000000..34be5d0a6 --- /dev/null +++ b/docs/Release Notes/Release Notes/v0.99.2.md @@ -0,0 +1,66 @@ +# v0.99.2 +> [!IMPORTANT] +> If you enjoyed this release, consider showing a token of appreciation by: +> +> * Pressing the ā€œStarā€ button on [GitHub](https://github.com/TriliumNext/Trilium) (top-right). +> * Considering a one-time or recurrent donation to the [lead developer](https://github.com/eliandoran) via [GitHub Sponsors](https://github.com/sponsors/eliandoran) or [PayPal](https://paypal.me/eliandoran). + +## šŸ’” Key highlights + +* Presentations can now be created directly from within Trilium, including being able to present in full screen. + * Presentations are a new type of collections. + * For more information, consult the in-app documentation or the [online documentation](https://docs.triliumnotes.org/User%20Guide/User%20Guide/Note%20Types/Collections/Presentation%20View.html). +* The whole printing mechanism was redesigned from ground up. + * This should translate to more stable printing or exporting to PDF across note types. + * The new Presentation collection can also be exported as PDF. + * For more information, consult the [documentation](https://docs.triliumnotes.org/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes/Printing%20%2526%20Exporting%20as%20PDF.html). + +## šŸž Bugfixes + +* Relation map: floating buttons stuck when showing source. +* [Mobile formatting toolbar appears cut off.](https://github.com/TriliumNext/Trilium/issues/7206) +* [Table View Max nesting depth not working](https://github.com/TriliumNext/Trilium/issues/7204) +* [Expand and Collapse buttons only work on refresh](https://github.com/TriliumNext/Trilium/issues/7209) +* Enter not working on Quick Search. +* Modifying an equation would reset its size, foreground color and background color. +* [Instances of Built-in Templates inherit `#excludeFromNoteMap`](https://github.com/TriliumNext/Trilium/issues/7187) +* [Background effects on Windows 11 were affected by custom title bar selection.](https://github.com/TriliumNext/Trilium/commit/5d8f789791f699d06e49123e672b1ad62b1d7ee7#commitcomment-165811641) +* [When creating a new note in the calendar view, the default name is not selected by default](https://github.com/TriliumNext/Trilium/issues/7289) +* [Wrong focus in protected session dialog](https://github.com/TriliumNext/Trilium/issues/7251) +* [Title bar buttons not centered on macOS](https://github.com/TriliumNext/Trilium/issues/7257) +* [Notes with children in collection list view are displayed twice](https://github.com/TriliumNext/Trilium/issues/7301) +* [The background color of a table's header remains black](https://github.com/TriliumNext/Trilium/issues/7230) +* [Keep the color of the note titles even after selection in the new theme](https://github.com/TriliumNext/Trilium/issues/3634) by @adoriandoran +* Search results: + * Collection would appear twice. + * Infinite recursion issues due to nesting, when using collections such as table. + * [Note path was no longer displayed.](https://github.com/TriliumNext/Trilium/issues/7404) + * All collection types are now supported by the search. +* Importing notes without selection imports previous selection +* [Failed to connect to Wayland display: No such file or directory](https://github.com/TriliumNext/Trilium/issues/7208) + +## ✨ Improvements + +* Board view enhancements: + * Basic keyboard interaction using Tab and Shift+Tab (consult the User Guide). + * The column title is now visible even if the column is scrolled. +* Custom HTML snippets in shared pages by @kleutzinger +* Text notes: [Allow accessing `obsidian:` links](https://github.com/TriliumNext/Trilium/issues/7207) +* Allow any date for first day of the week by @werererer +* Searches now have the _Collection Properties_ tab, to change the display mode from a list to one of the collections. +* [Clarify importing .zip structures when importing notes](https://github.com/TriliumNext/Trilium/issues/7429) +* [Style overhaul for the Canvas note type](https://github.com/TriliumNext/Trilium/pull/7372) by @adoriandoran + +## šŸ“– Documentation + +* Various improvements and clarifications. + +## šŸŒ Internationalization + +* Support for Portuguese (Portugal). +* Support for Arabic. + +## šŸ› ļø Technical updates + +* Fixed Nix flake. +* Preliminary support for right-to-left languages for the UI. \ No newline at end of file diff --git a/docs/Release Notes/Release Notes/v0.99.3.md b/docs/Release Notes/Release Notes/v0.99.3.md new file mode 100644 index 000000000..e82ddaf60 --- /dev/null +++ b/docs/Release Notes/Release Notes/v0.99.3.md @@ -0,0 +1,36 @@ +# v0.99.3 +> [!NOTE] +> If you are interested in an [official mobile application](https://oss.issuehunt.io/r/TriliumNext/Trilium/issues/7447) Ā ([#7447](https://github.com/TriliumNext/Trilium/issues/7447)) or [multi-user support](https://oss.issuehunt.io/r/TriliumNext/Trilium/issues/4956) ([#4956](https://github.com/TriliumNext/Trilium/issues/4956)), consider offering financial support via IssueHunt (see links). + +> [!IMPORTANT] +> If you enjoyed this release, consider showing a token of appreciation by: +> +> * Pressing the ā€œStarā€ button on [GitHub](https://github.com/TriliumNext/Trilium) (top-right). +> * Considering a one-time or recurrent donation to the [lead developer](https://github.com/eliandoran) via [GitHub Sponsors](https://github.com/sponsors/eliandoran) or [PayPal](https://paypal.me/eliandoran). + +## šŸž Bugfixes + +* [Issues with the ribbon and some about dialogs when formatting locale is set to Chinese](https://github.com/TriliumNext/Trilium/issues/7444) +* Incorrect date format for Chinese. +* Development locale appearing in production. +* Split reverted on right-to-left languages +* Fixes for the Flatpak installation method: + * [Flatpak Data Access Issue on install/update : permission issue](https://github.com/TriliumNext/Trilium/issues/7454) + * [flatpak doesn't launch after install, needs no-sandbox](https://github.com/TriliumNext/Trilium/issues/5516) + * Icon missing in Flatpak shortcut. +* [Trilium does not unlock after autolock](https://github.com/TriliumNext/Trilium/issues/7448) by @perfectra1n +* Note color not taken into consideration for reference links by @adoriandoran +* [Board view doesn't respond to Color tags](https://github.com/TriliumNext/Trilium/issues/7456) by @adoriandoran + +## šŸ“– Documentation + +* Improve links & starting page in demo note by @tredondo + +## šŸŒ Internationalization + +* Added support for Italian +* Various translation improvements. + +## šŸ› ļø Technical updates + +* Various dependency updates. \ No newline at end of file diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json index cb90db5b3..b73efe6a6 100644 --- a/docs/User Guide/!!!meta.json +++ b/docs/User Guide/!!!meta.json @@ -1,6 +1,6 @@ { "formatVersion": 2, - "appVersion": "0.98.0", + "appVersion": "0.99.1", "files": [ { "isClone": false, @@ -202,14 +202,14 @@ { "type": "relation", "name": "internalLink", - "value": "tAassRL4RSQL", + "value": "l2VkvOwUNfZj", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "l2VkvOwUNfZj", + "value": "tAassRL4RSQL", "isInheritable": false, "position": 20 }, @@ -230,7 +230,45 @@ ], "format": "markdown", "dataFileName": "Desktop Installation.md", - "attachments": [] + "attachments": [], + "dirFileName": "Desktop Installation", + "children": [ + { + "isClone": false, + "noteId": "nRqcgfTb97uV", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "poXkQfguuA0U", + "nRqcgfTb97uV" + ], + "title": "Using the desktop application as a server", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "x3i7MxGccDuM", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "WOcw2SLH6tbX", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Using the desktop application .md", + "attachments": [] + } + ] }, { "isClone": false, @@ -703,6 +741,13 @@ "type": "text", "mime": "text/markdown", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "LLzSMXACKhUs", + "isInheritable": false, + "position": 10 + }, { "type": "label", "name": "shareAlias", @@ -725,13 +770,20 @@ "vcjrb3VVYPZI", "fDLvzOx29Pfg" ], - "title": "Apache", + "title": "Apache using Docker", "notePosition": 20, "prefix": null, "isExpanded": false, "type": "text", "mime": "text/markdown", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "LLzSMXACKhUs", + "isInheritable": false, + "position": 10 + }, { "type": "label", "name": "shareAlias", @@ -741,7 +793,43 @@ } ], "format": "markdown", - "dataFileName": "Apache.md", + "dataFileName": "Apache using Docker.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "LLzSMXACKhUs", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "vcjrb3VVYPZI", + "LLzSMXACKhUs" + ], + "title": "Trusted proxy", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "vcjrb3VVYPZI", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Gzjqa934BdH4", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Trusted proxy.md", "attachments": [] } ] @@ -755,7 +843,7 @@ "WOcw2SLH6tbX", "l2VkvOwUNfZj" ], - "title": "TLS Configuration", + "title": "HTTPS (TLS)", "notePosition": 100, "prefix": null, "isExpanded": false, @@ -772,27 +860,41 @@ { "type": "relation", "name": "internalLink", - "value": "tAassRL4RSQL", + "value": "vcjrb3VVYPZI", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "Gzjqa934BdH4", + "value": "tAassRL4RSQL", "isInheritable": false, "position": 30 }, + { + "type": "relation", + "name": "internalLink", + "value": "Gzjqa934BdH4", + "isInheritable": false, + "position": 40 + }, { "type": "label", "name": "shareAlias", "value": "tls-configuration", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-lock-alt", + "isInheritable": false, + "position": 50 } ], "format": "markdown", - "dataFileName": "TLS Configuration.md", + "dataFileName": "HTTPS (TLS).md", "attachments": [] }, { @@ -835,7 +937,7 @@ { "type": "label", "name": "iconClass", - "value": "bx bx-lock-alt", + "value": "bx bx-user", "isInheritable": false, "position": 10 } @@ -994,24 +1096,31 @@ { "type": "relation", "name": "internalLink", - "value": "bwg0e8ewQMak", + "value": "nRqcgfTb97uV", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "WOcw2SLH6tbX", + "value": "bwg0e8ewQMak", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "CdNpE2pqjmI6", + "value": "WOcw2SLH6tbX", "isInheritable": false, "position": 30 }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 40 + }, { "type": "label", "name": "shareAlias", @@ -1029,24 +1138,7 @@ ], "format": "markdown", "dataFileName": "Mobile Frontend.md", - "attachments": [ - { - "attachmentId": "CyswsZZ3GwtQ", - "title": "mobile-tablet.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Mobile Frontend_mobile-tab.png" - }, - { - "attachmentId": "txzBbmMtgsrx", - "title": "mobile-smartphone.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Mobile Frontend_mobile-sma.png" - } - ] + "attachments": [] }, { "isClone": false, @@ -1634,94 +1726,101 @@ { "type": "relation", "name": "internalLink", - "value": "mHbBMPDPkVV5", + "value": "MKmLg5x6xkor", "isInheritable": false, "position": 70 }, { "type": "relation", "name": "internalLink", - "value": "eIg8jdvaoNNd", + "value": "mHbBMPDPkVV5", "isInheritable": false, "position": 80 }, { "type": "relation", "name": "internalLink", - "value": "ivYnonVFBxbQ", + "value": "eIg8jdvaoNNd", "isInheritable": false, "position": 90 }, { "type": "relation", "name": "internalLink", - "value": "TBwsyfadTA18", + "value": "ivYnonVFBxbQ", "isInheritable": false, "position": 100 }, { "type": "relation", "name": "internalLink", - "value": "0vhv7lsOLy82", + "value": "TBwsyfadTA18", "isInheritable": false, "position": 110 }, { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "0vhv7lsOLy82", "isInheritable": false, "position": 120 }, { "type": "relation", "name": "internalLink", - "value": "aGlEvb9hyDhS", + "value": "zEY4DaJG4YT5", "isInheritable": false, "position": 130 }, { "type": "relation", "name": "internalLink", - "value": "wArbEsdSae6g", + "value": "aGlEvb9hyDhS", "isInheritable": false, "position": 140 }, { "type": "relation", "name": "internalLink", - "value": "3seOhtN8uLIY", + "value": "wArbEsdSae6g", "isInheritable": false, "position": 150 }, { "type": "relation", "name": "internalLink", - "value": "KSZ04uQ2D1St", + "value": "3seOhtN8uLIY", "isInheritable": false, "position": 160 }, { "type": "relation", "name": "internalLink", - "value": "r5JGHN99bVKn", + "value": "KSZ04uQ2D1St", "isInheritable": false, "position": 170 }, { "type": "relation", "name": "internalLink", - "value": "W8vYD3Q1zjCR", + "value": "r5JGHN99bVKn", "isInheritable": false, "position": 180 }, { "type": "relation", "name": "internalLink", - "value": "QEAPj01N5f7w", + "value": "W8vYD3Q1zjCR", "isInheritable": false, "position": 190 }, + { + "type": "relation", + "name": "internalLink", + "value": "QEAPj01N5f7w", + "isInheritable": false, + "position": 200 + }, { "type": "label", "name": "iconClass", @@ -1986,31 +2085,38 @@ { "type": "relation", "name": "internalLink", - "value": "nRhnJkTT8cPs", + "value": "_optionsAppearance", "isInheritable": false, "position": 180 }, { "type": "relation", "name": "internalLink", - "value": "KSZ04uQ2D1St", + "value": "nRhnJkTT8cPs", "isInheritable": false, "position": 190 }, { "type": "relation", "name": "internalLink", - "value": "WOcw2SLH6tbX", + "value": "KSZ04uQ2D1St", "isInheritable": false, "position": 200 }, { "type": "relation", "name": "internalLink", - "value": "veGu4faJErEM", + "value": "WOcw2SLH6tbX", "isInheritable": false, "position": 210 }, + { + "type": "relation", + "name": "internalLink", + "value": "veGu4faJErEM", + "isInheritable": false, + "position": 220 + }, { "type": "label", "name": "iconClass", @@ -2297,24 +2403,31 @@ { "type": "relation", "name": "internalLink", - "value": "oPVyFC7WL2Lp", + "value": "_options", "isInheritable": false, "position": 30 }, { "type": "relation", "name": "internalLink", - "value": "3seOhtN8uLIY", + "value": "oPVyFC7WL2Lp", "isInheritable": false, "position": 40 }, { "type": "relation", "name": "internalLink", - "value": "cbkrhQjrkKrh", + "value": "3seOhtN8uLIY", "isInheritable": false, "position": 50 }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 60 + }, { "type": "label", "name": "iconClass", @@ -3359,7 +3472,7 @@ "BFs8mudNFgCS", "NRnIZmSMc5sj" ], - "title": "Export as PDF", + "title": "Printing & Exporting as PDF", "notePosition": 120, "prefix": null, "isExpanded": false, @@ -3376,27 +3489,76 @@ { "type": "relation", "name": "internalLink", - "value": "wy8So3yZZlH9", + "value": "0ESUbbAxVnoK", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "4TIF1oA4VQRO", + "value": "wy8So3yZZlH9", "isInheritable": false, "position": 30 }, + { + "type": "relation", + "name": "internalLink", + "value": "CohkqWQC1iBv", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "4TIF1oA4VQRO", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "KSZ04uQ2D1St", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GTwFsgaA0lCt", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zP3PMqaG71Ct", + "isInheritable": false, + "position": 90 + }, + { + "type": "relation", + "name": "internalLink", + "value": "AlhDUqhENtH7", + "isInheritable": false, + "position": 100 + }, { "type": "label", "name": "iconClass", - "value": "bx bxs-file-pdf", + "value": "bx bx-printer", "isInheritable": false, "position": 30 } ], "format": "markdown", - "dataFileName": "Export as PDF.md", + "dataFileName": "Printing & Exporting as PDF.md", "attachments": [ { "attachmentId": "NfSjRsArIQHy", @@ -3404,7 +3566,7 @@ "role": "image", "mime": "image/png", "position": 10, - "dataFileName": "Export as PDF_image.png" + "dataFileName": "Printing & Exporting as PD.png" }, { "attachmentId": "Om2EmdZr54vy", @@ -3412,7 +3574,7 @@ "role": "image", "mime": "image/png", "position": 10, - "dataFileName": "1_Export as PDF_image.png" + "dataFileName": "1_Printing & Exporting as PD.png" } ] }, @@ -3435,59 +3597,73 @@ { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "_optionsTextNotes", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "iPIMuisry3hd", + "value": "_optionsCodeNotes", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "6f9hih2hXXZk", + "value": "zEY4DaJG4YT5", "isInheritable": false, "position": 30 }, { "type": "relation", "name": "internalLink", - "value": "4TIF1oA4VQRO", + "value": "iPIMuisry3hd", "isInheritable": false, "position": 40 }, { "type": "relation", "name": "internalLink", - "value": "BlN9DFI679QC", + "value": "6f9hih2hXXZk", "isInheritable": false, "position": 50 }, { "type": "relation", "name": "internalLink", - "value": "XpOYSgsLkTJy", + "value": "4TIF1oA4VQRO", "isInheritable": false, "position": 60 }, { "type": "relation", "name": "internalLink", - "value": "s1aBHPd79XYj", + "value": "BlN9DFI679QC", "isInheritable": false, "position": 70 }, { "type": "relation", "name": "internalLink", - "value": "81SGnPGMk7Xc", + "value": "XpOYSgsLkTJy", "isInheritable": false, "position": 80 }, + { + "type": "relation", + "name": "internalLink", + "value": "s1aBHPd79XYj", + "isInheritable": false, + "position": 90 + }, + { + "type": "relation", + "name": "internalLink", + "value": "81SGnPGMk7Xc", + "isInheritable": false, + "position": 100 + }, { "type": "label", "name": "shareAlias", @@ -5744,10 +5920,17 @@ { "type": "relation", "name": "internalLink", - "value": "BlN9DFI679QC", + "value": "_optionsTextNotes", "isInheritable": false, "position": 20 }, + { + "type": "relation", + "name": "internalLink", + "value": "BlN9DFI679QC", + "isInheritable": false, + "position": 30 + }, { "type": "label", "name": "iconClass", @@ -5923,17 +6106,24 @@ { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "_optionsTextNotes", "isInheritable": false, "position": 30 }, { "type": "relation", "name": "internalLink", - "value": "BFvAtE74rbP6", + "value": "zEY4DaJG4YT5", "isInheritable": false, "position": 40 }, + { + "type": "relation", + "name": "internalLink", + "value": "BFvAtE74rbP6", + "isInheritable": false, + "position": 50 + }, { "type": "label", "name": "iconClass", @@ -6227,6 +6417,13 @@ "value": "nRhnJkTT8cPs", "isInheritable": false, "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R9pX4DGra2Vt", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -6664,23 +6861,23 @@ "dataFileName": "Lists.md", "attachments": [ { - "attachmentId": "5cmICTYfg13g", + "attachmentId": "1d3z8mz0JANE", "title": "image.png", "role": "image", - "mime": "image/jpg", + "mime": "image/png", "position": 10, "dataFileName": "Lists_image.png" }, { - "attachmentId": "6jl7tboJfutt", + "attachmentId": "7YtO7boIQcSu", "title": "image.png", "role": "image", - "mime": "image/jpg", + "mime": "image/png", "position": 10, "dataFileName": "1_Lists_image.png" }, { - "attachmentId": "7Ledf67P1S1b", + "attachmentId": "eCftcYsVKdAI", "title": "image.png", "role": "image", "mime": "image/png", @@ -6688,7 +6885,7 @@ "dataFileName": "2_Lists_image.png" }, { - "attachmentId": "d4XfLoK5srYZ", + "attachmentId": "fB3ZhdfysYC3", "title": "image.png", "role": "image", "mime": "image/jpg", @@ -6696,15 +6893,15 @@ "dataFileName": "3_Lists_image.png" }, { - "attachmentId": "eL11eZMPwpmH", + "attachmentId": "IZewdPx4evIx", "title": "image.png", "role": "image", - "mime": "image/jpg", + "mime": "image/png", "position": 10, "dataFileName": "4_Lists_image.png" }, { - "attachmentId": "EnkTpdeLJ6Ft", + "attachmentId": "JopMc0iA0dqA", "title": "image.png", "role": "image", "mime": "image/jpg", @@ -6712,7 +6909,7 @@ "dataFileName": "5_Lists_image.png" }, { - "attachmentId": "If3k6Tt5cPBt", + "attachmentId": "kZMYrJubac6T", "title": "image.png", "role": "image", "mime": "image/jpg", @@ -6720,7 +6917,7 @@ "dataFileName": "6_Lists_image.png" }, { - "attachmentId": "MxgVFEyXwRxo", + "attachmentId": "PGeVq8YAQBFA", "title": "image.png", "role": "image", "mime": "image/png", @@ -6728,26 +6925,26 @@ "dataFileName": "7_Lists_image.png" }, { - "attachmentId": "Te4LNZWv4ovM", + "attachmentId": "VgoG6BtlLYn7", "title": "image.png", "role": "image", - "mime": "image/png", + "mime": "image/jpg", "position": 10, "dataFileName": "8_Lists_image.png" }, { - "attachmentId": "tqeIwudL5QEY", + "attachmentId": "y0zFP6x0IRRf", "title": "image.png", "role": "image", - "mime": "image/png", + "mime": "image/jpg", "position": 10, "dataFileName": "9_Lists_image.png" }, { - "attachmentId": "zZGT8pbt2myS", + "attachmentId": "z8eVlXe2WKqr", "title": "image.png", "role": "image", - "mime": "image/png", + "mime": "image/jpg", "position": 10, "dataFileName": "10_Lists_image.png" } @@ -7276,10 +7473,17 @@ { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "_optionsTextNotes", "isInheritable": false, "position": 30 }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 40 + }, { "type": "label", "name": "iconClass", @@ -7611,38 +7815,52 @@ { "type": "relation", "name": "internalLink", - "value": "BFs8mudNFgCS", + "value": "zEY4DaJG4YT5", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "XpOYSgsLkTJy", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "OFXdgB2nNk1F", + "value": "oPVyFC7WL2Lp", "isInheritable": false, "position": 30 }, { "type": "relation", "name": "internalLink", - "value": "wX4HbRucYSDD", + "value": "yTjUdsOi4CIE", "isInheritable": false, "position": 40 }, { "type": "relation", "name": "internalLink", - "value": "BCkXAVs63Ttv", + "value": "OFXdgB2nNk1F", "isInheritable": false, "position": 50 }, + { + "type": "relation", + "name": "internalLink", + "value": "wX4HbRucYSDD", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bdUJEHsAPYQR", + "isInheritable": false, + "position": 70 + }, { "type": "label", "name": "shareAlias", @@ -7904,24 +8122,31 @@ { "type": "relation", "name": "internalLink", - "value": "m523cpzocqaD", + "value": "eIg8jdvaoNNd", "isInheritable": false, "position": 110 }, { "type": "relation", "name": "internalLink", - "value": "KC1HB96bqqHX", + "value": "m523cpzocqaD", "isInheritable": false, "position": 120 }, { "type": "relation", "name": "internalLink", - "value": "2mUhVmZK8RF3", + "value": "KC1HB96bqqHX", "isInheritable": false, "position": 130 }, + { + "type": "relation", + "name": "internalLink", + "value": "2mUhVmZK8RF3", + "isInheritable": false, + "position": 140 + }, { "type": "label", "name": "shareAlias", @@ -8571,6 +8796,107 @@ "dataFileName": "Board View_image.png" } ] + }, + { + "isClone": false, + "noteId": "zP3PMqaG71Ct", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "GTwFsgaA0lCt", + "zP3PMqaG71Ct" + ], + "title": "Presentation View", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "BlN9DFI679QC", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R9pX4DGra2Vt", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "0ESUbbAxVnoK", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "grjYqerjn243", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "AlhDUqhENtH7", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s1aBHPd79XYj", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "gBbsAeiuUxI5", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-slideshow", + "isInheritable": false, + "position": 10 + } + ], + "format": "markdown", + "dataFileName": "Presentation View.md", + "attachments": [ + { + "attachmentId": "aJa7vIrYknDw", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Presentation View_image.png" + }, + { + "attachmentId": "aPooMxP74PeA", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Presentation View_image.png" + } + ] } ] }, @@ -9503,7 +9829,29 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "9sRHySam5fXb", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "oPVyFC7WL2Lp", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zP3PMqaG71Ct", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "Custom app-wide CSS.md", "attachments": [ @@ -9516,7 +9864,7 @@ "dataFileName": "Custom app-wide CSS_image.png" }, { - "attachmentId": "TIerrMjmeich", + "attachmentId": "qBzZ9Qpxwoba", "title": "image.png", "role": "image", "mime": "image/png", @@ -9524,12 +9872,20 @@ "dataFileName": "1_Custom app-wide CSS_image.png" }, { - "attachmentId": "YUrNq5vsCwHe", + "attachmentId": "TIerrMjmeich", "title": "image.png", "role": "image", "mime": "image/png", "position": 10, "dataFileName": "2_Custom app-wide CSS_image.png" + }, + { + "attachmentId": "YUrNq5vsCwHe", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_Custom app-wide CSS_image.png" } ] } @@ -9687,185 +10043,192 @@ { "type": "relation", "name": "internalLink", - "value": "OFXdgB2nNk1F", + "value": "_help_YKWqdJhzi2VY", "isInheritable": false, "position": 50 }, { "type": "relation", "name": "internalLink", - "value": "BlN9DFI679QC", + "value": "OFXdgB2nNk1F", "isInheritable": false, "position": 60 }, { "type": "relation", "name": "internalLink", - "value": "vZWERwf8U3nx", + "value": "BlN9DFI679QC", "isInheritable": false, "position": 70 }, { "type": "relation", "name": "internalLink", - "value": "oPVyFC7WL2Lp", + "value": "vZWERwf8U3nx", "isInheritable": false, "position": 80 }, { "type": "relation", "name": "internalLink", - "value": "GPERMystNGTB", + "value": "oPVyFC7WL2Lp", "isInheritable": false, "position": 90 }, { "type": "relation", "name": "internalLink", - "value": "CoFPLs3dRlXc", + "value": "GPERMystNGTB", "isInheritable": false, "position": 100 }, { "type": "relation", "name": "internalLink", - "value": "AlhDUqhENtH7", + "value": "CoFPLs3dRlXc", "isInheritable": false, "position": 110 }, { "type": "relation", "name": "internalLink", - "value": "pKK96zzmvBGf", + "value": "AlhDUqhENtH7", "isInheritable": false, "position": 120 }, { "type": "relation", "name": "internalLink", - "value": "WFGzWeUK6arS", + "value": "pKK96zzmvBGf", "isInheritable": false, "position": 130 }, { "type": "relation", "name": "internalLink", - "value": "0ESUbbAxVnoK", + "value": "WFGzWeUK6arS", "isInheritable": false, "position": 140 }, { "type": "relation", "name": "internalLink", - "value": "J5Ex1ZrMbyJ6", + "value": "0ESUbbAxVnoK", "isInheritable": false, "position": 150 }, { "type": "relation", "name": "internalLink", - "value": "d3fAXQ2diepH", + "value": "J5Ex1ZrMbyJ6", "isInheritable": false, "position": 160 }, { "type": "relation", "name": "internalLink", - "value": "MgibgPcfeuGz", + "value": "d3fAXQ2diepH", "isInheritable": false, "position": 170 }, { "type": "relation", "name": "internalLink", - "value": "m523cpzocqaD", + "value": "MgibgPcfeuGz", "isInheritable": false, "position": 180 }, { "type": "relation", "name": "internalLink", - "value": "9sRHySam5fXb", + "value": "m523cpzocqaD", "isInheritable": false, "position": 190 }, { "type": "relation", "name": "internalLink", - "value": "u3YFHC9tQlpm", + "value": "9sRHySam5fXb", "isInheritable": false, "position": 200 }, { "type": "relation", "name": "internalLink", - "value": "R9pX4DGra2Vt", + "value": "u3YFHC9tQlpm", "isInheritable": false, "position": 210 }, { "type": "relation", "name": "internalLink", - "value": "iRwzGnHPzonm", + "value": "R9pX4DGra2Vt", "isInheritable": false, "position": 220 }, { "type": "relation", "name": "internalLink", - "value": "BCkXAVs63Ttv", + "value": "iRwzGnHPzonm", "isInheritable": false, "position": 230 }, { "type": "relation", "name": "internalLink", - "value": "47ZrP6FNuoG8", + "value": "BCkXAVs63Ttv", "isInheritable": false, "position": 240 }, { "type": "relation", "name": "internalLink", - "value": "KC1HB96bqqHX", + "value": "47ZrP6FNuoG8", "isInheritable": false, "position": 250 }, { "type": "relation", "name": "internalLink", - "value": "BFvAtE74rbP6", + "value": "KC1HB96bqqHX", "isInheritable": false, "position": 260 }, { "type": "relation", "name": "internalLink", - "value": "bdUJEHsAPYQR", + "value": "BFvAtE74rbP6", "isInheritable": false, "position": 270 }, { "type": "relation", "name": "internalLink", - "value": "AxshuNRegLAv", + "value": "bdUJEHsAPYQR", "isInheritable": false, "position": 280 }, { "type": "relation", "name": "internalLink", - "value": "81SGnPGMk7Xc", + "value": "AxshuNRegLAv", "isInheritable": false, "position": 290 }, { "type": "relation", "name": "internalLink", - "value": "xWbu3jpNWapp", + "value": "81SGnPGMk7Xc", "isInheritable": false, "position": 300 }, + { + "type": "relation", + "name": "internalLink", + "value": "xWbu3jpNWapp", + "isInheritable": false, + "position": 310 + }, { "type": "label", "name": "iconClass", @@ -10297,115 +10660,129 @@ { "type": "relation", "name": "internalLink", - "value": "6f9hih2hXXZk", + "value": "nBAXQFj20hS1", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "m523cpzocqaD", + "value": "6f9hih2hXXZk", "isInheritable": false, "position": 30 }, { "type": "relation", "name": "internalLink", - "value": "iRwzGnHPzonm", + "value": "m523cpzocqaD", "isInheritable": false, "position": 40 }, { "type": "relation", "name": "internalLink", - "value": "bdUJEHsAPYQR", + "value": "iRwzGnHPzonm", "isInheritable": false, "position": 50 }, { "type": "relation", "name": "internalLink", - "value": "HcABDtFCkbFN", + "value": "bdUJEHsAPYQR", "isInheritable": false, "position": 60 }, { "type": "relation", "name": "internalLink", - "value": "GTwFsgaA0lCt", + "value": "HcABDtFCkbFN", "isInheritable": false, "position": 70 }, { "type": "relation", "name": "internalLink", - "value": "s1aBHPd79XYj", + "value": "GTwFsgaA0lCt", "isInheritable": false, "position": 80 }, { "type": "relation", "name": "internalLink", - "value": "grjYqerjn243", + "value": "s1aBHPd79XYj", "isInheritable": false, "position": 90 }, { "type": "relation", "name": "internalLink", - "value": "1vHRoWCEjj0L", + "value": "grjYqerjn243", "isInheritable": false, "position": 100 }, { "type": "relation", "name": "internalLink", - "value": "gBbsAeiuUxI5", + "value": "1vHRoWCEjj0L", "isInheritable": false, "position": 110 }, { "type": "relation", "name": "internalLink", - "value": "81SGnPGMk7Xc", + "value": "gBbsAeiuUxI5", "isInheritable": false, "position": 120 }, { "type": "relation", "name": "internalLink", - "value": "W8vYD3Q1zjCR", + "value": "81SGnPGMk7Xc", "isInheritable": false, "position": 130 }, { "type": "relation", "name": "internalLink", - "value": "WOcw2SLH6tbX", + "value": "W8vYD3Q1zjCR", "isInheritable": false, "position": 140 }, { "type": "relation", "name": "internalLink", - "value": "bwZpz2ajCEwO", + "value": "WOcw2SLH6tbX", "isInheritable": false, "position": 150 }, { "type": "relation", "name": "internalLink", - "value": "Wy267RK4M69c", + "value": "x3i7MxGccDuM", "isInheritable": false, "position": 160 }, { "type": "relation", "name": "internalLink", - "value": "Qjt68inQ2bRj", + "value": "bwZpz2ajCEwO", "isInheritable": false, "position": 170 }, + { + "type": "relation", + "name": "internalLink", + "value": "Wy267RK4M69c", + "isInheritable": false, + "position": 180 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Qjt68inQ2bRj", + "isInheritable": false, + "position": 190 + }, { "type": "label", "name": "shareAlias", @@ -10424,14 +10801,6 @@ "format": "markdown", "dataFileName": "Sharing.md", "attachments": [ - { - "attachmentId": "2kLFcH6hel9i", - "title": "shared-list.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Sharing_shared-list.png" - }, { "attachmentId": "ibqWQUOCMhIE", "title": "image.png", @@ -11322,6 +11691,13 @@ "type": "text", "mime": "text/markdown", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "tAassRL4RSQL", + "isInheritable": false, + "position": 10 + }, { "type": "label", "name": "shareAlias", @@ -11881,94 +12257,178 @@ { "type": "relation", "name": "internalLink", - "value": "YKWqdJhzi2VY", + "value": "_globalNoteMap", "isInheritable": false, "position": 40 }, { "type": "relation", "name": "internalLink", - "value": "ivYnonVFBxbQ", + "value": "_sqlConsole", "isInheritable": false, "position": 50 }, { "type": "relation", "name": "internalLink", - "value": "eIg8jdvaoNNd", + "value": "YKWqdJhzi2VY", "isInheritable": false, "position": 60 }, { "type": "relation", "name": "internalLink", - "value": "QEAPj01N5f7w", + "value": "_search", "isInheritable": false, "position": 70 }, { "type": "relation", "name": "internalLink", - "value": "m1lbrzyKDaRB", + "value": "_bulkAction", "isInheritable": false, "position": 80 }, { "type": "relation", "name": "internalLink", - "value": "x3i7MxGccDuM", + "value": "ivYnonVFBxbQ", "isInheritable": false, "position": 90 }, { "type": "relation", "name": "internalLink", - "value": "bdUJEHsAPYQR", + "value": "_backendLog", "isInheritable": false, "position": 100 }, { "type": "relation", "name": "internalLink", - "value": "xYmIYSP6wE3F", + "value": "_userHidden", "isInheritable": false, "position": 110 }, { "type": "relation", "name": "internalLink", - "value": "u3YFHC9tQlpm", + "value": "_lbTplRoot", "isInheritable": false, "position": 120 }, { "type": "relation", "name": "internalLink", - "value": "qzNzp9LYQyPT", + "value": "_share", "isInheritable": false, "position": 130 }, { "type": "relation", "name": "internalLink", - "value": "CdNpE2pqjmI6", + "value": "_lbRoot", "isInheritable": false, "position": 140 }, { "type": "relation", "name": "internalLink", - "value": "R9pX4DGra2Vt", + "value": "_options", "isInheritable": false, "position": 150 }, { "type": "relation", "name": "internalLink", - "value": "4TIF1oA4VQRO", + "value": "_lbMobileRoot", "isInheritable": false, "position": 160 }, + { + "type": "relation", + "name": "internalLink", + "value": "_help", + "isInheritable": false, + "position": 170 + }, + { + "type": "relation", + "name": "internalLink", + "value": "eIg8jdvaoNNd", + "isInheritable": false, + "position": 180 + }, + { + "type": "relation", + "name": "internalLink", + "value": "QEAPj01N5f7w", + "isInheritable": false, + "position": 190 + }, + { + "type": "relation", + "name": "internalLink", + "value": "m1lbrzyKDaRB", + "isInheritable": false, + "position": 200 + }, + { + "type": "relation", + "name": "internalLink", + "value": "x3i7MxGccDuM", + "isInheritable": false, + "position": 210 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bdUJEHsAPYQR", + "isInheritable": false, + "position": 220 + }, + { + "type": "relation", + "name": "internalLink", + "value": "xYmIYSP6wE3F", + "isInheritable": false, + "position": 230 + }, + { + "type": "relation", + "name": "internalLink", + "value": "u3YFHC9tQlpm", + "isInheritable": false, + "position": 240 + }, + { + "type": "relation", + "name": "internalLink", + "value": "qzNzp9LYQyPT", + "isInheritable": false, + "position": 250 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 260 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R9pX4DGra2Vt", + "isInheritable": false, + "position": 270 + }, + { + "type": "relation", + "name": "internalLink", + "value": "4TIF1oA4VQRO", + "isInheritable": false, + "position": 280 + }, { "type": "label", "name": "iconClass", @@ -13042,6 +13502,49 @@ "attachments": [] } ] + }, + { + "isClone": false, + "noteId": "vElnKeDNPSVl", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "vElnKeDNPSVl" + ], + "title": "Logging", + "notePosition": 100, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "bnyigUA2UK7s", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-terminal", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Logging.md", + "attachments": [ + { + "attachmentId": "OFVZwVeITJOR", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Logging_image.png" + } + ] } ] } diff --git a/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md b/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md index 53307238f..071bbb7cf 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md +++ b/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md @@ -39,4 +39,4 @@ This is a list of labels that Trilium natively supports. > [!TIP] > Some labels presented here end with a `*`. That means that there are multiple labels with the same prefix, consult the specific page linked in the description of that label for more information. -
    {t("search_definition.add_search_option")} - {searchOptions?.availableOptions.map(({ icon, label, tooltip, attributeName, attributeType, defaultValue }) => ( -
    {t("search_definition.add_search_option")} + {searchOptions?.availableOptions.map(({ icon, label, tooltip, attributeName, attributeType, defaultValue }) => ( +
    -
    +
    - + In the ribbon, press the ā€œOwned Attributesā€ section and type #appCss.
    - + Type the desired CSS. + Type the desired CSS.  

    Generally it's a good idea to append !important for the styles that are being changed, in order to prevent other
    LabelDescription
    disableVersioningDisables automatic creation of Note Revisions for a particular note. Useful for e.g. large, but unimportant notes - e.g. large JS libraries used for scripting.
    versioningLimitLimits the maximum number of Note Revisions for a particular note, overriding the global settings.
    calendarRootMarks the note which should be used as root for Day Notes. Only one should be marked as such.
    archivedHides notes from default search results and dialogs. Archived notes can optionally be hidden in the Note Tree.
    excludeFromExportExcludes this note and its children when exporting.
    run, runOnInstance, runAtHourSee Events.
    disableInclusionScripts with this label won't be included into parent script execution.
    sorted

    Keeps child notes sorted by title alphabetically.

    When given a value, it will sort by the value of another label instead. If one of the child notes doesn't have the specified label, the title will be used for them instead.

    sortDirection

    If sorted is applied, specifies the direction of the sort:

    • ASC, ascending (default)
    • DESC, descending
    sortFoldersFirstIf sorted is applied, folders (notes with children) will be sorted as a group at the top, and the rest will be sorted.
    topIf sorted is applied to the parent note, keeps given note on top in its parent.
    hidePromotedAttributesHide Promoted Attributes on this note. Generally useful when defining inherited attributes, but the parent note doesn't need them.
    readOnlyMarks a note to be always be read-only, if it's a supported note (text, code, mermaid).
    autoReadOnlyDisabledDisables automatic read-only mode for the given note.
    appCssMarks CSS notes which are loaded into the Trilium application and can thus be used to modify Trilium's looks. See Custom app-wide CSS for more info.
    appThemeMarks CSS notes which are full Trilium themes and are thus available in Trilium options. See Theme development for more information.
    appThemeBaseSet to next, next-light, or next-dark to use the corresponding TriliumNext theme (auto, light or dark) as the base for a custom theme, instead of the legacy one. See Customize the Next theme for more information.
    cssClassValue of this label is then added as CSS class to the node representing given note in the Note Tree. This can be useful for advanced theming. Can be used in template notes.
    iconClassvalue of this label is added as a CSS class to the icon on the tree which can help visually distinguish the notes in the tree. Example might be bx bx-home - icons are taken from boxicons. Can be used in template notes.
    pageSizeSpecifies the number of items per page in Note List.
    customRequestHandlerSee Custom Request Handler.
    customResourceProviderSee Custom Resource Providers.
    widgetMarks this note as a custom widget which will be added to the Trilium component tree. See Custom Widgets for more information.
    searchHomeNew search notes will be created as children of this note (see Saved Search).
    workspace and related attributesSee Workspaces.
    inboxdefault inbox location for new notes - when you create a note using new note button in the sidebar, notes will be created as child notes in the note marked as with #inbox label.
    sqlConsoleHomeDefault location of SQL Console notes
    bookmarkedIndicates this note is a bookmark.
    bookmarkFolderNote with this label will appear in bookmarks as folder (allowing access to its children). See Bookmarks for more information.
    share*See the attribute reference in Sharing.
    displayRelations, hideRelationsComma delimited names of relations which should be displayed/hidden in a Relation Map (both the note type and the Note Map (Link map, Tree map) general functionality).
    titleTemplate

    Default title of notes created as children of this note. This value is evaluated as a JavaScript string and thus can be enriched with dynamic content via the injected now and parentNote variables.

    Examples:

    • \({parentNote.getLabel('authorName')}'s literary works
    • Log for \){now.format('YYYY-MM-DD HH:mm:ss')}
    • to mirror the parent's template.

    See Default Note Title for more info.

    templateThis note will appear in the selection of available template when creating new note. See Templates for more information.
    tocControls the display of the Table of contents for a given note. #toc or #toc=show to always display the table of contents, #toc=false to always hide it.
    colordefines color of the note in note tree, links etc. Use any valid CSS color value like 'red' or #a13d5f
    keyboardShortcutDefines a keyboard shortcut which will immediately jump to this note. Example: 'ctrl+alt+e'. Requires frontend reload for the change to take effect.
    keepCurrentHoistingOpening this link won't change hoisting even if the note is not displayable in the current hoisted subtree.
    executeButtonTitle of the button which will execute the current code note
    executeDescriptionLonger description of the current code note displayed together with the execute button
    excludeFromNoteMapNotes with this label will be hidden from the Note Map.
    newNotesOnTopNew notes will be created at the top of the parent note, not on the bottom.
    hideHighlightWidgetHides the Highlights list widget
    hideChildrenOverviewHides the Note List for that particular note.
    printLandscapeWhen exporting to PDF, changes the orientation of the page to landscape instead of portrait.
    printPageSizeWhen exporting to PDF, changes the size of the page. Supported values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
    geolocationIndicates the latitude and longitude of a note, to be displayed in a Geo Map.
    calendar:*Defines specific options for the Calendar View.
    viewTypeSets the view of child notes (e.g. grid or list). See Note List for more information.
    \ No newline at end of file +
    LabelDescription
    disableVersioningDisables automatic creation of Note Revisions for a particular note. Useful for e.g. large, but unimportant notes - e.g. large JS libraries used for scripting.
    versioningLimitLimits the maximum number of Note Revisions for a particular note, overriding the global settings.
    calendarRootMarks the note which should be used as root for Day Notes. Only one should be marked as such.
    archivedHides notes from default search results and dialogs. Archived notes can optionally be hidden in the Note Tree.
    excludeFromExportExcludes this note and its children when exporting.
    run, runOnInstance, runAtHourSee Events.
    disableInclusionScripts with this label won't be included into parent script execution.
    sorted

    Keeps child notes sorted by title alphabetically.

    When given a value, it will sort by the value of another label instead. If one of the child notes doesn't have the specified label, the title will be used for them instead.

    sortDirection

    If sorted is applied, specifies the direction of the sort:

    • ASC, ascending (default)
    • DESC, descending
    sortFoldersFirstIf sorted is applied, folders (notes with children) will be sorted as a group at the top, and the rest will be sorted.
    topIf sorted is applied to the parent note, keeps given note on top in its parent.
    hidePromotedAttributesHide Promoted Attributes on this note. Generally useful when defining inherited attributes, but the parent note doesn't need them.
    readOnlyMarks a note to be always be read-only, if it's a supported note (text, code, mermaid).
    autoReadOnlyDisabledDisables automatic read-only mode for the given note.
    appCssMarks CSS notes which are loaded into the Trilium application and can thus be used to modify Trilium's looks. See Custom app-wide CSS for more info.
    appThemeMarks CSS notes which are full Trilium themes and are thus available in Trilium options. See Theme development for more information.
    appThemeBaseSet to next, next-light, or next-dark to use the corresponding TriliumNext theme (auto, light or dark) as the base for a custom theme, instead of the legacy one. See Customize the Next theme for more information.
    cssClassValue of this label is then added as CSS class to the node representing given note in the Note Tree. This can be useful for advanced theming. Can be used in template notes.
    iconClassvalue of this label is added as a CSS class to the icon on the tree which can help visually distinguish the notes in the tree. Example might be bx bx-home - icons are taken from boxicons. Can be used in template notes.
    pageSizeSpecifies the number of items per page in Note List.
    customRequestHandlerSee Custom Request Handler.
    customResourceProviderSee Custom Resource Providers.
    widgetMarks this note as a custom widget which will be added to the Trilium component tree. See Custom Widgets for more information.
    searchHomeNew search notes will be created as children of this note (see Saved Search).
    workspace and related attributesSee Workspaces.
    inboxdefault inbox location for new notes - when you create a note using new note button in the sidebar, notes will be created as child notes in the note marked as with #inbox label.
    sqlConsoleHomeDefault location of SQL Console notes
    bookmarkedIndicates this note is a bookmark.
    bookmarkFolderNote with this label will appear in bookmarks as folder (allowing access to its children). See Bookmarks for more information.
    share*See the attribute reference in Sharing.
    displayRelations, hideRelationsComma delimited names of relations which should be displayed/hidden in a Relation Map (both the note type and the Note Map (Link map, Tree map) general functionality).
    titleTemplate

    Default title of notes created as children of this note. This value is evaluated as a JavaScript string and thus can be enriched with dynamic content via the injected now and parentNote variables.

    Examples:

    • \({parentNote.getLabel('authorName')}'s literary works
    • Log for \){now.format('YYYY-MM-DD HH:mm:ss')}
    • to mirror the parent's template.

    See Default Note Title for more info.

    templateThis note will appear in the selection of available template when creating new note. See Templates for more information.
    tocControls the display of the Table of contents for a given note. #toc or #toc=show to always display the table of contents, #toc=false to always hide it.
    colordefines color of the note in note tree, links etc. Use any valid CSS color value like 'red' or #a13d5f
    Note: this color may be automatically adjusted when displayed to ensure sufficient contrast with the background.
    keyboardShortcutDefines a keyboard shortcut which will immediately jump to this note. Example: 'ctrl+alt+e'. Requires frontend reload for the change to take effect.
    keepCurrentHoistingOpening this link won't change hoisting even if the note is not displayable in the current hoisted subtree.
    executeButtonTitle of the button which will execute the current code note
    executeDescriptionLonger description of the current code note displayed together with the execute button
    excludeFromNoteMapNotes with this label will be hidden from the Note Map.
    newNotesOnTopNew notes will be created at the top of the parent note, not on the bottom.
    hideHighlightWidgetHides the Highlights list widget
    hideChildrenOverviewHides the Note List for that particular note.
    printLandscapeWhen exporting to PDF, changes the orientation of the page to landscape instead of portrait.
    printPageSizeWhen exporting to PDF, changes the size of the page. Supported values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
    geolocationIndicates the latitude and longitude of a note, to be displayed in a Geo Map.
    calendar:*Defines specific options for the Calendar View.
    viewTypeSets the view of child notes (e.g. grid or list). See Note List for more information.
    \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md b/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md index 2916640ec..454e7d007 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md +++ b/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md @@ -50,5 +50,6 @@ These relations are supported and used internally by Trilium. | `widget_relation` | target of this relation will be executed and rendered as a widget in the sidebar | | `shareCss` | CSS note which will be injected into the share page. CSS note must be in the shared sub-tree as well. Consider using `share_hidden_from_tree` and `share_omit_default_css` as well. | | `shareJs` | JavaScript note which will be injected into the share page. JS note must be in the shared sub-tree as well. Consider using `share_hidden_from_tree`. | +| `shareHtml` | HTML note which will be injected into the share page at locations specified by the `shareHtmlLocation` label. HTML note must be in the shared sub-tree as well. Consider using `share_hidden_from_tree`. | | `shareTemplate` | Embedded JavaScript note that will be used as the template for displaying the shared note. Falls back to the default template. Consider using `share_hidden_from_tree`. | | `shareFavicon` | Favicon note to be set in the shared page. Typically you want to set it to share root and make it inheritable. Favicon note must be in the shared sub-tree as well. Consider using `share_hidden_from_tree`. | \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.md b/docs/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.md index aca209e0e..936cc3c4e 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.md +++ b/docs/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.md @@ -1,6 +1,10 @@ # Configuration (config.ini or environment variables) Trilium supports configuration via a file named `config.ini` and environment variables. This document provides a comprehensive reference for all configuration options. +## Location of the configuration file + +The configuration file is not located in the same directory as the application. Instead, the `config.ini` is located in theĀ Data directory. As such, the configuration file is only available after starting the application and creating a database. + ## Configuration Precedence Configuration values are loaded in the following order of precedence (highest to lowest): @@ -129,7 +133,7 @@ Both naming patterns are fully supported and can be used interchangeably: ```yaml services: trilium: - image: triliumnext/notes + image: triliumnext/trilium environment: # Using full format TRILIUM_GENERAL_INSTANCENAME: "My Trilium Instance" @@ -146,7 +150,7 @@ services: ### Shell Export Example -```sh +``` # Using either format export TRILIUM_GENERAL_NOAUTHENTICATION=false export TRILIUM_NETWORK_HTTPS=true diff --git a/docs/User Guide/User Guide/Advanced Usage/ETAPI (REST API).md b/docs/User Guide/User Guide/Advanced Usage/ETAPI (REST API).md index 4ea811020..12c284055 100644 --- a/docs/User Guide/User Guide/Advanced Usage/ETAPI (REST API).md +++ b/docs/User Guide/User Guide/Advanced Usage/ETAPI (REST API).md @@ -61,4 +61,12 @@ Make sure to replace the values of: * `TOKEN` with your ETAPI token. * `SERVER` with the correct protocol, host name and port to your Trilium instance. -* `NOTE_ID` with an existing note ID to download. \ No newline at end of file +* `NOTE_ID` with an existing note ID to download. + +As another example, to obtain a .zip export of a note and place it in a directory called `out`, simply replace the last statement in the script with: + +``` +curl -H "Authorization: $TOKEN" \ + -X GET "$SERVER/etapi/notes/$NOTE_ID/export" \ + --output "out/$NOTE_ID.zip" +``` \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Sharing.md b/docs/User Guide/User Guide/Advanced Usage/Sharing.md index 64b5767dd..5395f959c 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Sharing.md +++ b/docs/User Guide/User Guide/Advanced Usage/Sharing.md @@ -16,7 +16,7 @@ Trilium allows you to share selected notes as **publicly accessible** read-only ### By note type -
     Supported featuresLimitations
    Text
    • Table of contents.
    • Syntax highlight of code blocks, provided a language is selected (does not work if ā€œAuto-detectedā€ is enabled).
    • Rendering for math equations.
    • Including notes is not supported.
    • Inline Mermaid diagrams are not rendered.
    Code
    • Basic support (displaying the contents of the note in a monospace font).
    • No syntax highlight.
    Saved SearchNot supported. 
    Relation MapNot supported. 
    Note MapNot supported. 
    Render NoteNot supported. 
    Collections
    • The child notes are displayed in a fixed format. 
    • More advanced view types such as the calendar view are not supported.
    Mermaid Diagrams
    • The diagram is displayed as a vector image.
    • No further interaction supported.
    Canvas
    • The diagram is displayed as a vector image.
    • No further interaction supported.
    Web ViewNot supported. 
    Mind MapThe diagram is displayed as a vector image.
    • No further interaction supported.
    Geo Map ViewNot supported. 
    FileBasic interaction (downloading the file).
    • No further interaction supported.
    +
     Supported featuresLimitations
    Text
    • Table of contents.
    • Syntax highlight of code blocks, provided a language is selected (does not work if ā€œAuto-detectedā€ is enabled).
    • Rendering for math equations.
    • Including notes (only if the included notes are also shared).
    • Inline Mermaid diagrams are not rendered.
    Code
    • Basic support (displaying the contents of the note in a monospace font).
    • No syntax highlight.
    Saved SearchNot supported. 
    Relation MapNot supported. 
    Note MapNot supported. 
    Render NoteNot supported. 
    Collections
    • The child notes are displayed in a fixed format. 
    • More advanced view types such as the calendar view are not supported.
    Mermaid Diagrams
    • The diagram is displayed as a vector image.
    • No further interaction supported.
    Canvas
    • The diagram is displayed as a vector image.
    • No further interaction supported.
    Web ViewNot supported. 
    Mind MapThe diagram is displayed as a vector image.
    • No further interaction supported.
    Geo Map ViewNot supported. 
    FileBasic interaction (downloading the file).
    • No further interaction supported.
    While the sharing feature is powerful, it has some limitations: @@ -31,32 +31,32 @@ Some of these limitations may be addressed in future updates. To use the sharing feature, you must have aĀ Server InstallationĀ of Trilium. This is necessary because the notes will be hosted from the server. -## How to Share a Note +## Sharing a note 1. **Enable Sharing**: To share a note, toggle the `Shared` switch within the note's interface. Once sharing is enabled, an URL will appear, which you can click to access the shared note. ![Share Note](Sharing_share-single-note.png) 2. **Access the Shared Note**: The link provided will open the note in your browser. If your server is not configured with a public IP, the URL will refer to `localhost (127.0.0.1)`. -## Sharing a Note Subtree +## Sharing a note subtree When you share a note, you actually share the entire subtree of notes beneath it. If the note has child notes, they will also be included in the shared content. For example, sharing the "Formatting" subtree will display a page with basic navigation for exploring all the notes within that subtree. -## Viewing All Shared Notes +## Viewing and managing shared notes -You can view a list of all shared notes by clicking on "Show Shared Notes Subtree." This allows you to manage and navigate through all the notes you have made public. +You can view a list of all shared notes by clicking on "Show Shared Notes Subtree" in theĀ Global menu. This allows you to manage and navigate through all the notes you have made public. -## Security Considerations +## Security considerations Shared notes are published on the open internet and can be accessed by anyone with the URL. The URL's randomness does not provide security, so it is crucial not to share sensitive information through this feature. -### Password Protection +### Password protection To protect shared notes with a username and password, you can use the `#shareCredentials` attribute. Add this label to the note with the format `#shareCredentials="username:password"`. To protect an entire subtree, make sure the label is [inheritable](Attributes/Attribute%20Inheritance.md). -## Advanced Sharing Options +## Advanced sharing options -### Customizing the Appearance of Shared Notes +### Customizing the appearance of shared notes The default design should be a good starting point, but you can customize it using your own CSS: @@ -67,6 +67,25 @@ The default design should be a good starting point, but you can customize it usi You can inject custom JavaScript into the shared note using the `~shareJs` relation. This allows you to access note attributes or traverse the note tree using the `fetchNote()` API, which retrieves note data based on its ID. +### Adding custom HTML + +You can inject custom HTML snippets into specific locations of the shared page using the `~shareHtml` relation. The HTML note should contain the raw HTML content you want to inject, and you can control where it appears by adding the `#shareHtmlLocation` label to the HTML snippet note itself. + +The `#shareHtmlLocation` label accepts values in the format `location:position`: + +* **Locations**: `head`, `body`, `content` +* **Positions**: `start`, `end` + +For example: + +* `#shareHtmlLocation=head:start` - Injects HTML at the beginning of the `` section +* `#shareHtmlLocation=head:end` - Injects HTML at the end of the `` section (default) +* `#shareHtmlLocation=body:start` - Injects HTML at the beginning of the `` section +* `#shareHtmlLocation=content:start` - Injects HTML at the beginning of the content area +* `#shareHtmlLocation=content:end` - Injects HTML at the end of the content area + +If no location is specified, the HTML will be injected at `content:end` by default. + Example: ```javascript @@ -78,7 +97,7 @@ for (const attr of parentNote.attributes) { } ``` -### Creating Human-Readable URL Aliases +### Creating human-readable URL aliases Shared notes typically have URLs like `http://domain.tld/share/knvU8aJy4dJ7`, where the last part is the note's ID. You can make these URLs more user-friendly by adding the `#shareAlias` label to individual notes (e.g., `#shareAlias=highlighting`). This will change the URL to `http://domain.tld/share/highlighting`. @@ -87,23 +106,26 @@ Shared notes typically have URLs like `http://domain.tld/share/knvU8aJy4dJ7`, wh 1. Ensure that aliases are unique. 2. Using slashes (`/`) within aliases to create subpaths is not supported. -### Viewing and Managing Shared Notes - -All shared notes are grouped under an automatically managed "Shared Notes" section. From here, you can view, share, or unshare notes by moving or cloning them within this section. - -![Shared Notes List](Sharing_shared-list.png) - -### Setting a Custom Favicon +### Setting a custom favicon To customize the favicon for your shared pages, create a relation `~shareFavicon` pointing to a file note containing the favicon (e.g., in `.ico` format). -### Sharing a Note as the Root +### Sharing a note as the root -You can designate a specific note or folder as the root of your shared content by adding the `#shareRoot` label. This note will be linked when visiting `[http://domain.tld/share](http://domain/share)`, making it easier to use Trilium as a fully-fledged website. Consider combining this with the `#shareIndex` label, which will display a list of all shared notes. +You can designate a specific note or folder as the root of your shared content by adding the `#shareRoot` label. This note will be linked when visiting `[http://domain.tld/share](http://domain/share)`, making it easier to use Trilium as a fully-fledged website. + +> [!TIP] +> Consider combining this with the `#shareIndex` label, which will display a list of all shared notes. + +### Displaying an index of shared notes + +When accessing a share, the sub-notes will be displayed in a tree on the left. But since multiple note trees can be shared, it might be useful to display a list of all the different share trees. + +To do so, create a shared text note and apply the `shareIndex` label. When viewed, the list of shared roots will be displayed at the bottom of the note. ## Attribute reference -
    AttributeDescription
    shareHiddenFromTreethis note is hidden from left navigation tree, but still accessible with its URL
    shareExternalLinknote will act as a link to an external website in the share tree
    shareAliasdefine an alias using which the note will be available under https://your_trilium_host/share/[your_alias]
    shareOmitDefaultCssdefault share page CSS will be omitted. Use when you make extensive styling changes.
    shareRootmarks note which is served on /share root.
    shareDescriptiondefine text to be added to the HTML meta tag for description
    shareRawNote will be served in its raw format, without HTML wrapper. See also Serving directly the content of a note for an alternative method without setting an attribute.
    shareDisallowRobotIndexing

    Indicates to web crawlers that the page should not be indexed of this note by:

    • Setting the X-Robots-Tag: noindex HTTP header.
    • Setting the noindex, follow meta tag.
    shareCredentialsrequire credentials to access this shared note. Value is expected to be in format username:password. Don't forget to make this inheritable to apply to child-notes/images.
    shareIndexNote with this label will list all roots of shared notes.
    +
    AttributeDescription
    shareHiddenFromTreethis note is hidden from left navigation tree, but still accessible with its URL
    shareExternalLinknote will act as a link to an external website in the share tree
    shareAliasdefine an alias using which the note will be available under https://your_trilium_host/share/[your_alias]
    shareOmitDefaultCssdefault share page CSS will be omitted. Use when you make extensive styling changes.
    shareRootmarks note which is served on /share root.
    shareDescriptiondefine text to be added to the HTML meta tag for description
    shareRawNote will be served in its raw format, without HTML wrapper. See also Serving directly the content of a note for an alternative method without setting an attribute.
    shareDisallowRobotIndexing

    Indicates to web crawlers that the page should not be indexed of this note by:

    • Setting the X-Robots-Tag: noindex HTTP header.
    • Setting the noindex, follow meta tag.
    shareCredentialsrequire credentials to access this shared note. Value is expected to be in format username:password. Don't forget to make this inheritable to apply to child-notes/images.
    shareIndexNote with this label will list all roots of shared notes.
    shareHtmlLocationdefines where custom HTML injected via ~shareHtml relation should be placed. Applied to the HTML snippet note itself. Format: location:position where location is head, body, or content and position is start or end. Defaults to content:end.
    ## Credits diff --git a/docs/User Guide/User Guide/Advanced Usage/Sharing_shared-list.png b/docs/User Guide/User Guide/Advanced Usage/Sharing_shared-list.png deleted file mode 100644 index 8002303f8..000000000 Binary files a/docs/User Guide/User Guide/Advanced Usage/Sharing_shared-list.png and /dev/null differ diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/1_Export as PDF_image.png b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/1_Printing & Exporting as PD.png similarity index 100% rename from docs/User Guide/User Guide/Basic Concepts and Features/Notes/1_Export as PDF_image.png rename to docs/User Guide/User Guide/Basic Concepts and Features/Notes/1_Printing & Exporting as PD.png diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF.md deleted file mode 100644 index 20f5b7394..000000000 --- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF.md +++ /dev/null @@ -1,38 +0,0 @@ -# Export as PDF -![](Export%20as%20PDF_image.png) - -Screenshot of the note contextual menu indicating the ā€œExport as PDFā€ option. - -On the desktop application of Trilium it is possible to export a note as PDF. On the server or PWA (mobile), the option is not available due to technical constraints and it will be hidden. - -To print a note, select the ![](1_Export%20as%20PDF_image.png) button to the right of the note and select _Export as PDF_. - -Afterwards you will be prompted to select where to save the PDF file. - -## Automatic opening of the file - -When the PDF is exported, it is automatically opened with the system default application for easy preview. - -Note that if you are using Linux with the GNOME desktop environment, sometimes the default application might seem incorrect (such as opening in GIMP). This is because it uses Gnome's ā€œRecommended applicationsā€ list. - -To solve this, you can change the recommended application for PDFs via this command line. First, list the available applications via `gio mime application/pdf` and then set the desired one. For example to use GNOME's Evince: - -``` -gio mime application/pdf -``` - -## Reporting issues with the rendering - -Should you encounter any visual issues in the resulting PDF file (e.g. a table does not fit properly, there is cut off text, etc.) feel free to [report the issue](../../Troubleshooting/Reporting%20issues.md). In this case, it's best to offer a sample note (click on the ![](1_Export%20as%20PDF_image.png) button, select Export note → This note and all of its descendants → HTML in ZIP archive). Make sure not to accidentally leak any personal information. - -## Landscape mode - -When exporting to PDF, there are no customizable settings such as page orientation, size, etc. However, it is possible to specify a given note to be printed as a PDF in landscape mode by adding the `#printLandscape` attribute to it (seeĀ Attributes). - -## Page size - -By default, the resulting PDF will be in Letter format. It is possible to adjust it to another page size via the `#printPageSize` attribute, with one of the following values: `A0`, `A1`, `A2`, `A3`, `A4`, `A5`, `A6`, `Legal`, `Letter`, `Tabloid`, `Ledger`. - -## Keyboard shortcut - -It's possible to trigger the export to PDF from the keyboard by going toĀ _Keyboard shortcuts_Ā inĀ OptionsĀ and assigning a key combination for the `exportAsPdf` action. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF_image.png b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PD.png similarity index 100% rename from docs/User Guide/User Guide/Basic Concepts and Features/Notes/Export as PDF_image.png rename to docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PD.png diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md new file mode 100644 index 000000000..6873fd8a5 --- /dev/null +++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md @@ -0,0 +1,78 @@ +# Printing & Exporting as PDF +
    Screenshot of the note contextual menu indicating the ā€œExport as PDFā€ option.
    + +## Printing + +This feature allows printing of notes. It works on both the desktop client, but also on the web. + +Note that not all note types are printable as of now. We do plan to increase the coverage of supported note types in the future. + +To print a note, select the button to the right of the note and select _Print note_. Depending on the size and type of the note, this can take up to a few seconds. Afterwards you will be redirected to the system/browser printing dialog. + +> [!NOTE] +> Printing and exporting as PDF are not perfect. Due to technical limitations, and sometimes even browser glitches the text might appear cut off in some circumstances.Ā  + +## Reporting issues with the rendering + +Should you encounter any visual issues in the resulting PDF file (e.g. a table does not fit properly, there is cut off text, etc.) feel free to [report the issue](../../Troubleshooting/Reporting%20issues.md). In this case, it's best to offer a sample note (click on the button, select Export note → This note and all of its descendants → HTML in ZIP archive). Make sure not to accidentally leak any personal information. + +Consider adjusting font sizes and using [page breaks](../../Note%20Types/Text/Insert%20buttons.md) to work around the layout. + +## Exporting as PDF + +On the desktop application of Trilium it is possible to export a note as PDF. On the server or PWA (mobile), the option is not available due to technical constraints and it will be hidden. + +To print a note, select the ![](1_Printing%20&%20Exporting%20as%20PD.png) button to the right of the note and select _Export as PDF_. Afterwards you will be prompted to select where to save the PDF file. + +> [!TIP] +> Although direct export as PDF is not available in the browser version of the application, it's still possible to generate a PDF by selecting the _Print_ option instead and selecting ā€œSave to PDFā€ as the printer (depending on the browser). Generally, Mozilla Firefox has better printing capabilities. + +### Automatic opening of the file + +When the PDF is exported, it is automatically opened with the system default application for easy preview. + +Note that if you are using Linux with the GNOME desktop environment, sometimes the default application might seem incorrect (such as opening in GIMP). This is because it uses Gnome's ā€œRecommended applicationsā€ list. + +To solve this, you can change the recommended application for PDFs via this command line. First, list the available applications via `gio mime application/pdf` and then set the desired one. For example to use GNOME's Evince: + +``` +gio mime application/pdf +``` + +### Customizing exporting as PDF + +When exporting to PDF, there are no customizable settings such as page orientation, size. However, there are a fewĀ AttributesĀ to adjust some of the settings: + +* To print in landscape mode instead of portrait (useful for big diagrams or slides), add `#printLandscape`. +* By default, the resulting PDF will be in Letter format. It is possible to adjust it to another page size via the `#printPageSize` attribute, with one of the following values: `A0`, `A1`, `A2`, `A3`, `A4`, `A5`, `A6`, `Legal`, `Letter`, `Tabloid`, `Ledger`. + +> [!NOTE] +> These options have no effect when used with the printing feature, since the user-defined settings are used instead. + +## Keyboard shortcut + +It's possible to trigger both printing and export as PDF from the keyboard by going toĀ _Keyboard shortcuts_Ā inĀ OptionsĀ and assigning a key combination for: + +* _Print Active Note_ +* _Export Active Note as PDF_ + +## Constraints & limitations + +Not allĀ Note TypesĀ are supported when printing, in which case the _Print_ and _Export as PDF_ options will be disabled. + +* ForĀ CodeĀ notes: + * Line numbers are not printed. + * Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced. +* ForĀ Collections: + * OnlyĀ Presentation ViewĀ is currently supported. + * We plan to add support for all the collection types at some point. +* UsingĀ Custom app-wide CSSĀ for printing is not longer supported, due to a more stable but isolated mechanism. + * We plan to introduce a new mechanism specifically for a print CSS. + +## Under the hood + +Both printing and exporting as PDF use the same mechanism: a note is rendered individually in a separate webpage that is then sent to the browser or the Electron application either for printing or exporting as PDF. + +The webpage that renders a single note can actually be accessed in a web browser. For example `http://localhost:8080/#root/WWRGzqHUfRln/RRZsE9Al8AIZ?ntxId=0o4fzk` becomes `http://localhost:8080/?print#root/WWRGzqHUfRln/RRZsE9Al8AIZ`. + +Accessing the print note in a web browser allows for easy debugging to understand why a particular note doesn't render well. The mechanism for rendering is similar to the one used inĀ Note List. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.md index 2df2536cf..5ecb4bbd3 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.md @@ -52,6 +52,10 @@ The contextual menu can operate: * Creates a copy of the note and its descendants. * This process is different fromĀ Cloning NotesĀ since the duplicated note can be edited independently from the original. * An alternative to this, if done regularly, would beĀ Templates. +* **Archive/Unarchive** + * Marks a note as [archived](../../Notes/Archived%20Notes.md). + * If the note is already archived, it will be unarchived instead. + * Multiple notes can be selected as well. However, all the selected notes must be in the same state (archived or not), otherwise the option will be disabled. * **Delete** * Will delete the given notes, asking for confirmation first. * In the dialog, the following options can be configured: diff --git a/docs/User Guide/User Guide/Feature Highlights.md b/docs/User Guide/User Guide/Feature Highlights.md index 7cedd84f1..77f30d590 100644 --- a/docs/User Guide/User Guide/Feature Highlights.md +++ b/docs/User Guide/User Guide/Feature Highlights.md @@ -19,7 +19,7 @@ This section presents the most important changes by version. For a full set of c * v0.92.4: * macOS binaries are now signed. * TextĀ notes can now have adjustableĀ Content language & Right-to-left support. - * Export as PDF + * Export as PDF * Zen mode * Calendar View, allowing notes to be displayed in a monthly grid based on start and end dates. * v0.91.5: diff --git a/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md index 6b8ed9e97..c96a1e1cd 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md +++ b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md @@ -9,7 +9,7 @@ To install Trilium on your desktop, follow these steps: Trilium offers various startup scripts to customize your experience: -* `trilium-no-cert-check`: Starts Trilium without validating [TLS certificates](Server%20Installation/TLS%20Configuration.md), useful if connecting to a server with a self-signed certificate. +* `trilium-no-cert-check`: Starts Trilium without validating [TLS certificates](Server%20Installation/HTTPS%20\(TLS\).md), useful if connecting to a server with a self-signed certificate. * Alternatively, set the `NODE_TLS_REJECT_UNAUTHORIZED=0` environment variable before starting Trilium. * `trilium-portable`: Launches Trilium in portable mode, where the [data directory](Data%20directory.md) is created within the application's directory, making it easy to move the entire setup. * `trilium-safe-mode`: Boots Trilium in "safe mode," disabling any startup scripts that might cause the application to crash. diff --git a/docs/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .md b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .md new file mode 100644 index 000000000..cfed42f6b --- /dev/null +++ b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .md @@ -0,0 +1,25 @@ +# Using the desktop application as a server +Sometimes, setting up a [dedicated server installation](../Server%20Installation.md) is not feasible. The desktop application ships with a fully functional server instance by default. + +You can access this web interface locally by navigating to [http://localhost:37840/login](http://localhost:37840/login). + +> [!NOTE] +> The server embedded in the desktop application will only run as long as the desktop application itself is running. So closing the application will also close the server. To overcome this, you can try hiding the application in the system tray. + +## Mobile interface + +By default, this will display the desktop user interface, even on mobile. To switch to the mobile version, simply go to theĀ Global menuĀ and select ā€œSwitch to the mobile versionā€. + +## Allowing the port externally on Windows with Windows Defender Firewall + +First, find out the IP of your desktop server by running `ipconfig` in your local terminal. Then try accessing `http://:37840/login` on another device. If it doesn't work, then most likely the port is blocked by your operating system's firewall. + +If you use Windows Defender Firewall: + +1. Go to Windows's start menu and look for ā€œWindows Defender Firewall with Advanced Securityā€. +2. Go to ā€œInbound Rulesā€ on the left tree, and select ā€œNew Ruleā€ in the ā€œActionsā€ sidebar on the right. +3. Select ā€œPortā€ and press ā€œNextā€. +4. Type in `37840` in the ā€œSpecific local portsā€ section and then press ā€œNextā€. +5. Leave ā€œAllow the connectionā€ checked and press ā€œNextā€. +6. Configure the networks to apply to (check all if unsure) and then press ā€œNextā€. +7. Add an appropriate name to the rule (e.g. ā€œTrilium Notesā€) and press ā€œFinishā€. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend.md b/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend.md index 8785db770..dc9e7a112 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend.md +++ b/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend.md @@ -5,15 +5,9 @@ Mobile frontend is limited in features compared to full desktop frontend. See be Note that this is not an Android/iOS app, this is just mobile friendly web page served on the [server edition](Server%20Installation.md). -## Screenshots +## Testing via the desktop application -### Mobile phone - -![](Mobile%20Frontend_mobile-sma.png) - -### Tablet - -![](Mobile%20Frontend_mobile-tab.png) +If you are running Trilium without a dedicated [server installation](Server%20Installation.md), you can still test the mobile application using the desktop application. For more information, seeĀ Using the desktop application as a server. To access it go to `http://:37840/login?mobile` . ## Limitations diff --git a/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-sma.png b/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-sma.png deleted file mode 100644 index cd839420d..000000000 Binary files a/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-sma.png and /dev/null differ diff --git a/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-tab.png b/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-tab.png deleted file mode 100644 index 6d890f90d..000000000 Binary files a/docs/User Guide/User Guide/Installation & Setup/Mobile Frontend_mobile-tab.png and /dev/null differ diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation.md index 128249349..eb0054c91 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation.md +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation.md @@ -18,7 +18,7 @@ The server installation includes both web and [mobile frontends](Mobile%20Fronte ## Configuration -After setting up your server installation, you may want to configure settings such as the port or enable [TLS](Server%20Installation/TLS%20Configuration.md). Configuration is managed via the Trilium `config.ini` file, which is located in the [data directory](Data%20directory.md) by default. To begin customizing your setup, copy the provided `config-sample.ini` file with default values to `config.ini`. +After setting up your server installation, you may want to configure settings such as the port or enable [TLS](Server%20Installation/HTTPS%20\(TLS\).md). Configuration is managed via the Trilium `config.ini` file, which is located in the [data directory](Data%20directory.md) by default. To begin customizing your setup, copy the provided `config-sample.ini` file with default values to `config.ini`. You can also review the [configuration](../Advanced%20Usage/Configuration%20\(config.ini%20or%20e.md) file to provide all `config.ini` values as environment variables instead. @@ -76,4 +76,4 @@ client_max_body_size 0; ### Apache -For an Apache setup, refer to the [Apache proxy setup](Server%20Installation/2.%20Reverse%20proxy/Apache.md) guide. \ No newline at end of file +For an Apache setup, refer to the [Apache proxy setup](Server%20Installation/2.%20Reverse%20proxy/Apache%20using%20Docker.md) guide. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.md index 580892b5c..afc7661e6 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.md +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.md @@ -62,4 +62,4 @@ The application by default starts up on port 8080, so you can open your browser ## TLS -Don't forget to [configure TLS](../TLS%20Configuration.md) which is required for secure usage! \ No newline at end of file +Don't forget to [configure TLS](../HTTPS%20\(TLS\).md) which is required for secure usage! \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.md index e90eee63d..39dcc8561 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.md +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.md @@ -178,4 +178,4 @@ If you get an error like this, you need to either upgrade your glibc (typically ## TLS -Don't forget to [configure TLS](../TLS%20Configuration.md), which is required for secure usage! \ No newline at end of file +Don't forget to [configure TLS](../HTTPS%20\(TLS\).md), which is required for secure usage! \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker.md index a484446d7..87f1a23de 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker.md +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker.md @@ -109,7 +109,7 @@ If you want to run your instance in a non-default way, please use the volume swi ## Reverse Proxy 1. [Nginx](../2.%20Reverse%20proxy/Nginx.md) -2. [Apache](../2.%20Reverse%20proxy/Apache.md) +2. [Apache](../2.%20Reverse%20proxy/Apache%20using%20Docker.md) ### Note on --user Directive diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker.md new file mode 100644 index 000000000..12121d122 --- /dev/null +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker.md @@ -0,0 +1,91 @@ +# Apache using Docker +This tutorial assumes that you have created a DNS A record for `trilium.yourdomain.com` that you want to use for your Trilium server. + +## Docker setup + +Download docker image and create container + +``` + docker pull triliumnext/trilium:[VERSION] + docker create --name trilium -t -p 127.0.0.1:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/trilium:[VERSION] +``` + +## Configuring the Apache proxy + +1. Enable apache proxy modules + + ``` + a2enmod ssl + a2enmod proxy + a2enmod proxy_http + a2enmod proxy_wstunnel + ``` +2. Create a new let's encrypt certificate + + ``` + sudo certbot certonly -d trilium.mydomain.com + ``` + + Choose standalone (2) and note the location of the created certificates (typically /etc/letsencrypt/live/...) +3. Create a new virtual host file for apache (you may want to use `apachectl -S` to determine the server root location, mine is /etc/apache2) + + ``` + sudo nano /etc/apache2/sites-available/trilium.yourdomain.com.conf + ``` + + Paste (and customize) the following text into the configuration file + + ``` + + ServerName http://trilium.yourdomain.com + RewriteEngine on + RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] + + + ServerName https://trilium.yourdomain.com + RewriteEngine On + RewriteCond %{HTTP:Connection} Upgrade [NC] + RewriteCond %{HTTP:Upgrade} websocket [NC] + RewriteRule /(.*) ws://localhost:8080/$1 [P,L] + AllowEncodedSlashes NoDecode + ProxyPass / http://localhost:8080/ nocanon + ProxyPassReverse / http://localhost:8080/ + SSLCertificateFile /etc/letsencrypt/live/trilium.yourdomain.com/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/trilium.yourdomain.com/privkey.pem + Include /etc/letsencrypt/options-ssl-apache.conf + + ``` +4. Enable the virtual host with `sudo a2ensite trilium.yourdomain.com.conf` +5. Reload apache2 with `sudo systemctl reload apache2` + +## Configuring the trusted proxy + +After setting up a reverse proxy, make sure to configure theĀ Trusted proxy. + +## Setup the systemd service to start up the server + +Create and enable a systemd service to start the docker container on boot + +1. Create a new empty file called `/lib/systemd/system/trilium.service` with the contents + + ``` + [Unit] + Description=Trilium Server + Requires=docker.service + After=docker.service + + [Service] + Restart=always + ExecStart=/usr/bin/docker start -a trilium + ExecStop=/usr/bin/docker stop -t 2 trilium + + [Install] + WantedBy=local.target + ``` +2. Install, enable and start service + + ``` + sudo systemctl daemon-reload + sudo systemctl enable trilium.service + sudo systemctl start trilium.service + ``` \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache.md deleted file mode 100644 index 93f54da10..000000000 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache.md +++ /dev/null @@ -1,81 +0,0 @@ -# Apache -I've assumed you have created a DNS A record for `trilium.yourdomain.com` that you want to use for your Trilium server. - -1. Download docker image and create container - - ``` - docker pull triliumnext/trilium:[VERSION] - docker create --name trilium -t -p 127.0.0.1:8080:8080 -v ~/trilium-data:/home/node/trilium-data triliumnext/trilium:[VERSION] - ``` -2. Configure Apache proxy and websocket proxy - - 1. Enable apache proxy modules - - ``` - a2enmod ssl - a2enmod proxy - a2enmod proxy_http - a2enmod proxy_wstunnel - ``` - 2. Create a new let's encrypt certificate - - ``` - sudo certbot certonly -d trilium.mydomain.com - ``` - - Choose standalone (2) and note the location of the created certificates (typically /etc/letsencrypt/live/...) - 3. Create a new virtual host file for apache (you may want to use `apachectl -S` to determine the server root location, mine is /etc/apache2) - - ``` - sudo nano /etc/apache2/sites-available/trilium.yourdomain.com.conf - ``` - - Paste (and customize) the following text into the configuration file - - ``` - - ServerName http://trilium.yourdomain.com - RewriteEngine on - RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] - - - ServerName https://trilium.yourdomain.com - RewriteEngine On - RewriteCond %{HTTP:Connection} Upgrade [NC] - RewriteCond %{HTTP:Upgrade} websocket [NC] - RewriteRule /(.*) ws://localhost:8080/$1 [P,L] - AllowEncodedSlashes NoDecode - ProxyPass / http://localhost:8080/ nocanon - ProxyPassReverse / http://localhost:8080/ - SSLCertificateFile /etc/letsencrypt/live/trilium.yourdomain.com/fullchain.pem - SSLCertificateKeyFile /etc/letsencrypt/live/trilium.yourdomain.com/privkey.pem - Include /etc/letsencrypt/options-ssl-apache.conf - - ``` - 4. Enable the virtual host with `sudo a2ensite trilium.yourdomain.com.conf` - 5. Reload apache2 with `sudo systemctl reload apache2` -3. Create and enable a systemd service to start the docker container on boot - - 1. Create a new empty file called `/lib/systemd/system/trilium.service` with the contents - - ``` - [Unit] - Description=Trilium Server - Requires=docker.service - After=docker.service - - [Service] - Restart=always - ExecStart=/usr/bin/docker start -a trilium - ExecStop=/usr/bin/docker stop -t 2 trilium - - [Install] - WantedBy=local.target - ``` - 2. Install, enable and start service - - ``` - sudo systemctl daemon-reload - sudo systemctl enable trilium.service - sudo systemctl start trilium.service - ``` \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.md index 57f51b4e6..7bb33a9ef 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.md +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx.md @@ -1,19 +1,24 @@ # Nginx -Configure Nginx proxy and HTTPS. The operating system here is Ubuntu 18.04. +Configure Nginx proxy and HTTPS. The operating system here is Ubuntu. -1. Download Nginx and remove Apache2 - - ``` - sudo apt-get install nginx - sudo apt-get remove apache2 - ``` -2. Create configure file +## Installing Nginx + +Download Nginx and remove Apache2 + +``` +sudo apt-get install nginx +sudo apt-get remove apache2 +``` + +## Build the configuration file + +1. First, create the configuration file: ``` cd /etc/nginx/conf.d vim default.conf ``` -3. Fill the file with the context shown below, part of the setting show be changed. Then you can enjoy your web with HTTPS forced and proxy. +2. Fill the file with the context shown below, part of the setting show be changed. Then you can enjoy your web with HTTPS forced and proxy. ``` # This part configures, where your Trilium server is running @@ -54,23 +59,29 @@ Configure Nginx proxy and HTTPS. The operating system here is Ubuntu 18.04. return 301 https://$server_name$request_uri; } ``` -4. Alternatively if you want to serve the instance under a different path (useful e.g. if you want to serve multiple instances), update the location block like so: - - * update the location with your desired path (make sure to not leave a trailing slash "/", if your `proxy_pass` does not end on a slash as well) - * add the `proxy_cookie_path` directive with the same path: this allows you to stay logged in at multiple instances at the same time. - - ``` - location /trilium/instance-one { - rewrite /trilium/instance-one/(.*) /$1 break; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_pass http://trilium; - proxy_cookie_path / /trilium/instance-one - proxy_read_timeout 90; - } - - ``` \ No newline at end of file + +## Serving under a different path + +Alternatively if you want to serve the instance under a different path (useful e.g. if you want to serve multiple instances), update the location block like so: + +* update the location with your desired path (make sure to not leave a trailing slash "/", if your `proxy_pass` does not end on a slash as well) +* add the `proxy_cookie_path` directive with the same path: this allows you to stay logged in at multiple instances at the same time. + +``` + location /trilium/instance-one { + rewrite /trilium/instance-one/(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_pass http://trilium; + proxy_cookie_path / /trilium/instance-one + proxy_read_timeout 90; + } +``` + +## Configuring the trusted proxy + +After setting up a reverse proxy, make sure to configure theĀ Trusted proxy. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy.md new file mode 100644 index 000000000..9b8311d88 --- /dev/null +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy.md @@ -0,0 +1,17 @@ +# Trusted proxy +If you are running the Trilium server under a [reverse proxy](../2.%20Reverse%20proxy), it's important to configure it as a trusted proxy so that the application can correctly identify the real IP address of the clients (for authentication and rate limiting purposes). + +To do so, simply modifyĀ Configuration (config.ini or environment variables)Ā and set: + +``` +[Network] +trustedReverseProxy=true +``` + +This will use the left-most IP in the `X-Forwarded-For` header. Alternatively, instead of `true` use the IP address of the reverse proxy or Express.js shortcuts such as: + +``` +loopback(127.0.0.1/8, ::1/128), linklocal(169.254.0.0/16, fe80::/10), uniquelocal(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7) +``` + +For more information, consult [Express behind proxies](https://expressjs.com/en/guide/behind-proxies.html). \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).md similarity index 88% rename from docs/User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration.md rename to docs/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).md index eaa0bbba0..1a4945db8 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation/TLS Configuration.md +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).md @@ -1,7 +1,8 @@ -# TLS Configuration +# HTTPS (TLS) Configuring TLS is essential for [server installation](../Server%20Installation.md) in Trilium. This guide details the steps to set up TLS within Trilium itself. -For a more robust solution, consider using TLS termination with a reverse proxy (recommended, e.g., Nginx). You can follow a [guide like this](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04) for such setups. +> [!TIP] +> While Trilium supports HTTPS on its own, it's generally a good idea to use a [reverse proxy](2.%20Reverse%20proxy) instead with TLS termination. You can follow a [guide like this](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04) for such setups. ## Obtaining a TLS Certificate @@ -27,7 +28,7 @@ keyPath=/[username]/.acme.sh/[hostname]/example.com.key You can also review the [configuration](../../Advanced%20Usage/Configuration%20\(config.ini%20or%20e.md) file to provide all `config.ini` values as environment variables instead. For example, you can configure TLS using environment variables: -```sh +``` export TRILIUM_NETWORK_HTTPS=true export TRILIUM_NETWORK_CERTPATH=/path/to/cert.pem export TRILIUM_NETWORK_KEYPATH=/path/to/key.pem diff --git a/docs/User Guide/User Guide/Installation & Setup/Synchronization.md b/docs/User Guide/User Guide/Installation & Setup/Synchronization.md index 421b4458e..76bcf96f5 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Synchronization.md +++ b/docs/User Guide/User Guide/Installation & Setup/Synchronization.md @@ -9,7 +9,7 @@ In this setup, a central server (referred to as the _sync server_) and multiple ### Security Considerations -Setting up the server securely is critical and can be complex. It is crucial to use a valid [TLS certificate](Server%20Installation/TLS%20Configuration.md) (HTTPS) rather than an unencrypted HTTP connection to ensure security and avoid potential vulnerabilities. +Setting up the server securely is critical and can be complex. It is crucial to use a valid [TLS certificate](Server%20Installation/HTTPS%20\(TLS\).md) (HTTPS) rather than an unencrypted HTTP connection to ensure security and avoid potential vulnerabilities. ### Synchronizing a Desktop Instance with a Sync Server diff --git a/docs/User Guide/User Guide/Note Types/Collections.md b/docs/User Guide/User Guide/Note Types/Collections.md index 81f177fd5..90287709d 100644 --- a/docs/User Guide/User Guide/Note Types/Collections.md +++ b/docs/User Guide/User Guide/Note Types/Collections.md @@ -36,7 +36,12 @@ Now the text will be displayed above while still maintaining the collection view ### Using saved search -Since collections are based on theĀ Note ListĀ mechanism, it's possible to apply the same configuration toĀ Saved SearchĀ to do advanced querying and presenting the result in an adequate matter such as a calendar, a table or even a map. +Collections, by default, only display the child notes. However, it is possible to use theĀ SearchĀ functionality to display notes all across the tree, with advanced querying functionality. + +To do so, simply start aĀ SearchĀ and go to the _Collection Properties_ tab in theĀ RibbonĀ and select a desired type of collection. To keep the search-based collection, use aĀ Saved Search. + +> [!IMPORTANT] +> While in search, none of the collections will not display the child notes of the search results. The reason is that the search might hit a note multiple times, causing an exponential rise in the number of results. ### Creating a collection from scratch @@ -47,6 +52,12 @@ By default, collections come with a default configuration and sometimes even sam 3. Still in the ribbon, go to _Collection Properties_ and select the desired view type. 4. Consult the help page of the corresponding view type in order to understand how to configure them. +## Archived notes + +By default, archived notes will not be shown in collections. This behaviour can be changed by going to _Collection Properties_ in theĀ RibbonĀ and checking _Show archived notes_. + +Archived notes will be generally indicated by being greyed out as opposed to the normal ones. + ## Under the hood Collections by themselves are simply notes with no content that rely on theĀ Note ListĀ mechanism (the one that lists the children notes at the bottom of a note) to display information. diff --git a/docs/User Guide/User Guide/Note Types/Collections/1_Presentation View_image.png b/docs/User Guide/User Guide/Note Types/Collections/1_Presentation View_image.png new file mode 100644 index 000000000..83b0c01af Binary files /dev/null and b/docs/User Guide/User Guide/Note Types/Collections/1_Presentation View_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Collections/Board View.md b/docs/User Guide/User Guide/Note Types/Collections/Board View.md index 6a631bd75..c2630e67d 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Board View.md +++ b/docs/User Guide/User Guide/Note Types/Collections/Board View.md @@ -12,7 +12,7 @@ Notes are displayed recursively, so even the child notes of the child notes will ## Interaction with columns * Create a new column by pressing _Add Column_ near the last column. - * Once pressed, a text box will be displayed to set the name of the column. Press Enter to confirm. + * Once pressed, a text box will be displayed to set the name of the column. Press Enter to confirm, or Escape to dismiss. * To reorder a column, simply hold the mouse over the title and drag it to the desired position. * To delete a column, right click on its title and select _Delete column_. * To rename a column, click on the note title. @@ -23,8 +23,10 @@ Notes are displayed recursively, so even the child notes of the child notes will ## Interaction with notes * Create a new note in any column by pressing _New item_ - * Enter the name of the note and press _Enter_. - * Doing so will create a new note. The new note will have an attribute (`status` label by default) set to the name of the column. + * Enter the name of the note and press Enter or click away. To dismiss the creation of a new note, simply press Escape or leave the name empty. + * Once created, the new note will have an attribute (`status` label by default) set to the name of the column. +* To open the note, simply click on it. +* To change the title of the note directly from the board, hover the mouse over its card and press the edit button on the right. * To change the state of a note, simply drag a note from one column to the other to change its state. * The order of the notes in each column corresponds to their position in the tree. * It's possible to reorder notes simply by dragging them to the desired position within the same columns. @@ -33,9 +35,19 @@ Notes are displayed recursively, so even the child notes of the child notes will * Open the note in a new tab/split/window or quick edit. * Move the note to any column. * Insert a new note above/below the current one. + * Archive/unarchive the current note. * Delete the current note. * If there are many notes within the column, move the mouse over the column and use the mouse wheel to scroll. +## Keyboard interaction + +The board view has mild support for keyboard-based navigation: + +* Use Tab and Shift+Tab to navigate between column titles, notes and the ā€œNew itemā€ button for each of the columns, in sequential order. +* To rename a column or a note, press F2 while it is focused. +* To open a specific note or create a new item, press Enter while it is focused. +* To dismiss a rename of a note or a column, press Escape. + ## Configuration ### Grouping by another attribute diff --git a/docs/User Guide/User Guide/Note Types/Collections/Geo Map View.md b/docs/User Guide/User Guide/Note Types/Collections/Geo Map View.md index ae0be91ce..a060d385e 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Geo Map View.md +++ b/docs/User Guide/User Guide/Note Types/Collections/Geo Map View.md @@ -26,8 +26,8 @@ The position on the map and the zoom are saved inside the map note and restored | | | | | --- | --- | --- | -| 1 | To create a marker, first navigate to the desired point on the map. Then press the ![](10_Geo%20Map%20View_image.png) button in theĀ [Floating buttons](../../Basic%20Concepts%20and%20Features/UI%20Elements/Floating%20buttons.md)Ā (top-right) area.Ā Ā 

    If the button is not visible, make sure the button section is visible by pressing the chevron button (![](17_Geo%20Map%20View_image.png)) in the top-right of the map. | | -| 2 | | Once pressed, the map will enter in the insert mode, as illustrated by the notification.Ā Ā Ā Ā Ā 

    Simply click the point on the map where to place the marker, or the Escape key to cancel. | +| 1 | To create a marker, first navigate to the desired point on the map. Then press the ![](10_Geo%20Map%20View_image.png) button in theĀ [Floating buttons](../../Basic%20Concepts%20and%20Features/UI%20Elements/Floating%20buttons.md)Ā (top-right) area.Ā Ā Ā 

    If the button is not visible, make sure the button section is visible by pressing the chevron button (![](17_Geo%20Map%20View_image.png)) in the top-right of the map. | | +| 2 | | Once pressed, the map will enter in the insert mode, as illustrated by the notification.Ā Ā Ā Ā Ā Ā 

    Simply click the point on the map where to place the marker, or the Escape key to cancel. | | 3 | | Enter the name of the marker/note to be created. | | 4 | | Once confirmed, the marker will show up on the map and it will also be displayed as a child note of the map. | @@ -50,6 +50,9 @@ This works for: * Notes that are a child of the geo map but not yet positioned on the map. * Notes that are a child of the geo map and also positioned, case in which the marker will be relocated to the new position. +> [!NOTE] +> Dragging existing notes only works if the map is in editing mode. See the _Read-only_ section for more information. + ## How the location of the markers is stored The location of a marker is stored in the `#geolocation` attribute of the child notes: @@ -106,7 +109,7 @@ The value of the attribute is made up of the latitude and longitude separated by | | | | | --- | --- | --- | -| 1 |
    | Go to Google Maps on the web and look for a desired location, right click on it and a context menu will show up.Ā Ā Ā Ā Ā 

    Simply click on the first item displaying the coordinates and they will be copied to clipboard.Ā Ā Ā Ā Ā 

    Then paste the value inside the text box into the `#geolocation` attribute of a child note of the map (don't forget to surround the value with a `"` character). | +| 1 |
    | Go to Google Maps on the web and look for a desired location, right click on it and a context menu will show up.Ā Ā Ā Ā Ā Ā 

    Simply click on the first item displaying the coordinates and they will be copied to clipboard.Ā Ā Ā Ā Ā Ā 

    Then paste the value inside the text box into the `#geolocation` attribute of a child note of the map (don't forget to surround the value with a `"` character). | | 2 |
    | In Trilium, create a child note under the map. | | 3 |
    | And then go to Owned Attributes and type `#geolocation="`, then paste from the clipboard as-is and then add the ending `"` character. Press Enter to confirm and the map should now be updated to contain the new note. | @@ -117,7 +120,7 @@ Similarly to the Google Maps approach: | | | | | --- | --- | --- | | 1 | | Go to any location on openstreetmap.org and right click to bring up the context menu. Select the ā€œShow addressā€ item. | -| 2 | | The address will be visible in the top-left of the screen, in the place of the search bar.Ā Ā Ā Ā Ā 

    Select the coordinates and copy them into the clipboard. | +| 2 | | The address will be visible in the top-left of the screen, in the place of the search bar.Ā Ā Ā Ā Ā Ā 

    Select the coordinates and copy them into the clipboard. | | 3 | | Simply paste the value inside the text box into the `#geolocation` attribute of a child note of the map and then it should be displayed on the map. | ## Adding GPS tracks (.gpx) @@ -128,7 +131,7 @@ Trilium has basic support for displaying GPS tracks on the geo map. | --- | --- | --- | | 1 |
    | To add a track, simply drag & drop a .gpx file inside the geo map in the note tree. | | 2 |
    | In order for the file to be recognized as a GPS track, it needs to show up as `application/gpx+xml` in the _File type_ field. | -| 3 |
    | When going back to the map, the track should now be visible.Ā Ā Ā Ā Ā 

    The start and end points of the track are indicated by the two blue markers. | +| 3 |
    | When going back to the map, the track should now be visible.Ā Ā Ā Ā Ā Ā 

    The start and end points of the track are indicated by the two blue markers. | > [!NOTE] > The starting point of the track will be displayed as a marker, with the name of the note underneath. The start marker will also respect the icon and the `color` of the note. The end marker is displayed with a distinct icon. diff --git a/docs/User Guide/User Guide/Note Types/Collections/Presentation View.md b/docs/User Guide/User Guide/Note Types/Collections/Presentation View.md new file mode 100644 index 000000000..55ec5960c --- /dev/null +++ b/docs/User Guide/User Guide/Note Types/Collections/Presentation View.md @@ -0,0 +1,85 @@ +# Presentation View +
    + +The Presentation view allows the creation of slideshows directly from within Trilium. + +## How it works + +* Each slide is a child note of the collection. +* The order of the child notes determines the order of the slides. +* Unlike traditional presentation software, slides can be laid out both horizontally and vertically (see belwo for more information). +* Direct children will be laid out horizontally and the children of those will be laid out vertically. Children deeper than two levels of nesting are ignored. + +## Interaction and navigation + +In the floating buttons section (top-right): + +* Edit button to go to the corresponding note of the current slide. +* Press Overview button (or the O key) to show a birds-eye view of the slides. Press the button again to disable it. +* Press the ā€œStart presentationā€ button to show the presentation in full-screen. + +The following keyboard shortcuts are supported: + +* Press ← and → (or H and L) to go to the slide on the left or on the right (horizontal). +* Press ↑ and ↓ Ā (or K and J) to go to the upward or downward slide (vertical). +* Press Space and Shift + Space or Ā to go to the next/previous slide in order. +* And a few more, press ? to display a popup with all the supported keyboard combinations. + +## Vertical slides and nesting + +Unlike traditional presentation software such as Microsoft PowerPoint, the slides in Trilium can be laid out horizontally or vertically in order to create depth or better organize the slides by topic. + +This horizontal/vertical organization affects transitions (especially on the ā€œslideā€ transition), however it is most noticeable in navigation. + +* Pressing ← and → will navigate through slides horizontally, thus skipping vertical notes under the current slide. This is useful to skip entire chapters/related slides. +* Pressing ↑ and ↓ will navigate through the vertical slides at the current level. +* Pressing Space and Shift + Space will go to the next/previous slide in order, regardless of the direction. This is generally the key combination to use when presenting. +* The arrows on the bottom-right of the slide will also reflect this navigation scheme. + +
    + +All direct children of the collection will be laid out horizontally. If a direct child also has children, those children will be placed as vertical slides. + +In the following example, the note structure is as follows: + +* Presentation collection + * Trilium Notes (demo page) + * ā€œIntroductionā€ slide + * ā€œThe challenge of personal knowledge managementā€ + * ā€œNote-taking structuresā€ + * ā€œDemo & Feature highlightsā€ slide + * ā€œReally fast installation processā€ + * Video slide + +## Customization + +At collection level, it's possible to adjust: + +* The theme of the entire presentation to one of the predefined themes by going to theĀ RibbonĀ and looking for the _Collection Properties_ tab. +* It's currently not possible to create custom themes, although it is planned. +* Note that it is note possible to alter the CSS viaĀ Custom app-wide CSSĀ because the slides are rendered isolated (in a shadow DOM). + +At slide level: + +* It's possible to adjust the background color of a slide by using the [predefined promoted attribute](../../Advanced%20Usage/Attributes/Promoted%20Attributes.md) for the color or manually setting `#slide:background` to a hex color. +* More complex backgrounds can be achieved via gradients. There's no UI for it; it has to be set via `#slide:background` to a CSS gradient definition such as: `linear-gradient(to bottom, #283b95, #17b2c3)`. + +## Tips and tricks + +* Text notes generally respect the formatting (bold, italic, foreground and background colors) and font size. Code blocks and tables also work. +* Try using more than just text notes, the presentation uses the same mechanism as [shared notes](../../Advanced%20Usage/Sharing.md) andĀ Note ListĀ so it should be able to displayĀ Mermaid Diagrams,Ā CanvasĀ andĀ Mind MapĀ in full-screen (without the interactivity). + * Consider using a transparent background forĀ Canvas, if the slides have a custom background (go to the hamburger menu in the Canvas, press the button select a custom color and write `transparent`). + * ForĀ Mermaid Diagrams, some of them have a predefined background which can be changed via the frontmatter. For example, for XY-charts: + + ``` + --- + config: + themeVariables: + xyChart: + backgroundColor: transparent + --- + ``` + +## Under the hood + +The Presentation view uses [Reveal.js](https://revealjs.com/) to handle the navigation and layout of the slides. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Collections/Presentation View_image.png b/docs/User Guide/User Guide/Note Types/Collections/Presentation View_image.png new file mode 100644 index 000000000..b87b47a4b Binary files /dev/null and b/docs/User Guide/User Guide/Note Types/Collections/Presentation View_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Collections/Table View.md b/docs/User Guide/User Guide/Note Types/Collections/Table View.md index 0454b0a93..78774734a 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Table View.md +++ b/docs/User Guide/User Guide/Note Types/Collections/Table View.md @@ -65,7 +65,8 @@ There are multiple menus: * Adding new columns. * Right clicking on a row, allows: * Opening the corresponding note of the row in a new tab, split, window or quick editing it. - * Inserting rows above, below or as a child note. + * Inserting a new note above or below the selected row. These options are only enabled if the table is not sorted. + * Inserting a new child note for the selected row. * Deleting the row. ### Editing data diff --git a/docs/User Guide/User Guide/Note Types/Relation Map.md b/docs/User Guide/User Guide/Note Types/Relation Map.md index 23af21574..080c2f98e 100644 --- a/docs/User Guide/User Guide/Note Types/Relation Map.md +++ b/docs/User Guide/User Guide/Note Types/Relation Map.md @@ -1,15 +1,31 @@ # Relation Map -Relation map is a type ofĀ [Note](../Basic%20Concepts%20and%20Features/Notes.md)Ā which visualizes notes and their [relations](../Advanced%20Usage/Attributes.md). See an example: +Relation map is a type ofĀ noteĀ which visualizes notes and their [relations](../Advanced%20Usage/Attributes.md). + +## Interaction + +* To create a new note and add it to the board, press the plus button in theĀ Floating buttons. + * Afterwards, click anywhere on the map to place it there. + * The note will be placed as a sub-child of the map. +* An existing note can also be dragged from theĀ Note Tree. It will be placed at the position it's dragged on. + * Multiple notes can also be dragged viaĀ Multiple selection. The notes will be positioned near the dragged position without overlapping. + * The dragged note can be a sub-child of the map, or it can be at any arbitrary position. +* To create a relationship, hold the mouse on the box on the right of a note and then: + * Drag it over another note to create a relationship pointing from the first note to the second one. + * Drag over the same note to create a self-referencing relationship (represented as a loop). + * Once dragged, enter the name of the relationship to create. To cancel, simply dismiss the dialog or press Esc. +* To open a note, either click on the note (opening it in the current view) or use the right click menu to open in a new tab. +* To edit the title of a note or to delete it (either from the map, or delete it completely), right click the note. +* To delete a relationship, right click it and select the corresponding option. ## Development process demo This is a basic example how you can create simple diagram using relation maps: -![](1_Relation%20Map_relation-map-.png) + And this is how you can create it: -![](1_Relation%20Map_relation-map-.gif) + We start completely from scratch by first creating new note called "Development process" and changing its type to "Relation map". After that we create new notes one by one and place them by clicking into the map. We also drag [relations](../Advanced%20Usage/Attributes.md)between notes and name them. That's all! @@ -19,21 +35,21 @@ Items on the map - "Specification", "Development", "Testing" and "Demo" are actu This is more complicated demo using some advanced concepts. Resulting diagram is here: -![](Relation%20Map_relation-map-.png) + This is how you get to it: -![](Relation%20Map_relation-map-.gif) + There are several steps here: -* we start with empty relation map and two existing notes representing Prince Philip and Queen Elizabeth II. These two notes already have "isPartnerOf" [relations](../Advanced%20Usage/Attributes.md)defined. +* we start with empty relation map and two existing notes representing Prince Philip and Queen Elizabeth II. These two notes already have `isPartnerOf` [relations](../Advanced%20Usage/Attributes.md)defined. * There are actually two "inverse" relations (one from Philip to Elizabeth and one from Elizabeth to Philip) -* we drag both notes to relation map and place to suitable position. Notice how the existing "isPartnerOf" relations are displayed. +* we drag both notes to relation map and place to suitable position. Notice how the existing `isPartnerOf` relations are displayed. * now we create new note - we name it "Prince Charles" and place it on the relation map by clicking on the desired position. The note is by default created under the relation map note (visible in the note tree on the left). -* we create two new relations "isChildOf" targeting both Philip and Elizabeth - * now there's something unexpected - we can also see the relation to display another "hasChild" relation. This is because there's a [relation definition](../Advanced%20Usage/Attributes/Promoted%20Attributes.md) which puts "isChildOf" as an "[inverse](../Advanced%20Usage/Attributes/Promoted%20Attributes.md)" relation of "hasChildOf" (and vice versa) and thus it is created automatically. -* we create another note for Princess Diana and create "isPartnerOf" relation from Charles. Again notice how the relation has arrows both ways - this is because "isPartnerOf" definition specifies its inverse relation as again "isPartnerOf" so the opposite relation is created automatically. +* we create two new relations `isChildOf` targeting both Philip and Elizabeth + * now there's something unexpected - we can also see the relation to display another `hasChild` relation. This is because there's a [relation definition](../Advanced%20Usage/Attributes/Promoted%20Attributes.md) which puts `isChildOf` as an "[inverse](../Advanced%20Usage/Attributes/Promoted%20Attributes.md)" relation of `hasChildOf` (and vice versa) and thus it is created automatically. +* we create another note for Princess Diana and create `isPartnerOf` relation from Charles. Again notice how the relation has arrows both ways - this is because `isPartnerOf` definition specifies its inverse relation as again "isPartnerOf" so the opposite relation is created automatically. * as the last step we pan & zoom the map to fit better to window dimensions. Relation definitions mentioned above come from "Person template" note which is assigned to any child of "My Family Tree" relation note. You can play with the whole thing in the [demo notes](../Advanced%20Usage/Database.md). @@ -46,4 +62,4 @@ Alternatively, you can specify comma delimited list of relation names in `hideRe ## See also -* [Note Map](../Advanced%20Usage/Note%20Map%20\(Link%20map%2C%20Tree%20map\).md)Ā is a similar concept \ No newline at end of file +* Note MapĀ is a similar concept. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Text/10_Lists_image.png b/docs/User Guide/User Guide/Note Types/Text/10_Lists_image.png index 1282f27ec..fba0cc85c 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/10_Lists_image.png and b/docs/User Guide/User Guide/Note Types/Text/10_Lists_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/1_Lists_image.png b/docs/User Guide/User Guide/Note Types/Text/1_Lists_image.png index fba0cc85c..4a17f481c 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/1_Lists_image.png and b/docs/User Guide/User Guide/Note Types/Text/1_Lists_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/2_Lists_image.png b/docs/User Guide/User Guide/Note Types/Text/2_Lists_image.png index ee7a6bdea..2473cd310 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/2_Lists_image.png and b/docs/User Guide/User Guide/Note Types/Text/2_Lists_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/4_Lists_image.png b/docs/User Guide/User Guide/Note Types/Text/4_Lists_image.png index 8369a03c6..3caf2d880 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/4_Lists_image.png and b/docs/User Guide/User Guide/Note Types/Text/4_Lists_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/7_Lists_image.png b/docs/User Guide/User Guide/Note Types/Text/7_Lists_image.png index 3caf2d880..ee7a6bdea 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/7_Lists_image.png and b/docs/User Guide/User Guide/Note Types/Text/7_Lists_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/8_Lists_image.png b/docs/User Guide/User Guide/Note Types/Text/8_Lists_image.png index 4a17f481c..30a9511b0 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/8_Lists_image.png and b/docs/User Guide/User Guide/Note Types/Text/8_Lists_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/9_Lists_image.png b/docs/User Guide/User Guide/Note Types/Text/9_Lists_image.png index 2473cd310..8369a03c6 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/9_Lists_image.png and b/docs/User Guide/User Guide/Note Types/Text/9_Lists_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.md b/docs/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.md index 18960b335..31ae3233e 100644 --- a/docs/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.md +++ b/docs/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.md @@ -13,6 +13,14 @@ Note that this feature is meant for generally small snippets of code. For larger * Type ` ``` ` (as in Markdown). * Note that it's not possible to specify the language, as it will default to the last selected language. +## Exiting out of the code block + +* To exit out of a code block and enter a normal paragraph, move the cursor at the end of the code block and press Enter twice. +* Similarly, to insert a paragraph above the note block, move the cursor at the beginning of the code block and press Enter twice. + +> [!NOTE] +> If you've pasted a code block with a more complex HTML structure, exiting out of the code block by pressing Enter multiple times might not work. In that case the best approach is to delete the code block entirely and use Ctrl+Shift+V (paste as plain text). + ## Syntax highlighting & color schemes Since TriliumNext v0.90.12, Trilium will try to offer syntax highlighting to the code block. Note that the syntax highlighting mechanism is slightly different than the one inĀ CodeĀ notes as different technologies are involved. diff --git a/docs/User Guide/User Guide/Note Types/Text/Include Note.md b/docs/User Guide/User Guide/Note Types/Text/Include Note.md index 874bf70ca..8a3584f8b 100644 --- a/docs/User Guide/User Guide/Note Types/Text/Include Note.md +++ b/docs/User Guide/User Guide/Note Types/Text/Include Note.md @@ -3,4 +3,10 @@ Text notes can "include" another note as a read-only widget. This can be useful ## Including a note -In theĀ Formatting toolbar, look for the ![](Include%20Note_image.png) button. There is also a keyboard shortcut defined for it but it is not allocated by default. \ No newline at end of file +In theĀ Formatting toolbar, look for the ![](Include%20Note_image.png) button. There is also a keyboard shortcut defined for it but it is not allocated by default. + +## Included notes in the share functionality + +If a [shared note](../../Advanced%20Usage/Sharing.md) contains one or more included notes, they will be displayed in the content of the note as if they were part of the note itself. + +For this to work, the included notes must also be shared, otherwise they will not be shown. However, the included notes can still be hidden from the note tree via `#shareHiddenFromTree`. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Text/Insert buttons.md b/docs/User Guide/User Guide/Note Types/Text/Insert buttons.md index 6a161fadd..8d87e083c 100644 --- a/docs/User Guide/User Guide/Note Types/Text/Insert buttons.md +++ b/docs/User Guide/User Guide/Note Types/Text/Insert buttons.md @@ -53,7 +53,7 @@ Alternatively, it's possible to insert a horizontal ruler by typing `---`.
    -Page breaks provide a way to force the next paragraph or block (table, image, etc.) to be displayed onto the next page when printing (either to a real printer to [when exporting to PDF](../../Basic%20Concepts%20and%20Features/Notes/Export%20as%20PDF.md)). +Page breaks provide a way to force the next paragraph or block (table, image, etc.) to be displayed onto the next page when printing (either to a real printer to [when exporting to PDF](../../Basic%20Concepts%20and%20Features/Notes/Printing%20%26%20Exporting%20as%20PDF.md)). Page breaks are marked in the editor with the words _Page break_, but they will not actually be shown when printed. diff --git a/docs/User Guide/User Guide/Note Types/Text/Lists.md b/docs/User Guide/User Guide/Note Types/Text/Lists.md index efa0c5a62..8dcabdc25 100644 --- a/docs/User Guide/User Guide/Note Types/Text/Lists.md +++ b/docs/User Guide/User Guide/Note Types/Text/Lists.md @@ -1,23 +1,23 @@ # Lists There are three types of lists supported by text notes: -* Bulleted lists (also known as unordered lists). -* Numbered lists (or ordered lists). -* To-do lists +* Bulleted lists (also known as unordered lists). +* Numbered lists (or ordered lists). +* To-do lists -For bulleted and numbered lists, it's possible to configure an alternative marker such as squares or Roman numbering by pressing the icon. For numbered lists, it's also possible to specify the number to start at or whether to count in reverse order. +For bulleted and numbered lists, it's possible to configure an alternative marker such as squares or Roman numbering by pressing the icon. For numbered lists, it's also possible to specify the number to start at or whether to count in reverse order. ## Keyboard interaction * To create a new list: * Bulleted list: Start a line with `*` or `-` followed by a space; * Numbered list: Start a line with `1.` or `1)` followed by a space; - * To-do list: Start a line with `[ ]` for an unchecked item or `[x]` for a checked item. + * To-do list: Start a line with `- [ ]` for an unchecked item or `[x]` for a checked item. * To create a new item in the list, press Enter. * To create a blank line within a list item, press Shift+Enter. * To exit out of the list, press Enter twice. * To merge two lists, simply delete the gap between them. -* To create nested lists, simply use the button (see _Indentation_ inĀ Other features) or the Tab key. To decrease the nesting level for the current element, press Shift+Tab. +* To create nested lists, simply use the button (see _Indentation_ inĀ Other features) or the Tab key. To decrease the nesting level for the current element, press Shift+Tab. ## Headings, code blocks within lists @@ -26,10 +26,15 @@ It possible to add content-level blocks such as headings, code blocks, tables wi | | | | | --- | --- | --- | | 1 | ![](6_Lists_image.png) | First, create a list. | -| 2 | ![](4_Lists_image.png) | Press Enter to create a new list item. | +| 2 | ![](9_Lists_image.png) | Press Enter to create a new list item. | | 3 | ![](5_Lists_image.png) | Press Backspace to get rid of the bullet point. Notice the cursor position. | -| 4 | | At this point, insert any desired block-level item such as a code block. | -| 5 | | To continue with a new bullet point, press Enter until the cursor moves to a new blank position. | +| 4 | | At this point, insert any desired block-level item such as a code block. | +| 5 | | To continue with a new bullet point, press Enter until the cursor moves to a new blank position. | | 6 | | Press Enter once more to create the new bullet. | -The same principle applies to all three list types (bullet, numbered and to-do). \ No newline at end of file +The same principle applies to all three list types (bullet, numbered and to-do). + +## To-do lists + +* To insert a to-do list from the keyboard, type `- [ ]` for an unchecked item or `[x]` for a checked item while on an empty paragraph. +* To reorder the item under the cursor, press Alt+Up or Alt+Down. To reorder multiple items, select them first. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Text/Lists_image.png b/docs/User Guide/User Guide/Note Types/Text/Lists_image.png index 30a9511b0..1282f27ec 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/Lists_image.png and b/docs/User Guide/User Guide/Note Types/Text/Lists_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/Math Equations.md b/docs/User Guide/User Guide/Note Types/Text/Math Equations.md index 0bcb5af7a..c8cfa94e5 100644 --- a/docs/User Guide/User Guide/Note Types/Text/Math Equations.md +++ b/docs/User Guide/User Guide/Note Types/Text/Math Equations.md @@ -3,20 +3,26 @@ Within text notes, it's possible to enter mathematical equations using the button from theĀ Formatting toolbarĀ (generally found under theĀ Insert buttons). -If inserting equations frequently, using the Ctrl+M keyboard shortcut can be more comfortable. Alternatively, type `$$` or `\[` to trigger the popup directly. - -There is currently no quick way to insert an equation, such as surrounding it with `$` or pressing Ctrl+M on an already typed-out equation. - The mathematical expression must be written in the TeX format. There is no visual editor for the math equations, only a preview.Ā  Enabling _Display mode_ will render the equation slightly bigger (especially if using big operators such as summation, or fractions) and center it. Display mode equations will act as blocks (i.e. like paragraphs, or tables) and can be inserted for example in lists. Non-display equations can be part of the text. +## Keyboard shortcuts + +If inserting equations frequently, using the Ctrl+M keyboard shortcut can be more comfortable. Alternatively, type `$$` or `\[` to trigger the popup directly. + +There is currently no quick way to turn an already typed-out equation, such as surrounding it with `$` or pressing Ctrl+M. + ## Supported math features Technically we are using the KaTeX library which allows for a subset of the TeX format. To see the full list of supported features, consult the [Supported Functions](https://katex.org/docs/supported) and the [Support Table](https://katex.org/docs/support_table) from the official documentation. ## Markdown support -Math equations will be preserved when exporting to or importing from Markdown, surrounded by `\(` characters for inline math expressions, and `$\)` for display mode. +Math equations will be preserved when exporting to or importing from Markdown, surrounded by `$` characters for inline math expressions, and `$$` for display mode. -If you notice any issue with the Markdown import/export for equations, feel free to [report](../../Troubleshooting/Reporting%20issues.md) it while providing the equation that causes issues. \ No newline at end of file +If you notice any issue with the Markdown import/export for equations, feel free to [report](../../Troubleshooting/Reporting%20issues.md) it while providing the equation that causes issues. + +## Formatting the equation + +It is possible to customize the font size and foreground color for both inline and display-mode equations, just like any other text. For inline equations, the background color/highlight can also be adjusted. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Logging.md b/docs/User Guide/User Guide/Scripting/Logging.md new file mode 100644 index 000000000..74a33fccb --- /dev/null +++ b/docs/User Guide/User Guide/Scripting/Logging.md @@ -0,0 +1,19 @@ +# Logging +Both front-end and back-end notes can log messages for debugging. + +## UI logging via `api.log` + +
    + +The API log feature integrates with the script editor and it displays all the messages logged via `api.log`. This works for both back-end and front-end scripts. + +The API log panel will appear after executing a script that uses `api.log` and it can be dismissed temporarily by pressing the close button in the top-right of the panel. + +Apart from strings, an object can be passed as well in which case it will be pretty-formatted if possible (e.g. recursive objects are not supported). + +## Console logging + +For logs that are not directly visible to the user, the standard `console.log` can be used as well. + +* For front-end scripts, the log will be shown in the Developer Tools (also known as Inspect). +* For back-end scripts, the log will be shown in the server output while running but **will not** be visible in theĀ Backend (server) logs. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Logging_image.png b/docs/User Guide/User Guide/Scripting/Logging_image.png new file mode 100644 index 000000000..29933ba17 Binary files /dev/null and b/docs/User Guide/User Guide/Scripting/Logging_image.png differ diff --git a/docs/User Guide/User Guide/Theme development/1_Custom app-wide CSS_image.png b/docs/User Guide/User Guide/Theme development/1_Custom app-wide CSS_image.png index 97b8fc11d..225fcc24f 100644 Binary files a/docs/User Guide/User Guide/Theme development/1_Custom app-wide CSS_image.png and b/docs/User Guide/User Guide/Theme development/1_Custom app-wide CSS_image.png differ diff --git a/docs/User Guide/User Guide/Theme development/2_Custom app-wide CSS_image.png b/docs/User Guide/User Guide/Theme development/2_Custom app-wide CSS_image.png index 582152fe7..97b8fc11d 100644 Binary files a/docs/User Guide/User Guide/Theme development/2_Custom app-wide CSS_image.png and b/docs/User Guide/User Guide/Theme development/2_Custom app-wide CSS_image.png differ diff --git a/docs/User Guide/User Guide/Theme development/3_Custom app-wide CSS_image.png b/docs/User Guide/User Guide/Theme development/3_Custom app-wide CSS_image.png new file mode 100644 index 000000000..582152fe7 Binary files /dev/null and b/docs/User Guide/User Guide/Theme development/3_Custom app-wide CSS_image.png differ diff --git a/docs/User Guide/User Guide/Theme development/Custom app-wide CSS.md b/docs/User Guide/User Guide/Theme development/Custom app-wide CSS.md index 945d499e3..f601885a9 100644 --- a/docs/User Guide/User Guide/Theme development/Custom app-wide CSS.md +++ b/docs/User Guide/User Guide/Theme development/Custom app-wide CSS.md @@ -4,14 +4,16 @@ It is possible to provide a CSS file to be used regardless of the theme set by t | | | | --- | --- | | ![](Custom%20app-wide%20CSS_image.png) | Start by creating a new note and changing the note type to CSS | -| ![](1_Custom%20app-wide%20CSS_image.png) | In the ribbon, press the ā€œOwned Attributesā€ section and type `#appCss`. | -| ![](2_Custom%20app-wide%20CSS_image.png) | Type the desired CSS.

    Generally it's a good idea to append `!important` for the styles that are being changed, in order to prevent other | +| ![](2_Custom%20app-wide%20CSS_image.png) | In the ribbon, press the ā€œOwned Attributesā€ section and type `#appCss`. | +| ![](3_Custom%20app-wide%20CSS_image.png) | Type the desired CSS.Ā Ā 

    Generally it's a good idea to append `!important` for the styles that are being changed, in order to prevent other | ## Seeing the changes Adding a new _app CSS note_ or modifying an existing one does not immediately apply changes. To see the changes, press Ctrl+Shift+R to refresh the page first. -## Example use-case: customizing the printing stylesheet +## Sample use cases + +### Customizing the printing stylesheet When printing a document or exporting as PDF, it is possible to adjust the style by creating a CSS note that uses the `@media` selector. @@ -19,14 +21,67 @@ For example, to change the font of the document from the one defined by the them ``` @media print { - body { - --main-font-family: serif !important; - --detail-font-family: var(--main-font-family) !important; - } - } -``` \ No newline at end of file +``` + +### Per-workspace styles + +When usingĀ Workspaces, it can be helpful to create a visual distinction between notes in different workspaces. + +To do so: + +1. In the note with `#workspace`, add an inheritable attribute `#cssClass(inheritable)` with a value that uniquely identifies the workspace (say `my-workspace`). +2. Anywhere in the note structure, create a CSS note with `#appCss`. + +#### Change the color of the icons in theĀ Note Tree + +``` +.fancytree-node.my-workspace.fancytree-custom-icon { + color: #ff0000; +} +``` + +#### Change the color of the note title and the icon + +To change the color of the note title and the icon (above the content): + +``` +.note-split.my-workspace .note-icon-widget button.note-icon, +.note-split.my-workspace .note-title-widget input.note-title { + color: #ff0000; +} +``` + +#### Add a watermark to the note content + +
    + +1. Insert an image in any note and take the URL of the image. +2. Use the following CSS, adjusting the `background-image` and `width` and `height` to the desired values. + +``` +.note-split.my-workspace .scrolling-container:after { + position: fixed; + content: ""; + background-image: url("/api/attachments/Rvm3zJNITQI1/image/logo.png"); + background-size: contain; + background-position: center; + background-repeat: no-repeat; + width: 237px; + height: 44px; + bottom: 1em; + right: 1em; + opacity: 0.5; + z-index: 0; +} +``` + +## Limitations + +Some parts of the application can't be styled directly via custom CSS because they are rendered in an isolated mode (shadow DOM), more specifically: + +* The slides in aĀ Presentation View. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..5bf104216 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,94 @@ +# Trilium Notes Documentation + +Welcome to the official documentation for **Trilium Notes** - a hierarchical note-taking application with a focus on building large personal knowledge bases. + +![Trilium Notes Screenshot](app.png) + +## What is Trilium Notes? + +Trilium Notes is a powerful, feature-rich note-taking application designed for building and managing extensive personal knowledge bases. It offers: + +- **Hierarchical organization** with unlimited nesting of notes +- **Rich text editing** with markdown support +- **Powerful search** capabilities +- **Note relations** and attributes for semantic connections +- **Scripting support** for automation and customization +- **Synchronization** between devices +- **Encryption** for sensitive notes +- **Web clipper** for saving web content + +## Quick Links + +
    + +- :material-rocket-launch-outline: **[Quick Start Guide](User%20Guide/quick-start.md)** + + Get up and running with Trilium in minutes + +- :material-download: **[Installation](User%20Guide/installation.md)** + + Download and install Trilium on your platform + +- :material-docker: **[Docker Setup](User%20Guide/docker.md)** + + Deploy Trilium using Docker containers + +- :material-book-open-variant: **[User Guide](User%20Guide/index.md)** + + Comprehensive guide to all features + +- :material-code-braces: **[Script API](Script%20API/index.md)** + + Automate and extend Trilium with scripting + +- :material-wrench: **[Developer Guide](Developer%20Guide/index.md)** + + Contributing and development documentation + +
    + +## Features Overview + +### Note Organization +- Create unlimited hierarchical note structures +- Clone notes to appear in multiple locations +- Use attributes and relations for metadata +- Template system for consistent note creation + +### Content Types +- **Text notes** with rich formatting +- **Code notes** with syntax highlighting +- **Canvas notes** for drawing and diagrams +- **File attachments** of any type +- **Web view** for embedded content +- **Mermaid diagrams** support + +### Advanced Features +- **Full-text search** with advanced operators +- **Note map** visualization +- **Day notes** for journaling +- **Book notes** for long-form content +- **Protected notes** with encryption +- **Note versioning** and history + +### Automation & Integration +- JavaScript-based scripting +- Custom widgets and themes +- REST API for external integrations +- Web clipper browser extension +- Import/export in multiple formats + +## Getting Help + +- **[FAQ](support/faq.md)** - Frequently asked questions +- **[Troubleshooting](support/troubleshooting.md)** - Common issues and solutions +- **[Community Forum](https://github.com/triliumnext/trilium/discussions)** - Ask questions and share tips +- **[Issue Tracker](https://github.com/triliumnext/trilium/issues)** - Report bugs and request features + +## Contributing + +Trilium is open-source and welcomes contributions! Check out our [Contributing Guide](Developer%20Guide/contributing.md) to get started. + +## License + +Trilium Notes is licensed under [AGPL-3.0](https://github.com/triliumnext/trilium/blob/master/LICENSE). \ No newline at end of file diff --git a/docs/javascripts/extra.js b/docs/javascripts/extra.js new file mode 100644 index 000000000..f5c075755 --- /dev/null +++ b/docs/javascripts/extra.js @@ -0,0 +1,111 @@ +// Custom JavaScript for Trilium Notes documentation + +// Add smooth scrolling for anchor links +document.addEventListener('DOMContentLoaded', function() { + // Smooth scroll for internal links + document.querySelectorAll('a[href^="#"]').forEach(anchor => { + anchor.addEventListener('click', function (e) { + e.preventDefault(); + const target = document.querySelector(this.getAttribute('href')); + if (target) { + target.scrollIntoView({ + behavior: 'smooth', + block: 'start' + }); + } + }); + }); + + // Add copy button to code blocks if not already present + const codeBlocks = document.querySelectorAll('pre code'); + codeBlocks.forEach(block => { + if (!block.parentElement.querySelector('.copy-button')) { + const button = document.createElement('button'); + button.className = 'copy-button'; + button.textContent = 'Copy'; + button.addEventListener('click', () => { + navigator.clipboard.writeText(block.textContent); + button.textContent = 'Copied!'; + setTimeout(() => { + button.textContent = 'Copy'; + }, 2000); + }); + block.parentElement.appendChild(button); + } + }); + + // Add external link indicators + document.querySelectorAll('a[href^="http"]').forEach(link => { + if (!link.hostname.includes('trilium')) { + link.classList.add('external-link'); + link.setAttribute('target', '_blank'); + link.setAttribute('rel', 'noopener noreferrer'); + } + }); + + // Platform detection for download buttons + const platform = detectPlatform(); + const downloadButtons = document.querySelectorAll('.download-button'); + downloadButtons.forEach(button => { + if (button.dataset.platform === platform) { + button.classList.add('recommended'); + button.innerHTML += ' Recommended'; + } + }); +}); + +// Detect user's platform +function detectPlatform() { + const userAgent = navigator.userAgent.toLowerCase(); + if (userAgent.includes('win')) return 'windows'; + if (userAgent.includes('mac')) return 'macos'; + if (userAgent.includes('linux')) return 'linux'; + return 'unknown'; +} + +// Add search shortcuts +document.addEventListener('keydown', function(e) { + // Ctrl/Cmd + K to focus search + if ((e.ctrlKey || e.metaKey) && e.key === 'k') { + e.preventDefault(); + const searchInput = document.querySelector('.md-search__input'); + if (searchInput) { + searchInput.focus(); + } + } +}); + +// Version selector enhancement +const versionSelector = document.querySelector('.md-version__current'); +if (versionSelector) { + // Add version comparison tooltip + versionSelector.addEventListener('mouseenter', function() { + const tooltip = document.createElement('div'); + tooltip.className = 'version-tooltip'; + tooltip.textContent = 'Click to view other versions'; + this.appendChild(tooltip); + }); +} + +// Analytics event tracking for documentation +if (typeof gtag !== 'undefined') { + // Track external link clicks + document.querySelectorAll('a[href^="http"]').forEach(link => { + link.addEventListener('click', () => { + gtag('event', 'click', { + 'event_category': 'external_link', + 'event_label': link.href + }); + }); + }); + + // Track code copy events + document.querySelectorAll('.copy-button').forEach(button => { + button.addEventListener('click', () => { + gtag('event', 'copy_code', { + 'event_category': 'engagement', + 'event_label': window.location.pathname + }); + }); + }); +} \ No newline at end of file diff --git a/docs/javascripts/mathjax.js b/docs/javascripts/mathjax.js new file mode 100644 index 000000000..33ea4b928 --- /dev/null +++ b/docs/javascripts/mathjax.js @@ -0,0 +1,13 @@ +// MathJax configuration for mathematical notation support +window.MathJax = { + tex: { + inlineMath: [['$', '$'], ['\\(', '\\)']], + displayMath: [['$$', '$$'], ['\\[', '\\]']], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: 'no-mathjax', + processHtmlClass: 'mathjax' + } +}; \ No newline at end of file diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 000000000..354beb509 --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,121 @@ +/* Custom styles for Trilium Notes documentation */ + +/* Grid cards for homepage */ +.md-typeset .grid { + display: grid; + gap: 1rem; + grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); + margin-top: 1rem; +} + +.md-typeset .grid.cards > ul { + display: contents; +} + +.md-typeset .grid.cards > ul > li { + border: 1px solid var(--md-default-fg-color--lightest); + border-radius: .25rem; + display: flex; + flex-direction: column; + padding: 1rem; + transition: border-color .25s, box-shadow .25s; +} + +.md-typeset .grid.cards > ul > li:hover { + border-color: var(--md-accent-fg-color); + box-shadow: 0 0 0 .1rem var(--md-accent-fg-color--transparent); +} + +/* Improve code block appearance */ +.md-typeset pre > code { + font-size: .85rem; +} + +/* Better admonition spacing */ +.md-typeset .admonition { + margin: 1.5rem 0; +} + +/* Trilium brand colors */ +:root { + --trilium-primary: #4a5568; + --trilium-accent: #805ad5; +} + +/* Custom badge styles */ +.badge { + background-color: var(--md-accent-fg-color); + border-radius: .125rem; + color: var(--md-accent-bg-color); + display: inline-block; + font-size: .75rem; + font-weight: 700; + padding: .125rem .375rem; + text-transform: uppercase; +} + +/* Version badge */ +.version-badge { + background-color: var(--md-primary-fg-color); + margin-left: .5rem; +} + +/* Platform badges */ +.platform-badge { + margin: 0 .25rem; +} + +.platform-badge.windows { + background-color: #0078d4; +} + +.platform-badge.macos { + background-color: #000000; +} + +.platform-badge.linux { + background-color: #fcc624; + color: #000000; +} + +/* Improve table readability */ +.md-typeset table:not([class]) { + font-size: .85rem; +} + +.md-typeset table:not([class]) th { + background-color: var(--md-default-bg-color); + font-weight: 700; +} + +/* API reference styling */ +.api-method { + background-color: var(--md-code-bg-color); + border-radius: .125rem; + font-family: var(--md-code-font-family); + font-weight: 600; + padding: .125rem .25rem; +} + +.api-method.get { + color: #10b981; +} + +.api-method.post { + color: #3b82f6; +} + +.api-method.put { + color: #f59e0b; +} + +.api-method.delete { + color: #ef4444; +} + +/* Responsive improvements */ +@media screen and (max-width: 76.1875em) { + .md-typeset .grid { + grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr)); + } +} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 14d908731..000000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,60 +0,0 @@ -import nx from "@nx/eslint-plugin"; -import reactHooks from "eslint-plugin-react-hooks"; - -export default [ - ...nx.configs["flat/base"], - ...nx.configs["flat/typescript"], - ...nx.configs["flat/javascript"], - { - files: ['**/*.{ts,tsx}'], - plugins: { 'react-hooks': reactHooks }, - rules: { - 'react-hooks/rules-of-hooks': 'error', - } - }, - { - "ignores": [ - "**/dist", - "**/vite.config.*.timestamp*", - "**/vitest.config.*.timestamp*" - ] - }, - { - files: [ - "**/*.tsx", - ], - rules: { - "@nx/enforce-module-boundaries": [ - "error", - { - enforceBuildableLibDependency: true, - allow: [ - "^.*/eslint(\\.base)?\\.config\\.[cm]?js$" - ], - depConstraints: [ - { - sourceTag: "*", - onlyDependOnLibsWithTags: [ - "*" - ] - } - ] - } - ] - } - }, - { - files: [ - "**/*.ts", - "**/*.tsx", - "**/*.cts", - "**/*.mts", - "**/*.js", - "**/*.jsx", - "**/*.cjs", - "**/*.mjs" - ], - // Override or add rules here - rules: {} - } -]; diff --git a/flake.lock b/flake.lock index d77c38c69..590f44ef1 100644 --- a/flake.lock +++ b/flake.lock @@ -38,11 +38,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1751886450, - "narHash": "sha256-ODg0kj9LqBfwijQIDGC3WATqYN0sndImloD3IvinJEM=", + "lastModified": 1757942231, + "narHash": "sha256-yM1FFsRiyESij/lzbdBMCUoFOKMoShHu0CAexnBWzTM=", "owner": "nixos", "repo": "nixpkgs", - "rev": "979affb003b4626f2603b03ae7709dd4617b27e4", + "rev": "dd16e0b60390586a261a4e28fc180a91212fe010", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index ccf7c7b5a..00488214f 100644 --- a/flake.nix +++ b/flake.nix @@ -23,7 +23,15 @@ pkgs = import nixpkgs { inherit system; }; electron = pkgs."electron_${lib.versions.major packageJsonDesktop.devDependencies.electron}"; nodejs = pkgs.nodejs_22; - pnpm = pkgs.pnpm_10; + # pnpm creates an overly long PATH env variable for child processes. + # This patch deduplicates entries in PATH, which results in an equivalent but shorter entry. + # https://github.com/pnpm/pnpm/issues/6106 + # https://github.com/pnpm/pnpm/issues/8552 + pnpm = (pkgs.pnpm_10.overrideAttrs (prev: { + postInstall = prev.postInstall + '' + patch $out/libexec/pnpm/dist/pnpm.cjs ${./patches/pnpm-PATH-reduction.patch} + ''; + })); inherit (pkgs) copyDesktopItems darwin @@ -36,6 +44,7 @@ stdenv wrapGAppsHook3 xcodebuild + which ; fullCleanSourceFilter = @@ -46,8 +55,8 @@ baseName = baseNameOf (toString name); in # No need to copy the flake. - # Don't copy local development instance of NX cache. - baseName != "flake.nix" && baseName != "flake.lock" && baseName != ".nx" + # No need to copy local copy of node_modules. + baseName != "flake.nix" && baseName != "flake.lock" && baseName != "node_modules" ); fullCleanSource = src: @@ -93,19 +102,15 @@ postConfigure = '' - chmod +x node_modules/.pnpm/electron@*/node_modules/electron/install.js + chmod +x node_modules/electron/install.js patchShebangs --build node_modules - '' - + lib.optionalString stdenv.hostPlatform.isLinux '' - patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \ - node_modules/.pnpm/sass-embedded-linux-x64@*/node_modules/sass-embedded-linux-x64/dart-sass/src/dart ''; extraNativeBuildInputs = [ moreutils # sponge nodejs.python - removeReferencesTo + removeReferencesTo ] ++ lib.optionals (app == "desktop") [ copyDesktopItems @@ -113,6 +118,10 @@ # https://github.com/NixOS/nixpkgs/issues/172583 makeShellWrapper wrapGAppsHook3 + + # For determining the Electron version to rebuild for: + which + electron ] ++ lib.optionals (app == "server") [ makeBinaryWrapper @@ -129,7 +138,7 @@ ${preBuildCommands} ''; - scriptFull = "pnpm nx ${buildTask} --outputStyle stream --verbose"; + scriptFull = "pnpm run ${buildTask}"; installPhase = '' runHook preInstall @@ -139,6 +148,11 @@ runHook postInstall ''; + # This file is a symlink into /build which is not allowed. + postFixup = '' + rm $out/opt/trilium*/node_modules/better-sqlite3/node_modules/.bin/prebuild-install || true + ''; + components = [ "packages/ckeditor5" "packages/ckeditor5-admonition" @@ -181,12 +195,18 @@ desktop = makeApp { app = "desktop"; - preBuildCommands = "export npm_config_nodedir=${electron.headers}"; - buildTask = "run desktop:rebuild-deps"; + # pnpm throws an error at the end of `pnpm postinstall`, but it doesn't seem to matter: + # ENOENT: no such file or directory, lstat + # '/build/source/apps/desktop/node_modules/better-sqlite3/build/node_gyp_bins' + preBuildCommands = '' + export npm_config_nodedir=${electron.headers} + pnpm postinstall + ''; + buildTask = "desktop:build"; mainProgram = "trilium"; installCommands = '' - remove-references-to -t ${electron.headers} apps/desktop/dist/node_modules/better-sqlite3/build/config.gypi - remove-references-to -t ${nodejs.python} apps/desktop/dist/node_modules/better-sqlite3/build/config.gypi + #remove-references-to -t ${electron.headers} apps/desktop/dist/node_modules/better-sqlite3/build/config.gypi + #remove-references-to -t ${nodejs.python} apps/desktop/dist/node_modules/better-sqlite3/build/config.gypi mkdir -p $out/{bin,share/icons/hicolor/512x512/apps,opt/trilium} cp --archive apps/desktop/dist/* $out/opt/trilium @@ -202,12 +222,21 @@ server = makeApp { app = "server"; - preBuildCommands = "pushd apps/server; pnpm rebuild; popd"; - buildTask = "--project=server build"; + # pnpm throws an error at the end of `pnpm rebuild`, but it doesn't seem to matter: + # ERR_PNPM_MISSING_HOISTED_LOCATIONS + # vite@7.1.5(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1) + # (sass-embedded@1.91.0)(sass@1.91.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + # is not found in hoistedLocations inside node_modules/.modules.yaml + preBuildCommands = '' + pushd apps/server + pnpm rebuild || true + popd + ''; + buildTask = "server:build"; mainProgram = "trilium-server"; installCommands = '' - remove-references-to -t ${nodejs.python} apps/server/dist/node_modules/better-sqlite3/build/config.gypi - remove-references-to -t ${pnpm} apps/server/dist/node_modules/better-sqlite3/build/config.gypi + #remove-references-to -t ${nodejs.python} apps/server/dist/node_modules/better-sqlite3/build/config.gypi + #remove-references-to -t ${pnpm} apps/server/dist/node_modules/better-sqlite3/build/config.gypi pushd apps/server/dist rm -rf node_modules/better-sqlite3/build/Release/obj \ diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..3d787e9ed --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,191 @@ +# MkDocs configuration for Trilium Notes documentation +site_name: Trilium Notes Documentation +site_url: https://docs.triliumnext.com +site_description: Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases +site_author: Trilium Notes Team + +# Repository information +repo_name: triliumnext/trilium +repo_url: https://github.com/triliumnext/trilium +edit_uri: edit/main/docs/ + +# Copyright +copyright: Copyright © 2025 Trilium Notes + +# Use document-style URLs to fix image paths +use_directory_urls: false + +# Theme configuration +theme: + name: material + + # Color scheme + palette: + # Light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: indigo + accent: deep-purple + toggle: + icon: material/brightness-7 + name: Switch to dark mode + + # Dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: blue-grey + accent: deep-purple + toggle: + icon: material/brightness-4 + name: Switch to light mode + + # Font configuration + font: + text: Inter + code: JetBrains Mono + + # Features + features: + - announce.dismiss + - content.action.edit + - content.action.view + - content.code.annotate + - content.code.copy + - content.tooltips + - navigation.footer + - navigation.indexes + - navigation.instant + - navigation.instant.prefetch + - navigation.instant.progress + - navigation.path + - navigation.prune + - navigation.sections + - navigation.tabs + - navigation.tabs.sticky + - navigation.top + - navigation.tracking + - search.highlight + - search.share + - search.suggest + - toc.follow + - toc.integrate + + # Icons + icon: + logo: material/note-multiple + repo: fontawesome/brands/github + +# Plugins +plugins: + - search: + separator: '[\s\-,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])' + lang: + - en + - awesome-pages: + collapse_single_pages: false + strict: false + order: asc + sort_type: natural + order_by: title + - minify: + minify_html: true + minify_js: true + minify_css: true + htmlmin_opts: + remove_comments: true + - git-revision-date-localized: + enable_creation_date: true + type: iso_datetime + fallback_to_build_date: true + +# Extensions +markdown_extensions: + # Python Markdown + - abbr + - admonition + - attr_list + - def_list + - footnotes + - md_in_html + - toc: + permalink: true + permalink_title: Anchor link to this section for reference + + # Python Markdown Extensions + - pymdownx.arithmatex: + generic: true + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.keys + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.snippets + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: + alternate_style: true + combine_header_slug: true + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tilde + +# Extra CSS and JavaScript (if needed) +extra_css: + - stylesheets/extra.css + +extra_javascript: + - javascripts/extra.js + # MathJax for mathematical notation + - javascripts/mathjax.js + - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js + +# Extra configuration +extra: + # Social links + social: + - icon: fontawesome/brands/github + link: https://github.com/triliumnext/trilium + - icon: fontawesome/brands/docker + link: https://hub.docker.com/r/triliumnext/trilium + - icon: fontawesome/solid/globe + link: https://trilium.cc + + # Analytics (optional - add your own if needed) + analytics: + provider: google + property: G-XXXXXXXXXX # Replace with your Google Analytics ID + feedback: + title: Was this page helpful? + ratings: + - icon: material/emoticon-happy-outline + name: This page was helpful + data: 1 + note: >- + Thanks for your feedback! + - icon: material/emoticon-sad-outline + name: This page could be improved + data: 0 + note: >- + Thanks for your feedback! Help us improve this page by + opening an issue. + + # Version + version: + provider: mike + default: stable + +# Navigation is automatically generated from folder structure by awesome-pages plugin +# To customize order or titles, create .pages files in directories diff --git a/nx.json b/nx.json deleted file mode 100644 index 927089448..000000000 --- a/nx.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "$schema": "./node_modules/nx/schemas/nx-schema.json", - "defaultBase": "main", - "namedInputs": { - "default": [ - "{projectRoot}/**/*", - "sharedGlobals" - ], - "production": [ - "default", - "!{projectRoot}/.eslintrc.json", - "!{projectRoot}/eslint.config.mjs", - "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)", - "!{projectRoot}/tsconfig.spec.json", - "!{projectRoot}/src/test-setup.[jt]s" - ], - "sharedGlobals": [ - "{workspaceRoot}/.github/workflows/release.yml", - "{workspaceRoot}/.github/workflows/playwright.yml" - ] - }, - "plugins": [ - { - "plugin": "@nx/js/typescript", - "options": { - "typecheck": { - "targetName": "typecheck" - }, - "build": { - "targetName": "build", - "configName": "tsconfig.lib.json", - "buildDepsName": "build-deps", - "watchDepsName": "watch-deps" - } - } - }, - { - "plugin": "@nx/eslint/plugin", - "options": { - "targetName": "lint" - } - }, - { - "plugin": "@nx/vite/plugin", - "options": { - "buildTargetName": "build", - "testTargetName": "test", - "serveTargetName": "serve", - "devTargetName": "dev", - "previewTargetName": "preview", - "serveStaticTargetName": "serve-static", - "typecheckTargetName": "typecheck", - "buildDepsTargetName": "build-deps", - "watchDepsTargetName": "watch-deps" - } - }, - { - "plugin": "@nx/playwright/plugin", - "options": { - "targetName": "e2e" - } - } - ], - "targetDefaults": { - "test": { - "dependsOn": [ - "^build" - ] - }, - "@nx/esbuild:esbuild": { - "cache": true, - "dependsOn": [ - "^build" - ], - "inputs": [ - "production", - "^production" - ] - }, - "e2e-ci--**/*": { - "dependsOn": [ - "^build" - ] - } - }, - "generators": { - "@nx/web:application": { - "style": "css", - "linter": "eslint", - "unitTestRunner": "vitest", - "e2eTestRunner": "playwright" - } - } -} diff --git a/package.json b/package.json index 049b21810..54d96c346 100644 --- a/package.json +++ b/package.json @@ -1,99 +1,97 @@ { "name": "@triliumnext/source", - "version": "0.98.1", + "version": "0.99.3", "description": "Build your personal knowledge base with Trilium Notes", "directories": { "doc": "docs" }, "scripts": { - "client:test": "nx test client", - "client:build": "nx build client", - "client:coverage": "nx test client --coverage", - "server:test": "nx test server", - "server:build": "nx build server", - "server:coverage": "nx test server --coverage", - "server:start": "nx run server:serve --outputStyle stream", - "server:start-prod": "nx run server:start-prod", - "electron:build": "nx build desktop", + "client:test": "pnpm run --filter client test", + "client:build": "pnpm run --filter client build", + "client:coverage": "pnpm run --filter client test --coverage", + "server:test": "pnpm run --filter server test", + "server:build": "pnpm run --filter server build", + "server:coverage": "pnpm run --filter server test --coverage", + "server:start": "pnpm run --filter server dev", + "server:start-prod": "pnpm run --filter server start-prod", + "desktop:start": "pnpm run --filter desktop dev", + "desktop:build": "pnpm run --filter desktop build", + "desktop:start-prod": "pnpm run --filter desktop start-prod", + "website:build": "pnpm run --filter website build", + "electron:build": "pnpm desktop:build", + "electron:start": "pnpm desktop:start", + "electron:start-prod": "pnpm desktop:start-prod", "chore:ci-update-nightly-version": "tsx ./scripts/update-nightly-version.ts", "chore:generate-openapi": "tsx ./scripts/generate-openapi.ts", "chore:update-build-info": "tsx ./scripts/update-build-info.ts", "chore:update-version": "tsx ./scripts/update-version.ts", + "chore:fix-mkdocs-structure": "tsx ./scripts/fix-mkdocs-structure.ts", + "edit-docs:edit-docs": "pnpm run --filter edit-docs edit-docs", + "edit-docs:edit-demo": "pnpm run --filter edit-docs edit-demo", "test:all": "pnpm test:parallel && pnpm test:sequential", - "test:parallel": "pnpm nx run-many -t test --all --exclude=server,ckeditor5-mermaid,ckeditor5-math --parallel", - "test:sequential": "pnpm nx run-many -t test --projects=server,ckeditor5-mermaid,ckeditor5-math --parallel=1", - "coverage": "pnpm nx run-many -t coverage" + "test:parallel": "pnpm --filter=!server --filter=!ckeditor5-mermaid --filter=!ckeditor5-math --parallel test", + "test:sequential": "pnpm --filter=server --filter=ckeditor5-mermaid --filter=ckeditor5-math --sequential test", + "typecheck": "tsc --build", + "postinstall": "tsx scripts/electron-rebuild.mts" }, "private": true, "devDependencies": { "@electron/rebuild": "4.0.1", - "@nx/devkit": "21.3.11", - "@nx/esbuild": "21.3.11", - "@nx/eslint": "21.3.11", - "@nx/eslint-plugin": "21.3.11", - "@nx/express": "21.3.11", - "@nx/js": "21.3.11", - "@nx/node": "21.3.11", - "@nx/playwright": "21.3.11", - "@nx/vite": "21.3.11", - "@nx/web": "21.3.11", - "@playwright/test": "^1.36.0", + "@fast-csv/parse": "5.0.5", + "@playwright/test": "1.56.1", "@triliumnext/server": "workspace:*", - "@types/express": "^5.0.0", - "@types/node": "22.18.0", - "@vitest/coverage-v8": "^3.0.5", - "@vitest/ui": "^3.0.0", - "chalk": "5.6.0", - "cross-env": "10.0.0", + "@types/express": "5.0.3", + "@types/node": "22.18.12", + "@vitest/coverage-v8": "3.2.4", + "@vitest/ui": "3.2.4", + "chalk": "5.6.2", + "cross-env": "10.1.0", "dpdm": "3.14.0", - "esbuild": "^0.25.0", - "eslint": "^9.8.0", - "eslint-config-prettier": "^10.0.0", - "eslint-plugin-playwright": "^2.0.0", - "eslint-plugin-react-hooks": "5.2.0", - "happy-dom": "~18.0.0", - "jiti": "2.5.1", - "jsdom": "~26.1.0", - "jsonc-eslint-parser": "^2.1.0", - "nx": "21.3.11", - "react-refresh": "^0.17.0", - "rollup-plugin-webpack-stats": "2.1.4", - "tslib": "^2.3.0", - "tsx": "4.20.5", + "esbuild": "0.25.11", + "eslint": "9.38.0", + "eslint-config-prettier": "10.1.8", + "eslint-plugin-playwright": "2.2.2", + "eslint-plugin-react-hooks": "7.0.0", + "happy-dom": "~20.0.0", + "jiti": "2.6.1", + "jsonc-eslint-parser": "2.4.1", + "react-refresh": "0.18.0", + "rollup-plugin-webpack-stats": "2.1.6", + "tslib": "2.8.1", + "tsx": "4.20.6", "typescript": "~5.9.0", - "typescript-eslint": "^8.19.0", + "typescript-eslint": "8.46.2", "upath": "2.0.1", - "vite": "^7.0.0", + "vite": "7.1.11", "vite-plugin-dts": "~4.5.0", - "vitest": "^3.0.0" + "vitest": "3.2.4" }, "license": "AGPL-3.0-only", "author": { "name": "Trilium Notes Team", "email": "contact@eliandoran.me", - "url": "https://github.com/TriliumNext/Notes" + "url": "https://triliumnotes.org" }, "repository": { "type": "git", - "url": "git+https://github.com/TriliumNext/Notes.git" + "url": "git+https://github.com/TriliumNext/Trilium.git" }, "bugs": { - "url": "https://github.com/TriliumNext/Notes/issues" + "url": "https://github.com/TriliumNext/Trilium/issues" }, - "homepage": "https://github.com/TriliumNext/Notes#readme", - "packageManager": "pnpm@10.15.0", + "homepage": "https://triliumnotes.org", + "packageManager": "pnpm@10.18.3", "pnpm": { "patchedDependencies": { "@ckeditor/ckeditor5-mention": "patches/@ckeditor__ckeditor5-mention.patch", "@ckeditor/ckeditor5-code-block": "patches/@ckeditor__ckeditor5-code-block.patch", - "ckeditor5": "patches/ckeditor5.patch", - "@nx/js": "patches/@nx__js.patch" + "ckeditor5": "patches/ckeditor5.patch" }, "overrides": { - "mermaid": "11.10.1", - "preact": "10.27.1", + "mermaid": "11.12.0", + "preact": "10.27.2", "roughjs": "4.6.6", - "@types/express-serve-static-core": "5.0.7", + "@types/express-serve-static-core": "5.1.0", "flat@<5.0.1": ">=5.0.1", "debug@>=3.2.0 <3.2.7": ">=3.2.7", "nanoid@<3.3.8": ">=3.3.8", @@ -104,7 +102,8 @@ "tar-fs@>=2.0.0 <2.1.3": ">=2.1.3", "on-headers@<1.1.0": ">=1.1.0", "form-data@>=4.0.0 <4.0.4": ">=4.0.4", - "form-data@>=3.0.0 <3.0.4": ">=3.0.4" + "form-data@>=3.0.0 <3.0.4": ">=3.0.4", + "node-abi": "4.14.0" }, "ignoredBuiltDependencies": [ "sqlite3" @@ -120,11 +119,7 @@ "esbuild", "fs-xattr", "macos-alias", - "nx", "utf-8-validate" ] - }, - "nx": { - "name": "triliumnext" } } diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 2d84b2145..4f5df097f 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -11,18 +11,7 @@ "ckeditor5-package-generator" ], "type": "module", - "main": "dist/index.ts", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - }, - "./*": "./dist/*", - "./browser/*": null, - "./package.json": "./package.json" - }, + "main": "src/index.ts", "engines": { "node": ">=18.0.0", "npm": ">=5.7.1" @@ -34,26 +23,26 @@ "devDependencies": { "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@ckeditor/ckeditor5-package-tools": "^4.0.0", - "@typescript-eslint/eslint-plugin": "~8.41.0", - "@typescript-eslint/parser": "^8.0.0", - "@vitest/browser": "^3.0.5", - "@vitest/coverage-istanbul": "^3.0.5", - "ckeditor5": "46.0.2", - "eslint": "^9.0.0", + "@ckeditor/ckeditor5-package-tools": "4.1.1", + "@typescript-eslint/eslint-plugin": "~8.46.0", + "@typescript-eslint/parser": "8.46.2", + "@vitest/browser": "3.2.4", + "@vitest/coverage-istanbul": "3.2.4", + "ckeditor5": "47.1.0", + "eslint": "9.38.0", "eslint-config-ckeditor5": ">=9.1.0", - "http-server": "^14.1.0", - "lint-staged": "^16.0.0", - "stylelint": "^16.0.0", + "http-server": "14.1.1", + "lint-staged": "16.2.5", + "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", - "ts-node": "^10.9.1", - "typescript": "5.9.2", + "ts-node": "10.9.2", + "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "^3.0.5", - "webdriverio": "^9.0.7" + "vitest": "3.2.4", + "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "46.0.2" + "ckeditor5": "47.1.0" }, "author": "Elian Doran ", "license": "GPL-2.0-or-later", @@ -78,13 +67,5 @@ "**/*.css": [ "stylelint --quiet --allow-empty-input" ] - }, - "nx": { - "name": "ckeditor5-admonition", - "targets": { - "build": { - "cache": "true" - } - } } } diff --git a/packages/ckeditor5-admonition/src/admonitionui.ts b/packages/ckeditor5-admonition/src/admonitionui.ts index 09c78f880..ec765ecce 100644 --- a/packages/ckeditor5-admonition/src/admonitionui.ts +++ b/packages/ckeditor5-admonition/src/admonitionui.ts @@ -10,7 +10,7 @@ import { Plugin, addListToDropdown, createDropdown, ListDropdownItemDefinition, SplitButtonView, ViewModel } from 'ckeditor5'; import '../theme/blockquote.css'; -import admonitionIcon from '../theme/icons/admonition.svg'; +import admonitionIcon from '../theme/icons/admonition.svg?raw'; import { AdmonitionType } from './admonitioncommand.js'; import { Collection } from 'ckeditor5'; diff --git a/packages/ckeditor5-admonition/src/index.ts b/packages/ckeditor5-admonition/src/index.ts index 99edeece8..23716647d 100644 --- a/packages/ckeditor5-admonition/src/index.ts +++ b/packages/ckeditor5-admonition/src/index.ts @@ -1,4 +1,4 @@ -import admonitionIcon from '../theme/icons/admonition.svg'; +import admonitionIcon from '../theme/icons/admonition.svg?raw'; import './augmentation.js'; import "../theme/blockquote.css"; diff --git a/packages/ckeditor5-admonition/typings/types.d.ts b/packages/ckeditor5-admonition/typings/types.d.ts index 4333ece78..09be57e1c 100644 --- a/packages/ckeditor5-admonition/typings/types.d.ts +++ b/packages/ckeditor5-admonition/typings/types.d.ts @@ -1,4 +1,4 @@ -declare module '*.svg' { +declare module '*.svg?raw' { const content: string; export default content; } diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 0755f8c30..d8c5c50fb 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -11,18 +11,7 @@ "ckeditor5-package-generator" ], "type": "module", - "main": "dist/index.ts", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - }, - "./*": "./dist/*", - "./browser/*": null, - "./package.json": "./package.json" - }, + "main": "src/index.ts", "license": "ISC", "engines": { "node": ">=18.0.0", @@ -35,26 +24,26 @@ "devDependencies": { "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@ckeditor/ckeditor5-package-tools": "^4.0.0", - "@typescript-eslint/eslint-plugin": "~8.41.0", - "@typescript-eslint/parser": "^8.0.0", - "@vitest/browser": "^3.0.5", - "@vitest/coverage-istanbul": "^3.0.5", - "ckeditor5": "46.0.2", - "eslint": "^9.0.0", + "@ckeditor/ckeditor5-package-tools": "4.1.1", + "@typescript-eslint/eslint-plugin": "~8.46.0", + "@typescript-eslint/parser": "8.46.2", + "@vitest/browser": "3.2.4", + "@vitest/coverage-istanbul": "3.2.4", + "ckeditor5": "47.1.0", + "eslint": "9.38.0", "eslint-config-ckeditor5": ">=9.1.0", - "http-server": "^14.1.0", - "lint-staged": "^16.0.0", - "stylelint": "^16.0.0", + "http-server": "14.1.1", + "lint-staged": "16.2.5", + "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", - "ts-node": "^10.9.1", - "typescript": "5.9.2", + "ts-node": "10.9.2", + "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "^3.0.5", - "webdriverio": "^9.0.7" + "vitest": "3.2.4", + "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "46.0.2" + "ckeditor5": "47.1.0" }, "scripts": { "build": "node ./scripts/build-dist.mjs", @@ -77,13 +66,5 @@ "**/*.css": [ "stylelint --quiet --allow-empty-input" ] - }, - "nx": { - "name": "ckeditor5-footnotes", - "targets": { - "build": { - "cache": "true" - } - } } } diff --git a/packages/ckeditor5-footnotes/src/footnote-ui.ts b/packages/ckeditor5-footnotes/src/footnote-ui.ts index c54b77187..719eb6901 100644 --- a/packages/ckeditor5-footnotes/src/footnote-ui.ts +++ b/packages/ckeditor5-footnotes/src/footnote-ui.ts @@ -6,7 +6,7 @@ import { ELEMENTS, TOOLBAR_COMPONENT_NAME } from './constants.js'; -import insertFootnoteIcon from '../theme/icons/insert-footnote.svg'; +import insertFootnoteIcon from '../theme/icons/insert-footnote.svg?raw'; import { modelQueryElement, modelQueryElementsAll } from './utils.js'; export default class FootnoteUI extends Plugin { diff --git a/packages/ckeditor5-footnotes/src/index.ts b/packages/ckeditor5-footnotes/src/index.ts index 66f96f2b6..b93f1d62c 100644 --- a/packages/ckeditor5-footnotes/src/index.ts +++ b/packages/ckeditor5-footnotes/src/index.ts @@ -1,4 +1,4 @@ -import insertFootnoteIcon from './../theme/icons/insert-footnote.svg'; +import insertFootnoteIcon from './../theme/icons/insert-footnote.svg?raw'; import './augmentation.js'; import "../theme/footnote.css"; diff --git a/packages/ckeditor5-footnotes/typings/types.d.ts b/packages/ckeditor5-footnotes/typings/types.d.ts index 4333ece78..09be57e1c 100644 --- a/packages/ckeditor5-footnotes/typings/types.d.ts +++ b/packages/ckeditor5-footnotes/typings/types.d.ts @@ -1,4 +1,4 @@ -declare module '*.svg' { +declare module '*.svg?raw' { const content: string; export default content; } diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index 5024f813e..cac582774 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -11,18 +11,7 @@ "ckeditor5-package-generator" ], "type": "module", - "main": "dist/index.ts", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - }, - "./*": "./dist/*", - "./browser/*": null, - "./package.json": "./package.json" - }, + "main": "src/index.ts", "author": "Marek Lewandowski", "license": "GPL-3.0", "homepage": "https://github.com/mlewand/ckeditor5-keyboard-marker", @@ -37,26 +26,26 @@ "devDependencies": { "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@ckeditor/ckeditor5-package-tools": "^4.0.0", - "@typescript-eslint/eslint-plugin": "~8.41.0", - "@typescript-eslint/parser": "^8.0.0", - "@vitest/browser": "^3.0.5", - "@vitest/coverage-istanbul": "^3.0.5", - "ckeditor5": "46.0.2", - "eslint": "^9.0.0", + "@ckeditor/ckeditor5-package-tools": "4.1.1", + "@typescript-eslint/eslint-plugin": "~8.46.0", + "@typescript-eslint/parser": "8.46.2", + "@vitest/browser": "3.2.4", + "@vitest/coverage-istanbul": "3.2.4", + "ckeditor5": "47.1.0", + "eslint": "9.38.0", "eslint-config-ckeditor5": ">=9.1.0", - "http-server": "^14.1.0", - "lint-staged": "^16.0.0", - "stylelint": "^16.0.0", + "http-server": "14.1.1", + "lint-staged": "16.2.5", + "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", - "ts-node": "^10.9.1", - "typescript": "5.9.2", + "ts-node": "10.9.2", + "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "^3.0.5", - "webdriverio": "^9.0.7" + "vitest": "3.2.4", + "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "46.0.2" + "ckeditor5": "47.1.0" }, "scripts": { "build": "node ./scripts/build-dist.mjs", @@ -79,13 +68,5 @@ "**/*.css": [ "stylelint --quiet --allow-empty-input" ] - }, - "nx": { - "name": "ckeditor5-keyboard-marker", - "targets": { - "build": { - "cache": "true" - } - } } } diff --git a/packages/ckeditor5-keyboard-marker/src/index.ts b/packages/ckeditor5-keyboard-marker/src/index.ts index eecb33f8d..8b4dfd21f 100644 --- a/packages/ckeditor5-keyboard-marker/src/index.ts +++ b/packages/ckeditor5-keyboard-marker/src/index.ts @@ -1,4 +1,4 @@ -import kbdIcon from '../theme/icons/kbd.svg'; +import kbdIcon from '../theme/icons/kbd.svg?raw'; import './augmentation.js'; export { default as Kbd } from './kbd.js'; diff --git a/packages/ckeditor5-keyboard-marker/src/kbdui.ts b/packages/ckeditor5-keyboard-marker/src/kbdui.ts index 828157d66..0d12a7d28 100644 --- a/packages/ckeditor5-keyboard-marker/src/kbdui.ts +++ b/packages/ckeditor5-keyboard-marker/src/kbdui.ts @@ -1,5 +1,5 @@ import { AttributeCommand, ButtonView, Plugin } from 'ckeditor5'; -import kbdIcon from '../theme/icons/kbd.svg'; +import kbdIcon from '../theme/icons/kbd.svg?raw'; const KBD = 'kbd'; diff --git a/packages/ckeditor5-keyboard-marker/typings/types.d.ts b/packages/ckeditor5-keyboard-marker/typings/types.d.ts index 4333ece78..09be57e1c 100644 --- a/packages/ckeditor5-keyboard-marker/typings/types.d.ts +++ b/packages/ckeditor5-keyboard-marker/typings/types.d.ts @@ -1,4 +1,4 @@ -declare module '*.svg' { +declare module '*.svg?raw' { const content: string; export default content; } diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index 7c58f2c78..680042be7 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -12,18 +12,7 @@ "katex" ], "type": "module", - "main": "dist/index.ts", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - }, - "./*": "./dist/*", - "./browser/*": null, - "./package.json": "./package.json" - }, + "main": "src/index.ts", "author": "Sauli Anto", "license": "ISC", "engines": { @@ -38,26 +27,26 @@ "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-dev-utils": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@ckeditor/ckeditor5-package-tools": "^4.0.0", - "@typescript-eslint/eslint-plugin": "~8.41.0", - "@typescript-eslint/parser": "^8.0.0", - "@vitest/browser": "^3.0.5", - "@vitest/coverage-istanbul": "^3.0.5", - "ckeditor5": "46.0.2", - "eslint": "^9.0.0", + "@ckeditor/ckeditor5-package-tools": "4.1.1", + "@typescript-eslint/eslint-plugin": "~8.46.0", + "@typescript-eslint/parser": "8.46.2", + "@vitest/browser": "3.2.4", + "@vitest/coverage-istanbul": "3.2.4", + "ckeditor5": "47.1.0", + "eslint": "9.38.0", "eslint-config-ckeditor5": ">=9.1.0", - "http-server": "^14.1.0", - "lint-staged": "^16.0.0", - "stylelint": "^16.0.0", + "http-server": "14.1.1", + "lint-staged": "16.2.5", + "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", - "ts-node": "^10.9.1", - "typescript": "5.9.2", + "ts-node": "10.9.2", + "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "^3.0.5", - "webdriverio": "^9.0.7" + "vitest": "3.2.4", + "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "46.0.2" + "ckeditor5": "47.1.0" }, "scripts": { "build": "node ./scripts/build-dist.mjs", @@ -81,15 +70,7 @@ "stylelint --quiet --allow-empty-input" ] }, - "nx": { - "name": "ckeditor5-math", - "targets": { - "build": { - "cache": "true" - } - } - }, "dependencies": { - "@ckeditor/ckeditor5-icons": "46.0.2" + "@ckeditor/ckeditor5-icons": "47.1.0" } } diff --git a/packages/ckeditor5-math/src/index.ts b/packages/ckeditor5-math/src/index.ts index f33a90620..6d6982ae2 100644 --- a/packages/ckeditor5-math/src/index.ts +++ b/packages/ckeditor5-math/src/index.ts @@ -1,4 +1,4 @@ -import ckeditor from './../theme/icons/math.svg'; +import ckeditor from './../theme/icons/math.svg?raw'; import './augmentation.js'; import "../theme/mathform.css"; diff --git a/packages/ckeditor5-math/src/mathcommand.ts b/packages/ckeditor5-math/src/mathcommand.ts index 63671f437..e91350e1f 100644 --- a/packages/ckeditor5-math/src/mathcommand.ts +++ b/packages/ckeditor5-math/src/mathcommand.ts @@ -30,13 +30,26 @@ export default class MathCommand extends Command { mathtex = writer.createElement( display ? 'mathtex-display' : 'mathtex-inline', - { equation, type, display } + { + ...Object.fromEntries(selection.getAttributes()), + equation, + type, + display + } ); } else { + const selection = this.editor.model.document.selection; + // Create new model element mathtex = writer.createElement( display ? 'mathtex-display' : 'mathtex-inline', - { equation, type: outputType, display } + { + // Inherit all attributes from selection (e.g. color, background color, size). + ...Object.fromEntries(selection.getAttributes()), + equation, + type: outputType, + display, + } ); } model.insertContent( mathtex ); diff --git a/packages/ckeditor5-math/src/mathediting.ts b/packages/ckeditor5-math/src/mathediting.ts index bd026829c..a5f1a11db 100644 --- a/packages/ckeditor5-math/src/mathediting.ts +++ b/packages/ckeditor5-math/src/mathediting.ts @@ -59,12 +59,12 @@ export default class MathEditing extends Plugin { allowWhere: '$text', isInline: true, isObject: true, - allowAttributes: [ 'equation', 'type', 'display' ] + allowAttributes: [ 'equation', 'type', 'display', 'fontSize', 'fontColor', 'fontBackgroundColor' ] } ); schema.register( 'mathtex-display', { inheritAllFrom: '$blockObject', - allowAttributes: [ 'equation', 'type', 'display' ] + allowAttributes: [ 'equation', 'type', 'display', 'fontSize', 'fontColor' ] } ); } diff --git a/packages/ckeditor5-math/src/mathui.ts b/packages/ckeditor5-math/src/mathui.ts index a4efff473..4c4a2794c 100644 --- a/packages/ckeditor5-math/src/mathui.ts +++ b/packages/ckeditor5-math/src/mathui.ts @@ -1,6 +1,6 @@ import MathEditing from './mathediting.js'; import MainFormView from './ui/mainformview.js'; -import mathIcon from '../theme/icons/math.svg'; +import mathIcon from '../theme/icons/math.svg?raw'; import { Plugin, ClickObserver, ButtonView, ContextualBalloon, clickOutsideHandler, CKEditorError, uid } from 'ckeditor5'; import { getBalloonPositionData } from './utils.js'; import MathCommand from './mathcommand.js'; @@ -54,10 +54,10 @@ export default class MathUI extends Plugin { this._addFormView(); this._balloon.showStack( 'main' ); - + requestAnimationFrame(() => { this.formView?.mathInputView.fieldView.element?.focus(); - }); + }); } private _createFormView() { diff --git a/packages/ckeditor5-math/src/ui/mainformview.ts b/packages/ckeditor5-math/src/ui/mainformview.ts index 751c3c679..2d1c59793 100644 --- a/packages/ckeditor5-math/src/ui/mainformview.ts +++ b/packages/ckeditor5-math/src/ui/mainformview.ts @@ -1,5 +1,6 @@ import { ButtonView, createLabeledTextarea, FocusCycler, LabelView, LabeledFieldView, submitHandler, SwitchButtonView, View, ViewCollection, type TextareaView, type FocusableView, Locale, FocusTracker, KeystrokeHandler } from 'ckeditor5'; -import { IconCheck, IconCancel } from "@ckeditor/ckeditor5-icons"; +import IconCheck from "@ckeditor/ckeditor5-icons/theme/icons/check.svg?raw"; +import IconCancel from "@ckeditor/ckeditor5-icons/theme/icons/cancel.svg?raw"; import { extractDelimiters, hasDelimiters } from '../utils.js'; import MathView from './mathview.js'; import '../../theme/mathform.css'; diff --git a/packages/ckeditor5-math/typings/types.d.ts b/packages/ckeditor5-math/typings/types.d.ts index 4333ece78..09be57e1c 100644 --- a/packages/ckeditor5-math/typings/types.d.ts +++ b/packages/ckeditor5-math/typings/types.d.ts @@ -1,4 +1,4 @@ -declare module '*.svg' { +declare module '*.svg?raw' { const content: string; export default content; } diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 16e82a001..c57bfac11 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -11,18 +11,7 @@ "ckeditor5-package-generator" ], "type": "module", - "main": "dist/index.ts", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js" - }, - "./*": "./dist/*", - "./browser/*": null, - "./package.json": "./package.json" - }, + "main": "src/index.ts", "license": "SEE LICENSE IN LICENSE.md", "author": "CKSource (https://cksource.com/)", "homepage": "https://github.com/ckeditor/ckeditor5-mermaid", @@ -37,26 +26,26 @@ "devDependencies": { "@ckeditor/ckeditor5-dev-build-tools": "43.1.0", "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@ckeditor/ckeditor5-package-tools": "^4.0.0", - "@typescript-eslint/eslint-plugin": "~8.41.0", - "@typescript-eslint/parser": "^8.0.0", - "@vitest/browser": "^3.0.5", - "@vitest/coverage-istanbul": "^3.0.5", - "ckeditor5": "46.0.2", - "eslint": "^9.0.0", + "@ckeditor/ckeditor5-package-tools": "4.1.1", + "@typescript-eslint/eslint-plugin": "~8.46.0", + "@typescript-eslint/parser": "8.46.2", + "@vitest/browser": "3.2.4", + "@vitest/coverage-istanbul": "3.2.4", + "ckeditor5": "47.1.0", + "eslint": "9.38.0", "eslint-config-ckeditor5": ">=9.1.0", - "http-server": "^14.1.0", - "lint-staged": "^16.0.0", - "stylelint": "^16.0.0", + "http-server": "14.1.1", + "lint-staged": "16.2.5", + "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", - "ts-node": "^10.9.1", - "typescript": "5.9.2", + "ts-node": "10.9.2", + "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "^3.0.5", - "webdriverio": "^9.0.7" + "vitest": "3.2.4", + "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "46.0.2" + "ckeditor5": "47.1.0" }, "scripts": { "build": "node ./scripts/build-dist.mjs", @@ -82,14 +71,6 @@ }, "dependencies": { "@types/lodash-es": "4.17.12", - "lodash-es": "^4.17.21" - }, - "nx": { - "name": "ckeditor5-mermaid", - "targets": { - "build": { - "cache": "true" - } - } + "lodash-es": "4.17.21" } } diff --git a/packages/ckeditor5-mermaid/src/index.ts b/packages/ckeditor5-mermaid/src/index.ts index 58fa30892..d4f750bc8 100644 --- a/packages/ckeditor5-mermaid/src/index.ts +++ b/packages/ckeditor5-mermaid/src/index.ts @@ -1,11 +1,11 @@ import './augmentation.js'; export { default as Mermaid } from './mermaid.js'; -import infoIcon from './../theme/icons/info.svg'; -import insertMermaidIcon from './../theme/icons/insert.svg'; -import previewModeIcon from './../theme/icons/preview-mode.svg'; -import splitModeIcon from './../theme/icons/split-mode.svg'; -import sourceModeIcon from './../theme/icons/source-mode.svg'; +import infoIcon from './../theme/icons/info.svg?raw'; +import insertMermaidIcon from './../theme/icons/insert.svg?raw'; +import previewModeIcon from './../theme/icons/preview-mode.svg?raw'; +import splitModeIcon from './../theme/icons/split-mode.svg?raw'; +import sourceModeIcon from './../theme/icons/source-mode.svg?raw'; import "../theme/mermaid.css"; export const icons = { diff --git a/packages/ckeditor5-mermaid/src/mermaidui.ts b/packages/ckeditor5-mermaid/src/mermaidui.ts index d5fc6519e..0edc9c833 100644 --- a/packages/ckeditor5-mermaid/src/mermaidui.ts +++ b/packages/ckeditor5-mermaid/src/mermaidui.ts @@ -2,11 +2,11 @@ * @module mermaid/mermaidui */ -import insertMermaidIcon from '../theme/icons/insert.svg'; -import previewModeIcon from '../theme/icons/preview-mode.svg'; -import splitModeIcon from '../theme/icons/split-mode.svg'; -import sourceModeIcon from '../theme/icons/source-mode.svg'; -import infoIcon from '../theme/icons/info.svg'; +import insertMermaidIcon from '../theme/icons/insert.svg?raw'; +import previewModeIcon from '../theme/icons/preview-mode.svg?raw'; +import splitModeIcon from '../theme/icons/split-mode.svg?raw'; +import sourceModeIcon from '../theme/icons/source-mode.svg?raw'; +import infoIcon from '../theme/icons/info.svg?raw'; import { ButtonView, Editor, ModelElement, Locale, Observable, Plugin } from 'ckeditor5'; import InsertMermaidCommand from './commands/insertMermaidCommand.js'; diff --git a/packages/ckeditor5-mermaid/tests/index.ts b/packages/ckeditor5-mermaid/tests/index.ts index 06f8e2d83..a2ec5fd56 100644 --- a/packages/ckeditor5-mermaid/tests/index.ts +++ b/packages/ckeditor5-mermaid/tests/index.ts @@ -1,11 +1,11 @@ import { Mermaid as MermaidDll, icons } from '../src/index.js'; import Mermaid from '../src/mermaid.js'; -import infoIcon from './../theme/icons/info.svg'; -import insertMermaidIcon from './../theme/icons/insert.svg'; -import previewModeIcon from './../theme/icons/preview-mode.svg'; -import splitModeIcon from './../theme/icons/split-mode.svg'; -import sourceModeIcon from './../theme/icons/source-mode.svg'; +import infoIcon from './../theme/icons/info.svg?raw'; +import insertMermaidIcon from './../theme/icons/insert.svg?raw'; +import previewModeIcon from './../theme/icons/preview-mode.svg?raw'; +import splitModeIcon from './../theme/icons/split-mode.svg?raw'; +import sourceModeIcon from './../theme/icons/source-mode.svg?raw'; import { describe, it } from 'vitest'; import { expect } from 'vitest'; diff --git a/packages/ckeditor5-mermaid/typings/types.d.ts b/packages/ckeditor5-mermaid/typings/types.d.ts index 4333ece78..09be57e1c 100644 --- a/packages/ckeditor5-mermaid/typings/types.d.ts +++ b/packages/ckeditor5-mermaid/typings/types.d.ts @@ -1,4 +1,4 @@ -declare module '*.svg' { +declare module '*.svg?raw' { const content: string; export default content; } diff --git a/packages/ckeditor5/README.md b/packages/ckeditor5/README.md deleted file mode 100644 index 99d7186b4..000000000 --- a/packages/ckeditor5/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# ckeditor5 - -This library was generated with [Nx](https://nx.dev). - -## Building - -Run `nx build ckeditor5` to build the library. diff --git a/packages/ckeditor5/package.json b/packages/ckeditor5/package.json index 49562a8cc..261bbed8f 100644 --- a/packages/ckeditor5/package.json +++ b/packages/ckeditor5/package.json @@ -4,41 +4,18 @@ "version": "45.0.0", "private": true, "type": "module", - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - "./package.json": "./package.json", - "./emoji_definitions/": "./src/emoji_definitions/", - "./content.css": "./dist/content.css", - "./index.css": "./dist/index.css", - ".": { - "development": "./src/index.ts", - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" - } - }, - "nx": { - "name": "ckeditor5", - "targets": { - "typecheck": { - "dependsOn": [ - "^build" - ] - } - } - }, + "main": "./src/index.ts", "dependencies": { "@triliumnext/ckeditor5-admonition": "workspace:*", "@triliumnext/ckeditor5-footnotes": "workspace:*", "@triliumnext/ckeditor5-keyboard-marker": "workspace:*", "@triliumnext/ckeditor5-math": "workspace:*", "@triliumnext/ckeditor5-mermaid": "workspace:*", - "ckeditor5": "46.0.2", - "ckeditor5-premium-features": "46.0.2" + "ckeditor5": "47.1.0", + "ckeditor5-premium-features": "47.1.0" }, "devDependencies": { + "@smithy/middleware-retry": "4.4.4", "@types/jquery": "3.5.33" } } diff --git a/packages/ckeditor5/src/index.ts b/packages/ckeditor5/src/index.ts index 0bdc4c493..b20fa0db5 100644 --- a/packages/ckeditor5/src/index.ts +++ b/packages/ckeditor5/src/index.ts @@ -13,6 +13,8 @@ export { default as buildExtraCommands } from "./extra_slash_commands.js"; import "@triliumnext/ckeditor5-math"; import "@triliumnext/ckeditor5-mermaid"; +window[Symbol.for("cke distribution")] = "trilium"; + /** * Short-hand for the CKEditor classes supported by Trilium for text editing. * Specialized editors such as the {@link AttributeEditor} are not included. diff --git a/packages/ckeditor5/src/plugins.ts b/packages/ckeditor5/src/plugins.ts index a16ad1bbb..bbd613a9e 100644 --- a/packages/ckeditor5/src/plugins.ts +++ b/packages/ckeditor5/src/plugins.ts @@ -21,10 +21,10 @@ import { Admonition } from "@triliumnext/ckeditor5-admonition"; import { Footnotes } from "@triliumnext/ckeditor5-footnotes"; import { Math, AutoformatMath } from "@triliumnext/ckeditor5-math"; -import "@triliumnext/ckeditor5-mermaid/index.css"; -import "@triliumnext/ckeditor5-admonition/index.css"; -import "@triliumnext/ckeditor5-footnotes/index.css"; -import "@triliumnext/ckeditor5-math/index.css"; +// import "@triliumnext/ckeditor5-mermaid/index.css"; +// import "@triliumnext/ckeditor5-admonition/index.css"; +// import "@triliumnext/ckeditor5-footnotes/index.css"; +// import "@triliumnext/ckeditor5-math/index.css"; import CodeBlockToolbar from "./plugins/code_block_toolbar.js"; import CodeBlockLanguageDropdown from "./plugins/code_block_language_dropdown.js"; import MoveBlockUpDownPlugin from "./plugins/move_block_updown.js"; diff --git a/packages/ckeditor5/src/plugins/file_upload/progressbarview.ts b/packages/ckeditor5/src/plugins/file_upload/progressbarview.ts index daa888751..24d5a1a35 100644 --- a/packages/ckeditor5/src/plugins/file_upload/progressbarview.ts +++ b/packages/ckeditor5/src/plugins/file_upload/progressbarview.ts @@ -1,4 +1,4 @@ -import cancelIcon from '@ckeditor/ckeditor5-core/theme/icons/cancel.svg'; +import cancelIcon from '@ckeditor/ckeditor5-core/theme/icons/cancel.svg?raw'; import { ButtonView, Locale, toUnit, View } from 'ckeditor5'; const toPx = toUnit('%'); diff --git a/packages/ckeditor5/vite.config.ts b/packages/ckeditor5/vite.config.ts index 64a0ea57a..a310ff5c9 100644 --- a/packages/ckeditor5/vite.config.ts +++ b/packages/ckeditor5/vite.config.ts @@ -7,12 +7,6 @@ export default defineConfig(() => ({ root: __dirname, cacheDir: '../../node_modules/.vite/packages/ckeditor5', plugins: [dts({ entryRoot: 'src', tsconfigPath: path.join(__dirname, 'tsconfig.lib.json') })], - // Uncomment this if you are using workers. - // worker: { - // plugins: [ nxViteTsPaths() ], - // }, - // Configuration for building your library. - // See: https://vitejs.dev/guide/build.html#library-mode build: { outDir: './dist', emptyOutDir: true, diff --git a/packages/codemirror/README.md b/packages/codemirror/README.md deleted file mode 100644 index 34cc0ce78..000000000 --- a/packages/codemirror/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# codemirror - -This library was generated with [Nx](https://nx.dev). - -## Building - -Run `nx build codemirror` to build the library. diff --git a/packages/codemirror/eslint.config.mjs b/packages/codemirror/eslint.config.mjs deleted file mode 100644 index 9ee1191ff..000000000 --- a/packages/codemirror/eslint.config.mjs +++ /dev/null @@ -1,24 +0,0 @@ -import baseConfig from "../../eslint.config.mjs"; - -export default [ - ...baseConfig, - { - "files": [ - "**/*.json" - ], - "rules": { - "@nx/dependency-checks": [ - "error", - { - "ignoredFiles": [ - "{projectRoot}/eslint.config.{js,cjs,mjs}", - "{projectRoot}/vite.config.{js,ts,mjs,mts}" - ] - } - ] - }, - "languageOptions": { - "parser": (await import('jsonc-eslint-parser')) - } - } -]; diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index 45b0a0544..1a900b35f 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -3,34 +3,20 @@ "version": "0.0.1", "private": true, "type": "module", - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "development": "./src/index.ts", - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" - } - }, - "nx": { - "name": "codemirror" - }, + "main": "./src/index.ts", "dependencies": { - "@codemirror/commands": "6.8.1", + "@codemirror/commands": "6.9.0", "@codemirror/lang-css": "6.3.1", - "@codemirror/lang-html": "6.4.9", + "@codemirror/lang-html": "6.4.11", "@codemirror/lang-javascript": "6.2.4", "@codemirror/lang-json": "6.0.2", - "@codemirror/lang-markdown": "6.3.4", + "@codemirror/lang-markdown": "6.4.0", "@codemirror/lang-php": "6.0.2", "@codemirror/lang-vue": "0.1.3", "@codemirror/lang-xml": "6.1.0", - "@codemirror/legacy-modes": "6.5.1", + "@codemirror/legacy-modes": "6.5.2", "@codemirror/search": "6.5.11", - "@codemirror/view": "6.38.1", + "@codemirror/view": "6.38.6", "@fsegurai/codemirror-theme-abcdef": "6.2.2", "@fsegurai/codemirror-theme-abyss": "6.2.2", "@fsegurai/codemirror-theme-android-studio": "6.2.2", @@ -60,9 +46,10 @@ "@replit/codemirror-vim": "6.3.0", "@ssddanbrown/codemirror-lang-smarty": "1.0.0", "@ssddanbrown/codemirror-lang-twig": "1.0.0", + "@triliumnext/commons": "workspace:*", "codemirror-lang-elixir": "4.0.0", "codemirror-lang-hcl": "0.1.0", "codemirror-lang-mermaid": "0.5.0", - "eslint-linter-browserify": "9.34.0" + "eslint-linter-browserify": "9.38.0" } } diff --git a/packages/codemirror/vite.config.ts b/packages/codemirror/vite.config.ts index c2ba7e860..cb3055d05 100644 --- a/packages/codemirror/vite.config.ts +++ b/packages/codemirror/vite.config.ts @@ -7,12 +7,6 @@ export default defineConfig(() => ({ root: __dirname, cacheDir: '../../node_modules/.vite/packages/codemirror', plugins: [dts({ entryRoot: 'src', tsconfigPath: path.join(__dirname, 'tsconfig.lib.json') }), ], - // Uncomment this if you are using workers. - // worker: { - // plugins: [ nxViteTsPaths() ], - // }, - // Configuration for building your library. - // See: https://vitejs.dev/guide/build.html#library-mode build: { outDir: './dist', emptyOutDir: true, diff --git a/packages/commons/README.md b/packages/commons/README.md deleted file mode 100644 index 21a2e80a8..000000000 --- a/packages/commons/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# commons - -This library was generated with [Nx](https://nx.dev). - -## Building - -Run `nx build commons` to build the library. - -## Running unit tests - -Run `nx test commons` to execute the unit tests via [Vitest](https://vitest.dev/). diff --git a/packages/commons/eslint.config.mjs b/packages/commons/eslint.config.mjs deleted file mode 100644 index 9ee1191ff..000000000 --- a/packages/commons/eslint.config.mjs +++ /dev/null @@ -1,24 +0,0 @@ -import baseConfig from "../../eslint.config.mjs"; - -export default [ - ...baseConfig, - { - "files": [ - "**/*.json" - ], - "rules": { - "@nx/dependency-checks": [ - "error", - { - "ignoredFiles": [ - "{projectRoot}/eslint.config.{js,cjs,mjs}", - "{projectRoot}/vite.config.{js,ts,mjs,mts}" - ] - } - ] - }, - "languageOptions": { - "parser": (await import('jsonc-eslint-parser')) - } - } -]; diff --git a/packages/commons/package.json b/packages/commons/package.json index eff04806c..ecb5a08c3 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,57 +1,14 @@ { "name": "@triliumnext/commons", - "version": "0.98.1", + "version": "0.99.3", "description": "Shared library between the clients (e.g. browser, Electron) and the server, mostly for type definitions and utility methods.", "private": true, "type": "module", - "main": "./dist/main.js", - "module": "./dist/main.js", - "types": "./dist/index.d.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "development": "./src/index.ts", - "types": "./dist/index.d.ts", - "import": "./dist/main.js", - "default": "./dist/main.js" - } - }, + "main": "./src/index.ts", "license": "AGPL-3.0-only", "author": { "name": "Trilium Notes Team", "email": "contact@eliandoran.me", - "url": "https://github.com/TriliumNext/Notes" - }, - "nx": { - "name": "commons", - "sourceRoot": "packages/commons/src", - "targets": { - "build": { - "executor": "@nx/esbuild:esbuild", - "outputs": [ - "{options.outputPath}" - ], - "defaultConfiguration": "production", - "options": { - "main": "packages/commons/src/index.ts", - "outputPath": "packages/commons/dist", - "outputFileName": "main.js", - "tsConfig": "packages/commons/tsconfig.lib.json", - "platform": "node", - "format": [ - "esm" - ], - "declarationRootDir": "packages/commons/src" - }, - "configurations": { - "development": { - "minify": false - }, - "production": { - "minify": true - } - } - } - } + "url": "https://triliumnotes.org" } } \ No newline at end of file diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index 432990bc0..c74cd758f 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -8,3 +8,6 @@ export * from "./lib/mime_type.js"; export * from "./lib/bulk_actions.js"; export * from "./lib/server_api.js"; export * from "./lib/shared_constants.js"; +export * from "./lib/ws_api.js"; +export * from "./lib/attribute_names.js"; +export * from "./lib/utils.js"; diff --git a/packages/commons/src/lib/attribute_names.ts b/packages/commons/src/lib/attribute_names.ts new file mode 100644 index 000000000..d55d4e375 --- /dev/null +++ b/packages/commons/src/lib/attribute_names.ts @@ -0,0 +1,60 @@ +/** + * A listing of all the labels used by the system (i.e. not user-defined). Labels defined here have a data type which is not enforced, but offers type safety. + */ +type Labels = { + color: string; + iconClass: string; + workspaceIconClass: string; + executeDescription: string; + executeTitle: string; + limit: string; // should be probably be number + calendarRoot: boolean; + workspaceCalendarRoot: boolean; + archived: boolean; + sorted: boolean; + template: boolean; + autoReadOnlyDisabled: boolean; + language: string; + originalFileName: string; + pageUrl: string; + + // Search + searchString: string; + ancestorDepth: string; + orderBy: string; + orderDirection: string; + + // Collection-specific + viewType: string; + status: string; + pageSize: number; + geolocation: string; + readOnly: boolean; + expanded: boolean; + "calendar:hideWeekends": boolean; + "calendar:weekNumbers": boolean; + "calendar:view": string; + "map:style": string; + "map:scale": boolean; + "board:groupBy": string; + maxNestingDepth: number; + includeArchived: boolean; + "presentation:theme": string; + "slide:background": string; +} + +/** + * A listing of all relations used by the system (i.e. not user-defined). Unlike labels, relations + * always point to a note ID, so no specific data type is necessary. + */ +type Relations = [ + "searchScript", + "ancestor" +]; + +export type LabelNames = keyof Labels; +export type RelationNames = Relations[number]; + +export type FilterLabelsByType = { + [K in keyof Labels]: Labels[K] extends U ? K : never; +}[keyof Labels]; diff --git a/packages/commons/src/lib/hidden_subtree.ts b/packages/commons/src/lib/hidden_subtree.ts index e33276da9..0d23f0805 100644 --- a/packages/commons/src/lib/hidden_subtree.ts +++ b/packages/commons/src/lib/hidden_subtree.ts @@ -49,4 +49,15 @@ export interface HiddenSubtreeItem { * the user moves it around. */ enforceBranches?: boolean; + /** + * If set to true, then the attributes of this note will be checked. Any owned attribute that does not match the + * definitions will be removed. + */ + enforceAttributes?: boolean; + /** + * Optionally, a content to be set in the hidden note. If undefined, an empty string will be set instead. + * + * The value is also checked at every startup to ensure that it's kept up to date according to the definition. + */ + content?: string; } diff --git a/packages/commons/src/lib/i18n.ts b/packages/commons/src/lib/i18n.ts index d40f5ecc5..65ff196d2 100644 --- a/packages/commons/src/lib/i18n.ts +++ b/packages/commons/src/lib/i18n.ts @@ -5,23 +5,40 @@ export interface Locale { rtl?: boolean; /** `true` if the language is not supported by the application as a display language, but it is selectable by the user for the content. */ contentOnly?: boolean; + /** `true` if the language should only be visible while in development mode, and not in production. */ + devOnly?: boolean; /** The value to pass to `--lang` for the Electron instance in order to set it as a locale. Not setting it will hide it from the list of supported locales. */ electronLocale?: "en" | "de" | "es" | "fr" | "zh_CN" | "zh_TW" | "ro" | "af" | "am" | "ar" | "bg" | "bn" | "ca" | "cs" | "da" | "el" | "en_GB" | "es_419" | "et" | "fa" | "fi" | "fil" | "gu" | "he" | "hi" | "hr" | "hu" | "id" | "it" | "ja" | "kn" | "ko" | "lt" | "lv" | "ml" | "mr" | "ms" | "nb" | "nl" | "pl" | "pt_BR" | "pt_PT" | "ru" | "sk" | "sl" | "sr" | "sv" | "sw" | "ta" | "te" | "th" | "tr" | "uk" | "ur" | "vi"; } -const UNSORTED_LOCALES: Locale[] = [ +const UNSORTED_LOCALES = [ { id: "cn", name: "简体中文", electronLocale: "zh_CN" }, { id: "de", name: "Deutsch", electronLocale: "de" }, { id: "en", name: "English", electronLocale: "en" }, { id: "es", name: "EspaƱol", electronLocale: "es" }, { id: "fr", name: "FranƧais", electronLocale: "fr" }, + { id: "it", name: "Italiano", electronLocale: "it" }, { id: "ja", name: "ę—„ęœ¬čŖž", electronLocale: "ja" }, { id: "pt_br", name: "PortuguĆŖs (Brasil)", electronLocale: "pt_BR" }, + { id: "pt", name: "PortuguĆŖs (Portugal)", electronLocale: "pt_PT" }, { id: "ro", name: "RomĆ¢nă", electronLocale: "ro" }, { id: "ru", name: "Русский", electronLocale: "ru" }, { id: "tw", name: "繁體中文", electronLocale: "zh_TW" }, { id: "uk", name: "Š£ŠŗŃ€Š°Ń—Š½ŃŃŒŠŗŠ°", electronLocale: "uk" }, + /** + * Development-only languages. + * + * These are only displayed while in dev mode, to test some language particularities (such as RTL) more easily. + */ + { + id: "en_rtl", + name: "English RTL", + electronLocale: "en", + rtl: true, + devOnly: true + }, + /* * Right to left languages * @@ -31,7 +48,7 @@ const UNSORTED_LOCALES: Locale[] = [ id: "ar", name: "Ų§ŁŽŁ„Ł’Ų¹ŁŽŲ±ŁŽŲØŁŁŠŁŽŁ‘Ų©Ł", rtl: true, - contentOnly: true + electronLocale: "ar" }, { // Hebrew id: "he", @@ -56,4 +73,7 @@ const UNSORTED_LOCALES: Locale[] = [ export const LOCALES: Locale[] = Array.from(UNSORTED_LOCALES) .sort((a, b) => a.name.localeCompare(b.name)); +/** A type containing a string union of all the supported locales, including those that are content-only. */ export type LOCALE_IDS = typeof UNSORTED_LOCALES[number]["id"]; +/** A type containing a string union of all the supported locales that are not content-only (i.e. can be used as the UI language). */ +export type DISPLAYABLE_LOCALE_IDS = Exclude["id"]; diff --git a/packages/commons/src/lib/options_interface.ts b/packages/commons/src/lib/options_interface.ts index aedbab6e1..fe91fb82a 100644 --- a/packages/commons/src/lib/options_interface.ts +++ b/packages/commons/src/lib/options_interface.ts @@ -96,9 +96,11 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions setTimeout(resolve, duration)); +} diff --git a/packages/commons/src/lib/utils.ts b/packages/commons/src/lib/utils.ts new file mode 100644 index 000000000..936c63c16 --- /dev/null +++ b/packages/commons/src/lib/utils.ts @@ -0,0 +1,11 @@ +export function formatLogMessage(message: string | object) { + if (typeof message === "object") { + try { + return JSON.stringify(message, null, 4); + } catch (e) { + return message.toString(); + } + } + + return message; +} diff --git a/packages/commons/src/lib/ws_api.ts b/packages/commons/src/lib/ws_api.ts new file mode 100644 index 000000000..67beb0b42 --- /dev/null +++ b/packages/commons/src/lib/ws_api.ts @@ -0,0 +1,158 @@ +export interface EntityChange { + id?: number | null; + noteId?: string; + entityName: string; + entityId: string; + entity?: any; + positions?: Record; + hash: string; + utcDateChanged?: string; + utcDateModified?: string; + utcDateCreated?: string; + isSynced: boolean | 1 | 0; + isErased: boolean | 1 | 0; + componentId?: string | null; + changeId?: string | null; + instanceId?: string | null; +} + +export interface EntityRow { + isDeleted?: boolean; + content?: Buffer | string; +} + +export interface EntityChangeRecord { + entityChange: EntityChange; + entity?: EntityRow; +} + +type TaskDataDefinitions = { + empty: null, + deleteNotes: null, + undeleteNotes: null, + export: null, + protectNotes: { + protect: boolean; + } + importNotes: { + textImportedAsText?: boolean; + codeImportedAsCode?: boolean; + replaceUnderscoresWithSpaces?: boolean; + shrinkImages?: boolean; + safeImport?: boolean; + } | null, + importAttachments: null +} + +type TaskResultDefinitions = { + empty: null, + deleteNotes: null, + undeleteNotes: null, + export: null, + protectNotes: null, + importNotes: { + parentNoteId?: string; + importedNoteId?: string + }; + importAttachments: { + parentNoteId?: string; + importedNoteId?: string + }; +} + +export type TaskType = keyof TaskDataDefinitions | keyof TaskResultDefinitions; +export type TaskData = TaskDataDefinitions[T]; +export type TaskResult = TaskResultDefinitions[T]; + +type TaskDefinition = { + type: "taskProgressCount", + taskId: string; + taskType: T; + data: TaskData, + progressCount: number +} | { + type: "taskError", + taskId: string; + taskType: T; + data: TaskData, + message: string; +} | { + type: "taskSucceeded", + taskId: string; + taskType: T; + data: TaskData, + result: TaskResult; +} + +export interface OpenedFileUpdateStatus { + entityType: string; + entityId: string; + lastModifiedMs?: number; + filePath: string; +} + +type AllTaskDefinitions = + | TaskDefinition<"empty"> + | TaskDefinition<"deleteNotes"> + | TaskDefinition<"undeleteNotes"> + | TaskDefinition<"export"> + | TaskDefinition<"protectNotes"> + | TaskDefinition<"importNotes"> + | TaskDefinition<"importAttachments">; + +export type WebSocketMessage = AllTaskDefinitions | { + type: "ping" +} | { + type: "frontend-update", + data: { + lastSyncedPush: number, + entityChanges: EntityChange[] + } +} | { + type: "openNote", + noteId: string +} | OpenedFileUpdateStatus & { + type: "openedFileUpdated" +} | { + type: "protectedSessionLogin" +} | { + type: "protectedSessionLogout" +} | { + type: "toast", + message: string; +} | { + type: "api-log-messages", + noteId: string, + messages: string[] +} | { + type: "execute-script"; + script: string; + params: unknown[]; + startNoteId?: string; + currentNoteId: string; + originEntityName: string; + originEntityId?: string | null; +} | { + type: "reload-frontend"; + reason: string; +} | { + type: "sync-pull-in-progress" | "sync-push-in-progress" | "sync-finished" | "sync-failed"; + lastSyncedPush: number; +} | { + type: "consistency-checks-failed" +} | { + type: "llm-stream", + chatNoteId: string; + done?: boolean; + error?: string; + thinking?: string; + content?: string; + toolExecution?: { + action?: string; + tool?: string; + toolCallId?: string; + result?: string | Record; + error?: string; + args?: Record; + } +} diff --git a/packages/express-partial-content/eslint.config.mjs b/packages/express-partial-content/eslint.config.mjs deleted file mode 100644 index b0d78db72..000000000 --- a/packages/express-partial-content/eslint.config.mjs +++ /dev/null @@ -1,23 +0,0 @@ -import baseConfig from "../../eslint.config.mjs"; - -export default [ - ...baseConfig, - { - "files": [ - "**/*.json" - ], - "rules": { - "@nx/dependency-checks": [ - "error", - { - "ignoredFiles": [ - "{projectRoot}/eslint.config.{js,cjs,mjs}" - ] - } - ] - }, - "languageOptions": { - "parser": (await import('jsonc-eslint-parser')) - } - } -]; diff --git a/packages/express-partial-content/package.json b/packages/express-partial-content/package.json index d4a78437b..012cad027 100644 --- a/packages/express-partial-content/package.json +++ b/packages/express-partial-content/package.json @@ -5,56 +5,14 @@ "version": "1.1.0", "type": "module", "private": true, - "main": "./dist/main.js", - "module": "./dist/main.js", - "types": "./dist/index.d.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "development": "./src/index.ts", - "types": "./dist/index.d.ts", - "import": "./dist/main.js", - "default": "./dist/main.js" - } - }, + "main": "./src/index.ts", "keywords": [ "partial-content", "206", "stream", "typescript" ], - "nx": { - "name": "express-partial-content", - "targets": { - "build": { - "executor": "@nx/esbuild:esbuild", - "outputs": [ - "{options.outputPath}" - ], - "defaultConfiguration": "production", - "options": { - "main": "packages/express-partial-content/src/index.ts", - "outputPath": "packages/express-partial-content/dist", - "outputFileName": "main.js", - "tsConfig": "packages/express-partial-content/tsconfig.lib.json", - "platform": "node", - "format": [ - "esm" - ], - "declarationRootDir": "packages/express-partial-content/src" - }, - "configurations": { - "development": { - "minify": false - }, - "production": { - "minify": true - } - } - } - } - }, "dependencies": { - "tslib": "^2.3.0" + "tslib": "2.8.1" } } diff --git a/packages/express-partial-content/vite.config.ts b/packages/express-partial-content/vite.config.ts index 450381921..fc85d4a52 100644 --- a/packages/express-partial-content/vite.config.ts +++ b/packages/express-partial-content/vite.config.ts @@ -5,14 +5,10 @@ export default defineConfig(() => ({ root: __dirname, cacheDir: '../../node_modules/.vite/packages/express-partial-content', plugins: [], - // Uncomment this if you are using workers. - // worker: { - // plugins: [ nxViteTsPaths() ], - // }, test: { watch: false, globals: true, - environment: 'jsdom', + environment: 'happy-dom', include: ['{src,tests}/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], reporters: ['default'], coverage: { diff --git a/packages/highlightjs/README.md b/packages/highlightjs/README.md deleted file mode 100644 index d3897f3f7..000000000 --- a/packages/highlightjs/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# highlightjs - -This library was generated with [Nx](https://nx.dev). - -## Building - -Run `nx build highlightjs` to build the library. - -## Running unit tests - -Run `nx test highlightjs` to execute the unit tests via [Vitest](https://vitest.dev/). diff --git a/packages/highlightjs/eslint.config.mjs b/packages/highlightjs/eslint.config.mjs deleted file mode 100644 index 9ee1191ff..000000000 --- a/packages/highlightjs/eslint.config.mjs +++ /dev/null @@ -1,24 +0,0 @@ -import baseConfig from "../../eslint.config.mjs"; - -export default [ - ...baseConfig, - { - "files": [ - "**/*.json" - ], - "rules": { - "@nx/dependency-checks": [ - "error", - { - "ignoredFiles": [ - "{projectRoot}/eslint.config.{js,cjs,mjs}", - "{projectRoot}/vite.config.{js,ts,mjs,mts}" - ] - } - ] - }, - "languageOptions": { - "parser": (await import('jsonc-eslint-parser')) - } - } -]; diff --git a/packages/highlightjs/package.json b/packages/highlightjs/package.json index c6eb24ed1..249e2373f 100644 --- a/packages/highlightjs/package.json +++ b/packages/highlightjs/package.json @@ -3,21 +3,7 @@ "version": "0.0.1", "private": true, "type": "module", - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "development": "./src/index.ts", - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" - } - }, - "nx": { - "name": "highlightjs" - }, + "main": "./src/index.ts", "dependencies": { "@exercism/highlightjs-gdscript": "0.0.1", "@triliumnext/commons": "workspace:*", diff --git a/packages/highlightjs/src/index.ts b/packages/highlightjs/src/index.ts index 29ffec2a7..355268179 100644 --- a/packages/highlightjs/src/index.ts +++ b/packages/highlightjs/src/index.ts @@ -1,4 +1,4 @@ -import hljs from "../node_modules/highlight.js/es/core.js"; +import hljs from "highlight.js"; import { normalizeMimeTypeForCKEditor, type MimeType } from "@triliumnext/commons"; import syntaxDefinitions from "./syntax_highlighting.js"; import { type Theme } from "./themes.js"; diff --git a/packages/highlightjs/src/themes.ts b/packages/highlightjs/src/themes.ts index 686467780..568ace5f5 100644 --- a/packages/highlightjs/src/themes.ts +++ b/packages/highlightjs/src/themes.ts @@ -6,323 +6,323 @@ export interface Theme { const themeDefinitions: Record = { "1c-light": { name: "1C (Light)", - load: () => import("../node_modules/highlight.js/styles/1c-light.css?raw") + load: () => import("highlight.js/styles/1c-light.css?raw") }, "a11y-dark": { name: "a11y (Dark)", - load: () => import("../node_modules/highlight.js/styles/a11y-dark.css?raw") + load: () => import("highlight.js/styles/a11y-dark.css?raw") }, "a11y-light": { name: "a11y (Light)", - load: () => import("../node_modules/highlight.js/styles/a11y-light.css?raw") + load: () => import("highlight.js/styles/a11y-light.css?raw") }, "agate": { name: "Agate (Dark)", - load: () => import("../node_modules/highlight.js/styles/agate.css?raw") + load: () => import("highlight.js/styles/agate.css?raw") }, "an-old-hope": { name: "An Old Hope (Dark)", - load: () => import("../node_modules/highlight.js/styles/an-old-hope.css?raw") + load: () => import("highlight.js/styles/an-old-hope.css?raw") }, "androidstudio": { name: "Android Studio (Dark)", - load: () => import("../node_modules/highlight.js/styles/androidstudio.css?raw") + load: () => import("highlight.js/styles/androidstudio.css?raw") }, "arduino-light": { name: "Arduino (Light)", - load: () => import("../node_modules/highlight.js/styles/arduino-light.css?raw") + load: () => import("highlight.js/styles/arduino-light.css?raw") }, "arta": { name: "Arta (Dark)", - load: () => import("../node_modules/highlight.js/styles/arta.css?raw") + load: () => import("highlight.js/styles/arta.css?raw") }, "ascetic": { name: "Ascetic (Light)", - load: () => import("../node_modules/highlight.js/styles/ascetic.css?raw") + load: () => import("highlight.js/styles/ascetic.css?raw") }, "atom-one-dark-reasonable": { name: "Atom One with ReasonML support (Dark)", - load: () => import("../node_modules/highlight.js/styles/atom-one-dark-reasonable.css?raw") + load: () => import("highlight.js/styles/atom-one-dark-reasonable.css?raw") }, "atom-one-dark": { name: "Atom One (Dark)", - load: () => import("../node_modules/highlight.js/styles/atom-one-dark.css?raw") + load: () => import("highlight.js/styles/atom-one-dark.css?raw") }, "atom-one-light": { name: "Atom One (Light)", - load: () => import("../node_modules/highlight.js/styles/atom-one-light.css?raw") + load: () => import("highlight.js/styles/atom-one-light.css?raw") }, "brown-paper": { name: "Brown Paper (Light)", - load: () => import("../node_modules/highlight.js/styles/brown-paper.css?raw") + load: () => import("highlight.js/styles/brown-paper.css?raw") }, "codepen-embed": { name: "CodePen Embed (Dark)", - load: () => import("../node_modules/highlight.js/styles/codepen-embed.css?raw") + load: () => import("highlight.js/styles/codepen-embed.css?raw") }, "color-brewer": { name: "Color Brewer (Light)", - load: () => import("../node_modules/highlight.js/styles/color-brewer.css?raw") + load: () => import("highlight.js/styles/color-brewer.css?raw") }, "cybertopia-cherry": { name: "Cybertopia Cherry (Dark)", - load: () => import("../node_modules/highlight.js/styles/cybertopia-cherry.css?raw") + load: () => import("highlight.js/styles/cybertopia-cherry.css?raw") }, "cybertopia-dimmer": { name: "Cybertopia Dimmer (Dark)", - load: () => import("../node_modules/highlight.js/styles/cybertopia-dimmer.css?raw") + load: () => import("highlight.js/styles/cybertopia-dimmer.css?raw") }, "cybertopia-icecap": { name: "Cybertopia Icecap (Dark)", - load: () => import("../node_modules/highlight.js/styles/cybertopia-icecap.css?raw") + load: () => import("highlight.js/styles/cybertopia-icecap.css?raw") }, "cybertopia-saturated": { name: "Cybertopia Saturated (Dark)", - load: () => import("../node_modules/highlight.js/styles/cybertopia-saturated.css?raw") + load: () => import("highlight.js/styles/cybertopia-saturated.css?raw") }, "dark": { name: "Dark", - load: () => import("../node_modules/highlight.js/styles/dark.css?raw") + load: () => import("highlight.js/styles/dark.css?raw") }, "default": { name: "Original highlight.js Theme (Light)", - load: () => import("../node_modules/highlight.js/styles/default.css?raw") + load: () => import("highlight.js/styles/default.css?raw") }, "devibeans": { name: "devibeans (Dark)", - load: () => import("../node_modules/highlight.js/styles/devibeans.css?raw") + load: () => import("highlight.js/styles/devibeans.css?raw") }, "docco": { name: "Docco (Light)", - load: () => import("../node_modules/highlight.js/styles/docco.css?raw") + load: () => import("highlight.js/styles/docco.css?raw") }, "far": { name: "FAR (Dark)", - load: () => import("../node_modules/highlight.js/styles/far.css?raw") + load: () => import("highlight.js/styles/far.css?raw") }, "felipec": { name: "FelipeC (Dark)", - load: () => import("../node_modules/highlight.js/styles/felipec.css?raw") + load: () => import("highlight.js/styles/felipec.css?raw") }, "foundation": { name: "Foundation 4 Docs (Light)", - load: () => import("../node_modules/highlight.js/styles/foundation.css?raw") + load: () => import("highlight.js/styles/foundation.css?raw") }, "github-dark-dimmed": { name: "GitHub Dimmed (Dark)", - load: () => import("../node_modules/highlight.js/styles/github-dark-dimmed.css?raw") + load: () => import("highlight.js/styles/github-dark-dimmed.css?raw") }, "github-dark": { name: "GitHub (Dark)", - load: () => import("../node_modules/highlight.js/styles/github-dark.css?raw") + load: () => import("highlight.js/styles/github-dark.css?raw") }, "github": { name: "GitHub (Light)", - load: () => import("../node_modules/highlight.js/styles/github.css?raw") + load: () => import("highlight.js/styles/github.css?raw") }, "gml": { name: "GML (Dark)", - load: () => import("../node_modules/highlight.js/styles/gml.css?raw") + load: () => import("highlight.js/styles/gml.css?raw") }, "googlecode": { name: "Google Code (Light)", - load: () => import("../node_modules/highlight.js/styles/googlecode.css?raw") + load: () => import("highlight.js/styles/googlecode.css?raw") }, "gradient-dark": { name: "Gradient (Dark)", - load: () => import("../node_modules/highlight.js/styles/gradient-dark.css?raw") + load: () => import("highlight.js/styles/gradient-dark.css?raw") }, "gradient-light": { name: "Gradient (Light)", - load: () => import("../node_modules/highlight.js/styles/gradient-light.css?raw") + load: () => import("highlight.js/styles/gradient-light.css?raw") }, "grayscale": { name: "Grayscale (Light)", - load: () => import("../node_modules/highlight.js/styles/grayscale.css?raw") + load: () => import("highlight.js/styles/grayscale.css?raw") }, "hybrid": { name: "hybrid (Dark)", - load: () => import("../node_modules/highlight.js/styles/hybrid.css?raw") + load: () => import("highlight.js/styles/hybrid.css?raw") }, "idea": { name: "Idea (Light)", - load: () => import("../node_modules/highlight.js/styles/idea.css?raw") + load: () => import("highlight.js/styles/idea.css?raw") }, "intellij-light": { name: "IntelliJ (Light)", - load: () => import("../node_modules/highlight.js/styles/intellij-light.css?raw") + load: () => import("highlight.js/styles/intellij-light.css?raw") }, "ir-black": { name: "IR Black (Dark)", - load: () => import("../node_modules/highlight.js/styles/ir-black.css?raw") + load: () => import("highlight.js/styles/ir-black.css?raw") }, "isbl-editor-dark": { name: "ISBL Editor (Dark)", - load: () => import("../node_modules/highlight.js/styles/isbl-editor-dark.css?raw") + load: () => import("highlight.js/styles/isbl-editor-dark.css?raw") }, "isbl-editor-light": { name: "ISBL Editor (Light)", - load: () => import("../node_modules/highlight.js/styles/isbl-editor-light.css?raw") + load: () => import("highlight.js/styles/isbl-editor-light.css?raw") }, "kimbie-dark": { name: "Kimbie (Dark)", - load: () => import("../node_modules/highlight.js/styles/kimbie-dark.css?raw") + load: () => import("highlight.js/styles/kimbie-dark.css?raw") }, "kimbie-light": { name: "Kimbie (Light)", - load: () => import("../node_modules/highlight.js/styles/kimbie-light.css?raw") + load: () => import("highlight.js/styles/kimbie-light.css?raw") }, "lightfair": { name: "Lightfair (Light)", - load: () => import("../node_modules/highlight.js/styles/lightfair.css?raw") + load: () => import("highlight.js/styles/lightfair.css?raw") }, "lioshi": { name: "Lioshi (Dark)", - load: () => import("../node_modules/highlight.js/styles/lioshi.css?raw") + load: () => import("highlight.js/styles/lioshi.css?raw") }, "magula": { name: "Magula (Light)", - load: () => import("../node_modules/highlight.js/styles/magula.css?raw") + load: () => import("highlight.js/styles/magula.css?raw") }, "mono-blue": { name: "Mono Blue (Light)", - load: () => import("../node_modules/highlight.js/styles/mono-blue.css?raw") + load: () => import("highlight.js/styles/mono-blue.css?raw") }, "monokai-sublime": { name: "Monokai Sublime (Dark)", - load: () => import("../node_modules/highlight.js/styles/monokai-sublime.css?raw") + load: () => import("highlight.js/styles/monokai-sublime.css?raw") }, "monokai": { name: "Monokai (Dark)", - load: () => import("../node_modules/highlight.js/styles/monokai.css?raw") + load: () => import("highlight.js/styles/monokai.css?raw") }, "night-owl": { name: "Night Owl (Dark)", - load: () => import("../node_modules/highlight.js/styles/night-owl.css?raw") + load: () => import("highlight.js/styles/night-owl.css?raw") }, "nnfx-dark": { name: "NNFX (Dark)", - load: () => import("../node_modules/highlight.js/styles/nnfx-dark.css?raw") + load: () => import("highlight.js/styles/nnfx-dark.css?raw") }, "nnfx-light": { name: "NNFX (Light)", - load: () => import("../node_modules/highlight.js/styles/nnfx-light.css?raw") + load: () => import("highlight.js/styles/nnfx-light.css?raw") }, "nord": { name: "Nord (Dark)", - load: () => import("../node_modules/highlight.js/styles/nord.css?raw") + load: () => import("highlight.js/styles/nord.css?raw") }, "obsidian": { name: "Obsidian (Dark)", - load: () => import("../node_modules/highlight.js/styles/obsidian.css?raw") + load: () => import("highlight.js/styles/obsidian.css?raw") }, "panda-syntax-dark": { name: "Panda (Dark)", - load: () => import("../node_modules/highlight.js/styles/panda-syntax-dark.css?raw") + load: () => import("highlight.js/styles/panda-syntax-dark.css?raw") }, "panda-syntax-light": { name: "Panda (Light)", - load: () => import("../node_modules/highlight.js/styles/panda-syntax-light.css?raw") + load: () => import("highlight.js/styles/panda-syntax-light.css?raw") }, "paraiso-dark": { name: "Paraiso (Dark)", - load: () => import("../node_modules/highlight.js/styles/paraiso-dark.css?raw") + load: () => import("highlight.js/styles/paraiso-dark.css?raw") }, "paraiso-light": { name: "Paraiso (Light)", - load: () => import("../node_modules/highlight.js/styles/paraiso-light.css?raw") + load: () => import("highlight.js/styles/paraiso-light.css?raw") }, "pojoaque": { name: "Pojoaque (Dark)", - load: () => import("../node_modules/highlight.js/styles/pojoaque.css?raw") + load: () => import("highlight.js/styles/pojoaque.css?raw") }, "purebasic": { name: "PureBasic (Light)", - load: () => import("../node_modules/highlight.js/styles/purebasic.css?raw") + load: () => import("highlight.js/styles/purebasic.css?raw") }, "qtcreator-dark": { name: "Qt Creator (Dark)", - load: () => import("../node_modules/highlight.js/styles/qtcreator-dark.css?raw") + load: () => import("highlight.js/styles/qtcreator-dark.css?raw") }, "qtcreator-light": { name: "Qt Creator (Light)", - load: () => import("../node_modules/highlight.js/styles/qtcreator-light.css?raw") + load: () => import("highlight.js/styles/qtcreator-light.css?raw") }, "rainbow": { name: "Rainbow (Dark)", - load: () => import("../node_modules/highlight.js/styles/rainbow.css?raw") + load: () => import("highlight.js/styles/rainbow.css?raw") }, "routeros": { name: "RouterOS Script (Light)", - load: () => import("../node_modules/highlight.js/styles/routeros.css?raw") + load: () => import("highlight.js/styles/routeros.css?raw") }, "rose-pine-dawn": { name: "Rose Pine Dawn (Light)", - load: () => import("../node_modules/highlight.js/styles/rose-pine-dawn.css?raw") + load: () => import("highlight.js/styles/rose-pine-dawn.css?raw") }, "rose-pine-moon": { name: "Rose Pine Moon (Dark)", - load: () => import("../node_modules/highlight.js/styles/rose-pine-moon.css?raw") + load: () => import("highlight.js/styles/rose-pine-moon.css?raw") }, "rose-pine": { name: "Rose Pine (Dark)", - load: () => import("../node_modules/highlight.js/styles/rose-pine.css?raw") + load: () => import("highlight.js/styles/rose-pine.css?raw") }, "school-book": { name: "School Book (Light)", - load: () => import("../node_modules/highlight.js/styles/school-book.css?raw") + load: () => import("highlight.js/styles/school-book.css?raw") }, "shades-of-purple": { name: "Shades of Purple (Dark)", - load: () => import("../node_modules/highlight.js/styles/shades-of-purple.css?raw") + load: () => import("highlight.js/styles/shades-of-purple.css?raw") }, "srcery": { name: "Srcery (Dark)", - load: () => import("../node_modules/highlight.js/styles/srcery.css?raw") + load: () => import("highlight.js/styles/srcery.css?raw") }, "stackoverflow-dark": { name: "Stack Overflow (Dark)", - load: () => import("../node_modules/highlight.js/styles/stackoverflow-dark.css?raw") + load: () => import("highlight.js/styles/stackoverflow-dark.css?raw") }, "stackoverflow-light": { name: "Stack Overflow (Light)", - load: () => import("../node_modules/highlight.js/styles/stackoverflow-light.css?raw") + load: () => import("highlight.js/styles/stackoverflow-light.css?raw") }, "sunburst": { name: "Sunburst (Dark)", - load: () => import("../node_modules/highlight.js/styles/sunburst.css?raw") + load: () => import("highlight.js/styles/sunburst.css?raw") }, "tokyo-night-dark": { name: "Tokyo Night (Dark)", - load: () => import("../node_modules/highlight.js/styles/tokyo-night-dark.css?raw") + load: () => import("highlight.js/styles/tokyo-night-dark.css?raw") }, "tokyo-night-light": { name: "Tokyo Night (Light)", - load: () => import("../node_modules/highlight.js/styles/tokyo-night-light.css?raw") + load: () => import("highlight.js/styles/tokyo-night-light.css?raw") }, "tomorrow-night-blue": { name: "Tomorrow Night Blue (Dark)", - load: () => import("../node_modules/highlight.js/styles/tomorrow-night-blue.css?raw") + load: () => import("highlight.js/styles/tomorrow-night-blue.css?raw") }, "tomorrow-night-bright": { name: "Tomorrow Night Bright (Dark)", - load: () => import("../node_modules/highlight.js/styles/tomorrow-night-bright.css?raw") + load: () => import("highlight.js/styles/tomorrow-night-bright.css?raw") }, "vs": { name: "Visual Studio (Light)", - load: () => import("../node_modules/highlight.js/styles/vs.css?raw") + load: () => import("highlight.js/styles/vs.css?raw") }, "vs2015": { name: "Visual Studio 2015 (Dark)", - load: () => import("../node_modules/highlight.js/styles/vs2015.css?raw") + load: () => import("highlight.js/styles/vs2015.css?raw") }, "xcode": { name: "Xcode (Light)", - load: () => import("../node_modules/highlight.js/styles/xcode.css?raw") + load: () => import("highlight.js/styles/xcode.css?raw") }, "xt256": { name: "xt256 (Dark)", - load: () => import("../node_modules/highlight.js/styles/xt256.css?raw") + load: () => import("highlight.js/styles/xt256.css?raw") } } diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json index 7c2740589..a521b66aa 100644 --- a/packages/share-theme/package.json +++ b/packages/share-theme/package.json @@ -22,17 +22,14 @@ ], "license": "Apache-2.0", "devDependencies": { - "@digitak/esrun": "^3.2.24", - "@types/swagger-ui": "^5.0.0", - "@typescript-eslint/eslint-plugin": "^8.0.0", - "@typescript-eslint/parser": "^8.0.0", - "dotenv": "^17.0.0", - "esbuild": "^0.25.0", - "eslint": "^9.0.0", - "highlight.js": "^11.8.0", - "typescript": "^5.2.2" - }, - "nx": { - "name": "share-theme" + "@digitak/esrun": "3.2.26", + "@types/swagger-ui": "5.21.1", + "@typescript-eslint/eslint-plugin": "8.46.2", + "@typescript-eslint/parser": "8.46.2", + "dotenv": "17.2.3", + "esbuild": "0.25.11", + "eslint": "9.38.0", + "highlight.js": "11.11.1", + "typescript": "5.9.3" } } diff --git a/packages/share-theme/src/styles/content.css b/packages/share-theme/src/styles/content.css index 00d5f2030..d500888a6 100644 --- a/packages/share-theme/src/styles/content.css +++ b/packages/share-theme/src/styles/content.css @@ -1,8 +1,8 @@ :root { - --ck-content-font-family: inherit; - --ck-content-font-size: inherit; - --ck-content-font-color: inherit; - --ck-content-line-height: inherit; + --ck-content-font-family: inherit !important; + --ck-content-font-size: inherit !important; + --ck-content-font-color: inherit !important; + --ck-content-line-height: inherit !important; } .ck-content code, diff --git a/packages/share-theme/src/templates/page.ejs b/packages/share-theme/src/templates/page.ejs index 5c39051eb..2fd07c8a7 100644 --- a/packages/share-theme/src/templates/page.ejs +++ b/packages/share-theme/src/templates/page.ejs @@ -1,12 +1,36 @@ - <% const hasTree = subRoot.note.hasVisibleChildren(); %> + <% + const hasTree = subRoot.note.hasVisibleChildren(); + + // Collect HTML snippets by location + const htmlSnippetsByLocation = {}; + for (const htmlRelation of note.getRelations("shareHtml")) { + const htmlNote = htmlRelation.targetNote; + if (htmlNote) { + let location = htmlNote.getLabelValue("shareHtmlLocation") || "content:end"; + // Default to :end if no position specified + if (!location.includes(":")) { + location = location + ":end"; + } + if (!htmlSnippetsByLocation[location]) { + htmlSnippetsByLocation[location] = []; + } + htmlSnippetsByLocation[location].push(htmlNote.getContent()); + } + } + const renderSnippets = (location) => { + const snippets = htmlSnippetsByLocation[location]; + return snippets ? snippets.join("\n") : ""; + }; + %> + <%- renderSnippets("head:start") %> api/notes/<%= note.getRelation("shareFavicon").value %>/download<% } else { %>../favicon.ico<% } %>"> - + <% if (!isDev && !note.isLabelTruthy("shareOmitDefaultCss")) { %> @@ -53,6 +77,7 @@ + <%- renderSnippets("head:end") %> <% const customLogoId = subRoot.note.getRelation("shareLogo")?.value; @@ -65,13 +90,14 @@ const currentTheme = note.getLabel("shareTheme") === "light" ? "light" : "dark"; const themeClass = currentTheme === "light" ? " theme-light" : " theme-dark"; const headingRe = /()(.+?)(<\/h[1-6]>)/g; const headingMatches = [...content.matchAll(headingRe)]; -const slugify = (text) => text.toLowerCase().replace(/[^\w]/g, "-"); content = content.replaceAll(headingRe, (...match) => { - match[0] = match[0].replace(match[3], `#${match[3]}`); + const slug = utils.slugify(utils.stripTags(match[2])); + match[0] = match[0].replace(match[3], `#${match[3]}`); return match[0]; }); %> +<%- renderSnippets("body:start") %>
    -
    ck-content<% } %><% if (isEmpty) { %> no-content<% } %>"> + <%- renderSnippets("content:start") %>

    <%= note.title %>

    <% if (isEmpty && (!note.hasVisibleChildren() && note.type !== "book")) { %>

    This note has no content.

    @@ -132,6 +158,7 @@ content = content.replaceAll(headingRe, (...match) => { %> <%- content %> <% } %> + <%- renderSnippets("content:end") %>
    <% if (note.hasVisibleChildren() || note.type === "book") { %> @@ -164,7 +191,7 @@ content = content.replaceAll(headingRe, (...match) => {
    <% } %> - <% if (hasTree) { %> + <% if (hasTree) { %> <%- include("prev_next", { note: note, subRoot: subRoot }) %> <% } %> @@ -205,5 +232,6 @@ content = content.replaceAll(headingRe, (...match) => { <% } %>
    +<%- renderSnippets("body:end") %> diff --git a/packages/share-theme/src/templates/toc_item.ejs b/packages/share-theme/src/templates/toc_item.ejs index b18b4a1a6..4346fe55a 100644 --- a/packages/share-theme/src/templates/toc_item.ejs +++ b/packages/share-theme/src/templates/toc_item.ejs @@ -1,12 +1,11 @@ <% -const slugify = (text) => text.toLowerCase().replace(/[^\w]/g, "-"); -const slug = slugify(entry.name); +const strippedName = utils.stripTags(entry.name); +const slug = utils.slugify(strippedName); %> -
  • - <%= entry.name %> + <%= strippedName %> <% if (entry.children.length) { %> diff --git a/packages/splitjs/LICENSE.txt b/packages/splitjs/LICENSE.txt new file mode 100644 index 000000000..35bcf12a2 --- /dev/null +++ b/packages/splitjs/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2020 Nathan Cahill + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/splitjs/README.md b/packages/splitjs/README.md new file mode 100644 index 000000000..b42f1a928 --- /dev/null +++ b/packages/splitjs/README.md @@ -0,0 +1,602 @@ +

    +Split.js +

    +Build Status +File Size +npm version +Dependencies +Backers on Open Collective +Sponsors on Open Collective +

    + +# Split.js + +> 2kb unopinionated utility for resizeable split views. + +- **Zero Deps** +- **Tiny:** Weights 2kb gzipped. +- **Fast:** No overhead or attached window event listeners, uses pure CSS for resizing. +- **Unopinionated:** Plays nicely with `float`, `flex` and other layouts. +- **Compatible:** Works great in IE9, early Firefox/Chrome/Safari/Opera supported too. + +## Table of Contents + +- [Installation](#installation) +- [Documentation](#documentation) +- [Important Note](#important-note) +- [Options](#options) +- [Examples](#usage-examples) +- [Saving State](#saving-state) +- [Flexbox](#flex-layout) +- [API](#api) +- [CSS](#css) +- [React](#react) +- [Browser Support](#browser-support) +- [Credits](#credits) +- [License](#license) + +## Installation + +Yarn: + +```bash +$ yarn add split.js +``` + +npm: + +```bash +$ npm install --save split.js +``` + +Include with a module bundler like [rollup](http://rollupjs.org/) or [webpack](https://webpack.github.io/): + +```js +// using ES6 modules +import Split from 'split.js' + +// using CommonJS modules +var Split = require('split.js') +``` + +The [UMD](https://github.com/umdjs/umd) build is also available on [unpkg](http://unpkg.com/): + +```html + +``` + +or [cdnjs](https://cdnjs.com/): + +```html + +``` + +You can find the library on `window.Split`. + +## Documentation + +```js +var split = Split( elements, options?) +``` + +| Options | Type | Default | Description | +| -------------- | --------------- | -------------- | -------------------------------------------------------- | +| `sizes` | Array | | Initial sizes of each element in percents or CSS values. | +| `minSize` | Number or Array | `100` | Minimum size of each element. | +| `maxSize` | Number or Array | `Infinity` | Maximum size of each element. | +| `expandToMin` | Boolean | `false` | Grow initial sizes to `minSize` | +| `gutterSize` | Number | `10` | Gutter size in pixels. | +| `gutterAlign` | String | `'center'` | Gutter alignment between elements. | +| `snapOffset` | Number | `30` | Snap to minimum size offset in pixels. | +| `dragInterval` | Number | `1` | Number of pixels to drag. | +| `direction` | String | `'horizontal'` | Direction to split: horizontal or vertical. | +| `cursor` | String | `'col-resize'` | Cursor to display while dragging. | +| `gutter` | Function | | Called to create each gutter element | +| `elementStyle` | Function | | Called to set the style of each element. | +| `gutterStyle` | Function | | Called to set the style of the gutter. | +| `onDrag` | Function | | Callback on drag. | +| `onDragStart` | Function | | Callback on drag start. | +| `onDragEnd` | Function | | Callback on drag end. | + +## Important Note + +Split.js does not set CSS beyond the minimum needed to manage the width or height of the elements. +This is by design. It makes Split.js flexible and useful in many different situations. +If you create a horizontal split, you are responsible for (likely) floating the elements and the gutter, +and setting their heights. See the [CSS](#css) section below. If your gutters are not showing up, check the applied CSS styles. + +**THIS IS THE #1 QUESTION ABOUT THE LIBRARY**. + +## Options + +#### sizes + +An array of initial sizes of the elements, specified as percentage values. Example: Setting the initial sizes to `25%` and `75%`. + +```js +Split(['#one', '#two'], { + sizes: [25, 75], +}) +``` + +#### minSize. Default: `100` + +An array of minimum sizes of the elements, specified as pixel values. Example: Setting the minimum sizes to `100px` and `300px`, respectively. + +```js +Split(['#one', '#two'], { + minSize: [100, 300], +}) +``` + +#### maxSize. Default: `Infinity` + +An array of maximum sizes of the elements, specified as pixel values. Example: Setting the maximum sizes of the first element to `500px`, and not setting a maximum size on the second element. + +```js +Split(['#one', '#two'], { + maxSize: [500, Infinity], +}) +``` + +If a number is passed instead of an array, all elements are set to the same minimum size: + +```js +Split(['#one', '#two'], { + minSize: 100, + maxSize: 500, +}) +``` + +#### expandToMin. Default: `false` + +When the split is created, if `expandToMin` is `true`, the minSize for each element overrides the percentage value from the `sizes` option. +Example: The first element (`#one`) is set to 25% width of the parent container. However, it's `minSize` is `300px`. Using `expandToMin: true` means that +the first element will always load at at least `300px`, even if `25%` were smaller. + +```js +Split(['#one', '#two'], { + sizes: [25, 75], + minSize: [300, 100], + expandToMin: true, +}) +``` + +#### gutterSize. Default: `10` + +Gutter size in pixels. Example: Setting the gutter size to `20px`. + +```js +Split(['#one', '#two'], { + gutterSize: 20, +}) +``` + +#### gutterAlign. Default: `'center'` + +Possible options are `'start'`, `'end'` and `'center'`. Determines how the gutter aligns between the two elements. +`'start'` shrinks the first element to fit the gutter, `'end'` shrinks the second element to fit the gutter and `'center'` shrinks both +elements by the same amount so the gutter sits between. Added in v1.5.3. + +Example: move gutter to the side of the second element: + +```js +Split(['#one', '#two'], { + gutterAlign: 'end', +}) +``` + +#### snapOffset. Default: `30` + +Snap to minimum size at this offset in pixels. Example: Set to `0` to disable to snap effect. + +```js +Split(['#one', '#two'], { + snapOffset: 0, +}) +``` + +#### dragInterval. Default: `1` + +Drag this number of pixels at a time. Defaults to `1` for smooth dragging, but can be set to a pixel value to +give more control over the resulting sizes. Works particularly well when the `gutterSize` is set to the same size. +Added in v1.5.3. Example: Drag 20px at a time: + +```js +Split(['#one', '#two'], { + dragInterval: 20, +}) +``` + +#### direction. Default: `'horizontal'` + +Direction to split in. Can be `'vertical'` or `'horizontal'`. Determines which CSS properties are applied (ie. width/height) to each element and gutter. Example: split vertically: + +```js +Split(['#one', '#two'], { + direction: 'vertical', +}) +``` + +#### cursor. Default: `'col-resize'` + +Cursor to show on the gutter (also applied to the body on dragging to prevent flickering). Defaults to `'col-resize'`for `direction: 'horizontal'` and `'row-resize'` for `direction: 'vertical'`: + +```js +Split(['#one', '#two'], { + direction: 'vertical', + cursor: 'row-resize', +}) +``` + +#### gutter + +Optional function called to create each gutter element. The signature looks like this: + +```js +(index, direction, pairElement) => HTMLElement +``` + +Defaults to creating a `div` with `class="gutter gutter-horizontal"` or `class="gutter gutter-vertical"`, depending on the direction. The default gutter function looks like this: + +```js +(index, direction) => { + const gutter = document.createElement('div') + gutter.className = `gutter gutter-${direction}` + return gutter +} +``` + +The returned element is then inserted into the DOM, and it's width or height are set. This option can be used to clone an existing DOM element, or to create a new element with custom styles. + +Returning a falsey value like `null` or `false` will not insert a gutter. This behavior was added in v1.4.1. +An additional argument, `pairElement`, is passed to the gutter function: this is the DOM element after (to the right or below) the gutter. This argument was added in v1.4.1. + +This final argument makes it easy to return the gutter that has already been created, for example, if `split.destroy()` was called with the option to preserve the gutters. + +```js +(index, direction, pairElement) => pairElement.previousSibling +``` + +#### elementStyle + +Optional function called setting the CSS style of the elements. The signature looks like this: + +```js +(dimension, elementSize, gutterSize, index) => Object +``` + +Dimension will be a string, `'width'` or `'height'`, and can be used in the return style. `elementSize` is the target percentage value of the element, and `gutterSize` is the target pixel value of the gutter. + +It should return an object with CSS properties to apply to the element. For horizontal splits, the return object looks like this: + +```js +{ + 'width': 'calc(50% - 5px)' +} +``` + +A vertical split style would look like this: + +```js +{ + 'height': 'calc(50% - 5px)' +} +``` + +You might use this function if you're using a different layout like flex (see [Flex Layout](#flex-layout)). +Flex styles for a horizontal split could return an object like this: + +```js +{ + 'flex-basis': 'calc(50% - 5px)' +} +``` + +#### gutterStyle + +Optional function called when setting the CSS style of the gutters. The signature looks like this: + +```js +(dimension, gutterSize, index) => Object +``` + +Dimension is a string, either `'width'` or `'height'`, and `gutterSize` is a pixel value representing the width of the gutter. + +It should return a similar object as `elementStyle`, an object with CSS properties to apply to the gutter. Since gutters have fixed widths, it will generally look like this: + +```js +{ + 'width': '10px' +} +``` + +Both `elementStyle` and `gutterStyle` are called continously while dragging, so don't do anything besides return the style object in these functions. Both of these functions should be _pure_, returning the same values for the same inputs and not modifying any external state. + +#### onDrag, onDragStart, onDragEnd + +Callbacks that can be added on drag (fired continously), drag start and drag end. If doing more than basic operations in `onDrag`, add a debounce function to rate limit the callback. + +`onDrag`, `onDragStart` and `onDragEnd` are passed the initial and final sizes of the split since it's a common pattern to access the sizes this way. + +Their function signature looks like this, where `sizes` is an array of percentage values like returned by `getSizes()`: + +```js +sizes => {} +``` + +## Usage Examples + +Reference HTML for examples. Gutters are inserted automatically: + +```html +
    +
    content one
    +
    content two
    +
    content three
    +
    +``` + +A split with two elements, starting at `25%` and `75%` wide, with `200px` minimum width. + +```js +Split(['#one', '#two'], { + sizes: [25, 75], + minSize: 200, +}) +``` + +A split with three elements, starting with even (default) widths and minimum widths set to `100px`, `100px` and `300px`, respectively. + +```js +Split(['#one', '#two', '#three'], { + minSize: [100, 100, 300], +}) +``` + +A vertical split with two elements. + +```js +Split(['#one', '#two'], { + direction: 'vertical', +}) +``` + +## Saving State + +Use local storage to save the most recent state: + +```js +var sizes = localStorage.getItem('split-sizes') + +if (sizes) { + sizes = JSON.parse(sizes) +} else { + sizes = [50, 50] // default sizes +} + +var split = Split(['#one', '#two'], { + sizes: sizes, + onDragEnd: function (sizes) { + localStorage.setItem('split-sizes', JSON.stringify(sizes)) + }, +}) +``` + +## Flex Layout + +Flex layout is supported easily by adding a `display: flex` to the parent element. The `width` or `height` CSS values +assigned by default by Split.js work well with flex. + +```html +
    +
    +
    +
    +``` + +And CSS style like this: + +```css +#flex { + display: flex; + flex-direction: row; +} +``` + +For more complicated flex layouts, the `elementStyle` and `gutterStyle` can be used to set flex-basis: + +```js +Split(['#flex-1', '#flex-2'], { + elementStyle: function (dimension, size, gutterSize) { + return { + 'flex-basis': 'calc(' + size + '% - ' + gutterSize + 'px)', + } + }, + gutterStyle: function (dimension, gutterSize) { + return { + 'flex-basis': gutterSize + 'px', + } + }, +}) +``` + +## API + +Split.js returns an instance with a couple of functions. The instance is returned on creation: + +```js +var instance = Split([], ...) +``` + +#### `.setSizes([])` + +setSizes behaves the same as the `sizes` configuration option, passing an array of percentages. It updates the sizes of the elements in the split. Added in v1.1.0: + +```js +instance.setSizes([25, 75]) +``` + +#### `.getSizes()` + +getSizes returns an array of percents, suitable for using with `setSizes` or creation. Not supported in IE8. Added in v1.1.2: + +```js +instance.getSizes() > [25, 75] +``` + +#### `.collapse(index)` + +collapse changes the size of element at `index` to it's `minSize`. Every element except the last is collapsed towards the front (left or top). The last is collapsed towards the back. Not supported in IE8. Added in v1.1.0: + +```js +instance.collapse(0) +``` + +#### `.destroy(preserveStyles? = false, preserveGutters? = false)` + +Destroy the instance. It removes the gutter elements, and the size CSS styles Split.js set. Added in v1.1.1. +Passing `preserveStyles = true` does not remove the CSS styles. Option added in v1.4.0. +Passing `preserveGutters = true` does not remove the gutter elements. Option added in v1.4.1. + +```js +instance.destroy() +``` + +## CSS + +In being non-opionionated, the only CSS Split.js sets is the widths or heights of the elements. Everything else is left up to you. You must set the elements and gutter heights when using horizontal mode. The gutters will not be visible if their height is 0px. Here's some basic CSS to style the gutters with, although it's not required. Both grip images are included in this repo: + +```css +.gutter { + background-color: #eee; + + background-repeat: no-repeat; + background-position: 50%; +} + +.gutter.gutter-horizontal { + background-image: url('grips/vertical.png'); + cursor: col-resize; +} + +.gutter.gutter-vertical { + background-image: url('grips/horizontal.png'); + cursor: row-resize; +} +``` + +The grip images are small files and can be included with base64 instead: + +```css +.gutter.gutter-vertical { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII='); +} + +.gutter.gutter-horizontal { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg=='); +} +``` + +Split.js also works best when the elements are sized using `border-box`. The `split` class would have to be added manually to apply these styles: + +```css +.split { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +``` + +And for horizontal splits, make sure the layout allows elements (including gutters) to be displayed side-by-side. Floating the elements is one option: + +```css +.split, +.gutter.gutter-horizontal { + float: left; +} +``` + +If you use floats, set the height of the elements including the gutters. The gutters will not be visible otherwise if the height is set to 0px. + +```css +.split, +.gutter.gutter-horizontal { + height: 300px; +} +``` + +Overflow can be handled as well, to get scrolling within the elements: + +```css +.split { + overflow-y: auto; + overflow-x: hidden; +} +``` + +## React + +**[React Split](https://github.com/nathancahill/split/tree/master/packages/react-split)** - Thin wrapper component for Split.js. + +## Browser Support + +This library uses [CSS calc()](https://developer.mozilla.org/en-US/docs/Web/CSS/calc#AutoCompatibilityTable), [CSS box-sizing](https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing#AutoCompatibilityTable) and [JS getBoundingClientRect()](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#AutoCompatibilityTable). These features are supported in the following browsers: + +| Chrome logo | Firefox logo | Internet Explorer logo | Opera logo | Safari logo | [Sauce Labs](https://saucelabs.com) | +| :-------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------- | +| 22+ āœ” | 6+ āœ” | 9+ āœ” | 15+ āœ” | 6.2+ āœ” | Sponsored āœ” | + +Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs](https://saucelabs.com). + +## Credits + +### Contributors + +This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. + + +### Backers + +Thank you to all our backers! šŸ™ [[Become a backer](https://opencollective.com/splitjs#backer)] + + + +### Sponsors + +Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/splitjs#sponsor)] + +[Sauce Labs](https://saucelabs.com) + + + + + + + + + + + + +## License + +Copyright (c) 2019 Nathan Cahill + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/splitjs/grips/horizontal.png b/packages/splitjs/grips/horizontal.png new file mode 100644 index 000000000..cbe7da77d Binary files /dev/null and b/packages/splitjs/grips/horizontal.png differ diff --git a/packages/splitjs/grips/vertical.png b/packages/splitjs/grips/vertical.png new file mode 100644 index 000000000..0ac8fa1e0 Binary files /dev/null and b/packages/splitjs/grips/vertical.png differ diff --git a/packages/splitjs/index.d.ts b/packages/splitjs/index.d.ts new file mode 100644 index 000000000..d4ad55cde --- /dev/null +++ b/packages/splitjs/index.d.ts @@ -0,0 +1,100 @@ +// Type definitions for Split.js +// Project: https://github.com/nathancahill/split/tree/master/packages/splitjs +// Definitions by: Ilia Choly +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.1 + +// Global variable outside module loader +export as namespace Split + +// Module loader +export = Split + +declare function Split( + elements: Array, + options?: Split.Options, +): Split.Instance + +declare namespace Split { + type Partial = { [P in keyof T]?: T[P] } + type CSSStyleDeclarationPartial = Partial + + interface Options { + // Initial sizes of each element in percents or CSS values. + sizes?: number[] + + // Minimum size of each element. + minSize?: number | number[] + + // Maximum size of each element. + maxSize?: number | number[] + + expandToMin?: boolean + + // Gutter size in pixels. + gutterSize?: number + + gutterAlign?: string + + // Snap to minimum size offset in pixels. + snapOffset?: number | number[] + + dragInterval?: number + + // Direction to split: horizontal or vertical. + direction?: 'horizontal' | 'vertical' + + // If the UI is right-to-left. Affects the drag direction. + rtl?: boolean + + // Cursor to display while dragging. + cursor?: string + + // Callback on drag. + onDrag?(sizes: number[]): void + + // Callback on drag start. + onDragStart?(sizes: number[]): void + + // Callback on drag end. + onDragEnd?(sizes: number[]): void + + // Called to create each gutter element + gutter?( + index: number, + direction: 'horizontal' | 'vertical', + ): HTMLElement + + // Called to set the style of each element. + elementStyle?( + dimension: 'width' | 'height', + elementSize: number, + gutterSize: number, + index: number, + ): CSSStyleDeclarationPartial + + // Called to set the style of the gutter. + gutterStyle?( + dimension: 'width' | 'height', + gutterSize: number, + index: number, + ): CSSStyleDeclarationPartial + } + + interface Instance { + // setSizes behaves the same as the sizes configuration option, passing an array of percents or CSS values. + // It updates the sizes of the elements in the split. + setSizes(sizes: number[]): void + + // getSizes returns an array of percents, suitable for using with setSizes or creation. + getSizes(): number[] + + // collapse changes the size of element at index to 0. + // Every element except the last is collapsed towards the front (left or top). + // The last is collapsed towards the back. + collapse(index: number): void + + // Destroy the instance. It removes the gutter elements, and the size CSS styles Split.js set. + destroy(preserveStyles?: boolean, preserveGutters?: boolean): void + } +} diff --git a/packages/splitjs/karma.conf.js b/packages/splitjs/karma.conf.js new file mode 100644 index 000000000..a05a16d5f --- /dev/null +++ b/packages/splitjs/karma.conf.js @@ -0,0 +1,51 @@ +module.exports = config => { + config.set({ + customLaunchers: { + // latest firefox, chrome, safari + sl_firefox_latest: { + base: 'SauceLabs', + browserName: 'firefox', + platform: 'Windows 10', + version: 'latest', + }, + sl_chrome_latest: { + base: 'SauceLabs', + browserName: 'chrome', + platform: 'Windows 10', + version: 'latest', + }, + sl_safari: { + base: 'SauceLabs', + browserName: 'safari', + platform: 'macOS 10.15', + version: 'latest', + }, + + // latest edge + sl_edge: { + base: 'SauceLabs', + browserName: 'MicrosoftEdge', + platform: 'Windows 10', + version: 'latest', + }, + // ie 11 + sl_ie_11: { + base: 'SauceLabs', + browserName: 'internet explorer', + platform: 'Windows 10', + version: 'latest', + }, + // ie 10 + sl_ie_10: { + base: 'SauceLabs', + browserName: 'internet explorer', + platform: 'Windows 7', + version: '10.0', + }, + }, + frameworks: ['jasmine'], + browsers: ['FirefoxHeadless', 'ChromeHeadless'], + singleRun: true, + files: ['dist/split.js', 'test/split.spec.js'], + }) +} diff --git a/packages/splitjs/logo.svg b/packages/splitjs/logo.svg new file mode 100644 index 000000000..f8dc2a4b5 --- /dev/null +++ b/packages/splitjs/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/splitjs/package.json b/packages/splitjs/package.json new file mode 100644 index 000000000..f23cb2282 --- /dev/null +++ b/packages/splitjs/package.json @@ -0,0 +1,48 @@ +{ + "name": "@triliumnext/split.js", + "version": "1.6.5", + "description": "2kb unopinionated utility for resizeable split views", + "main": "src/split.js", + "types": "index.d.ts", + "repository": "https://github.com/nathancahill/split", + "keywords": [ + "css", + "split", + "flexbox", + "tiny", + "split-layout" + ], + "author": "Nathan Cahill ", + "license": "MIT", + "homepage": "https://split.js.org/", + "scripts": { + "test": "pnpm build && karma start", + "prepublish": "rollup -c", + "build": "rollup -c && npm run size", + "watch": "rollup -cw", + "size": "echo \"gzip size: $(gzip-size --raw $npm_package_minified_main) bytes\"", + "saucelabs": "yarn run test --browsers sl_firefox_latest,sl_chrome_latest,sl_safari,sl_edge,sl_ie_11,sl_ie_10" + }, + "files": [ + "index.d.ts", + "dist" + ], + "browserslist": [ + "Chrome >= 22", + "Firefox >= 6", + "Opera >= 15", + "Safari >= 6.2", + "IE >= 9" + ], + "collective": { + "type": "opencollective", + "url": "https://opencollective.com/splitjs" + }, + "devDependencies": { + "@rollup/plugin-buble": "1.0.3", + "karma": "6.4.4", + "karma-chrome-launcher": "3.2.0", + "karma-firefox-launcher": "2.1.3", + "karma-jasmine": "5.1.0" + } +} diff --git a/packages/splitjs/rollup.config.mjs b/packages/splitjs/rollup.config.mjs new file mode 100644 index 000000000..c074e562a --- /dev/null +++ b/packages/splitjs/rollup.config.mjs @@ -0,0 +1,25 @@ +import buble from '@rollup/plugin-buble' +import pkg from "./package.json" with { type: "json" }; + +const output = { + format: 'umd', + file: "dist/split.js", + name: 'Split', + sourcemap: false, + banner: `/*! Split.js - v${pkg.version} */\n` +} + +export default [ + { + input: 'src/split.js', + output: [ + output, + { + file: "dist/split.min.js", + format: 'esm', + sourcemap: false, + }, + ], + plugins: [buble()], + } +] diff --git a/packages/splitjs/src/split.js b/packages/splitjs/src/split.js new file mode 100644 index 000000000..3f8f9dc9c --- /dev/null +++ b/packages/splitjs/src/split.js @@ -0,0 +1,769 @@ +// The programming goals of Split.js are to deliver readable, understandable and +// maintainable code, while at the same time manually optimizing for tiny minified file size, +// browser compatibility without additional requirements +// and very few assumptions about the user's page layout. +const global = typeof window !== 'undefined' ? window : null +const ssr = global === null +const document = !ssr ? global.document : undefined + +// Save a couple long function names that are used frequently. +// This optimization saves around 400 bytes. +const addEventListener = 'addEventListener' +const removeEventListener = 'removeEventListener' +const getBoundingClientRect = 'getBoundingClientRect' +const gutterStartDragging = '_a' +const aGutterSize = '_b' +const bGutterSize = '_c' +const HORIZONTAL = 'horizontal' +const NOOP = () => false + +// Helper function determines which prefixes of CSS calc we need. +// We only need to do this once on startup, when this anonymous function is called. +// +// Tests -webkit, -moz and -o prefixes. Modified from StackOverflow: +// http://stackoverflow.com/questions/16625140/js-feature-detection-to-detect-the-usage-of-webkit-calc-over-calc/16625167#16625167 +const calc = ssr + ? 'calc' + : `${['', '-webkit-', '-moz-', '-o-'] + .filter(prefix => { + const el = document.createElement('div') + el.style.cssText = `width:${prefix}calc(9px)` + + return !!el.style.length + }) + .shift()}calc` + +// Helper function checks if its argument is a string-like type +const isString = v => typeof v === 'string' || v instanceof String + +// Helper function allows elements and string selectors to be used +// interchangeably. In either case an element is returned. This allows us to +// do `Split([elem1, elem2])` as well as `Split(['#id1', '#id2'])`. +const elementOrSelector = el => { + if (isString(el)) { + const ele = document.querySelector(el) + if (!ele) { + throw new Error(`Selector ${el} did not match a DOM element`) + } + return ele + } + + return el +} + +// Helper function gets a property from the properties object, with a default fallback +const getOption = (options, propName, def) => { + const value = options[propName] + if (value !== undefined) { + return value + } + return def +} + +const getGutterSize = (gutterSize, isFirst, isLast, gutterAlign) => { + if (isFirst) { + if (gutterAlign === 'end') { + return 0 + } + if (gutterAlign === 'center') { + return gutterSize / 2 + } + } else if (isLast) { + if (gutterAlign === 'start') { + return 0 + } + if (gutterAlign === 'center') { + return gutterSize / 2 + } + } + + return gutterSize +} + +// Default options +const defaultGutterFn = (i, gutterDirection) => { + const gut = document.createElement('div') + gut.className = `gutter gutter-${gutterDirection}` + return gut +} + +const defaultElementStyleFn = (dim, size, gutSize) => { + const style = {} + + if (!isString(size)) { + style[dim] = `${calc}(${size}% - ${gutSize}px)` + } else { + style[dim] = size + } + + return style +} + +const defaultGutterStyleFn = (dim, gutSize) => ({ [dim]: `${gutSize}px` }) + +// The main function to initialize a split. Split.js thinks about each pair +// of elements as an independant pair. Dragging the gutter between two elements +// only changes the dimensions of elements in that pair. This is key to understanding +// how the following functions operate, since each function is bound to a pair. +// +// A pair object is shaped like this: +// +// { +// a: DOM element, +// b: DOM element, +// aMin: Number, +// bMin: Number, +// dragging: Boolean, +// parent: DOM element, +// direction: 'horizontal' | 'vertical' +// } +// +// The basic sequence: +// +// 1. Set defaults to something sane. `options` doesn't have to be passed at all. +// 2. Initialize a bunch of strings based on the direction we're splitting. +// A lot of the behavior in the rest of the library is paramatized down to +// rely on CSS strings and classes. +// 3. Define the dragging helper functions, and a few helpers to go with them. +// 4. Loop through the elements while pairing them off. Every pair gets an +// `pair` object and a gutter. +// 5. Actually size the pair elements, insert gutters and attach event listeners. +const Split = (idsOption, options = {}) => { + if (ssr) return {} + + let ids = idsOption + let dimension + let clientAxis + let position + let positionEnd + let clientSize + let elements + + // Allow HTMLCollection to be used as an argument when supported + if (Array.from) { + ids = Array.from(ids) + } + + // All DOM elements in the split should have a common parent. We can grab + // the first elements parent and hope users read the docs because the + // behavior will be whacky otherwise. + const firstElement = elementOrSelector(ids[0]) + const parent = firstElement.parentNode + const parentStyle = getComputedStyle ? getComputedStyle(parent) : null + const parentFlexDirection = parentStyle ? parentStyle.flexDirection : null + + // Set default options.sizes to equal percentages of the parent element. + let sizes = getOption(options, 'sizes') || ids.map(() => 100 / ids.length) + + // Standardize minSize and maxSize to an array if it isn't already. + // This allows minSize and maxSize to be passed as a number. + const minSize = getOption(options, 'minSize', 100) + const minSizes = Array.isArray(minSize) ? minSize : ids.map(() => minSize) + const maxSize = getOption(options, 'maxSize', Infinity) + const maxSizes = Array.isArray(maxSize) ? maxSize : ids.map(() => maxSize) + + // Get other options + const expandToMin = getOption(options, 'expandToMin', false) + const gutterSize = getOption(options, 'gutterSize', 10) + const gutterAlign = getOption(options, 'gutterAlign', 'center') + const snapOffset = getOption(options, 'snapOffset', 30) + const snapOffsets = Array.isArray(snapOffset) ? snapOffset : ids.map(() => snapOffset) + const dragInterval = getOption(options, 'dragInterval', 1) + const direction = getOption(options, 'direction', HORIZONTAL) + const cursor = getOption( + options, + 'cursor', + direction === HORIZONTAL ? 'col-resize' : 'row-resize', + ) + const gutter = getOption(options, 'gutter', defaultGutterFn) + const elementStyle = getOption( + options, + 'elementStyle', + defaultElementStyleFn, + ) + const gutterStyle = getOption(options, 'gutterStyle', defaultGutterStyleFn) + const rtl = getOption(options, 'rtl', false) + + // 2. Initialize a bunch of strings based on the direction we're splitting. + // A lot of the behavior in the rest of the library is paramatized down to + // rely on CSS strings and classes. + if (direction === HORIZONTAL) { + dimension = 'width' + clientAxis = 'clientX' + position = 'left' + positionEnd = 'right' + clientSize = 'clientWidth' + } else if (direction === 'vertical') { + dimension = 'height' + clientAxis = 'clientY' + position = 'top' + positionEnd = 'bottom' + clientSize = 'clientHeight' + } + + // 3. Define the dragging helper functions, and a few helpers to go with them. + // Each helper is bound to a pair object that contains its metadata. This + // also makes it easy to store references to listeners that that will be + // added and removed. + // + // Even though there are no other functions contained in them, aliasing + // this to self saves 50 bytes or so since it's used so frequently. + // + // The pair object saves metadata like dragging state, position and + // event listener references. + + function setElementSize(el, size, gutSize, i) { + // Split.js allows setting sizes via numbers (ideally), or if you must, + // by string, like '300px'. This is less than ideal, because it breaks + // the fluid layout that `calc(% - px)` provides. You're on your own if you do that, + // make sure you calculate the gutter size by hand. + const style = elementStyle(dimension, size, gutSize, i) + + Object.keys(style).forEach(prop => { + // eslint-disable-next-line no-param-reassign + el.style[prop] = style[prop] + }) + } + + function setGutterSize(gutterElement, gutSize, i) { + const style = gutterStyle(dimension, gutSize, i) + + Object.keys(style).forEach(prop => { + // eslint-disable-next-line no-param-reassign + gutterElement.style[prop] = style[prop] + }) + } + + function getSizes() { + return elements.map(element => element.size) + } + + // Supports touch events, but not multitouch, so only the first + // finger `touches[0]` is counted. + function getMousePosition(e) { + if ('touches' in e) return e.touches[0][clientAxis] + return e[clientAxis] + } + + // Actually adjust the size of elements `a` and `b` to `offset` while dragging. + // calc is used to allow calc(percentage + gutterpx) on the whole split instance, + // which allows the viewport to be resized without additional logic. + // Element a's size is the same as offset. b's size is total size - a size. + // Both sizes are calculated from the initial parent percentage, + // then the gutter size is subtracted. + function adjust(offset) { + const a = elements[this.a] + const b = elements[this.b] + const percentage = a.size + b.size + + a.size = (offset / this.size) * percentage + b.size = percentage - (offset / this.size) * percentage + + setElementSize(a.element, a.size, this[aGutterSize], a.i) + setElementSize(b.element, b.size, this[bGutterSize], b.i) + } + + // drag, where all the magic happens. The logic is really quite simple: + // + // 1. Ignore if the pair is not dragging. + // 2. Get the offset of the event. + // 3. Snap offset to min if within snappable range (within min + snapOffset). + // 4. Actually adjust each element in the pair to offset. + // + // --------------------------------------------------------------------- + // | | <- a.minSize || b.minSize -> | | + // | | | <- this.snapOffset || this.snapOffset -> | | | + // | | | || | | | + // | | | || | | | + // --------------------------------------------------------------------- + // | <- this.start this.size -> | + function drag(e) { + let offset + const a = elements[this.a] + const b = elements[this.b] + + if (!this.dragging) return + + // Get the offset of the event from the first side of the + // pair `this.start`. Then offset by the initial position of the + // mouse compared to the gutter size. + offset = + getMousePosition(e) - + this.start + + (this[aGutterSize] - this.dragOffset) + + if (dragInterval > 1) { + offset = Math.round(offset / dragInterval) * dragInterval + } + + // If within snapOffset of min or max, set offset to min or max. + // snapOffset buffers a.minSize and b.minSize, so logic is opposite for both. + // Include the appropriate gutter sizes to prevent overflows. + if (offset <= a.minSize + a.snapOffset + this[aGutterSize]) { + offset = a.minSize + this[aGutterSize] + } else if ( + offset >= + this.size - (b.minSize + b.snapOffset + this[bGutterSize]) + ) { + offset = this.size - (b.minSize + this[bGutterSize]) + } + + if (offset >= a.maxSize - a.snapOffset + this[aGutterSize]) { + offset = a.maxSize + this[aGutterSize] + } else if ( + offset <= + this.size - (b.maxSize - b.snapOffset + this[bGutterSize]) + ) { + offset = this.size - (b.maxSize + this[bGutterSize]) + } + + // Actually adjust the size. + adjust.call(this, offset) + + // Call the drag callback continously. Don't do anything too intensive + // in this callback. + getOption(options, 'onDrag', NOOP)(getSizes()) + } + + // Cache some important sizes when drag starts, so we don't have to do that + // continously: + // + // `size`: The total size of the pair. First + second + first gutter + second gutter. + // `start`: The leading side of the first element. + // + // ------------------------------------------------ + // | aGutterSize -> ||| | + // | ||| | + // | ||| | + // | ||| <- bGutterSize | + // ------------------------------------------------ + // | <- start size -> | + function calculateSizes() { + // Figure out the parent size minus padding. + const a = elements[this.a].element + const b = elements[this.b].element + + const aBounds = a[getBoundingClientRect]() + const bBounds = b[getBoundingClientRect]() + + this.size = + aBounds[dimension] + + bBounds[dimension] + + this[aGutterSize] + + this[bGutterSize] + this.start = aBounds[position] + this.end = aBounds[positionEnd] + } + + function innerSize(element) { + // Return nothing if getComputedStyle is not supported (< IE9) + // Or if parent element has no layout yet + if (!getComputedStyle) return null + + const computedStyle = getComputedStyle(element) + + if (!computedStyle) return null + + let size = element[clientSize] + + if (size === 0) return null + + if (direction === HORIZONTAL) { + size -= + parseFloat(computedStyle.paddingLeft) + + parseFloat(computedStyle.paddingRight) + } else { + size -= + parseFloat(computedStyle.paddingTop) + + parseFloat(computedStyle.paddingBottom) + } + + return size + } + + // When specifying percentage sizes that are less than the computed + // size of the element minus the gutter, the lesser percentages must be increased + // (and decreased from the other elements) to make space for the pixels + // subtracted by the gutters. + function trimToMin(sizesToTrim) { + // Try to get inner size of parent element. + // If it's no supported, return original sizes. + const parentSize = innerSize(parent) + if (parentSize === null) { + return sizesToTrim + } + + if (minSizes.reduce((a, b) => a + b, 0) > parentSize) { + return sizesToTrim + } + + // Keep track of the excess pixels, the amount of pixels over the desired percentage + // Also keep track of the elements with pixels to spare, to decrease after if needed + let excessPixels = 0 + const toSpare = [] + + const pixelSizes = sizesToTrim.map((size, i) => { + // Convert requested percentages to pixel sizes + const pixelSize = (parentSize * size) / 100 + const elementGutterSize = getGutterSize( + gutterSize, + i === 0, + i === sizesToTrim.length - 1, + gutterAlign, + ) + const elementMinSize = minSizes[i] + elementGutterSize + + // If element is too smal, increase excess pixels by the difference + // and mark that it has no pixels to spare + if (pixelSize < elementMinSize) { + excessPixels += elementMinSize - pixelSize + toSpare.push(0) + return elementMinSize + } + + // Otherwise, mark the pixels it has to spare and return it's original size + toSpare.push(pixelSize - elementMinSize) + return pixelSize + }) + + // If nothing was adjusted, return the original sizes + if (excessPixels === 0) { + return sizesToTrim + } + + return pixelSizes.map((pixelSize, i) => { + let newPixelSize = pixelSize + + // While there's still pixels to take, and there's enough pixels to spare, + // take as many as possible up to the total excess pixels + if (excessPixels > 0 && toSpare[i] - excessPixels > 0) { + const takenPixels = Math.min( + excessPixels, + toSpare[i] - excessPixels, + ) + + // Subtract the amount taken for the next iteration + excessPixels -= takenPixels + newPixelSize = pixelSize - takenPixels + } + + // Return the pixel size adjusted as a percentage + return (newPixelSize / parentSize) * 100 + }) + } + + // stopDragging is very similar to startDragging in reverse. + function stopDragging() { + const self = this + const a = elements[self.a].element + const b = elements[self.b].element + + if (self.dragging) { + getOption(options, 'onDragEnd', NOOP)(getSizes()) + } + + self.dragging = false + + // Remove the stored event listeners. This is why we store them. + global[removeEventListener]('mouseup', self.stop) + global[removeEventListener]('touchend', self.stop) + global[removeEventListener]('touchcancel', self.stop) + global[removeEventListener]('mousemove', self.move) + global[removeEventListener]('touchmove', self.move) + + // Clear bound function references + self.stop = null + self.move = null + + a[removeEventListener]('selectstart', NOOP) + a[removeEventListener]('dragstart', NOOP) + b[removeEventListener]('selectstart', NOOP) + b[removeEventListener]('dragstart', NOOP) + + a.style.userSelect = '' + a.style.webkitUserSelect = '' + a.style.MozUserSelect = '' + a.style.pointerEvents = '' + + b.style.userSelect = '' + b.style.webkitUserSelect = '' + b.style.MozUserSelect = '' + b.style.pointerEvents = '' + + self.gutter.style.cursor = '' + self.parent.style.cursor = '' + document.body.style.cursor = '' + } + + // startDragging calls `calculateSizes` to store the inital size in the pair object. + // It also adds event listeners for mouse/touch events, + // and prevents selection while dragging so avoid the selecting text. + function startDragging(e) { + // Right-clicking can't start dragging. + if ('button' in e && e.button !== 0) { + return + } + + // Alias frequently used variables to save space. 200 bytes. + const self = this + const a = elements[self.a].element + const b = elements[self.b].element + + // Call the onDragStart callback. + if (!self.dragging) { + getOption(options, 'onDragStart', NOOP)(getSizes()) + } + + // Don't actually drag the element. We emulate that in the drag function. + e.preventDefault() + + // Set the dragging property of the pair object. + self.dragging = true + + // Create two event listeners bound to the same pair object and store + // them in the pair object. + self.move = drag.bind(self) + self.stop = stopDragging.bind(self) + + // All the binding. `window` gets the stop events in case we drag out of the elements. + global[addEventListener]('mouseup', self.stop) + global[addEventListener]('touchend', self.stop) + global[addEventListener]('touchcancel', self.stop) + global[addEventListener]('mousemove', self.move) + global[addEventListener]('touchmove', self.move) + + // Disable selection. Disable! + a[addEventListener]('selectstart', NOOP) + a[addEventListener]('dragstart', NOOP) + b[addEventListener]('selectstart', NOOP) + b[addEventListener]('dragstart', NOOP) + + a.style.userSelect = 'none' + a.style.webkitUserSelect = 'none' + a.style.MozUserSelect = 'none' + a.style.pointerEvents = 'none' + + b.style.userSelect = 'none' + b.style.webkitUserSelect = 'none' + b.style.MozUserSelect = 'none' + b.style.pointerEvents = 'none' + + // Set the cursor at multiple levels + self.gutter.style.cursor = cursor + self.parent.style.cursor = cursor + document.body.style.cursor = cursor + + // Cache the initial sizes of the pair. + calculateSizes.call(self) + + // Determine the position of the mouse compared to the gutter + self.dragOffset = getMousePosition(e) - self.end + } + + // adjust sizes to ensure percentage is within min size and gutter. + sizes = trimToMin(sizes) + + // 5. Create pair and element objects. Each pair has an index reference to + // elements `a` and `b` of the pair (first and second elements). + // Loop through the elements while pairing them off. Every pair gets a + // `pair` object and a gutter. + // + // Basic logic: + // + // - Starting with the second element `i > 0`, create `pair` objects with + // `a = i - 1` and `b = i` + // - Set gutter sizes based on the _pair_ being first/last. The first and last + // pair have gutterSize / 2, since they only have one half gutter, and not two. + // - Create gutter elements and add event listeners. + // - Set the size of the elements, minus the gutter sizes. + // + // ----------------------------------------------------------------------- + // | i=0 | i=1 | i=2 | i=3 | + // | | | | | + // | pair 0 pair 1 pair 2 | + // | | | | | + // ----------------------------------------------------------------------- + const pairs = [] + elements = ids.map((id, i) => { + // Create the element object. + const element = { + element: elementOrSelector(id), + size: sizes[i], + minSize: minSizes[i], + maxSize: maxSizes[i], + snapOffset: snapOffsets[i], + i, + } + + let pair + + if (i > 0) { + // Create the pair object with its metadata. + pair = { + a: i - 1, + b: i, + dragging: false, + direction, + parent, + } + + pair[aGutterSize] = getGutterSize( + gutterSize, + i - 1 === 0, + false, + gutterAlign, + ) + pair[bGutterSize] = getGutterSize( + gutterSize, + false, + i === ids.length - 1, + gutterAlign, + ) + + // if the parent has a reverse flex-direction, switch the pair elements. + if ( + (direction === HORIZONTAL && rtl) || + parentFlexDirection === 'row-reverse' || + parentFlexDirection === 'column-reverse' + ) { + const temp = pair.a + pair.a = pair.b + pair.b = temp + } + } + + // Determine the size of the current element. IE8 is supported by + // staticly assigning sizes without draggable gutters. Assigns a string + // to `size`. + // + // Create gutter elements for each pair. + if (i > 0) { + const gutterElement = gutter(i, direction, element.element) + setGutterSize(gutterElement, gutterSize, i) + + // Save bound event listener for removal later + pair[gutterStartDragging] = startDragging.bind(pair) + + // Attach bound event listener + gutterElement[addEventListener]( + 'mousedown', + pair[gutterStartDragging], + ) + gutterElement[addEventListener]( + 'touchstart', + pair[gutterStartDragging], + ) + + parent.insertBefore(gutterElement, element.element) + + pair.gutter = gutterElement + } + + setElementSize( + element.element, + element.size, + getGutterSize( + gutterSize, + i === 0, + i === ids.length - 1, + gutterAlign, + ), + i, + ) + + // After the first iteration, and we have a pair object, append it to the + // list of pairs. + if (i > 0) { + pairs.push(pair) + } + + return element + }) + + function adjustToMin(element) { + const isLast = element.i === pairs.length + const pair = isLast ? pairs[element.i - 1] : pairs[element.i] + + calculateSizes.call(pair) + + const size = isLast + ? pair.size - element.minSize - pair[bGutterSize] + : element.minSize + pair[aGutterSize] + + adjust.call(pair, size) + } + + elements.forEach(element => { + const computedSize = element.element[getBoundingClientRect]()[dimension] + + if (computedSize < element.minSize) { + if (expandToMin) { + adjustToMin(element) + } else { + // eslint-disable-next-line no-param-reassign + element.minSize = computedSize + } + } + }) + + function setSizes(newSizes) { + const trimmed = trimToMin(newSizes) + trimmed.forEach((newSize, i) => { + if (i > 0) { + const pair = pairs[i - 1] + + const a = elements[pair.a] + const b = elements[pair.b] + + a.size = trimmed[i - 1] + b.size = newSize + + setElementSize(a.element, a.size, pair[aGutterSize], a.i) + setElementSize(b.element, b.size, pair[bGutterSize], b.i) + } + }) + } + + function destroy(preserveStyles, preserveGutter) { + pairs.forEach(pair => { + if (preserveGutter !== true) { + pair.parent.removeChild(pair.gutter) + } else { + pair.gutter[removeEventListener]( + 'mousedown', + pair[gutterStartDragging], + ) + pair.gutter[removeEventListener]( + 'touchstart', + pair[gutterStartDragging], + ) + } + + if (preserveStyles !== true) { + const style = elementStyle( + dimension, + pair.a.size, + pair[aGutterSize], + ) + + Object.keys(style).forEach(prop => { + elements[pair.a].element.style[prop] = '' + elements[pair.b].element.style[prop] = '' + }) + } + }) + } + + return { + setSizes, + getSizes, + collapse(i) { + adjustToMin(elements[i]) + }, + destroy, + parent, + pairs, + } +} + +export default Split diff --git a/packages/splitjs/test/SpecRunner.html b/packages/splitjs/test/SpecRunner.html new file mode 100644 index 000000000..0f9dabe69 --- /dev/null +++ b/packages/splitjs/test/SpecRunner.html @@ -0,0 +1,20 @@ + + + + + Jasmine Spec Runner v3.5.0 + + + + + + + + + + + + + + + diff --git a/packages/splitjs/test/lib/jasmine-3.5.0/boot.js b/packages/splitjs/test/lib/jasmine-3.5.0/boot.js new file mode 100644 index 000000000..2d6846289 --- /dev/null +++ b/packages/splitjs/test/lib/jasmine-3.5.0/boot.js @@ -0,0 +1,136 @@ +/** + Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js` and `jasmine_html.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. + + If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms. + + The location of `boot.js` can be specified and/or overridden in `jasmine.yml`. + + [jasmine-gem]: http://github.com/pivotal/jasmine-gem + */ + +(function() { + + /** + * ## Require & Instantiate + * + * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference. + */ + window.jasmine = jasmineRequire.core(jasmineRequire); + + /** + * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference. + */ + jasmineRequire.html(jasmine); + + /** + * Create the Jasmine environment. This is used to run all specs in a project. + */ + var env = jasmine.getEnv(); + + /** + * ## The Global Interface + * + * Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged. + */ + var jasmineInterface = jasmineRequire.interface(jasmine, env); + + /** + * Add all of the Jasmine global/public interface to the global scope, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. + */ + extend(window, jasmineInterface); + + /** + * ## Runner Parameters + * + * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. + */ + + var queryString = new jasmine.QueryString({ + getWindowLocation: function() { return window.location; } + }); + + var filterSpecs = !!queryString.getParam("spec"); + + var config = { + failFast: queryString.getParam("failFast"), + oneFailurePerSpec: queryString.getParam("oneFailurePerSpec"), + hideDisabled: queryString.getParam("hideDisabled") + }; + + var random = queryString.getParam("random"); + + if (random !== undefined && random !== "") { + config.random = random; + } + + var seed = queryString.getParam("seed"); + if (seed) { + config.seed = seed; + } + + /** + * ## Reporters + * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any). + */ + var htmlReporter = new jasmine.HtmlReporter({ + env: env, + navigateWithNewParam: function(key, value) { return queryString.navigateWithNewParam(key, value); }, + addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); }, + getContainer: function() { return document.body; }, + createElement: function() { return document.createElement.apply(document, arguments); }, + createTextNode: function() { return document.createTextNode.apply(document, arguments); }, + timer: new jasmine.Timer(), + filterSpecs: filterSpecs + }); + + /** + * The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript. + */ + env.addReporter(jasmineInterface.jsApiReporter); + env.addReporter(htmlReporter); + + /** + * Filter which specs will be run by matching the start of the full name against the `spec` query param. + */ + var specFilter = new jasmine.HtmlSpecFilter({ + filterString: function() { return queryString.getParam("spec"); } + }); + + config.specFilter = function(spec) { + return specFilter.matches(spec.getFullName()); + }; + + env.configure(config); + + /** + * Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack. + */ + window.setTimeout = window.setTimeout; + window.setInterval = window.setInterval; + window.clearTimeout = window.clearTimeout; + window.clearInterval = window.clearInterval; + + /** + * ## Execution + * + * Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded. + */ + var currentWindowOnload = window.onload; + + window.onload = function() { + if (currentWindowOnload) { + currentWindowOnload(); + } + htmlReporter.initialize(); + env.execute(); + }; + + /** + * Helper function for readability above. + */ + function extend(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; + } + +}()); diff --git a/packages/splitjs/test/lib/jasmine-3.5.0/jasmine-html.js b/packages/splitjs/test/lib/jasmine-3.5.0/jasmine-html.js new file mode 100644 index 000000000..aecf2f1b6 --- /dev/null +++ b/packages/splitjs/test/lib/jasmine-3.5.0/jasmine-html.js @@ -0,0 +1,817 @@ +/* +Copyright (c) 2008-2019 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +jasmineRequire.html = function(j$) { + j$.ResultsNode = jasmineRequire.ResultsNode(); + j$.HtmlReporter = jasmineRequire.HtmlReporter(j$); + j$.QueryString = jasmineRequire.QueryString(); + j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); +}; + +jasmineRequire.HtmlReporter = function(j$) { + function ResultsStateBuilder() { + this.topResults = new j$.ResultsNode({}, '', null); + this.currentParent = this.topResults; + this.specsExecuted = 0; + this.failureCount = 0; + this.pendingSpecCount = 0; + } + + ResultsStateBuilder.prototype.suiteStarted = function(result) { + this.currentParent.addChild(result, 'suite'); + this.currentParent = this.currentParent.last(); + }; + + ResultsStateBuilder.prototype.suiteDone = function(result) { + this.currentParent.updateResult(result); + if (this.currentParent !== this.topResults) { + this.currentParent = this.currentParent.parent; + } + + if (result.status === 'failed') { + this.failureCount++; + } + }; + + ResultsStateBuilder.prototype.specStarted = function(result) {}; + + ResultsStateBuilder.prototype.specDone = function(result) { + this.currentParent.addChild(result, 'spec'); + + if (result.status !== 'excluded') { + this.specsExecuted++; + } + + if (result.status === 'failed') { + this.failureCount++; + } + + if (result.status == 'pending') { + this.pendingSpecCount++; + } + }; + + function HtmlReporter(options) { + var config = function() { + return (options.env && options.env.configuration()) || {}; + }, + getContainer = options.getContainer, + createElement = options.createElement, + createTextNode = options.createTextNode, + navigateWithNewParam = options.navigateWithNewParam || function() {}, + addToExistingQueryString = + options.addToExistingQueryString || defaultQueryString, + filterSpecs = options.filterSpecs, + htmlReporterMain, + symbols, + deprecationWarnings = []; + + this.initialize = function() { + clearPrior(); + htmlReporterMain = createDom( + 'div', + { className: 'jasmine_html-reporter' }, + createDom( + 'div', + { className: 'jasmine-banner' }, + createDom('a', { + className: 'jasmine-title', + href: 'http://jasmine.github.io/', + target: '_blank' + }), + createDom('span', { className: 'jasmine-version' }, j$.version) + ), + createDom('ul', { className: 'jasmine-symbol-summary' }), + createDom('div', { className: 'jasmine-alert' }), + createDom( + 'div', + { className: 'jasmine-results' }, + createDom('div', { className: 'jasmine-failures' }) + ) + ); + getContainer().appendChild(htmlReporterMain); + }; + + var totalSpecsDefined; + this.jasmineStarted = function(options) { + totalSpecsDefined = options.totalSpecsDefined || 0; + }; + + var summary = createDom('div', { className: 'jasmine-summary' }); + + var stateBuilder = new ResultsStateBuilder(); + + this.suiteStarted = function(result) { + stateBuilder.suiteStarted(result); + }; + + this.suiteDone = function(result) { + stateBuilder.suiteDone(result); + + if (result.status === 'failed') { + failures.push(failureDom(result)); + } + addDeprecationWarnings(result); + }; + + this.specStarted = function(result) { + stateBuilder.specStarted(result); + }; + + var failures = []; + this.specDone = function(result) { + stateBuilder.specDone(result); + + if (noExpectations(result)) { + var noSpecMsg = "Spec '" + result.fullName + "' has no expectations."; + if (result.status === 'failed') { + console.error(noSpecMsg); + } else { + console.warn(noSpecMsg); + } + } + + if (!symbols) { + symbols = find('.jasmine-symbol-summary'); + } + + symbols.appendChild( + createDom('li', { + className: this.displaySpecInCorrectFormat(result), + id: 'spec_' + result.id, + title: result.fullName + }) + ); + + if (result.status === 'failed') { + failures.push(failureDom(result)); + } + + addDeprecationWarnings(result); + }; + + this.displaySpecInCorrectFormat = function(result) { + return noExpectations(result) && result.status === 'passed' + ? 'jasmine-empty' + : this.resultStatus(result.status); + }; + + this.resultStatus = function(status) { + if (status === 'excluded') { + return config().hideDisabled + ? 'jasmine-excluded-no-display' + : 'jasmine-excluded'; + } + return 'jasmine-' + status; + }; + + this.jasmineDone = function(doneResult) { + var banner = find('.jasmine-banner'); + var alert = find('.jasmine-alert'); + var order = doneResult && doneResult.order; + var i; + alert.appendChild( + createDom( + 'span', + { className: 'jasmine-duration' }, + 'finished in ' + doneResult.totalTime / 1000 + 's' + ) + ); + + banner.appendChild(optionsMenu(config())); + + if (stateBuilder.specsExecuted < totalSpecsDefined) { + var skippedMessage = + 'Ran ' + + stateBuilder.specsExecuted + + ' of ' + + totalSpecsDefined + + ' specs - run all'; + var skippedLink = addToExistingQueryString('spec', ''); + alert.appendChild( + createDom( + 'span', + { className: 'jasmine-bar jasmine-skipped' }, + createDom( + 'a', + { href: skippedLink, title: 'Run all specs' }, + skippedMessage + ) + ) + ); + } + var statusBarMessage = ''; + var statusBarClassName = 'jasmine-overall-result jasmine-bar '; + var globalFailures = (doneResult && doneResult.failedExpectations) || []; + var failed = stateBuilder.failureCount + globalFailures.length > 0; + + if (totalSpecsDefined > 0 || failed) { + statusBarMessage += + pluralize('spec', stateBuilder.specsExecuted) + + ', ' + + pluralize('failure', stateBuilder.failureCount); + if (stateBuilder.pendingSpecCount) { + statusBarMessage += + ', ' + pluralize('pending spec', stateBuilder.pendingSpecCount); + } + } + + if (doneResult.overallStatus === 'passed') { + statusBarClassName += ' jasmine-passed '; + } else if (doneResult.overallStatus === 'incomplete') { + statusBarClassName += ' jasmine-incomplete '; + statusBarMessage = + 'Incomplete: ' + + doneResult.incompleteReason + + ', ' + + statusBarMessage; + } else { + statusBarClassName += ' jasmine-failed '; + } + + var seedBar; + if (order && order.random) { + seedBar = createDom( + 'span', + { className: 'jasmine-seed-bar' }, + ', randomized with seed ', + createDom( + 'a', + { + title: 'randomized with seed ' + order.seed, + href: seedHref(order.seed) + }, + order.seed + ) + ); + } + + alert.appendChild( + createDom( + 'span', + { className: statusBarClassName }, + statusBarMessage, + seedBar + ) + ); + + var errorBarClassName = 'jasmine-bar jasmine-errored'; + var afterAllMessagePrefix = 'AfterAll '; + + for (i = 0; i < globalFailures.length; i++) { + alert.appendChild( + createDom( + 'span', + { className: errorBarClassName }, + globalFailureMessage(globalFailures[i]) + ) + ); + } + + function globalFailureMessage(failure) { + if (failure.globalErrorType === 'load') { + var prefix = 'Error during loading: ' + failure.message; + + if (failure.filename) { + return ( + prefix + ' in ' + failure.filename + ' line ' + failure.lineno + ); + } else { + return prefix; + } + } else { + return afterAllMessagePrefix + failure.message; + } + } + + addDeprecationWarnings(doneResult); + + var warningBarClassName = 'jasmine-bar jasmine-warning'; + for (i = 0; i < deprecationWarnings.length; i++) { + var warning = deprecationWarnings[i]; + alert.appendChild( + createDom( + 'span', + { className: warningBarClassName }, + 'DEPRECATION: ' + warning + ) + ); + } + + var results = find('.jasmine-results'); + results.appendChild(summary); + + summaryList(stateBuilder.topResults, summary); + + if (failures.length) { + alert.appendChild( + createDom( + 'span', + { className: 'jasmine-menu jasmine-bar jasmine-spec-list' }, + createDom('span', {}, 'Spec List | '), + createDom( + 'a', + { className: 'jasmine-failures-menu', href: '#' }, + 'Failures' + ) + ) + ); + alert.appendChild( + createDom( + 'span', + { className: 'jasmine-menu jasmine-bar jasmine-failure-list' }, + createDom( + 'a', + { className: 'jasmine-spec-list-menu', href: '#' }, + 'Spec List' + ), + createDom('span', {}, ' | Failures ') + ) + ); + + find('.jasmine-failures-menu').onclick = function() { + setMenuModeTo('jasmine-failure-list'); + }; + find('.jasmine-spec-list-menu').onclick = function() { + setMenuModeTo('jasmine-spec-list'); + }; + + setMenuModeTo('jasmine-failure-list'); + + var failureNode = find('.jasmine-failures'); + for (i = 0; i < failures.length; i++) { + failureNode.appendChild(failures[i]); + } + } + }; + + return this; + + function failureDom(result) { + var failure = createDom( + 'div', + { className: 'jasmine-spec-detail jasmine-failed' }, + failureDescription(result, stateBuilder.currentParent), + createDom('div', { className: 'jasmine-messages' }) + ); + var messages = failure.childNodes[1]; + + for (var i = 0; i < result.failedExpectations.length; i++) { + var expectation = result.failedExpectations[i]; + messages.appendChild( + createDom( + 'div', + { className: 'jasmine-result-message' }, + expectation.message + ) + ); + messages.appendChild( + createDom( + 'div', + { className: 'jasmine-stack-trace' }, + expectation.stack + ) + ); + } + + if (result.failedExpectations.length === 0) { + messages.appendChild( + createDom( + 'div', + { className: 'jasmine-result-message' }, + 'Spec has no expectations' + ) + ); + } + + return failure; + } + + function summaryList(resultsTree, domParent) { + var specListNode; + for (var i = 0; i < resultsTree.children.length; i++) { + var resultNode = resultsTree.children[i]; + if (filterSpecs && !hasActiveSpec(resultNode)) { + continue; + } + if (resultNode.type === 'suite') { + var suiteListNode = createDom( + 'ul', + { className: 'jasmine-suite', id: 'suite-' + resultNode.result.id }, + createDom( + 'li', + { + className: + 'jasmine-suite-detail jasmine-' + resultNode.result.status + }, + createDom( + 'a', + { href: specHref(resultNode.result) }, + resultNode.result.description + ) + ) + ); + + summaryList(resultNode, suiteListNode); + domParent.appendChild(suiteListNode); + } + if (resultNode.type === 'spec') { + if (domParent.getAttribute('class') !== 'jasmine-specs') { + specListNode = createDom('ul', { className: 'jasmine-specs' }); + domParent.appendChild(specListNode); + } + var specDescription = resultNode.result.description; + if (noExpectations(resultNode.result)) { + specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; + } + if ( + resultNode.result.status === 'pending' && + resultNode.result.pendingReason !== '' + ) { + specDescription = + specDescription + + ' PENDING WITH MESSAGE: ' + + resultNode.result.pendingReason; + } + specListNode.appendChild( + createDom( + 'li', + { + className: 'jasmine-' + resultNode.result.status, + id: 'spec-' + resultNode.result.id + }, + createDom( + 'a', + { href: specHref(resultNode.result) }, + specDescription + ) + ) + ); + } + } + } + + function optionsMenu(config) { + var optionsMenuDom = createDom( + 'div', + { className: 'jasmine-run-options' }, + createDom('span', { className: 'jasmine-trigger' }, 'Options'), + createDom( + 'div', + { className: 'jasmine-payload' }, + createDom( + 'div', + { className: 'jasmine-stop-on-failure' }, + createDom('input', { + className: 'jasmine-fail-fast', + id: 'jasmine-fail-fast', + type: 'checkbox' + }), + createDom( + 'label', + { className: 'jasmine-label', for: 'jasmine-fail-fast' }, + 'stop execution on spec failure' + ) + ), + createDom( + 'div', + { className: 'jasmine-throw-failures' }, + createDom('input', { + className: 'jasmine-throw', + id: 'jasmine-throw-failures', + type: 'checkbox' + }), + createDom( + 'label', + { className: 'jasmine-label', for: 'jasmine-throw-failures' }, + 'stop spec on expectation failure' + ) + ), + createDom( + 'div', + { className: 'jasmine-random-order' }, + createDom('input', { + className: 'jasmine-random', + id: 'jasmine-random-order', + type: 'checkbox' + }), + createDom( + 'label', + { className: 'jasmine-label', for: 'jasmine-random-order' }, + 'run tests in random order' + ) + ), + createDom( + 'div', + { className: 'jasmine-hide-disabled' }, + createDom('input', { + className: 'jasmine-disabled', + id: 'jasmine-hide-disabled', + type: 'checkbox' + }), + createDom( + 'label', + { className: 'jasmine-label', for: 'jasmine-hide-disabled' }, + 'hide disabled tests' + ) + ) + ) + ); + + var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast'); + failFastCheckbox.checked = config.failFast; + failFastCheckbox.onclick = function() { + navigateWithNewParam('failFast', !config.failFast); + }; + + var throwCheckbox = optionsMenuDom.querySelector( + '#jasmine-throw-failures' + ); + throwCheckbox.checked = config.oneFailurePerSpec; + throwCheckbox.onclick = function() { + navigateWithNewParam('throwFailures', !config.oneFailurePerSpec); + }; + + var randomCheckbox = optionsMenuDom.querySelector( + '#jasmine-random-order' + ); + randomCheckbox.checked = config.random; + randomCheckbox.onclick = function() { + navigateWithNewParam('random', !config.random); + }; + + var hideDisabled = optionsMenuDom.querySelector('#jasmine-hide-disabled'); + hideDisabled.checked = config.hideDisabled; + hideDisabled.onclick = function() { + navigateWithNewParam('hideDisabled', !config.hideDisabled); + }; + + var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'), + optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'), + isOpen = /\bjasmine-open\b/; + + optionsTrigger.onclick = function() { + if (isOpen.test(optionsPayload.className)) { + optionsPayload.className = optionsPayload.className.replace( + isOpen, + '' + ); + } else { + optionsPayload.className += ' jasmine-open'; + } + }; + + return optionsMenuDom; + } + + function failureDescription(result, suite) { + var wrapper = createDom( + 'div', + { className: 'jasmine-description' }, + createDom( + 'a', + { title: result.description, href: specHref(result) }, + result.description + ) + ); + var suiteLink; + + while (suite && suite.parent) { + wrapper.insertBefore(createTextNode(' > '), wrapper.firstChild); + suiteLink = createDom( + 'a', + { href: suiteHref(suite) }, + suite.result.description + ); + wrapper.insertBefore(suiteLink, wrapper.firstChild); + + suite = suite.parent; + } + + return wrapper; + } + + function suiteHref(suite) { + var els = []; + + while (suite && suite.parent) { + els.unshift(suite.result.description); + suite = suite.parent; + } + + return addToExistingQueryString('spec', els.join(' ')); + } + + function addDeprecationWarnings(result) { + if (result && result.deprecationWarnings) { + for (var i = 0; i < result.deprecationWarnings.length; i++) { + var warning = result.deprecationWarnings[i].message; + if (!j$.util.arrayContains(warning)) { + deprecationWarnings.push(warning); + } + } + } + } + + function find(selector) { + return getContainer().querySelector('.jasmine_html-reporter ' + selector); + } + + function clearPrior() { + // return the reporter + var oldReporter = find(''); + + if (oldReporter) { + getContainer().removeChild(oldReporter); + } + } + + function createDom(type, attrs, childrenVarArgs) { + var el = createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(createTextNode(child)); + } else { + if (child) { + el.appendChild(child); + } + } + } + + for (var attr in attrs) { + if (attr == 'className') { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; + } + + function pluralize(singular, count) { + var word = count == 1 ? singular : singular + 's'; + + return '' + count + ' ' + word; + } + + function specHref(result) { + return addToExistingQueryString('spec', result.fullName); + } + + function seedHref(seed) { + return addToExistingQueryString('seed', seed); + } + + function defaultQueryString(key, value) { + return '?' + key + '=' + value; + } + + function setMenuModeTo(mode) { + htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode); + } + + function noExpectations(result) { + var allExpectations = + result.failedExpectations.length + result.passedExpectations.length; + + return ( + allExpectations === 0 && + (result.status === 'passed' || result.status === 'failed') + ); + } + + function hasActiveSpec(resultNode) { + if (resultNode.type == 'spec' && resultNode.result.status != 'excluded') { + return true; + } + + if (resultNode.type == 'suite') { + for (var i = 0, j = resultNode.children.length; i < j; i++) { + if (hasActiveSpec(resultNode.children[i])) { + return true; + } + } + } + } + } + + return HtmlReporter; +}; + +jasmineRequire.HtmlSpecFilter = function() { + function HtmlSpecFilter(options) { + var filterString = + options && + options.filterString() && + options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); + var filterPattern = new RegExp(filterString); + + this.matches = function(specName) { + return filterPattern.test(specName); + }; + } + + return HtmlSpecFilter; +}; + +jasmineRequire.ResultsNode = function() { + function ResultsNode(result, type, parent) { + this.result = result; + this.type = type; + this.parent = parent; + + this.children = []; + + this.addChild = function(result, type) { + this.children.push(new ResultsNode(result, type, this)); + }; + + this.last = function() { + return this.children[this.children.length - 1]; + }; + + this.updateResult = function(result) { + this.result = result; + }; + } + + return ResultsNode; +}; + +jasmineRequire.QueryString = function() { + function QueryString(options) { + this.navigateWithNewParam = function(key, value) { + options.getWindowLocation().search = this.fullStringWithNewParam( + key, + value + ); + }; + + this.fullStringWithNewParam = function(key, value) { + var paramMap = queryStringToParamMap(); + paramMap[key] = value; + return toQueryString(paramMap); + }; + + this.getParam = function(key) { + return queryStringToParamMap()[key]; + }; + + return this; + + function toQueryString(paramMap) { + var qStrPairs = []; + for (var prop in paramMap) { + qStrPairs.push( + encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop]) + ); + } + return '?' + qStrPairs.join('&'); + } + + function queryStringToParamMap() { + var paramStr = options.getWindowLocation().search.substring(1), + params = [], + paramMap = {}; + + if (paramStr.length > 0) { + params = paramStr.split('&'); + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + var value = decodeURIComponent(p[1]); + if (value === 'true' || value === 'false') { + value = JSON.parse(value); + } + paramMap[decodeURIComponent(p[0])] = value; + } + } + + return paramMap; + } + } + + return QueryString; +}; diff --git a/packages/splitjs/test/lib/jasmine-3.5.0/jasmine.css b/packages/splitjs/test/lib/jasmine-3.5.0/jasmine.css new file mode 100644 index 000000000..81dd5b3e2 --- /dev/null +++ b/packages/splitjs/test/lib/jasmine-3.5.0/jasmine.css @@ -0,0 +1,128 @@ +@charset "UTF-8"; +body { overflow-y: scroll; } + +.jasmine_html-reporter { width: 100%; background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; } + +.jasmine_html-reporter a { text-decoration: none; } + +.jasmine_html-reporter a:hover { text-decoration: underline; } + +.jasmine_html-reporter p, .jasmine_html-reporter h1, .jasmine_html-reporter h2, .jasmine_html-reporter h3, .jasmine_html-reporter h4, .jasmine_html-reporter h5, .jasmine_html-reporter h6 { margin: 0; line-height: 14px; } + +.jasmine_html-reporter .jasmine-banner, .jasmine_html-reporter .jasmine-symbol-summary, .jasmine_html-reporter .jasmine-summary, .jasmine_html-reporter .jasmine-result-message, .jasmine_html-reporter .jasmine-spec .jasmine-description, .jasmine_html-reporter .jasmine-spec-detail .jasmine-description, .jasmine_html-reporter .jasmine-alert .jasmine-bar, .jasmine_html-reporter .jasmine-stack-trace { padding-left: 9px; padding-right: 9px; } + +.jasmine_html-reporter .jasmine-banner { position: relative; } + +.jasmine_html-reporter .jasmine-banner .jasmine-title { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAZCAMAAACGusnyAAACdlBMVEX/////AP+AgICqVaqAQICZM5mAVYCSSZKAQICOOY6ATYCLRouAQICJO4mSSYCIRIiPQICHPIeOR4CGQ4aMQICGPYaLRoCFQ4WKQICPPYWJRYCOQoSJQICNPoSIRICMQoSHQICHRICKQoOHQICKPoOJO4OJQYOMQICMQ4CIQYKLQICIPoKLQ4CKQICNPoKJQISMQ4KJQoSLQYKJQISLQ4KIQoSKQYKIQICIQISMQoSKQYKLQIOLQoOJQYGLQIOKQIOMQoGKQYOLQYGKQIOLQoGJQYOJQIOKQYGJQIOKQoGKQIGLQIKLQ4KKQoGLQYKJQIGKQYKJQIGKQIKJQoGKQYKLQIGKQYKLQIOJQoKKQoOJQYKKQIOJQoKKQoOKQIOLQoKKQYOLQYKJQIOKQoKKQYKKQoKJQYOKQYKLQIOKQoKLQYOKQYKLQIOJQoGKQYKJQYGJQoGKQYKLQoGLQYGKQoGJQYKKQYGJQIKKQoGJQYKLQIKKQYGLQYKKQYGKQYGKQYKJQYOKQoKJQYOKQYKLQYOLQYOKQYKLQYOKQoKKQYKKQYOKQYOJQYKKQYKLQYKKQIKKQoKKQYKKQYKKQoKJQIKKQYKLQYKKQYKKQIKKQYKKQYKKQYKKQIKKQYKJQYGLQYGKQYKKQYKKQYGKQIKKQYGKQYOJQoKKQYOLQYKKQYOKQoKKQYKKQoKKQYKKQYKJQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKJQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKmIDpEAAAA0XRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAiIyQlJycoKissLS4wMTQ1Njc4OTo7PDw+P0BCQ0RISUpLTE1OUFNUVVdYWFlaW15fYGFiY2ZnaGlqa2xtb3BxcnN0dnh5ent8fX5/gIGChIWIioyNjo+QkZOUlZaYmZqbnJ2eoKGio6WmqKmsra6vsLGztre4ubq7vL2+wMHDxMjJysvNzs/Q0dLU1tfY2dvc3t/g4eLj5ebn6Onq6+zt7u/w8vP09fb3+Pn6+/z9/vkVQXAAAAMaSURBVHhe5dXxV1N1GMfxz2ABbDgIAm5VDJOyVDIJLUMaVpBWUZUaGbmqoGpZRSiGiRWp6KoZ5AB0ZY50RImZQIlahKkMYXv/R90dBvET/rJfOr3Ouc8v99zPec59zvf56j+vYKlViSf7250X4Mr3O29Tgq08BdGB4DhcekEJ5YkQKFsgWZdtj9JpV+I8xPjLFqkrsEIqO8PHSpis36jWazcqjEsfJjkvRssVU37SdIOu4XCf5vEJPsnwJpnRNU9JmxhMk8l1gehIrq7hTFjzOD+Vf88629qKMJVNltInFeRexRQyJlNeqd1iGDlSzrIUIyXbyFfm3RYprcQRe7lqtWyGYbfc6dT0R2vmdOOkX3u55C1rP37ftiH+tDby4r/RBT0w8TyEkr+epB9XgPDmSYYWbrhCuFYaIyw3fDQAXTnSkh+ANofiHmWf9l+FY1I90FdQTetstO00o23novzVsJ7uB3/C5TkbjRwZ5JerwV4iRWq9HFbFMaK/d0TYqayRiQPuIxxS3Bu8JWU90/60tKi7vkhaznez0a/TbVOKj5CaOZh6fWG6/Lyv9B/ZLR1gw/S/fpbeVD3MCW1li6SvWDOn65tr99/uvWtBS0XDm4s1t+sOHpG0kpBKx/l77wOSnxLpcx6TXmXLTPQOKYOf9Q1dfr8/SJ2mFdCvl1Yl93DiHUZvXeLJbGSzYu5gVJ2slbSakOR8dxCq5adQ2oFLqsE9Ex3L4qQO0eOPeU5x56bypXp4onSEb5OkICX6lDat55TeoztNKQcJaakrz9KCb95oD69IKq+yKW4XPjknaS52V0TZqE2cTtXjcHSCRmUO88e+85hj3EP74i9p8pylw7lxgMDyyl6OV7ZejnjNMfatu87LxRbH0IS35gt2a4ZjmGpVBdKK3Wr6INk8jWWSGqbA55CKgjBRC6E9w78ydTg3ABS3AFV1QN0Y4Aa2pgEjWnQURj9L0ayK6R2ysEqxHUKzYnLvvyU+i9KM2JHJzE4vyZOyDcOwOsySajeLPc8sNvPJkFlyJd20wpqAzZeAfZ3oWybxd+P/3j+SG3uSBdf2VQAAAABJRU5ErkJggg==") no-repeat; background: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=") no-repeat, none; -moz-background-size: 100%; -o-background-size: 100%; -webkit-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; } + +.jasmine_html-reporter .jasmine-banner .jasmine-version { margin-left: 14px; position: relative; top: 6px; } + +.jasmine_html-reporter #jasmine_content { position: fixed; right: 100%; } + +.jasmine_html-reporter .jasmine-version { color: #aaa; } + +.jasmine_html-reporter .jasmine-banner { margin-top: 14px; } + +.jasmine_html-reporter .jasmine-duration { color: #fff; float: right; line-height: 28px; padding-right: 9px; } + +.jasmine_html-reporter .jasmine-symbol-summary { overflow: hidden; margin: 14px 0; } + +.jasmine_html-reporter .jasmine-symbol-summary li { display: inline-block; height: 10px; width: 14px; font-size: 16px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed { font-size: 14px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed:before { color: #007069; content: "•"; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed { line-height: 9px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before { color: #ca3a11; content: "Ɨ"; font-weight: bold; margin-left: -1px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded { font-size: 14px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded:before { color: #bababa; content: "•"; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded-no-display { font-size: 14px; display: none; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending { line-height: 17px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending:before { color: #ba9d37; content: "*"; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty { font-size: 14px; } + +.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty:before { color: #ba9d37; content: "•"; } + +.jasmine_html-reporter .jasmine-run-options { float: right; margin-right: 5px; border: 1px solid #8a4182; color: #8a4182; position: relative; line-height: 20px; } + +.jasmine_html-reporter .jasmine-run-options .jasmine-trigger { cursor: pointer; padding: 8px 16px; } + +.jasmine_html-reporter .jasmine-run-options .jasmine-payload { position: absolute; display: none; right: -1px; border: 1px solid #8a4182; background-color: #eee; white-space: nowrap; padding: 4px 8px; } + +.jasmine_html-reporter .jasmine-run-options .jasmine-payload.jasmine-open { display: block; } + +.jasmine_html-reporter .jasmine-bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } + +.jasmine_html-reporter .jasmine-bar.jasmine-failed, .jasmine_html-reporter .jasmine-bar.jasmine-errored { background-color: #ca3a11; border-bottom: 1px solid #eee; } + +.jasmine_html-reporter .jasmine-bar.jasmine-passed { background-color: #007069; } + +.jasmine_html-reporter .jasmine-bar.jasmine-incomplete { background-color: #bababa; } + +.jasmine_html-reporter .jasmine-bar.jasmine-skipped { background-color: #bababa; } + +.jasmine_html-reporter .jasmine-bar.jasmine-warning { background-color: #ba9d37; color: #333; } + +.jasmine_html-reporter .jasmine-bar.jasmine-menu { background-color: #fff; color: #aaa; } + +.jasmine_html-reporter .jasmine-bar.jasmine-menu a { color: #333; } + +.jasmine_html-reporter .jasmine-bar a { color: white; } + +.jasmine_html-reporter.jasmine-spec-list .jasmine-bar.jasmine-menu.jasmine-failure-list, .jasmine_html-reporter.jasmine-spec-list .jasmine-results .jasmine-failures { display: none; } + +.jasmine_html-reporter.jasmine-failure-list .jasmine-bar.jasmine-menu.jasmine-spec-list, .jasmine_html-reporter.jasmine-failure-list .jasmine-summary { display: none; } + +.jasmine_html-reporter .jasmine-results { margin-top: 14px; } + +.jasmine_html-reporter .jasmine-summary { margin-top: 14px; } + +.jasmine_html-reporter .jasmine-summary ul { list-style-type: none; margin-left: 14px; padding-top: 0; padding-left: 0; } + +.jasmine_html-reporter .jasmine-summary ul.jasmine-suite { margin-top: 7px; margin-bottom: 7px; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-passed a { color: #007069; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-failed a { color: #ca3a11; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-empty a { color: #ba9d37; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-pending a { color: #ba9d37; } + +.jasmine_html-reporter .jasmine-summary li.jasmine-excluded a { color: #bababa; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-passed a:before { content: "• "; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-failed a:before { content: "Ɨ "; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-empty a:before { content: "* "; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-pending a:before { content: "• "; } + +.jasmine_html-reporter .jasmine-specs li.jasmine-excluded a:before { content: "• "; } + +.jasmine_html-reporter .jasmine-description + .jasmine-suite { margin-top: 0; } + +.jasmine_html-reporter .jasmine-suite { margin-top: 14px; } + +.jasmine_html-reporter .jasmine-suite a { color: #333; } + +.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail { margin-bottom: 28px; } + +.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description { background-color: #ca3a11; color: white; } + +.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description a { color: white; } + +.jasmine_html-reporter .jasmine-result-message { padding-top: 14px; color: #333; white-space: pre-wrap; } + +.jasmine_html-reporter .jasmine-result-message span.jasmine-result { display: block; } + +.jasmine_html-reporter .jasmine-stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666; border: 1px solid #ddd; background: white; white-space: pre; } diff --git a/packages/splitjs/test/lib/jasmine-3.5.0/jasmine.js b/packages/splitjs/test/lib/jasmine-3.5.0/jasmine.js new file mode 100644 index 000000000..4875624e6 --- /dev/null +++ b/packages/splitjs/test/lib/jasmine-3.5.0/jasmine.js @@ -0,0 +1,8218 @@ +/* +Copyright (c) 2008-2019 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +// eslint-disable-next-line no-unused-vars +var getJasmineRequireObj = (function(jasmineGlobal) { + var jasmineRequire; + + if ( + typeof module !== 'undefined' && + module.exports && + typeof exports !== 'undefined' + ) { + if (typeof global !== 'undefined') { + jasmineGlobal = global; + } else { + jasmineGlobal = {}; + } + jasmineRequire = exports; + } else { + if ( + typeof window !== 'undefined' && + typeof window.toString === 'function' && + window.toString() === '[object GjsGlobal]' + ) { + jasmineGlobal = window; + } + jasmineRequire = jasmineGlobal.jasmineRequire = {}; + } + + function getJasmineRequire() { + return jasmineRequire; + } + + getJasmineRequire().core = function(jRequire) { + var j$ = {}; + + jRequire.base(j$, jasmineGlobal); + j$.util = jRequire.util(j$); + j$.errors = jRequire.errors(); + j$.formatErrorMsg = jRequire.formatErrorMsg(); + j$.Any = jRequire.Any(j$); + j$.Anything = jRequire.Anything(j$); + j$.CallTracker = jRequire.CallTracker(j$); + j$.MockDate = jRequire.MockDate(); + j$.getClearStack = jRequire.clearStack(j$); + j$.Clock = jRequire.Clock(); + j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(j$); + j$.Env = jRequire.Env(j$); + j$.StackTrace = jRequire.StackTrace(j$); + j$.ExceptionFormatter = jRequire.ExceptionFormatter(j$); + j$.ExpectationFilterChain = jRequire.ExpectationFilterChain(); + j$.Expector = jRequire.Expector(j$); + j$.Expectation = jRequire.Expectation(j$); + j$.buildExpectationResult = jRequire.buildExpectationResult(); + j$.noopTimer = jRequire.noopTimer(); + j$.JsApiReporter = jRequire.JsApiReporter(j$); + j$.matchersUtil = jRequire.matchersUtil(j$); + j$.ObjectContaining = jRequire.ObjectContaining(j$); + j$.ArrayContaining = jRequire.ArrayContaining(j$); + j$.ArrayWithExactContents = jRequire.ArrayWithExactContents(j$); + j$.MapContaining = jRequire.MapContaining(j$); + j$.SetContaining = jRequire.SetContaining(j$); + j$.pp = jRequire.pp(j$); + j$.QueueRunner = jRequire.QueueRunner(j$); + j$.ReportDispatcher = jRequire.ReportDispatcher(j$); + j$.Spec = jRequire.Spec(j$); + j$.Spy = jRequire.Spy(j$); + j$.SpyFactory = jRequire.SpyFactory(j$); + j$.SpyRegistry = jRequire.SpyRegistry(j$); + j$.SpyStrategy = jRequire.SpyStrategy(j$); + j$.StringMatching = jRequire.StringMatching(j$); + j$.UserContext = jRequire.UserContext(j$); + j$.Suite = jRequire.Suite(j$); + j$.Timer = jRequire.Timer(); + j$.TreeProcessor = jRequire.TreeProcessor(); + j$.version = jRequire.version(); + j$.Order = jRequire.Order(); + j$.DiffBuilder = jRequire.DiffBuilder(j$); + j$.NullDiffBuilder = jRequire.NullDiffBuilder(j$); + j$.ObjectPath = jRequire.ObjectPath(j$); + j$.GlobalErrors = jRequire.GlobalErrors(j$); + + j$.Truthy = jRequire.Truthy(j$); + j$.Falsy = jRequire.Falsy(j$); + j$.Empty = jRequire.Empty(j$); + j$.NotEmpty = jRequire.NotEmpty(j$); + + j$.matchers = jRequire.requireMatchers(jRequire, j$); + j$.asyncMatchers = jRequire.requireAsyncMatchers(jRequire, j$); + + return j$; + }; + + return getJasmineRequire; +})(this); + +getJasmineRequireObj().requireMatchers = function(jRequire, j$) { + var availableMatchers = [ + 'nothing', + 'toBe', + 'toBeCloseTo', + 'toBeDefined', + 'toBeInstanceOf', + 'toBeFalse', + 'toBeFalsy', + 'toBeGreaterThan', + 'toBeGreaterThanOrEqual', + 'toBeLessThan', + 'toBeLessThanOrEqual', + 'toBeNaN', + 'toBeNegativeInfinity', + 'toBeNull', + 'toBePositiveInfinity', + 'toBeTrue', + 'toBeTruthy', + 'toBeUndefined', + 'toContain', + 'toEqual', + 'toHaveBeenCalled', + 'toHaveBeenCalledBefore', + 'toHaveBeenCalledTimes', + 'toHaveBeenCalledWith', + 'toHaveClass', + 'toMatch', + 'toThrow', + 'toThrowError', + 'toThrowMatching' + ], + matchers = {}; + + for (var i = 0; i < availableMatchers.length; i++) { + var name = availableMatchers[i]; + matchers[name] = jRequire[name](j$); + } + + return matchers; +}; + +getJasmineRequireObj().base = function(j$, jasmineGlobal) { + j$.unimplementedMethod_ = function() { + throw new Error('unimplemented method'); + }; + + /** + * Maximum object depth the pretty printer will print to. + * Set this to a lower value to speed up pretty printing if you have large objects. + * @name jasmine.MAX_PRETTY_PRINT_DEPTH + * @since 1.3.0 + */ + j$.MAX_PRETTY_PRINT_DEPTH = 8; + /** + * Maximum number of array elements to display when pretty printing objects. + * This will also limit the number of keys and values displayed for an object. + * Elements past this number will be ellipised. + * @name jasmine.MAX_PRETTY_PRINT_ARRAY_LENGTH + * @since 2.7.0 + */ + j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 50; + /** + * Maximum number of characters to display when pretty printing objects. + * Characters past this number will be ellipised. + * @name jasmine.MAX_PRETTY_PRINT_CHARS + * @since 2.9.0 + */ + j$.MAX_PRETTY_PRINT_CHARS = 1000; + /** + * Default number of milliseconds Jasmine will wait for an asynchronous spec to complete. + * @name jasmine.DEFAULT_TIMEOUT_INTERVAL + * @since 1.3.0 + */ + j$.DEFAULT_TIMEOUT_INTERVAL = 5000; + + j$.getGlobal = function() { + return jasmineGlobal; + }; + + /** + * Get the currently booted Jasmine Environment. + * + * @name jasmine.getEnv + * @since 1.3.0 + * @function + * @return {Env} + */ + j$.getEnv = function(options) { + var env = (j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options)); + //jasmine. singletons in here (setTimeout blah blah). + return env; + }; + + j$.isArray_ = function(value) { + return j$.isA_('Array', value); + }; + + j$.isObject_ = function(value) { + return ( + !j$.util.isUndefined(value) && value !== null && j$.isA_('Object', value) + ); + }; + + j$.isString_ = function(value) { + return j$.isA_('String', value); + }; + + j$.isNumber_ = function(value) { + return j$.isA_('Number', value); + }; + + j$.isFunction_ = function(value) { + return j$.isA_('Function', value); + }; + + j$.isAsyncFunction_ = function(value) { + return j$.isA_('AsyncFunction', value); + }; + + j$.isTypedArray_ = function(value) { + return ( + j$.isA_('Float32Array', value) || + j$.isA_('Float64Array', value) || + j$.isA_('Int16Array', value) || + j$.isA_('Int32Array', value) || + j$.isA_('Int8Array', value) || + j$.isA_('Uint16Array', value) || + j$.isA_('Uint32Array', value) || + j$.isA_('Uint8Array', value) || + j$.isA_('Uint8ClampedArray', value) + ); + }; + + j$.isA_ = function(typeName, value) { + return j$.getType_(value) === '[object ' + typeName + ']'; + }; + + j$.isError_ = function(value) { + if (value instanceof Error) { + return true; + } + if (value && value.constructor && value.constructor.constructor) { + var valueGlobal = value.constructor.constructor('return this'); + if (j$.isFunction_(valueGlobal)) { + valueGlobal = valueGlobal(); + } + + if (valueGlobal.Error && value instanceof valueGlobal.Error) { + return true; + } + } + return false; + }; + + j$.getType_ = function(value) { + return Object.prototype.toString.apply(value); + }; + + j$.isDomNode = function(obj) { + // Node is a function, because constructors + return typeof jasmineGlobal.Node !== 'undefined' + ? obj instanceof jasmineGlobal.Node + : obj !== null && + typeof obj === 'object' && + typeof obj.nodeType === 'number' && + typeof obj.nodeName === 'string'; + // return obj.nodeType > 0; + }; + + j$.isMap = function(obj) { + return ( + obj !== null && + typeof obj !== 'undefined' && + typeof jasmineGlobal.Map !== 'undefined' && + obj.constructor === jasmineGlobal.Map + ); + }; + + j$.isSet = function(obj) { + return ( + obj !== null && + typeof obj !== 'undefined' && + typeof jasmineGlobal.Set !== 'undefined' && + obj.constructor === jasmineGlobal.Set + ); + }; + + j$.isPromise = function(obj) { + return ( + typeof jasmineGlobal.Promise !== 'undefined' && + !!obj && + obj.constructor === jasmineGlobal.Promise + ); + }; + + j$.isPromiseLike = function(obj) { + return !!obj && j$.isFunction_(obj.then); + }; + + j$.fnNameFor = function(func) { + if (func.name) { + return func.name; + } + + var matches = + func.toString().match(/^\s*function\s*(\w+)\s*\(/) || + func.toString().match(/^\s*\[object\s*(\w+)Constructor\]/); + + return matches ? matches[1] : ''; + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is an instance of the specified class/constructor. + * @name jasmine.any + * @since 1.3.0 + * @function + * @param {Constructor} clazz - The constructor to check against. + */ + j$.any = function(clazz) { + return new j$.Any(clazz); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is not `null` and not `undefined`. + * @name jasmine.anything + * @since 2.2.0 + * @function + */ + j$.anything = function() { + return new j$.Anything(); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is `true` or anything truthy. + * @name jasmine.truthy + * @since 3.1.0 + * @function + */ + j$.truthy = function() { + return new j$.Truthy(); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is `null`, `undefined`, `0`, `false` or anything falsey. + * @name jasmine.falsy + * @since 3.1.0 + * @function + */ + j$.falsy = function() { + return new j$.Falsy(); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is empty. + * @name jasmine.empty + * @since 3.1.0 + * @function + */ + j$.empty = function() { + return new j$.Empty(); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared is not empty. + * @name jasmine.notEmpty + * @since 3.1.0 + * @function + */ + j$.notEmpty = function() { + return new j$.NotEmpty(); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value being compared contains at least the keys and values. + * @name jasmine.objectContaining + * @since 1.3.0 + * @function + * @param {Object} sample - The subset of properties that _must_ be in the actual. + */ + j$.objectContaining = function(sample) { + return new j$.ObjectContaining(sample); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is a `String` that matches the `RegExp` or `String`. + * @name jasmine.stringMatching + * @since 2.2.0 + * @function + * @param {RegExp|String} expected + */ + j$.stringMatching = function(expected) { + return new j$.StringMatching(expected); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is an `Array` that contains at least the elements in the sample. + * @name jasmine.arrayContaining + * @since 2.2.0 + * @function + * @param {Array} sample + */ + j$.arrayContaining = function(sample) { + return new j$.ArrayContaining(sample); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if the actual value is an `Array` that contains all of the elements in the sample in any order. + * @name jasmine.arrayWithExactContents + * @since 2.8.0 + * @function + * @param {Array} sample + */ + j$.arrayWithExactContents = function(sample) { + return new j$.ArrayWithExactContents(sample); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if every key/value pair in the sample passes the deep equality comparison + * with at least one key/value pair in the actual value being compared + * @name jasmine.mapContaining + * @since 3.5.0 + * @function + * @param {Map} sample - The subset of items that _must_ be in the actual. + */ + j$.mapContaining = function(sample) { + return new j$.MapContaining(sample); + }; + + /** + * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}), + * that will succeed if every item in the sample passes the deep equality comparison + * with at least one item in the actual value being compared + * @name jasmine.setContaining + * @since 3.5.0 + * @function + * @param {Set} sample - The subset of items that _must_ be in the actual. + */ + j$.setContaining = function(sample) { + return new j$.SetContaining(sample); + }; + + j$.isSpy = function(putativeSpy) { + if (!putativeSpy) { + return false; + } + return ( + putativeSpy.and instanceof j$.SpyStrategy && + putativeSpy.calls instanceof j$.CallTracker + ); + }; +}; + +getJasmineRequireObj().util = function(j$) { + var util = {}; + + util.inherit = function(childClass, parentClass) { + var Subclass = function() {}; + Subclass.prototype = parentClass.prototype; + childClass.prototype = new Subclass(); + }; + + util.htmlEscape = function(str) { + if (!str) { + return str; + } + return str + .replace(/&/g, '&') + .replace(//g, '>'); + }; + + util.argsToArray = function(args) { + var arrayOfArgs = []; + for (var i = 0; i < args.length; i++) { + arrayOfArgs.push(args[i]); + } + return arrayOfArgs; + }; + + util.isUndefined = function(obj) { + return obj === void 0; + }; + + util.arrayContains = function(array, search) { + var i = array.length; + while (i--) { + if (array[i] === search) { + return true; + } + } + return false; + }; + + util.clone = function(obj) { + if (Object.prototype.toString.apply(obj) === '[object Array]') { + return obj.slice(); + } + + var cloned = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + cloned[prop] = obj[prop]; + } + } + + return cloned; + }; + + util.cloneArgs = function(args) { + var clonedArgs = []; + var argsAsArray = j$.util.argsToArray(args); + for (var i = 0; i < argsAsArray.length; i++) { + var str = Object.prototype.toString.apply(argsAsArray[i]), + primitives = /^\[object (Boolean|String|RegExp|Number)/; + + // All falsey values are either primitives, `null`, or `undefined. + if (!argsAsArray[i] || str.match(primitives)) { + clonedArgs.push(argsAsArray[i]); + } else { + clonedArgs.push(j$.util.clone(argsAsArray[i])); + } + } + return clonedArgs; + }; + + util.getPropertyDescriptor = function(obj, methodName) { + var descriptor, + proto = obj; + + do { + descriptor = Object.getOwnPropertyDescriptor(proto, methodName); + proto = Object.getPrototypeOf(proto); + } while (!descriptor && proto); + + return descriptor; + }; + + util.objectDifference = function(obj, toRemove) { + var diff = {}; + + for (var key in obj) { + if (util.has(obj, key) && !util.has(toRemove, key)) { + diff[key] = obj[key]; + } + } + + return diff; + }; + + util.has = function(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + }; + + util.errorWithStack = function errorWithStack() { + // Don't throw and catch if we don't have to, because it makes it harder + // for users to debug their code with exception breakpoints. + var error = new Error(); + + if (error.stack) { + return error; + } + + // But some browsers (e.g. Phantom) only provide a stack trace if we throw. + try { + throw new Error(); + } catch (e) { + return e; + } + }; + + function callerFile() { + var trace = new j$.StackTrace(util.errorWithStack()); + return trace.frames[2].file; + } + + util.jasmineFile = (function() { + var result; + + return function() { + if (!result) { + result = callerFile(); + } + + return result; + }; + })(); + + function StopIteration() {} + StopIteration.prototype = Object.create(Error.prototype); + StopIteration.prototype.constructor = StopIteration; + + // useful for maps and sets since `forEach` is the only IE11-compatible way to iterate them + util.forEachBreakable = function(iterable, iteratee) { + function breakLoop() { + throw new StopIteration(); + } + + try { + iterable.forEach(function(value, key) { + iteratee(breakLoop, value, key, iterable); + }); + } catch (error) { + if (!(error instanceof StopIteration)) throw error; + } + }; + + return util; +}; + +getJasmineRequireObj().Spec = function(j$) { + function Spec(attrs) { + this.expectationFactory = attrs.expectationFactory; + this.asyncExpectationFactory = attrs.asyncExpectationFactory; + this.resultCallback = attrs.resultCallback || function() {}; + this.id = attrs.id; + this.description = attrs.description || ''; + this.queueableFn = attrs.queueableFn; + this.beforeAndAfterFns = + attrs.beforeAndAfterFns || + function() { + return { befores: [], afters: [] }; + }; + this.userContext = + attrs.userContext || + function() { + return {}; + }; + this.onStart = attrs.onStart || function() {}; + this.getSpecName = + attrs.getSpecName || + function() { + return ''; + }; + this.expectationResultFactory = + attrs.expectationResultFactory || function() {}; + this.queueRunnerFactory = attrs.queueRunnerFactory || function() {}; + this.catchingExceptions = + attrs.catchingExceptions || + function() { + return true; + }; + this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; + this.timer = attrs.timer || j$.noopTimer; + + if (!this.queueableFn.fn) { + this.pend(); + } + + /** + * @typedef SpecResult + * @property {Int} id - The unique id of this spec. + * @property {String} description - The description passed to the {@link it} that created this spec. + * @property {String} fullName - The full description including all ancestors of this spec. + * @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec. + * @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec. + * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec. + * @property {String} pendingReason - If the spec is {@link pending}, this will be the reason. + * @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec. + * @property {number} duration - The time in ms used by the spec execution, including any before/afterEach. + */ + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + failedExpectations: [], + passedExpectations: [], + deprecationWarnings: [], + pendingReason: '', + duration: null + }; + } + + Spec.prototype.addExpectationResult = function(passed, data, isError) { + var expectationResult = this.expectationResultFactory(data); + if (passed) { + this.result.passedExpectations.push(expectationResult); + } else { + this.result.failedExpectations.push(expectationResult); + + if (this.throwOnExpectationFailure && !isError) { + throw new j$.errors.ExpectationFailed(); + } + } + }; + + Spec.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Spec.prototype.expectAsync = function(actual) { + return this.asyncExpectationFactory(actual, this); + }; + + Spec.prototype.execute = function(onComplete, excluded, failSpecWithNoExp) { + var self = this; + + var onStart = { + fn: function(done) { + self.timer.start(); + self.onStart(self, done); + } + }; + + var complete = { + fn: function(done) { + self.queueableFn.fn = null; + self.result.status = self.status(excluded, failSpecWithNoExp); + self.resultCallback(self.result, done); + } + }; + + var fns = this.beforeAndAfterFns(); + var regularFns = fns.befores.concat(this.queueableFn); + + var runnerConfig = { + isLeaf: true, + queueableFns: regularFns, + cleanupFns: fns.afters, + onException: function() { + self.onException.apply(self, arguments); + }, + onComplete: function() { + self.result.duration = self.timer.elapsed(); + onComplete( + self.result.status === 'failed' && + new j$.StopExecutionError('spec failed') + ); + }, + userContext: this.userContext() + }; + + if (this.markedPending || excluded === true) { + runnerConfig.queueableFns = []; + runnerConfig.cleanupFns = []; + } + + runnerConfig.queueableFns.unshift(onStart); + runnerConfig.cleanupFns.push(complete); + + this.queueRunnerFactory(runnerConfig); + }; + + Spec.prototype.onException = function onException(e) { + if (Spec.isPendingSpecException(e)) { + this.pend(extractCustomPendingMessage(e)); + return; + } + + if (e instanceof j$.errors.ExpectationFailed) { + return; + } + + this.addExpectationResult( + false, + { + matcherName: '', + passed: false, + expected: '', + actual: '', + error: e + }, + true + ); + }; + + Spec.prototype.pend = function(message) { + this.markedPending = true; + if (message) { + this.result.pendingReason = message; + } + }; + + Spec.prototype.getResult = function() { + this.result.status = this.status(); + return this.result; + }; + + Spec.prototype.status = function(excluded, failSpecWithNoExpectations) { + if (excluded === true) { + return 'excluded'; + } + + if (this.markedPending) { + return 'pending'; + } + + if ( + this.result.failedExpectations.length > 0 || + (failSpecWithNoExpectations && + this.result.failedExpectations.length + + this.result.passedExpectations.length === + 0) + ) { + return 'failed'; + } + + return 'passed'; + }; + + Spec.prototype.getFullName = function() { + return this.getSpecName(this); + }; + + Spec.prototype.addDeprecationWarning = function(deprecation) { + if (typeof deprecation === 'string') { + deprecation = { message: deprecation }; + } + this.result.deprecationWarnings.push( + this.expectationResultFactory(deprecation) + ); + }; + + var extractCustomPendingMessage = function(e) { + var fullMessage = e.toString(), + boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage), + boilerplateEnd = + boilerplateStart + Spec.pendingSpecExceptionMessage.length; + + return fullMessage.substr(boilerplateEnd); + }; + + Spec.pendingSpecExceptionMessage = '=> marked Pending'; + + Spec.isPendingSpecException = function(e) { + return !!( + e && + e.toString && + e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1 + ); + }; + + return Spec; +}; + +if (typeof window == void 0 && typeof exports == 'object') { + /* globals exports */ + exports.Spec = jasmineRequire.Spec; +} + +/*jshint bitwise: false*/ + +getJasmineRequireObj().Order = function() { + function Order(options) { + this.random = 'random' in options ? options.random : true; + var seed = (this.seed = options.seed || generateSeed()); + this.sort = this.random ? randomOrder : naturalOrder; + + function naturalOrder(items) { + return items; + } + + function randomOrder(items) { + var copy = items.slice(); + copy.sort(function(a, b) { + return jenkinsHash(seed + a.id) - jenkinsHash(seed + b.id); + }); + return copy; + } + + function generateSeed() { + return String(Math.random()).slice(-5); + } + + // Bob Jenkins One-at-a-Time Hash algorithm is a non-cryptographic hash function + // used to get a different output when the key changes slightly. + // We use your return to sort the children randomly in a consistent way when + // used in conjunction with a seed + + function jenkinsHash(key) { + var hash, i; + for (hash = i = 0; i < key.length; ++i) { + hash += key.charCodeAt(i); + hash += hash << 10; + hash ^= hash >> 6; + } + hash += hash << 3; + hash ^= hash >> 11; + hash += hash << 15; + return hash; + } + } + + return Order; +}; + +getJasmineRequireObj().Env = function(j$) { + /** + * _Note:_ Do not construct this directly, Jasmine will make one during booting. + * @name Env + * @since 2.0.0 + * @classdesc The Jasmine environment + * @constructor + */ + function Env(options) { + options = options || {}; + + var self = this; + var global = options.global || j$.getGlobal(); + var customPromise; + + var totalSpecsDefined = 0; + + var realSetTimeout = global.setTimeout; + var realClearTimeout = global.clearTimeout; + var clearStack = j$.getClearStack(global); + this.clock = new j$.Clock( + global, + function() { + return new j$.DelayedFunctionScheduler(); + }, + new j$.MockDate(global) + ); + + var runnableResources = {}; + + var currentSpec = null; + var currentlyExecutingSuites = []; + var currentDeclarationSuite = null; + var hasFailures = false; + + /** + * This represents the available options to configure Jasmine. + * Options that are not provided will use their default values + * @interface Configuration + * @since 3.3.0 + */ + var config = { + /** + * Whether to randomize spec execution order + * @name Configuration#random + * @since 3.3.0 + * @type Boolean + * @default true + */ + random: true, + /** + * Seed to use as the basis of randomization. + * Null causes the seed to be determined randomly at the start of execution. + * @name Configuration#seed + * @since 3.3.0 + * @type function + * @default null + */ + seed: null, + /** + * Whether to stop execution of the suite after the first spec failure + * @name Configuration#failFast + * @since 3.3.0 + * @type Boolean + * @default false + */ + failFast: false, + /** + * Whether to fail the spec if it ran no expectations. By default + * a spec that ran no expectations is reported as passed. Setting this + * to true will report such spec as a failure. + * @name Configuration#failSpecWithNoExpectations + * @since 3.5.0 + * @type Boolean + * @default false + */ + failSpecWithNoExpectations: false, + /** + * Whether to cause specs to only have one expectation failure. + * @name Configuration#oneFailurePerSpec + * @since 3.3.0 + * @type Boolean + * @default false + */ + oneFailurePerSpec: false, + /** + * Function to use to filter specs + * @name Configuration#specFilter + * @since 3.3.0 + * @type function + * @default true + */ + specFilter: function() { + return true; + }, + /** + * Whether or not reporters should hide disabled specs from their output. + * Currently only supported by Jasmine's HTMLReporter + * @name Configuration#hideDisabled + * @since 3.3.0 + * @type Boolean + * @default false + */ + hideDisabled: false, + /** + * Set to provide a custom promise library that Jasmine will use if it needs + * to create a promise. If not set, it will default to whatever global Promise + * library is available (if any). + * @name Configuration#Promise + * @since 3.5.0 + * @type function + * @default undefined + */ + Promise: undefined + }; + + var currentSuite = function() { + return currentlyExecutingSuites[currentlyExecutingSuites.length - 1]; + }; + + var currentRunnable = function() { + return currentSpec || currentSuite(); + }; + + var globalErrors = null; + + var installGlobalErrors = function() { + if (globalErrors) { + return; + } + + globalErrors = new j$.GlobalErrors(); + globalErrors.install(); + }; + + if (!options.suppressLoadErrors) { + installGlobalErrors(); + globalErrors.pushListener(function( + message, + filename, + lineno, + colNo, + err + ) { + topSuite.result.failedExpectations.push({ + passed: false, + globalErrorType: 'load', + message: message, + stack: err && err.stack, + filename: filename, + lineno: lineno + }); + }); + } + + /** + * Configure your jasmine environment + * @name Env#configure + * @since 3.3.0 + * @argument {Configuration} configuration + * @function + */ + this.configure = function(configuration) { + if (configuration.specFilter) { + config.specFilter = configuration.specFilter; + } + + if (configuration.hasOwnProperty('random')) { + config.random = !!configuration.random; + } + + if (configuration.hasOwnProperty('seed')) { + config.seed = configuration.seed; + } + + if (configuration.hasOwnProperty('failFast')) { + config.failFast = configuration.failFast; + } + + if (configuration.hasOwnProperty('failSpecWithNoExpectations')) { + config.failSpecWithNoExpectations = + configuration.failSpecWithNoExpectations; + } + + if (configuration.hasOwnProperty('oneFailurePerSpec')) { + config.oneFailurePerSpec = configuration.oneFailurePerSpec; + } + + if (configuration.hasOwnProperty('hideDisabled')) { + config.hideDisabled = configuration.hideDisabled; + } + + // Don't use hasOwnProperty to check for Promise existence because Promise + // can be initialized to undefined, either explicitly or by using the + // object returned from Env#configuration. In particular, Karma does this. + if (configuration.Promise) { + if ( + typeof configuration.Promise.resolve === 'function' && + typeof configuration.Promise.reject === 'function' + ) { + customPromise = configuration.Promise; + } else { + throw new Error( + 'Custom promise library missing `resolve`/`reject` functions' + ); + } + } + }; + + /** + * Get the current configuration for your jasmine environment + * @name Env#configuration + * @since 3.3.0 + * @function + * @returns {Configuration} + */ + this.configuration = function() { + var result = {}; + for (var property in config) { + result[property] = config[property]; + } + return result; + }; + + Object.defineProperty(this, 'specFilter', { + get: function() { + self.deprecated( + 'Getting specFilter directly from Env is deprecated and will be removed in a future version of Jasmine, please check the specFilter option from `configuration`' + ); + return config.specFilter; + }, + set: function(val) { + self.deprecated( + 'Setting specFilter directly on Env is deprecated and will be removed in a future version of Jasmine, please use the specFilter option in `configure`' + ); + config.specFilter = val; + } + }); + + this.setDefaultSpyStrategy = function(defaultStrategyFn) { + if (!currentRunnable()) { + throw new Error( + 'Default spy strategy must be set in a before function or a spec' + ); + } + runnableResources[ + currentRunnable().id + ].defaultStrategyFn = defaultStrategyFn; + }; + + this.addSpyStrategy = function(name, fn) { + if (!currentRunnable()) { + throw new Error( + 'Custom spy strategies must be added in a before function or a spec' + ); + } + runnableResources[currentRunnable().id].customSpyStrategies[name] = fn; + }; + + this.addCustomEqualityTester = function(tester) { + if (!currentRunnable()) { + throw new Error( + 'Custom Equalities must be added in a before function or a spec' + ); + } + runnableResources[currentRunnable().id].customEqualityTesters.push( + tester + ); + }; + + this.addMatchers = function(matchersToAdd) { + if (!currentRunnable()) { + throw new Error( + 'Matchers must be added in a before function or a spec' + ); + } + var customMatchers = + runnableResources[currentRunnable().id].customMatchers; + for (var matcherName in matchersToAdd) { + customMatchers[matcherName] = matchersToAdd[matcherName]; + } + }; + + this.addAsyncMatchers = function(matchersToAdd) { + if (!currentRunnable()) { + throw new Error( + 'Async Matchers must be added in a before function or a spec' + ); + } + var customAsyncMatchers = + runnableResources[currentRunnable().id].customAsyncMatchers; + for (var matcherName in matchersToAdd) { + customAsyncMatchers[matcherName] = matchersToAdd[matcherName]; + } + }; + + j$.Expectation.addCoreMatchers(j$.matchers); + j$.Expectation.addAsyncCoreMatchers(j$.asyncMatchers); + + var nextSpecId = 0; + var getNextSpecId = function() { + return 'spec' + nextSpecId++; + }; + + var nextSuiteId = 0; + var getNextSuiteId = function() { + return 'suite' + nextSuiteId++; + }; + + var expectationFactory = function(actual, spec) { + return j$.Expectation.factory({ + util: j$.matchersUtil, + customEqualityTesters: runnableResources[spec.id].customEqualityTesters, + customMatchers: runnableResources[spec.id].customMatchers, + actual: actual, + addExpectationResult: addExpectationResult + }); + + function addExpectationResult(passed, result) { + return spec.addExpectationResult(passed, result); + } + }; + + var asyncExpectationFactory = function(actual, spec) { + return j$.Expectation.asyncFactory({ + util: j$.matchersUtil, + customEqualityTesters: runnableResources[spec.id].customEqualityTesters, + customAsyncMatchers: runnableResources[spec.id].customAsyncMatchers, + actual: actual, + addExpectationResult: addExpectationResult + }); + + function addExpectationResult(passed, result) { + return spec.addExpectationResult(passed, result); + } + }; + + var defaultResourcesForRunnable = function(id, parentRunnableId) { + var resources = { + spies: [], + customEqualityTesters: [], + customMatchers: {}, + customAsyncMatchers: {}, + customSpyStrategies: {}, + defaultStrategyFn: undefined + }; + + if (runnableResources[parentRunnableId]) { + resources.customEqualityTesters = j$.util.clone( + runnableResources[parentRunnableId].customEqualityTesters + ); + resources.customMatchers = j$.util.clone( + runnableResources[parentRunnableId].customMatchers + ); + resources.customAsyncMatchers = j$.util.clone( + runnableResources[parentRunnableId].customAsyncMatchers + ); + resources.defaultStrategyFn = + runnableResources[parentRunnableId].defaultStrategyFn; + } + + runnableResources[id] = resources; + }; + + var clearResourcesForRunnable = function(id) { + spyRegistry.clearSpies(); + delete runnableResources[id]; + }; + + var beforeAndAfterFns = function(suite) { + return function() { + var befores = [], + afters = []; + + while (suite) { + befores = befores.concat(suite.beforeFns); + afters = afters.concat(suite.afterFns); + + suite = suite.parentSuite; + } + + return { + befores: befores.reverse(), + afters: afters + }; + }; + }; + + var getSpecName = function(spec, suite) { + var fullName = [spec.description], + suiteFullName = suite.getFullName(); + + if (suiteFullName !== '') { + fullName.unshift(suiteFullName); + } + return fullName.join(' '); + }; + + // TODO: we may just be able to pass in the fn instead of wrapping here + var buildExpectationResult = j$.buildExpectationResult, + exceptionFormatter = new j$.ExceptionFormatter(), + expectationResultFactory = function(attrs) { + attrs.messageFormatter = exceptionFormatter.message; + attrs.stackFormatter = exceptionFormatter.stack; + + return buildExpectationResult(attrs); + }; + + /** + * Sets whether Jasmine should throw an Error when an expectation fails. + * This causes a spec to only have one expectation failure. + * @name Env#throwOnExpectationFailure + * @since 2.3.0 + * @function + * @param {Boolean} value Whether to throw when a expectation fails + * @deprecated Use the `oneFailurePerSpec` option with {@link Env#configure} + */ + this.throwOnExpectationFailure = function(value) { + this.deprecated( + 'Setting throwOnExpectationFailure directly on Env is deprecated and will be removed in a future version of Jasmine, please use the oneFailurePerSpec option in `configure`' + ); + this.configure({ oneFailurePerSpec: !!value }); + }; + + this.throwingExpectationFailures = function() { + this.deprecated( + 'Getting throwingExpectationFailures directly from Env is deprecated and will be removed in a future version of Jasmine, please check the oneFailurePerSpec option from `configuration`' + ); + return config.oneFailurePerSpec; + }; + + /** + * Set whether to stop suite execution when a spec fails + * @name Env#stopOnSpecFailure + * @since 2.7.0 + * @function + * @param {Boolean} value Whether to stop suite execution when a spec fails + * @deprecated Use the `failFast` option with {@link Env#configure} + */ + this.stopOnSpecFailure = function(value) { + this.deprecated( + 'Setting stopOnSpecFailure directly is deprecated and will be removed in a future version of Jasmine, please use the failFast option in `configure`' + ); + this.configure({ failFast: !!value }); + }; + + this.stoppingOnSpecFailure = function() { + this.deprecated( + 'Getting stoppingOnSpecFailure directly from Env is deprecated and will be removed in a future version of Jasmine, please check the failFast option from `configuration`' + ); + return config.failFast; + }; + + /** + * Set whether to randomize test execution order + * @name Env#randomizeTests + * @since 2.4.0 + * @function + * @param {Boolean} value Whether to randomize execution order + * @deprecated Use the `random` option with {@link Env#configure} + */ + this.randomizeTests = function(value) { + this.deprecated( + 'Setting randomizeTests directly is deprecated and will be removed in a future version of Jasmine, please use the random option in `configure`' + ); + config.random = !!value; + }; + + this.randomTests = function() { + this.deprecated( + 'Getting randomTests directly from Env is deprecated and will be removed in a future version of Jasmine, please check the random option from `configuration`' + ); + return config.random; + }; + + /** + * Set the random number seed for spec randomization + * @name Env#seed + * @since 2.4.0 + * @function + * @param {Number} value The seed value + * @deprecated Use the `seed` option with {@link Env#configure} + */ + this.seed = function(value) { + this.deprecated( + 'Setting seed directly is deprecated and will be removed in a future version of Jasmine, please use the seed option in `configure`' + ); + if (value) { + config.seed = value; + } + return config.seed; + }; + + this.hidingDisabled = function(value) { + this.deprecated( + 'Getting hidingDisabled directly from Env is deprecated and will be removed in a future version of Jasmine, please check the hideDisabled option from `configuration`' + ); + return config.hideDisabled; + }; + + /** + * @name Env#hideDisabled + * @since 3.2.0 + * @function + */ + this.hideDisabled = function(value) { + this.deprecated( + 'Setting hideDisabled directly is deprecated and will be removed in a future version of Jasmine, please use the hideDisabled option in `configure`' + ); + config.hideDisabled = !!value; + }; + + this.deprecated = function(deprecation) { + var runnable = currentRunnable() || topSuite; + runnable.addDeprecationWarning(deprecation); + if ( + typeof console !== 'undefined' && + typeof console.error === 'function' + ) { + console.error('DEPRECATION:', deprecation); + } + }; + + var queueRunnerFactory = function(options, args) { + var failFast = false; + if (options.isLeaf) { + failFast = config.oneFailurePerSpec; + } else if (!options.isReporter) { + failFast = config.failFast; + } + options.clearStack = options.clearStack || clearStack; + options.timeout = { + setTimeout: realSetTimeout, + clearTimeout: realClearTimeout + }; + options.fail = self.fail; + options.globalErrors = globalErrors; + options.completeOnFirstError = failFast; + options.onException = + options.onException || + function(e) { + (currentRunnable() || topSuite).onException(e); + }; + options.deprecated = self.deprecated; + + new j$.QueueRunner(options).execute(args); + }; + + var topSuite = new j$.Suite({ + env: this, + id: getNextSuiteId(), + description: 'Jasmine__TopLevel__Suite', + expectationFactory: expectationFactory, + asyncExpectationFactory: asyncExpectationFactory, + expectationResultFactory: expectationResultFactory + }); + defaultResourcesForRunnable(topSuite.id); + currentDeclarationSuite = topSuite; + + this.topSuite = function() { + return topSuite; + }; + + /** + * This represents the available reporter callback for an object passed to {@link Env#addReporter}. + * @interface Reporter + * @see custom_reporter + */ + var reporter = new j$.ReportDispatcher( + [ + /** + * `jasmineStarted` is called after all of the specs have been loaded, but just before execution starts. + * @function + * @name Reporter#jasmineStarted + * @param {JasmineStartedInfo} suiteInfo Information about the full Jasmine suite that is being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'jasmineStarted', + /** + * When the entire suite has finished execution `jasmineDone` is called + * @function + * @name Reporter#jasmineDone + * @param {JasmineDoneInfo} suiteInfo Information about the full Jasmine suite that just finished running. + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'jasmineDone', + /** + * `suiteStarted` is invoked when a `describe` starts to run + * @function + * @name Reporter#suiteStarted + * @param {SuiteResult} result Information about the individual {@link describe} being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'suiteStarted', + /** + * `suiteDone` is invoked when all of the child specs and suites for a given suite have been run + * + * While jasmine doesn't require any specific functions, not defining a `suiteDone` will make it impossible for a reporter to know when a suite has failures in an `afterAll`. + * @function + * @name Reporter#suiteDone + * @param {SuiteResult} result + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'suiteDone', + /** + * `specStarted` is invoked when an `it` starts to run (including associated `beforeEach` functions) + * @function + * @name Reporter#specStarted + * @param {SpecResult} result Information about the individual {@link it} being run + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'specStarted', + /** + * `specDone` is invoked when an `it` and its associated `beforeEach` and `afterEach` functions have been run. + * + * While jasmine doesn't require any specific functions, not defining a `specDone` will make it impossible for a reporter to know when a spec has failed. + * @function + * @name Reporter#specDone + * @param {SpecResult} result + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + * @see async + */ + 'specDone' + ], + queueRunnerFactory + ); + + this.execute = function(runnablesToRun) { + installGlobalErrors(); + + if (!runnablesToRun) { + if (focusedRunnables.length) { + runnablesToRun = focusedRunnables; + } else { + runnablesToRun = [topSuite.id]; + } + } + + var order = new j$.Order({ + random: config.random, + seed: config.seed + }); + + var processor = new j$.TreeProcessor({ + tree: topSuite, + runnableIds: runnablesToRun, + queueRunnerFactory: queueRunnerFactory, + failSpecWithNoExpectations: config.failSpecWithNoExpectations, + nodeStart: function(suite, next) { + currentlyExecutingSuites.push(suite); + defaultResourcesForRunnable(suite.id, suite.parentSuite.id); + reporter.suiteStarted(suite.result, next); + suite.startTimer(); + }, + nodeComplete: function(suite, result, next) { + if (suite !== currentSuite()) { + throw new Error('Tried to complete the wrong suite'); + } + + clearResourcesForRunnable(suite.id); + currentlyExecutingSuites.pop(); + + if (result.status === 'failed') { + hasFailures = true; + } + suite.endTimer(); + reporter.suiteDone(result, next); + }, + orderChildren: function(node) { + return order.sort(node.children); + }, + excludeNode: function(spec) { + return !config.specFilter(spec); + } + }); + + if (!processor.processTree().valid) { + throw new Error( + 'Invalid order: would cause a beforeAll or afterAll to be run multiple times' + ); + } + + var jasmineTimer = new j$.Timer(); + jasmineTimer.start(); + + /** + * Information passed to the {@link Reporter#jasmineStarted} event. + * @typedef JasmineStartedInfo + * @property {Int} totalSpecsDefined - The total number of specs defined in this suite. + * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. + */ + reporter.jasmineStarted( + { + totalSpecsDefined: totalSpecsDefined, + order: order + }, + function() { + currentlyExecutingSuites.push(topSuite); + + processor.execute(function() { + clearResourcesForRunnable(topSuite.id); + currentlyExecutingSuites.pop(); + var overallStatus, incompleteReason; + + if (hasFailures || topSuite.result.failedExpectations.length > 0) { + overallStatus = 'failed'; + } else if (focusedRunnables.length > 0) { + overallStatus = 'incomplete'; + incompleteReason = 'fit() or fdescribe() was found'; + } else if (totalSpecsDefined === 0) { + overallStatus = 'incomplete'; + incompleteReason = 'No specs found'; + } else { + overallStatus = 'passed'; + } + + /** + * Information passed to the {@link Reporter#jasmineDone} event. + * @typedef JasmineDoneInfo + * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'. + * @property {Int} totalTime - The total time (in ms) that it took to execute the suite + * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete. + * @property {Order} order - Information about the ordering (random or not) of this execution of the suite. + * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level. + * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level. + */ + reporter.jasmineDone( + { + overallStatus: overallStatus, + totalTime: jasmineTimer.elapsed(), + incompleteReason: incompleteReason, + order: order, + failedExpectations: topSuite.result.failedExpectations, + deprecationWarnings: topSuite.result.deprecationWarnings + }, + function() {} + ); + }); + } + ); + }; + + /** + * Add a custom reporter to the Jasmine environment. + * @name Env#addReporter + * @since 2.0.0 + * @function + * @param {Reporter} reporterToAdd The reporter to be added. + * @see custom_reporter + */ + this.addReporter = function(reporterToAdd) { + reporter.addReporter(reporterToAdd); + }; + + /** + * Provide a fallback reporter if no other reporters have been specified. + * @name Env#provideFallbackReporter + * @since 2.5.0 + * @function + * @param {Reporter} reporterToAdd The reporter + * @see custom_reporter + */ + this.provideFallbackReporter = function(reporterToAdd) { + reporter.provideFallbackReporter(reporterToAdd); + }; + + /** + * Clear all registered reporters + * @name Env#clearReporters + * @since 2.5.2 + * @function + */ + this.clearReporters = function() { + reporter.clearReporters(); + }; + + var spyFactory = new j$.SpyFactory( + function getCustomStrategies() { + var runnable = currentRunnable(); + + if (runnable) { + return runnableResources[runnable.id].customSpyStrategies; + } + + return {}; + }, + function getDefaultStrategyFn() { + var runnable = currentRunnable(); + + if (runnable) { + return runnableResources[runnable.id].defaultStrategyFn; + } + + return undefined; + }, + function getPromise() { + return customPromise || global.Promise; + } + ); + + var spyRegistry = new j$.SpyRegistry({ + currentSpies: function() { + if (!currentRunnable()) { + throw new Error( + 'Spies must be created in a before function or a spec' + ); + } + return runnableResources[currentRunnable().id].spies; + }, + createSpy: function(name, originalFn) { + return self.createSpy(name, originalFn); + } + }); + + this.allowRespy = function(allow) { + spyRegistry.allowRespy(allow); + }; + + this.spyOn = function() { + return spyRegistry.spyOn.apply(spyRegistry, arguments); + }; + + this.spyOnProperty = function() { + return spyRegistry.spyOnProperty.apply(spyRegistry, arguments); + }; + + this.spyOnAllFunctions = function() { + return spyRegistry.spyOnAllFunctions.apply(spyRegistry, arguments); + }; + + this.createSpy = function(name, originalFn) { + if (arguments.length === 1 && j$.isFunction_(name)) { + originalFn = name; + name = originalFn.name; + } + + return spyFactory.createSpy(name, originalFn); + }; + + this.createSpyObj = function(baseName, methodNames, propertyNames) { + return spyFactory.createSpyObj(baseName, methodNames, propertyNames); + }; + + var ensureIsFunction = function(fn, caller) { + if (!j$.isFunction_(fn)) { + throw new Error( + caller + ' expects a function argument; received ' + j$.getType_(fn) + ); + } + }; + + var ensureIsFunctionOrAsync = function(fn, caller) { + if (!j$.isFunction_(fn) && !j$.isAsyncFunction_(fn)) { + throw new Error( + caller + ' expects a function argument; received ' + j$.getType_(fn) + ); + } + }; + + function ensureIsNotNested(method) { + var runnable = currentRunnable(); + if (runnable !== null && runnable !== undefined) { + throw new Error( + "'" + method + "' should only be used in 'describe' function" + ); + } + } + + var suiteFactory = function(description) { + var suite = new j$.Suite({ + env: self, + id: getNextSuiteId(), + description: description, + parentSuite: currentDeclarationSuite, + expectationFactory: expectationFactory, + asyncExpectationFactory: asyncExpectationFactory, + expectationResultFactory: expectationResultFactory, + throwOnExpectationFailure: config.oneFailurePerSpec + }); + + return suite; + }; + + this.describe = function(description, specDefinitions) { + ensureIsNotNested('describe'); + ensureIsFunction(specDefinitions, 'describe'); + var suite = suiteFactory(description); + if (specDefinitions.length > 0) { + throw new Error('describe does not expect any arguments'); + } + if (currentDeclarationSuite.markedPending) { + suite.pend(); + } + addSpecsToSuite(suite, specDefinitions); + return suite; + }; + + this.xdescribe = function(description, specDefinitions) { + ensureIsNotNested('xdescribe'); + ensureIsFunction(specDefinitions, 'xdescribe'); + var suite = suiteFactory(description); + suite.pend(); + addSpecsToSuite(suite, specDefinitions); + return suite; + }; + + var focusedRunnables = []; + + this.fdescribe = function(description, specDefinitions) { + ensureIsNotNested('fdescribe'); + ensureIsFunction(specDefinitions, 'fdescribe'); + var suite = suiteFactory(description); + suite.isFocused = true; + + focusedRunnables.push(suite.id); + unfocusAncestor(); + addSpecsToSuite(suite, specDefinitions); + + return suite; + }; + + function addSpecsToSuite(suite, specDefinitions) { + var parentSuite = currentDeclarationSuite; + parentSuite.addChild(suite); + currentDeclarationSuite = suite; + + var declarationError = null; + try { + specDefinitions.call(suite); + } catch (e) { + declarationError = e; + } + + if (declarationError) { + suite.onException(declarationError); + } + + currentDeclarationSuite = parentSuite; + } + + function findFocusedAncestor(suite) { + while (suite) { + if (suite.isFocused) { + return suite.id; + } + suite = suite.parentSuite; + } + + return null; + } + + function unfocusAncestor() { + var focusedAncestor = findFocusedAncestor(currentDeclarationSuite); + if (focusedAncestor) { + for (var i = 0; i < focusedRunnables.length; i++) { + if (focusedRunnables[i] === focusedAncestor) { + focusedRunnables.splice(i, 1); + break; + } + } + } + } + + var specFactory = function(description, fn, suite, timeout) { + totalSpecsDefined++; + var spec = new j$.Spec({ + id: getNextSpecId(), + beforeAndAfterFns: beforeAndAfterFns(suite), + expectationFactory: expectationFactory, + asyncExpectationFactory: asyncExpectationFactory, + resultCallback: specResultCallback, + getSpecName: function(spec) { + return getSpecName(spec, suite); + }, + onStart: specStarted, + description: description, + expectationResultFactory: expectationResultFactory, + queueRunnerFactory: queueRunnerFactory, + userContext: function() { + return suite.clonedSharedUserContext(); + }, + queueableFn: { + fn: fn, + timeout: timeout || 0 + }, + throwOnExpectationFailure: config.oneFailurePerSpec, + timer: new j$.Timer() + }); + return spec; + + function specResultCallback(result, next) { + clearResourcesForRunnable(spec.id); + currentSpec = null; + + if (result.status === 'failed') { + hasFailures = true; + } + + reporter.specDone(result, next); + } + + function specStarted(spec, next) { + currentSpec = spec; + defaultResourcesForRunnable(spec.id, suite.id); + reporter.specStarted(spec.result, next); + } + }; + + this.it = function(description, fn, timeout) { + ensureIsNotNested('it'); + // it() sometimes doesn't have a fn argument, so only check the type if + // it's given. + if (arguments.length > 1 && typeof fn !== 'undefined') { + ensureIsFunctionOrAsync(fn, 'it'); + } + var spec = specFactory(description, fn, currentDeclarationSuite, timeout); + if (currentDeclarationSuite.markedPending) { + spec.pend(); + } + currentDeclarationSuite.addChild(spec); + return spec; + }; + + this.xit = function(description, fn, timeout) { + ensureIsNotNested('xit'); + // xit(), like it(), doesn't always have a fn argument, so only check the + // type when needed. + if (arguments.length > 1 && typeof fn !== 'undefined') { + ensureIsFunctionOrAsync(fn, 'xit'); + } + var spec = this.it.apply(this, arguments); + spec.pend('Temporarily disabled with xit'); + return spec; + }; + + this.fit = function(description, fn, timeout) { + ensureIsNotNested('fit'); + ensureIsFunctionOrAsync(fn, 'fit'); + var spec = specFactory(description, fn, currentDeclarationSuite, timeout); + currentDeclarationSuite.addChild(spec); + focusedRunnables.push(spec.id); + unfocusAncestor(); + return spec; + }; + + this.expect = function(actual) { + if (!currentRunnable()) { + throw new Error( + "'expect' was used when there was no current spec, this could be because an asynchronous test timed out" + ); + } + + return currentRunnable().expect(actual); + }; + + this.expectAsync = function(actual) { + if (!currentRunnable()) { + throw new Error( + "'expectAsync' was used when there was no current spec, this could be because an asynchronous test timed out" + ); + } + + return currentRunnable().expectAsync(actual); + }; + + this.beforeEach = function(beforeEachFunction, timeout) { + ensureIsNotNested('beforeEach'); + ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach'); + currentDeclarationSuite.beforeEach({ + fn: beforeEachFunction, + timeout: timeout || 0 + }); + }; + + this.beforeAll = function(beforeAllFunction, timeout) { + ensureIsNotNested('beforeAll'); + ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll'); + currentDeclarationSuite.beforeAll({ + fn: beforeAllFunction, + timeout: timeout || 0 + }); + }; + + this.afterEach = function(afterEachFunction, timeout) { + ensureIsNotNested('afterEach'); + ensureIsFunctionOrAsync(afterEachFunction, 'afterEach'); + afterEachFunction.isCleanup = true; + currentDeclarationSuite.afterEach({ + fn: afterEachFunction, + timeout: timeout || 0 + }); + }; + + this.afterAll = function(afterAllFunction, timeout) { + ensureIsNotNested('afterAll'); + ensureIsFunctionOrAsync(afterAllFunction, 'afterAll'); + currentDeclarationSuite.afterAll({ + fn: afterAllFunction, + timeout: timeout || 0 + }); + }; + + this.pending = function(message) { + var fullMessage = j$.Spec.pendingSpecExceptionMessage; + if (message) { + fullMessage += message; + } + throw fullMessage; + }; + + this.fail = function(error) { + if (!currentRunnable()) { + throw new Error( + "'fail' was used when there was no current spec, this could be because an asynchronous test timed out" + ); + } + + var message = 'Failed'; + if (error) { + message += ': '; + if (error.message) { + message += error.message; + } else if (j$.isString_(error)) { + message += error; + } else { + // pretty print all kind of objects. This includes arrays. + message += j$.pp(error); + } + } + + currentRunnable().addExpectationResult(false, { + matcherName: '', + passed: false, + expected: '', + actual: '', + message: message, + error: error && error.message ? error : null + }); + + if (config.oneFailurePerSpec) { + throw new Error(message); + } + }; + } + + return Env; +}; + +getJasmineRequireObj().JsApiReporter = function(j$) { + /** + * @name jsApiReporter + * @classdesc {@link Reporter} added by default in `boot.js` to record results for retrieval in javascript code. An instance is made available as `jsApiReporter` on the global object. + * @class + * @hideconstructor + */ + function JsApiReporter(options) { + var timer = options.timer || j$.noopTimer, + status = 'loaded'; + + this.started = false; + this.finished = false; + this.runDetails = {}; + + this.jasmineStarted = function() { + this.started = true; + status = 'started'; + timer.start(); + }; + + var executionTime; + + this.jasmineDone = function(runDetails) { + this.finished = true; + this.runDetails = runDetails; + executionTime = timer.elapsed(); + status = 'done'; + }; + + /** + * Get the current status for the Jasmine environment. + * @name jsApiReporter#status + * @since 2.0.0 + * @function + * @return {String} - One of `loaded`, `started`, or `done` + */ + this.status = function() { + return status; + }; + + var suites = [], + suites_hash = {}; + + this.suiteStarted = function(result) { + suites_hash[result.id] = result; + }; + + this.suiteDone = function(result) { + storeSuite(result); + }; + + /** + * Get the results for a set of suites. + * + * Retrievable in slices for easier serialization. + * @name jsApiReporter#suiteResults + * @since 2.1.0 + * @function + * @param {Number} index - The position in the suites list to start from. + * @param {Number} length - Maximum number of suite results to return. + * @return {SuiteResult[]} + */ + this.suiteResults = function(index, length) { + return suites.slice(index, index + length); + }; + + function storeSuite(result) { + suites.push(result); + suites_hash[result.id] = result; + } + + /** + * Get all of the suites in a single object, with their `id` as the key. + * @name jsApiReporter#suites + * @since 2.0.0 + * @function + * @return {Object} - Map of suite id to {@link SuiteResult} + */ + this.suites = function() { + return suites_hash; + }; + + var specs = []; + + this.specDone = function(result) { + specs.push(result); + }; + + /** + * Get the results for a set of specs. + * + * Retrievable in slices for easier serialization. + * @name jsApiReporter#specResults + * @since 2.0.0 + * @function + * @param {Number} index - The position in the specs list to start from. + * @param {Number} length - Maximum number of specs results to return. + * @return {SpecResult[]} + */ + this.specResults = function(index, length) { + return specs.slice(index, index + length); + }; + + /** + * Get all spec results. + * @name jsApiReporter#specs + * @since 2.0.0 + * @function + * @return {SpecResult[]} + */ + this.specs = function() { + return specs; + }; + + /** + * Get the number of milliseconds it took for the full Jasmine suite to run. + * @name jsApiReporter#executionTime + * @since 2.0.0 + * @function + * @return {Number} + */ + this.executionTime = function() { + return executionTime; + }; + } + + return JsApiReporter; +}; + +getJasmineRequireObj().Any = function(j$) { + + function Any(expectedObject) { + if (typeof expectedObject === 'undefined') { + throw new TypeError( + 'jasmine.any() expects to be passed a constructor function. ' + + 'Please pass one or use jasmine.anything() to match any object.' + ); + } + this.expectedObject = expectedObject; + } + + Any.prototype.asymmetricMatch = function(other) { + if (this.expectedObject == String) { + return typeof other == 'string' || other instanceof String; + } + + if (this.expectedObject == Number) { + return typeof other == 'number' || other instanceof Number; + } + + if (this.expectedObject == Function) { + return typeof other == 'function' || other instanceof Function; + } + + if (this.expectedObject == Object) { + return other !== null && typeof other == 'object'; + } + + if (this.expectedObject == Boolean) { + return typeof other == 'boolean'; + } + + /* jshint -W122 */ + /* global Symbol */ + if (typeof Symbol != 'undefined' && this.expectedObject == Symbol) { + return typeof other == 'symbol'; + } + /* jshint +W122 */ + + return other instanceof this.expectedObject; + }; + + Any.prototype.jasmineToString = function() { + return ''; + }; + + return Any; +}; + +getJasmineRequireObj().Anything = function(j$) { + + function Anything() {} + + Anything.prototype.asymmetricMatch = function(other) { + return !j$.util.isUndefined(other) && other !== null; + }; + + Anything.prototype.jasmineToString = function() { + return ''; + }; + + return Anything; +}; + +getJasmineRequireObj().ArrayContaining = function(j$) { + function ArrayContaining(sample) { + this.sample = sample; + } + + ArrayContaining.prototype.asymmetricMatch = function(other, customTesters) { + if (!j$.isArray_(this.sample)) { + throw new Error('You must provide an array to arrayContaining, not ' + j$.pp(this.sample) + '.'); + } + + // If the actual parameter is not an array, we can fail immediately, since it couldn't + // possibly be an "array containing" anything. However, we also want an empty sample + // array to match anything, so we need to double-check we aren't in that case + if (!j$.isArray_(other) && this.sample.length > 0) { + return false; + } + + for (var i = 0; i < this.sample.length; i++) { + var item = this.sample[i]; + if (!j$.matchersUtil.contains(other, item, customTesters)) { + return false; + } + } + + return true; + }; + + ArrayContaining.prototype.jasmineToString = function () { + return ''; + }; + + return ArrayContaining; +}; + +getJasmineRequireObj().ArrayWithExactContents = function(j$) { + + function ArrayWithExactContents(sample) { + this.sample = sample; + } + + ArrayWithExactContents.prototype.asymmetricMatch = function(other, customTesters) { + if (!j$.isArray_(this.sample)) { + throw new Error('You must provide an array to arrayWithExactContents, not ' + j$.pp(this.sample) + '.'); + } + + if (this.sample.length !== other.length) { + return false; + } + + for (var i = 0; i < this.sample.length; i++) { + var item = this.sample[i]; + if (!j$.matchersUtil.contains(other, item, customTesters)) { + return false; + } + } + + return true; + }; + + ArrayWithExactContents.prototype.jasmineToString = function() { + return ''; + }; + + return ArrayWithExactContents; +}; + +getJasmineRequireObj().Empty = function (j$) { + + function Empty() {} + + Empty.prototype.asymmetricMatch = function (other) { + if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) { + return other.length === 0; + } + + if (j$.isMap(other) || j$.isSet(other)) { + return other.size === 0; + } + + if (j$.isObject_(other)) { + return Object.keys(other).length === 0; + } + return false; + }; + + Empty.prototype.jasmineToString = function () { + return ''; + }; + + return Empty; +}; + +getJasmineRequireObj().Falsy = function(j$) { + + function Falsy() {} + + Falsy.prototype.asymmetricMatch = function(other) { + return !other; + }; + + Falsy.prototype.jasmineToString = function() { + return ''; + }; + + return Falsy; +}; + +getJasmineRequireObj().MapContaining = function(j$) { + function MapContaining(sample) { + if (!j$.isMap(sample)) { + throw new Error('You must provide a map to `mapContaining`, not ' + j$.pp(sample)); + } + + this.sample = sample; + } + + MapContaining.prototype.asymmetricMatch = function(other, customTesters) { + if (!j$.isMap(other)) return false; + + var hasAllMatches = true; + j$.util.forEachBreakable(this.sample, function(breakLoop, value, key) { + // for each key/value pair in `sample` + // there should be at least one pair in `other` whose key and value both match + var hasMatch = false; + j$.util.forEachBreakable(other, function(oBreakLoop, oValue, oKey) { + if ( + j$.matchersUtil.equals(oKey, key, customTesters) + && j$.matchersUtil.equals(oValue, value, customTesters) + ) { + hasMatch = true; + oBreakLoop(); + } + }); + if (!hasMatch) { + hasAllMatches = false; + breakLoop(); + } + }); + + return hasAllMatches; + }; + + MapContaining.prototype.jasmineToString = function() { + return ''; + }; + + return MapContaining; +}; + +getJasmineRequireObj().NotEmpty = function (j$) { + + function NotEmpty() {} + + NotEmpty.prototype.asymmetricMatch = function (other) { + if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) { + return other.length !== 0; + } + + if (j$.isMap(other) || j$.isSet(other)) { + return other.size !== 0; + } + + if (j$.isObject_(other)) { + return Object.keys(other).length !== 0; + } + + return false; + }; + + NotEmpty.prototype.jasmineToString = function () { + return ''; + }; + + return NotEmpty; +}; + +getJasmineRequireObj().ObjectContaining = function(j$) { + + function ObjectContaining(sample) { + this.sample = sample; + } + + function getPrototype(obj) { + if (Object.getPrototypeOf) { + return Object.getPrototypeOf(obj); + } + + if (obj.constructor.prototype == obj) { + return null; + } + + return obj.constructor.prototype; + } + + function hasProperty(obj, property) { + if (!obj) { + return false; + } + + if (Object.prototype.hasOwnProperty.call(obj, property)) { + return true; + } + + return hasProperty(getPrototype(obj), property); + } + + ObjectContaining.prototype.asymmetricMatch = function(other, customTesters) { + if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); } + + for (var property in this.sample) { + if (!hasProperty(other, property) || + !j$.matchersUtil.equals(this.sample[property], other[property], customTesters)) { + return false; + } + } + + return true; + }; + + ObjectContaining.prototype.jasmineToString = function() { + return ''; + }; + + return ObjectContaining; +}; + +getJasmineRequireObj().SetContaining = function(j$) { + function SetContaining(sample) { + if (!j$.isSet(sample)) { + throw new Error('You must provide a set to `setContaining`, not ' + j$.pp(sample)); + } + + this.sample = sample; + } + + SetContaining.prototype.asymmetricMatch = function(other, customTesters) { + if (!j$.isSet(other)) return false; + + var hasAllMatches = true; + j$.util.forEachBreakable(this.sample, function(breakLoop, item) { + // for each item in `sample` there should be at least one matching item in `other` + // (not using `j$.matchersUtil.contains` because it compares set members by reference, + // not by deep value equality) + var hasMatch = false; + j$.util.forEachBreakable(other, function(oBreakLoop, oItem) { + if (j$.matchersUtil.equals(oItem, item, customTesters)) { + hasMatch = true; + oBreakLoop(); + } + }); + if (!hasMatch) { + hasAllMatches = false; + breakLoop(); + } + }); + + return hasAllMatches; + }; + + SetContaining.prototype.jasmineToString = function() { + return ''; + }; + + return SetContaining; +}; + +getJasmineRequireObj().StringMatching = function(j$) { + + function StringMatching(expected) { + if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { + throw new Error('Expected is not a String or a RegExp'); + } + + this.regexp = new RegExp(expected); + } + + StringMatching.prototype.asymmetricMatch = function(other) { + return this.regexp.test(other); + }; + + StringMatching.prototype.jasmineToString = function() { + return ''; + }; + + return StringMatching; +}; + +getJasmineRequireObj().Truthy = function(j$) { + + function Truthy() {} + + Truthy.prototype.asymmetricMatch = function(other) { + return !!other; + }; + + Truthy.prototype.jasmineToString = function() { + return ''; + }; + + return Truthy; +}; + +getJasmineRequireObj().CallTracker = function(j$) { + /** + * @namespace Spy#calls + * @since 2.0.0 + */ + function CallTracker() { + var calls = []; + var opts = {}; + + this.track = function(context) { + if (opts.cloneArgs) { + context.args = j$.util.cloneArgs(context.args); + } + calls.push(context); + }; + + /** + * Check whether this spy has been invoked. + * @name Spy#calls#any + * @since 2.0.0 + * @function + * @return {Boolean} + */ + this.any = function() { + return !!calls.length; + }; + + /** + * Get the number of invocations of this spy. + * @name Spy#calls#count + * @since 2.0.0 + * @function + * @return {Integer} + */ + this.count = function() { + return calls.length; + }; + + /** + * Get the arguments that were passed to a specific invocation of this spy. + * @name Spy#calls#argsFor + * @since 2.0.0 + * @function + * @param {Integer} index The 0-based invocation index. + * @return {Array} + */ + this.argsFor = function(index) { + var call = calls[index]; + return call ? call.args : []; + }; + + /** + * Get the raw calls array for this spy. + * @name Spy#calls#all + * @since 2.0.0 + * @function + * @return {Spy.callData[]} + */ + this.all = function() { + return calls; + }; + + /** + * Get all of the arguments for each invocation of this spy in the order they were received. + * @name Spy#calls#allArgs + * @since 2.0.0 + * @function + * @return {Array} + */ + this.allArgs = function() { + var callArgs = []; + for (var i = 0; i < calls.length; i++) { + callArgs.push(calls[i].args); + } + + return callArgs; + }; + + /** + * Get the first invocation of this spy. + * @name Spy#calls#first + * @since 2.0.0 + * @function + * @return {ObjecSpy.callData} + */ + this.first = function() { + return calls[0]; + }; + + /** + * Get the most recent invocation of this spy. + * @name Spy#calls#mostRecent + * @since 2.0.0 + * @function + * @return {ObjecSpy.callData} + */ + this.mostRecent = function() { + return calls[calls.length - 1]; + }; + + /** + * Reset this spy as if it has never been called. + * @name Spy#calls#reset + * @since 2.0.0 + * @function + */ + this.reset = function() { + calls = []; + }; + + /** + * Set this spy to do a shallow clone of arguments passed to each invocation. + * @name Spy#calls#saveArgumentsByValue + * @since 2.5.0 + * @function + */ + this.saveArgumentsByValue = function() { + opts.cloneArgs = true; + }; + } + + return CallTracker; +}; + +getJasmineRequireObj().clearStack = function(j$) { + var maxInlineCallCount = 10; + + function messageChannelImpl(global, setTimeout) { + var channel = new global.MessageChannel(), + head = {}, + tail = head; + + var taskRunning = false; + channel.port1.onmessage = function() { + head = head.next; + var task = head.task; + delete head.task; + + if (taskRunning) { + global.setTimeout(task, 0); + } else { + try { + taskRunning = true; + task(); + } finally { + taskRunning = false; + } + } + }; + + var currentCallCount = 0; + return function clearStack(fn) { + currentCallCount++; + + if (currentCallCount < maxInlineCallCount) { + tail = tail.next = { task: fn }; + channel.port2.postMessage(0); + } else { + currentCallCount = 0; + setTimeout(fn); + } + }; + } + + function getClearStack(global) { + var currentCallCount = 0; + var realSetTimeout = global.setTimeout; + var setTimeoutImpl = function clearStack(fn) { + Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]); + }; + + if (j$.isFunction_(global.setImmediate)) { + var realSetImmediate = global.setImmediate; + return function(fn) { + currentCallCount++; + + if (currentCallCount < maxInlineCallCount) { + realSetImmediate(fn); + } else { + currentCallCount = 0; + + setTimeoutImpl(fn); + } + }; + } else if (!j$.util.isUndefined(global.MessageChannel)) { + return messageChannelImpl(global, setTimeoutImpl); + } else { + return setTimeoutImpl; + } + } + + return getClearStack; +}; + +getJasmineRequireObj().Clock = function() { + /* global process */ + var NODE_JS = + typeof process !== 'undefined' && + process.versions && + typeof process.versions.node === 'string'; + + /** + * _Note:_ Do not construct this directly, Jasmine will make one during booting. You can get the current clock with {@link jasmine.clock}. + * @class Clock + * @classdesc Jasmine's mock clock is used when testing time dependent code. + */ + function Clock(global, delayedFunctionSchedulerFactory, mockDate) { + var self = this, + realTimingFunctions = { + setTimeout: global.setTimeout, + clearTimeout: global.clearTimeout, + setInterval: global.setInterval, + clearInterval: global.clearInterval + }, + fakeTimingFunctions = { + setTimeout: setTimeout, + clearTimeout: clearTimeout, + setInterval: setInterval, + clearInterval: clearInterval + }, + installed = false, + delayedFunctionScheduler, + timer; + + self.FakeTimeout = FakeTimeout; + + /** + * Install the mock clock over the built-in methods. + * @name Clock#install + * @since 2.0.0 + * @function + * @return {Clock} + */ + self.install = function() { + if (!originalTimingFunctionsIntact()) { + throw new Error( + 'Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?' + ); + } + replace(global, fakeTimingFunctions); + timer = fakeTimingFunctions; + delayedFunctionScheduler = delayedFunctionSchedulerFactory(); + installed = true; + + return self; + }; + + /** + * Uninstall the mock clock, returning the built-in methods to their places. + * @name Clock#uninstall + * @since 2.0.0 + * @function + */ + self.uninstall = function() { + delayedFunctionScheduler = null; + mockDate.uninstall(); + replace(global, realTimingFunctions); + + timer = realTimingFunctions; + installed = false; + }; + + /** + * Execute a function with a mocked Clock + * + * The clock will be {@link Clock#install|install}ed before the function is called and {@link Clock#uninstall|uninstall}ed in a `finally` after the function completes. + * @name Clock#withMock + * @since 2.3.0 + * @function + * @param {Function} closure The function to be called. + */ + self.withMock = function(closure) { + this.install(); + try { + closure(); + } finally { + this.uninstall(); + } + }; + + /** + * Instruct the installed Clock to also mock the date returned by `new Date()` + * @name Clock#mockDate + * @since 2.1.0 + * @function + * @param {Date} [initialDate=now] The `Date` to provide. + */ + self.mockDate = function(initialDate) { + mockDate.install(initialDate); + }; + + self.setTimeout = function(fn, delay, params) { + return Function.prototype.apply.apply(timer.setTimeout, [ + global, + arguments + ]); + }; + + self.setInterval = function(fn, delay, params) { + return Function.prototype.apply.apply(timer.setInterval, [ + global, + arguments + ]); + }; + + self.clearTimeout = function(id) { + return Function.prototype.call.apply(timer.clearTimeout, [global, id]); + }; + + self.clearInterval = function(id) { + return Function.prototype.call.apply(timer.clearInterval, [global, id]); + }; + + /** + * Tick the Clock forward, running any enqueued timeouts along the way + * @name Clock#tick + * @since 1.3.0 + * @function + * @param {int} millis The number of milliseconds to tick. + */ + self.tick = function(millis) { + if (installed) { + delayedFunctionScheduler.tick(millis, function(millis) { + mockDate.tick(millis); + }); + } else { + throw new Error( + 'Mock clock is not installed, use jasmine.clock().install()' + ); + } + }; + + return self; + + function originalTimingFunctionsIntact() { + return ( + global.setTimeout === realTimingFunctions.setTimeout && + global.clearTimeout === realTimingFunctions.clearTimeout && + global.setInterval === realTimingFunctions.setInterval && + global.clearInterval === realTimingFunctions.clearInterval + ); + } + + function replace(dest, source) { + for (var prop in source) { + dest[prop] = source[prop]; + } + } + + function setTimeout(fn, delay) { + if (!NODE_JS) { + return delayedFunctionScheduler.scheduleFunction( + fn, + delay, + argSlice(arguments, 2) + ); + } + + var timeout = new FakeTimeout(); + + delayedFunctionScheduler.scheduleFunction( + fn, + delay, + argSlice(arguments, 2), + false, + timeout + ); + + return timeout; + } + + function clearTimeout(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function setInterval(fn, interval) { + if (!NODE_JS) { + return delayedFunctionScheduler.scheduleFunction( + fn, + interval, + argSlice(arguments, 2), + true + ); + } + + var timeout = new FakeTimeout(); + + delayedFunctionScheduler.scheduleFunction( + fn, + interval, + argSlice(arguments, 2), + true, + timeout + ); + + return timeout; + } + + function clearInterval(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function argSlice(argsObj, n) { + return Array.prototype.slice.call(argsObj, n); + } + } + + /** + * Mocks Node.js Timeout class + */ + function FakeTimeout() {} + + FakeTimeout.prototype.ref = function() { + return this; + }; + + FakeTimeout.prototype.unref = function() { + return this; + }; + + return Clock; +}; + +getJasmineRequireObj().DelayedFunctionScheduler = function(j$) { + function DelayedFunctionScheduler() { + var self = this; + var scheduledLookup = []; + var scheduledFunctions = {}; + var currentTime = 0; + var delayedFnCount = 0; + var deletedKeys = []; + + self.tick = function(millis, tickDate) { + millis = millis || 0; + var endTime = currentTime + millis; + + runScheduledFunctions(endTime, tickDate); + currentTime = endTime; + }; + + self.scheduleFunction = function( + funcToCall, + millis, + params, + recurring, + timeoutKey, + runAtMillis + ) { + var f; + if (typeof funcToCall === 'string') { + /* jshint evil: true */ + f = function() { + return eval(funcToCall); + }; + /* jshint evil: false */ + } else { + f = funcToCall; + } + + millis = millis || 0; + timeoutKey = timeoutKey || ++delayedFnCount; + runAtMillis = runAtMillis || currentTime + millis; + + var funcToSchedule = { + runAtMillis: runAtMillis, + funcToCall: f, + recurring: recurring, + params: params, + timeoutKey: timeoutKey, + millis: millis + }; + + if (runAtMillis in scheduledFunctions) { + scheduledFunctions[runAtMillis].push(funcToSchedule); + } else { + scheduledFunctions[runAtMillis] = [funcToSchedule]; + scheduledLookup.push(runAtMillis); + scheduledLookup.sort(function(a, b) { + return a - b; + }); + } + + return timeoutKey; + }; + + self.removeFunctionWithId = function(timeoutKey) { + deletedKeys.push(timeoutKey); + + for (var runAtMillis in scheduledFunctions) { + var funcs = scheduledFunctions[runAtMillis]; + var i = indexOfFirstToPass(funcs, function(func) { + return func.timeoutKey === timeoutKey; + }); + + if (i > -1) { + if (funcs.length === 1) { + delete scheduledFunctions[runAtMillis]; + deleteFromLookup(runAtMillis); + } else { + funcs.splice(i, 1); + } + + // intervals get rescheduled when executed, so there's never more + // than a single scheduled function with a given timeoutKey + break; + } + } + }; + + return self; + + function indexOfFirstToPass(array, testFn) { + var index = -1; + + for (var i = 0; i < array.length; ++i) { + if (testFn(array[i])) { + index = i; + break; + } + } + + return index; + } + + function deleteFromLookup(key) { + var value = Number(key); + var i = indexOfFirstToPass(scheduledLookup, function(millis) { + return millis === value; + }); + + if (i > -1) { + scheduledLookup.splice(i, 1); + } + } + + function reschedule(scheduledFn) { + self.scheduleFunction( + scheduledFn.funcToCall, + scheduledFn.millis, + scheduledFn.params, + true, + scheduledFn.timeoutKey, + scheduledFn.runAtMillis + scheduledFn.millis + ); + } + + function forEachFunction(funcsToRun, callback) { + for (var i = 0; i < funcsToRun.length; ++i) { + callback(funcsToRun[i]); + } + } + + function runScheduledFunctions(endTime, tickDate) { + tickDate = tickDate || function() {}; + if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) { + tickDate(endTime - currentTime); + return; + } + + do { + deletedKeys = []; + var newCurrentTime = scheduledLookup.shift(); + tickDate(newCurrentTime - currentTime); + + currentTime = newCurrentTime; + + var funcsToRun = scheduledFunctions[currentTime]; + + delete scheduledFunctions[currentTime]; + + forEachFunction(funcsToRun, function(funcToRun) { + if (funcToRun.recurring) { + reschedule(funcToRun); + } + }); + + forEachFunction(funcsToRun, function(funcToRun) { + if (j$.util.arrayContains(deletedKeys, funcToRun.timeoutKey)) { + // skip a timeoutKey deleted whilst we were running + return; + } + funcToRun.funcToCall.apply(null, funcToRun.params || []); + }); + deletedKeys = []; + } while ( + scheduledLookup.length > 0 && + // checking first if we're out of time prevents setTimeout(0) + // scheduled in a funcToRun from forcing an extra iteration + currentTime !== endTime && + scheduledLookup[0] <= endTime + ); + + // ran out of functions to call, but still time left on the clock + if (currentTime !== endTime) { + tickDate(endTime - currentTime); + } + } + } + + return DelayedFunctionScheduler; +}; + +getJasmineRequireObj().errors = function() { + function ExpectationFailed() {} + + ExpectationFailed.prototype = new Error(); + ExpectationFailed.prototype.constructor = ExpectationFailed; + + return { + ExpectationFailed: ExpectationFailed + }; +}; + +getJasmineRequireObj().ExceptionFormatter = function(j$) { + var ignoredProperties = [ + 'name', + 'message', + 'stack', + 'fileName', + 'sourceURL', + 'line', + 'lineNumber', + 'column', + 'description', + 'jasmineMessage' + ]; + + function ExceptionFormatter(options) { + var jasmineFile = (options && options.jasmineFile) || j$.util.jasmineFile(); + this.message = function(error) { + var message = ''; + + if (error.jasmineMessage) { + message += error.jasmineMessage; + } else if (error.name && error.message) { + message += error.name + ': ' + error.message; + } else if (error.message) { + message += error.message; + } else { + message += error.toString() + ' thrown'; + } + + if (error.fileName || error.sourceURL) { + message += ' in ' + (error.fileName || error.sourceURL); + } + + if (error.line || error.lineNumber) { + message += ' (line ' + (error.line || error.lineNumber) + ')'; + } + + return message; + }; + + this.stack = function(error) { + if (!error || !error.stack) { + return null; + } + + var stackTrace = new j$.StackTrace(error); + var lines = filterJasmine(stackTrace); + var result = ''; + + if (stackTrace.message) { + lines.unshift(stackTrace.message); + } + + result += formatProperties(error); + result += lines.join('\n'); + + return result; + }; + + function filterJasmine(stackTrace) { + var result = [], + jasmineMarker = + stackTrace.style === 'webkit' ? '' : ' at '; + + stackTrace.frames.forEach(function(frame) { + if (frame.file && frame.file !== jasmineFile) { + result.push(frame.raw); + } else if (result[result.length - 1] !== jasmineMarker) { + result.push(jasmineMarker); + } + }); + + return result; + } + + function formatProperties(error) { + if (!(error instanceof Object)) { + return; + } + + var result = {}; + var empty = true; + + for (var prop in error) { + if (j$.util.arrayContains(ignoredProperties, prop)) { + continue; + } + result[prop] = error[prop]; + empty = false; + } + + if (!empty) { + return 'error properties: ' + j$.pp(result) + '\n'; + } + + return ''; + } + } + + return ExceptionFormatter; +}; + +getJasmineRequireObj().Expectation = function(j$) { + /** + * Matchers that come with Jasmine out of the box. + * @namespace matchers + */ + function Expectation(options) { + this.expector = new j$.Expector(options); + + var customMatchers = options.customMatchers || {}; + for (var matcherName in customMatchers) { + this[matcherName] = wrapSyncCompare( + matcherName, + customMatchers[matcherName] + ); + } + } + + /** + * Add some context for an {@link expect} + * @function + * @name matchers#withContext + * @since 3.3.0 + * @param {String} message - Additional context to show when the matcher fails + * @return {matchers} + */ + Expectation.prototype.withContext = function withContext(message) { + return addFilter(this, new ContextAddingFilter(message)); + }; + + /** + * Invert the matcher following this {@link expect} + * @member + * @name matchers#not + * @since 1.3.0 + * @type {matchers} + * @example + * expect(something).not.toBe(true); + */ + Object.defineProperty(Expectation.prototype, 'not', { + get: function() { + return addFilter(this, syncNegatingFilter); + } + }); + + /** + * Asynchronous matchers. + * @namespace async-matchers + */ + function AsyncExpectation(options) { + var global = options.global || j$.getGlobal(); + this.expector = new j$.Expector(options); + + if (!global.Promise) { + throw new Error( + 'expectAsync is unavailable because the environment does not support promises.' + ); + } + + var customAsyncMatchers = options.customAsyncMatchers || {}; + for (var matcherName in customAsyncMatchers) { + this[matcherName] = wrapAsyncCompare( + matcherName, + customAsyncMatchers[matcherName] + ); + } + } + + /** + * Add some context for an {@link expectAsync} + * @function + * @name async-matchers#withContext + * @since 3.3.0 + * @param {String} message - Additional context to show when the async matcher fails + * @return {async-matchers} + */ + AsyncExpectation.prototype.withContext = function withContext(message) { + return addFilter(this, new ContextAddingFilter(message)); + }; + + /** + * Invert the matcher following this {@link expectAsync} + * @member + * @name async-matchers#not + * @type {async-matchers} + * @example + * await expectAsync(myPromise).not.toBeResolved(); + * @example + * return expectAsync(myPromise).not.toBeResolved(); + */ + Object.defineProperty(AsyncExpectation.prototype, 'not', { + get: function() { + return addFilter(this, asyncNegatingFilter); + } + }); + + function wrapSyncCompare(name, matcherFactory) { + return function() { + var result = this.expector.compare(name, matcherFactory, arguments); + this.expector.processResult(result); + }; + } + + function wrapAsyncCompare(name, matcherFactory) { + return function() { + var self = this; + + // Capture the call stack here, before we go async, so that it will contain + // frames that are relevant to the user instead of just parts of Jasmine. + var errorForStack = j$.util.errorWithStack(); + + return this.expector + .compare(name, matcherFactory, arguments) + .then(function(result) { + self.expector.processResult(result, errorForStack); + }); + }; + } + + function addCoreMatchers(prototype, matchers, wrapper) { + for (var matcherName in matchers) { + var matcher = matchers[matcherName]; + prototype[matcherName] = wrapper(matcherName, matcher); + } + } + + function addFilter(source, filter) { + var result = Object.create(source); + result.expector = source.expector.addFilter(filter); + return result; + } + + function negatedFailureMessage(result, matcherName, args, util) { + if (result.message) { + if (j$.isFunction_(result.message)) { + return result.message(); + } else { + return result.message; + } + } + + args = args.slice(); + args.unshift(true); + args.unshift(matcherName); + return util.buildFailureMessage.apply(null, args); + } + + function negate(result) { + result.pass = !result.pass; + return result; + } + + var syncNegatingFilter = { + selectComparisonFunc: function(matcher) { + function defaultNegativeCompare() { + return negate(matcher.compare.apply(null, arguments)); + } + + return matcher.negativeCompare || defaultNegativeCompare; + }, + buildFailureMessage: negatedFailureMessage + }; + + var asyncNegatingFilter = { + selectComparisonFunc: function(matcher) { + function defaultNegativeCompare() { + return matcher.compare.apply(this, arguments).then(negate); + } + + return matcher.negativeCompare || defaultNegativeCompare; + }, + buildFailureMessage: negatedFailureMessage + }; + + function ContextAddingFilter(message) { + this.message = message; + } + + ContextAddingFilter.prototype.modifyFailureMessage = function(msg) { + return this.message + ': ' + msg; + }; + + return { + factory: function(options) { + return new Expectation(options || {}); + }, + addCoreMatchers: function(matchers) { + addCoreMatchers(Expectation.prototype, matchers, wrapSyncCompare); + }, + asyncFactory: function(options) { + return new AsyncExpectation(options || {}); + }, + addAsyncCoreMatchers: function(matchers) { + addCoreMatchers(AsyncExpectation.prototype, matchers, wrapAsyncCompare); + } + }; +}; + +getJasmineRequireObj().ExpectationFilterChain = function() { + function ExpectationFilterChain(maybeFilter, prev) { + this.filter_ = maybeFilter; + this.prev_ = prev; + } + + ExpectationFilterChain.prototype.addFilter = function(filter) { + return new ExpectationFilterChain(filter, this); + }; + + ExpectationFilterChain.prototype.selectComparisonFunc = function(matcher) { + return this.callFirst_('selectComparisonFunc', arguments).result; + }; + + ExpectationFilterChain.prototype.buildFailureMessage = function( + result, + matcherName, + args, + util + ) { + return this.callFirst_('buildFailureMessage', arguments).result; + }; + + ExpectationFilterChain.prototype.modifyFailureMessage = function(msg) { + var result = this.callFirst_('modifyFailureMessage', arguments).result; + return result || msg; + }; + + ExpectationFilterChain.prototype.callFirst_ = function(fname, args) { + var prevResult; + + if (this.prev_) { + prevResult = this.prev_.callFirst_(fname, args); + + if (prevResult.found) { + return prevResult; + } + } + + if (this.filter_ && this.filter_[fname]) { + return { + found: true, + result: this.filter_[fname].apply(this.filter_, args) + }; + } + + return { found: false }; + }; + + return ExpectationFilterChain; +}; + +//TODO: expectation result may make more sense as a presentation of an expectation. +getJasmineRequireObj().buildExpectationResult = function() { + function buildExpectationResult(options) { + var messageFormatter = options.messageFormatter || function() {}, + stackFormatter = options.stackFormatter || function() {}; + + /** + * @typedef Expectation + * @property {String} matcherName - The name of the matcher that was executed for this expectation. + * @property {String} message - The failure message for the expectation. + * @property {String} stack - The stack trace for the failure if available. + * @property {Boolean} passed - Whether the expectation passed or failed. + * @property {Object} expected - If the expectation failed, what was the expected value. + * @property {Object} actual - If the expectation failed, what actual value was produced. + */ + var result = { + matcherName: options.matcherName, + message: message(), + stack: stack(), + passed: options.passed + }; + + if (!result.passed) { + result.expected = options.expected; + result.actual = options.actual; + } + + return result; + + function message() { + if (options.passed) { + return 'Passed.'; + } else if (options.message) { + return options.message; + } else if (options.error) { + return messageFormatter(options.error); + } + return ''; + } + + function stack() { + if (options.passed) { + return ''; + } + + var error = options.error; + if (!error) { + if (options.errorForStack) { + error = options.errorForStack; + } else if (options.stack) { + error = options; + } else { + try { + throw new Error(message()); + } catch (e) { + error = e; + } + } + } + return stackFormatter(error); + } + } + + return buildExpectationResult; +}; + +getJasmineRequireObj().Expector = function(j$) { + function Expector(options) { + this.util = options.util || { buildFailureMessage: function() {} }; + this.customEqualityTesters = options.customEqualityTesters || []; + this.actual = options.actual; + this.addExpectationResult = options.addExpectationResult || function() {}; + this.filters = new j$.ExpectationFilterChain(); + } + + Expector.prototype.instantiateMatcher = function( + matcherName, + matcherFactory, + args + ) { + this.matcherName = matcherName; + this.args = Array.prototype.slice.call(args, 0); + this.expected = this.args.slice(0); + + this.args.unshift(this.actual); + + var matcher = matcherFactory(this.util, this.customEqualityTesters); + var comparisonFunc = this.filters.selectComparisonFunc(matcher); + return comparisonFunc || matcher.compare; + }; + + Expector.prototype.buildMessage = function(result) { + var self = this; + + if (result.pass) { + return ''; + } + + var msg = this.filters.buildFailureMessage( + result, + this.matcherName, + this.args, + this.util, + defaultMessage + ); + return this.filters.modifyFailureMessage(msg || defaultMessage()); + + function defaultMessage() { + if (!result.message) { + var args = self.args.slice(); + args.unshift(false); + args.unshift(self.matcherName); + return self.util.buildFailureMessage.apply(null, args); + } else if (j$.isFunction_(result.message)) { + return result.message(); + } else { + return result.message; + } + } + }; + + Expector.prototype.compare = function(matcherName, matcherFactory, args) { + var matcherCompare = this.instantiateMatcher( + matcherName, + matcherFactory, + args + ); + return matcherCompare.apply(null, this.args); + }; + + Expector.prototype.addFilter = function(filter) { + var result = Object.create(this); + result.filters = this.filters.addFilter(filter); + return result; + }; + + Expector.prototype.processResult = function(result, errorForStack) { + var message = this.buildMessage(result); + + if (this.expected.length === 1) { + this.expected = this.expected[0]; + } + + this.addExpectationResult(result.pass, { + matcherName: this.matcherName, + passed: result.pass, + message: message, + error: errorForStack ? undefined : result.error, + errorForStack: errorForStack || undefined, + actual: this.actual, + expected: this.expected // TODO: this may need to be arrayified/sliced + }); + }; + + return Expector; +}; + +getJasmineRequireObj().formatErrorMsg = function() { + function generateErrorMsg(domain, usage) { + var usageDefinition = usage ? '\nUsage: ' + usage : ''; + + return function errorMsg(msg) { + return domain + ' : ' + msg + usageDefinition; + }; + } + + return generateErrorMsg; +}; + +getJasmineRequireObj().GlobalErrors = function(j$) { + function GlobalErrors(global) { + var handlers = []; + global = global || j$.getGlobal(); + + var onerror = function onerror() { + var handler = handlers[handlers.length - 1]; + + if (handler) { + handler.apply(null, Array.prototype.slice.call(arguments, 0)); + } else { + throw arguments[0]; + } + }; + + this.originalHandlers = {}; + this.jasmineHandlers = {}; + this.installOne_ = function installOne_(errorType, jasmineMessage) { + function taggedOnError(error) { + error.jasmineMessage = jasmineMessage + ': ' + error; + + var handler = handlers[handlers.length - 1]; + + if (handler) { + handler(error); + } else { + throw error; + } + } + + this.originalHandlers[errorType] = global.process.listeners(errorType); + this.jasmineHandlers[errorType] = taggedOnError; + + global.process.removeAllListeners(errorType); + global.process.on(errorType, taggedOnError); + + this.uninstall = function uninstall() { + var errorTypes = Object.keys(this.originalHandlers); + for (var iType = 0; iType < errorTypes.length; iType++) { + var errorType = errorTypes[iType]; + global.process.removeListener( + errorType, + this.jasmineHandlers[errorType] + ); + for (var i = 0; i < this.originalHandlers[errorType].length; i++) { + global.process.on(errorType, this.originalHandlers[errorType][i]); + } + delete this.originalHandlers[errorType]; + delete this.jasmineHandlers[errorType]; + } + }; + }; + + this.install = function install() { + if ( + global.process && + global.process.listeners && + j$.isFunction_(global.process.on) + ) { + this.installOne_('uncaughtException', 'Uncaught exception'); + this.installOne_('unhandledRejection', 'Unhandled promise rejection'); + } else { + var originalHandler = global.onerror; + global.onerror = onerror; + + this.uninstall = function uninstall() { + global.onerror = originalHandler; + }; + } + }; + + this.pushListener = function pushListener(listener) { + handlers.push(listener); + }; + + this.popListener = function popListener() { + handlers.pop(); + }; + } + + return GlobalErrors; +}; + +getJasmineRequireObj().toBeRejected = function(j$) { + /** + * Expect a promise to be rejected. + * @function + * @async + * @name async-matchers#toBeRejected + * @since 3.1.0 + * @example + * await expectAsync(aPromise).toBeRejected(); + * @example + * return expectAsync(aPromise).toBeRejected(); + */ + return function toBeRejected(util) { + return { + compare: function(actual) { + if (!j$.isPromiseLike(actual)) { + throw new Error('Expected toBeRejected to be called on a promise.'); + } + return actual.then( + function() { return {pass: false}; }, + function() { return {pass: true}; } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeRejectedWith = function(j$) { + /** + * Expect a promise to be rejected with a value equal to the expected, using deep equality comparison. + * @function + * @async + * @name async-matchers#toBeRejectedWith + * @since 3.3.0 + * @param {Object} expected - Value that the promise is expected to be rejected with + * @example + * await expectAsync(aPromise).toBeRejectedWith({prop: 'value'}); + * @example + * return expectAsync(aPromise).toBeRejectedWith({prop: 'value'}); + */ + return function toBeRejectedWith(util, customEqualityTesters) { + return { + compare: function(actualPromise, expectedValue) { + if (!j$.isPromiseLike(actualPromise)) { + throw new Error('Expected toBeRejectedWith to be called on a promise.'); + } + + function prefix(passed) { + return 'Expected a promise ' + + (passed ? 'not ' : '') + + 'to be rejected with ' + j$.pp(expectedValue); + } + + return actualPromise.then( + function() { + return { + pass: false, + message: prefix(false) + ' but it was resolved.' + }; + }, + function(actualValue) { + if (util.equals(actualValue, expectedValue, customEqualityTesters)) { + return { + pass: true, + message: prefix(true) + '.' + }; + } else { + return { + pass: false, + message: prefix(false) + ' but it was rejected with ' + j$.pp(actualValue) + '.' + }; + } + } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeRejectedWithError = function(j$) { + /** + * Expect a promise to be rejected with a value matched to the expected + * @function + * @async + * @name async-matchers#toBeRejectedWithError + * @since 3.5.0 + * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used. + * @param {RegExp|String} [message] - The message that should be set on the thrown `Error` + * @example + * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError, 'Error message'); + * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError, /Error message/); + * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError); + * await expectAsync(aPromise).toBeRejectedWithError('Error message'); + * return expectAsync(aPromise).toBeRejectedWithError(/Error message/); + */ + return function toBeRejectedWithError() { + return { + compare: function(actualPromise, arg1, arg2) { + if (!j$.isPromiseLike(actualPromise)) { + throw new Error('Expected toBeRejectedWithError to be called on a promise.'); + } + + var expected = getExpectedFromArgs(arg1, arg2); + + return actualPromise.then( + function() { + return { + pass: false, + message: 'Expected a promise to be rejected but it was resolved.' + }; + }, + function(actualValue) { return matchError(actualValue, expected); } + ); + } + }; + }; + + function matchError(actual, expected) { + if (!j$.isError_(actual)) { + return fail(expected, 'rejected with ' + j$.pp(actual)); + } + + if (!(actual instanceof expected.error)) { + return fail(expected, 'rejected with type ' + j$.fnNameFor(actual.constructor)); + } + + var actualMessage = actual.message; + + if (actualMessage === expected.message || typeof expected.message === 'undefined') { + return pass(expected); + } + + if (expected.message instanceof RegExp && expected.message.test(actualMessage)) { + return pass(expected); + } + + return fail(expected, 'rejected with ' + j$.pp(actual)); + } + + function pass(expected) { + return { + pass: true, + message: 'Expected a promise not to be rejected with ' + expected.printValue + ', but it was.' + }; + } + + function fail(expected, message) { + return { + pass: false, + message: 'Expected a promise to be rejected with ' + expected.printValue + ' but it was ' + message + '.' + }; + } + + + function getExpectedFromArgs(arg1, arg2) { + var error, message; + + if (isErrorConstructor(arg1)) { + error = arg1; + message = arg2; + } else { + error = Error; + message = arg1; + } + + return { + error: error, + message: message, + printValue: j$.fnNameFor(error) + (typeof message === 'undefined' ? '' : ': ' + j$.pp(message)) + }; + } + + function isErrorConstructor(value) { + return typeof value === 'function' && (value === Error || j$.isError_(value.prototype)); + } +}; + +getJasmineRequireObj().toBeResolved = function(j$) { + /** + * Expect a promise to be resolved. + * @function + * @async + * @name async-matchers#toBeResolved + * @since 3.1.0 + * @example + * await expectAsync(aPromise).toBeResolved(); + * @example + * return expectAsync(aPromise).toBeResolved(); + */ + return function toBeResolved(util) { + return { + compare: function(actual) { + if (!j$.isPromiseLike(actual)) { + throw new Error('Expected toBeResolved to be called on a promise.'); + } + + return actual.then( + function() { return {pass: true}; }, + function() { return {pass: false}; } + ); + } + }; + }; +}; + +getJasmineRequireObj().toBeResolvedTo = function(j$) { + /** + * Expect a promise to be resolved to a value equal to the expected, using deep equality comparison. + * @function + * @async + * @name async-matchers#toBeResolvedTo + * @since 3.1.0 + * @param {Object} expected - Value that the promise is expected to resolve to + * @example + * await expectAsync(aPromise).toBeResolvedTo({prop: 'value'}); + * @example + * return expectAsync(aPromise).toBeResolvedTo({prop: 'value'}); + */ + return function toBeResolvedTo(util, customEqualityTesters) { + return { + compare: function(actualPromise, expectedValue) { + if (!j$.isPromiseLike(actualPromise)) { + throw new Error('Expected toBeResolvedTo to be called on a promise.'); + } + + function prefix(passed) { + return 'Expected a promise ' + + (passed ? 'not ' : '') + + 'to be resolved to ' + j$.pp(expectedValue); + } + + return actualPromise.then( + function(actualValue) { + if (util.equals(actualValue, expectedValue, customEqualityTesters)) { + return { + pass: true, + message: prefix(true) + '.' + }; + } else { + return { + pass: false, + message: prefix(false) + ' but it was resolved to ' + j$.pp(actualValue) + '.' + }; + } + }, + function() { + return { + pass: false, + message: prefix(false) + ' but it was rejected.' + }; + } + ); + } + }; + }; +}; + +getJasmineRequireObj().DiffBuilder = function(j$) { + return function DiffBuilder() { + var path = new j$.ObjectPath(), + mismatches = []; + + return { + record: function (actual, expected, formatter) { + formatter = formatter || defaultFormatter; + mismatches.push(formatter(actual, expected, path)); + }, + + getMessage: function () { + return mismatches.join('\n'); + }, + + withPath: function (pathComponent, block) { + var oldPath = path; + path = path.add(pathComponent); + block(); + path = oldPath; + } + }; + + function defaultFormatter (actual, expected, path) { + return 'Expected ' + + path + (path.depth() ? ' = ' : '') + + j$.pp(actual) + + ' to equal ' + + j$.pp(expected) + + '.'; + } + }; +}; + +getJasmineRequireObj().matchersUtil = function(j$) { + // TODO: what to do about jasmine.pp not being inject? move to JSON.stringify? gut PrettyPrinter? + + return { + equals: equals, + + contains: function(haystack, needle, customTesters) { + customTesters = customTesters || []; + + if (j$.isSet(haystack)) { + return haystack.has(needle); + } + + if ((Object.prototype.toString.apply(haystack) === '[object Array]') || + (!!haystack && !haystack.indexOf)) + { + for (var i = 0; i < haystack.length; i++) { + if (equals(haystack[i], needle, customTesters)) { + return true; + } + } + return false; + } + + return !!haystack && haystack.indexOf(needle) >= 0; + }, + + buildFailureMessage: function() { + var args = Array.prototype.slice.call(arguments, 0), + matcherName = args[0], + isNot = args[1], + actual = args[2], + expected = args.slice(3), + englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); + + var message = 'Expected ' + + j$.pp(actual) + + (isNot ? ' not ' : ' ') + + englishyPredicate; + + if (expected.length > 0) { + for (var i = 0; i < expected.length; i++) { + if (i > 0) { + message += ','; + } + message += ' ' + j$.pp(expected[i]); + } + } + + return message + '.'; + } + }; + + function isAsymmetric(obj) { + return obj && j$.isA_('Function', obj.asymmetricMatch); + } + + function asymmetricMatch(a, b, customTesters, diffBuilder) { + var asymmetricA = isAsymmetric(a), + asymmetricB = isAsymmetric(b), + result; + + if (asymmetricA && asymmetricB) { + return undefined; + } + + if (asymmetricA) { + result = a.asymmetricMatch(b, customTesters); + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + + if (asymmetricB) { + result = b.asymmetricMatch(a, customTesters); + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + } + + function equals(a, b, customTesters, diffBuilder) { + customTesters = customTesters || []; + diffBuilder = diffBuilder || j$.NullDiffBuilder(); + + return eq(a, b, [], [], customTesters, diffBuilder); + } + + // Equality function lovingly adapted from isEqual in + // [Underscore](http://underscorejs.org) + function eq(a, b, aStack, bStack, customTesters, diffBuilder) { + var result = true, i; + + var asymmetricResult = asymmetricMatch(a, b, customTesters, diffBuilder); + if (!j$.util.isUndefined(asymmetricResult)) { + return asymmetricResult; + } + + for (i = 0; i < customTesters.length; i++) { + var customTesterResult = customTesters[i](a, b); + if (!j$.util.isUndefined(customTesterResult)) { + if (!customTesterResult) { + diffBuilder.record(a, b); + } + return customTesterResult; + } + } + + if (a instanceof Error && b instanceof Error) { + result = a.message == b.message; + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) { + result = a !== 0 || 1 / a == 1 / b; + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + // A strict comparison is necessary because `null == undefined`. + if (a === null || b === null) { + result = a === b; + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + var className = Object.prototype.toString.call(a); + if (className != Object.prototype.toString.call(b)) { + diffBuilder.record(a, b); + return false; + } + switch (className) { + // Strings, numbers, dates, and booleans are compared by value. + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + result = a == String(b); + if (!result) { + diffBuilder.record(a, b); + } + return result; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for + // other numeric values. + result = a != +a ? b != +b : (a === 0 ? 1 / a == 1 / b : a == +b); + if (!result) { + diffBuilder.record(a, b); + } + return result; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + result = +a == +b; + if (!result) { + diffBuilder.record(a, b); + } + return result; + // RegExps are compared by their source patterns and flags. + case '[object RegExp]': + return a.source == b.source && + a.global == b.global && + a.multiline == b.multiline && + a.ignoreCase == b.ignoreCase; + } + if (typeof a != 'object' || typeof b != 'object') { + diffBuilder.record(a, b); + return false; + } + + var aIsDomNode = j$.isDomNode(a); + var bIsDomNode = j$.isDomNode(b); + if (aIsDomNode && bIsDomNode) { + // At first try to use DOM3 method isEqualNode + result = a.isEqualNode(b); + if (!result) { + diffBuilder.record(a, b); + } + return result; + } + if (aIsDomNode || bIsDomNode) { + diffBuilder.record(a, b); + return false; + } + + var aIsPromise = j$.isPromise(a); + var bIsPromise = j$.isPromise(b); + if (aIsPromise && bIsPromise) { + return a === b; + } + + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] == a) { return bStack[length] == b; } + } + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + var size = 0; + // Recursively compare objects and arrays. + // Compare array lengths to determine if a deep comparison is necessary. + if (className == '[object Array]') { + var aLength = a.length; + var bLength = b.length; + + diffBuilder.withPath('length', function() { + if (aLength !== bLength) { + diffBuilder.record(aLength, bLength); + result = false; + } + }); + + for (i = 0; i < aLength || i < bLength; i++) { + diffBuilder.withPath(i, function() { + if (i >= bLength) { + diffBuilder.record(a[i], void 0, actualArrayIsLongerFormatter); + result = false; + } else { + result = eq(i < aLength ? a[i] : void 0, i < bLength ? b[i] : void 0, aStack, bStack, customTesters, diffBuilder) && result; + } + }); + } + if (!result) { + return false; + } + } else if (j$.isMap(a) && j$.isMap(b)) { + if (a.size != b.size) { + diffBuilder.record(a, b); + return false; + } + + var keysA = []; + var keysB = []; + a.forEach( function( valueA, keyA ) { + keysA.push( keyA ); + }); + b.forEach( function( valueB, keyB ) { + keysB.push( keyB ); + }); + + // For both sets of keys, check they map to equal values in both maps. + // Keep track of corresponding keys (in insertion order) in order to handle asymmetric obj keys. + var mapKeys = [keysA, keysB]; + var cmpKeys = [keysB, keysA]; + var mapIter, mapKey, mapValueA, mapValueB; + var cmpIter, cmpKey; + for (i = 0; result && i < mapKeys.length; i++) { + mapIter = mapKeys[i]; + cmpIter = cmpKeys[i]; + + for (var j = 0; result && j < mapIter.length; j++) { + mapKey = mapIter[j]; + cmpKey = cmpIter[j]; + mapValueA = a.get(mapKey); + + // Only use the cmpKey when one of the keys is asymmetric and the corresponding key matches, + // otherwise explicitly look up the mapKey in the other Map since we want keys with unique + // obj identity (that are otherwise equal) to not match. + if (isAsymmetric(mapKey) || isAsymmetric(cmpKey) && + eq(mapKey, cmpKey, aStack, bStack, customTesters, j$.NullDiffBuilder())) { + mapValueB = b.get(cmpKey); + } else { + mapValueB = b.get(mapKey); + } + result = eq(mapValueA, mapValueB, aStack, bStack, customTesters, j$.NullDiffBuilder()); + } + } + + if (!result) { + diffBuilder.record(a, b); + return false; + } + } else if (j$.isSet(a) && j$.isSet(b)) { + if (a.size != b.size) { + diffBuilder.record(a, b); + return false; + } + + var valuesA = []; + a.forEach( function( valueA ) { + valuesA.push( valueA ); + }); + var valuesB = []; + b.forEach( function( valueB ) { + valuesB.push( valueB ); + }); + + // For both sets, check they are all contained in the other set + var setPairs = [[valuesA, valuesB], [valuesB, valuesA]]; + var stackPairs = [[aStack, bStack], [bStack, aStack]]; + var baseValues, baseValue, baseStack; + var otherValues, otherValue, otherStack; + var found; + var prevStackSize; + for (i = 0; result && i < setPairs.length; i++) { + baseValues = setPairs[i][0]; + otherValues = setPairs[i][1]; + baseStack = stackPairs[i][0]; + otherStack = stackPairs[i][1]; + // For each value in the base set... + for (var k = 0; result && k < baseValues.length; k++) { + baseValue = baseValues[k]; + found = false; + // ... test that it is present in the other set + for (var l = 0; !found && l < otherValues.length; l++) { + otherValue = otherValues[l]; + prevStackSize = baseStack.length; + // compare by value equality + found = eq(baseValue, otherValue, baseStack, otherStack, customTesters, j$.NullDiffBuilder()); + if (!found && prevStackSize !== baseStack.length) { + baseStack.splice(prevStackSize); + otherStack.splice(prevStackSize); + } + } + result = result && found; + } + } + + if (!result) { + diffBuilder.record(a, b); + return false; + } + } else { + + // Objects with different constructors are not equivalent, but `Object`s + // or `Array`s from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && + isFunction(aCtor) && isFunction(bCtor) && + a instanceof aCtor && b instanceof bCtor && + !(aCtor instanceof aCtor && bCtor instanceof bCtor)) { + + diffBuilder.record(a, b, constructorsAreDifferentFormatter); + return false; + } + } + + // Deep compare objects. + var aKeys = keys(a, className == '[object Array]'), key; + size = aKeys.length; + + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (keys(b, className == '[object Array]').length !== size) { + diffBuilder.record(a, b, objectKeysAreDifferentFormatter); + return false; + } + + for (i = 0; i < size; i++) { + key = aKeys[i]; + // Deep compare each member + if (!j$.util.has(b, key)) { + diffBuilder.record(a, b, objectKeysAreDifferentFormatter); + result = false; + continue; + } + + diffBuilder.withPath(key, function() { + if(!eq(a[key], b[key], aStack, bStack, customTesters, diffBuilder)) { + result = false; + } + }); + } + + if (!result) { + return false; + } + + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + + return result; + } + + function keys(obj, isArray) { + var allKeys = Object.keys ? Object.keys(obj) : + (function(o) { + var keys = []; + for (var key in o) { + if (j$.util.has(o, key)) { + keys.push(key); + } + } + return keys; + })(obj); + + if (!isArray) { + return allKeys; + } + + if (allKeys.length === 0) { + return allKeys; + } + + var extraKeys = []; + for (var i = 0; i < allKeys.length; i++) { + if (!/^[0-9]+$/.test(allKeys[i])) { + extraKeys.push(allKeys[i]); + } + } + + return extraKeys; + } + + function isFunction(obj) { + return typeof obj === 'function'; + } + + function objectKeysAreDifferentFormatter(actual, expected, path) { + var missingProperties = j$.util.objectDifference(expected, actual), + extraProperties = j$.util.objectDifference(actual, expected), + missingPropertiesMessage = formatKeyValuePairs(missingProperties), + extraPropertiesMessage = formatKeyValuePairs(extraProperties), + messages = []; + + if (!path.depth()) { + path = 'object'; + } + + if (missingPropertiesMessage.length) { + messages.push('Expected ' + path + ' to have properties' + missingPropertiesMessage); + } + + if (extraPropertiesMessage.length) { + messages.push('Expected ' + path + ' not to have properties' + extraPropertiesMessage); + } + + return messages.join('\n'); + } + + function constructorsAreDifferentFormatter(actual, expected, path) { + if (!path.depth()) { + path = 'object'; + } + + return 'Expected ' + + path + ' to be a kind of ' + + j$.fnNameFor(expected.constructor) + + ', but was ' + j$.pp(actual) + '.'; + } + + function actualArrayIsLongerFormatter(actual, expected, path) { + return 'Unexpected ' + + path + (path.depth() ? ' = ' : '') + + j$.pp(actual) + + ' in array.'; + } + + function formatKeyValuePairs(obj) { + var formatted = ''; + for (var key in obj) { + formatted += '\n ' + key + ': ' + j$.pp(obj[key]); + } + return formatted; + } +}; + +getJasmineRequireObj().nothing = function() { + /** + * {@link expect} nothing explicitly. + * @function + * @name matchers#nothing + * @since 2.8.0 + * @example + * expect().nothing(); + */ + function nothing() { + return { + compare: function() { + return { + pass: true + }; + } + }; + } + + return nothing; +}; + +getJasmineRequireObj().NullDiffBuilder = function(j$) { + return function() { + return { + withPath: function(_, block) { + block(); + }, + record: function() {} + }; + }; +}; + +getJasmineRequireObj().ObjectPath = function(j$) { + function ObjectPath(components) { + this.components = components || []; + } + + ObjectPath.prototype.toString = function() { + if (this.components.length) { + return '$' + map(this.components, formatPropertyAccess).join(''); + } else { + return ''; + } + }; + + ObjectPath.prototype.add = function(component) { + return new ObjectPath(this.components.concat([component])); + }; + + ObjectPath.prototype.depth = function() { + return this.components.length; + }; + + function formatPropertyAccess(prop) { + if (typeof prop === 'number') { + return '[' + prop + ']'; + } + + if (isValidIdentifier(prop)) { + return '.' + prop; + } + + return '[\'' + prop + '\']'; + } + + function map(array, fn) { + var results = []; + for (var i = 0; i < array.length; i++) { + results.push(fn(array[i])); + } + return results; + } + + function isValidIdentifier(string) { + return /^[A-Za-z\$_][A-Za-z0-9\$_]*$/.test(string); + } + + return ObjectPath; +}; + +getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) { + var availableMatchers = [ + 'toBeResolved', + 'toBeRejected', + 'toBeResolvedTo', + 'toBeRejectedWith', + 'toBeRejectedWithError' + ], + matchers = {}; + + for (var i = 0; i < availableMatchers.length; i++) { + var name = availableMatchers[i]; + matchers[name] = jRequire[name](j$); + } + + return matchers; +}; + +getJasmineRequireObj().toBe = function(j$) { + /** + * {@link expect} the actual value to be `===` to the expected value. + * @function + * @name matchers#toBe + * @since 1.3.0 + * @param {Object} expected - The expected value to compare against. + * @example + * expect(thing).toBe(realThing); + */ + function toBe(util) { + var tip = ' Tip: To check for deep equality, use .toEqual() instead of .toBe().'; + + return { + compare: function(actual, expected) { + var result = { + pass: actual === expected + }; + + if (typeof expected === 'object') { + result.message = util.buildFailureMessage('toBe', result.pass, actual, expected) + tip; + } + + return result; + } + }; + } + + return toBe; +}; + +getJasmineRequireObj().toBeCloseTo = function() { + /** + * {@link expect} the actual value to be within a specified precision of the expected value. + * @function + * @name matchers#toBeCloseTo + * @since 1.3.0 + * @param {Object} expected - The expected value to compare against. + * @param {Number} [precision=2] - The number of decimal points to check. + * @example + * expect(number).toBeCloseTo(42.2, 3); + */ + function toBeCloseTo() { + return { + compare: function(actual, expected, precision) { + if (precision !== 0) { + precision = precision || 2; + } + + if (expected === null || actual === null) { + throw new Error('Cannot use toBeCloseTo with null. Arguments evaluated to: ' + + 'expect(' + actual + ').toBeCloseTo(' + expected + ').' + ); + } + + var pow = Math.pow(10, precision + 1); + var delta = Math.abs(expected - actual); + var maxDelta = Math.pow(10, -precision) / 2; + + return { + pass: Math.round(delta * pow) <= maxDelta * pow + }; + } + }; + } + + return toBeCloseTo; +}; + +getJasmineRequireObj().toBeDefined = function() { + /** + * {@link expect} the actual value to be defined. (Not `undefined`) + * @function + * @name matchers#toBeDefined + * @since 1.3.0 + * @example + * expect(result).toBeDefined(); + */ + function toBeDefined() { + return { + compare: function(actual) { + return { + pass: (void 0 !== actual) + }; + } + }; + } + + return toBeDefined; +}; + +getJasmineRequireObj().toBeFalse = function() { + /** + * {@link expect} the actual value to be `false`. + * @function + * @name matchers#toBeFalse + * @since 3.5.0 + * @example + * expect(result).toBeFalse(); + */ + function toBeFalse() { + return { + compare: function(actual) { + return { + pass: actual === false + }; + } + }; + } + + return toBeFalse; +}; + +getJasmineRequireObj().toBeFalsy = function() { + /** + * {@link expect} the actual value to be falsy + * @function + * @name matchers#toBeFalsy + * @since 2.0.0 + * @example + * expect(result).toBeFalsy(); + */ + function toBeFalsy() { + return { + compare: function(actual) { + return { + pass: !actual + }; + } + }; + } + + return toBeFalsy; +}; + +getJasmineRequireObj().toBeGreaterThan = function() { + /** + * {@link expect} the actual value to be greater than the expected value. + * @function + * @name matchers#toBeGreaterThan + * @since 2.0.0 + * @param {Number} expected - The value to compare against. + * @example + * expect(result).toBeGreaterThan(3); + */ + function toBeGreaterThan() { + return { + compare: function(actual, expected) { + return { + pass: actual > expected + }; + } + }; + } + + return toBeGreaterThan; +}; + + +getJasmineRequireObj().toBeGreaterThanOrEqual = function() { + /** + * {@link expect} the actual value to be greater than or equal to the expected value. + * @function + * @name matchers#toBeGreaterThanOrEqual + * @since 2.0.0 + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeGreaterThanOrEqual(25); + */ + function toBeGreaterThanOrEqual() { + return { + compare: function(actual, expected) { + return { + pass: actual >= expected + }; + } + }; + } + + return toBeGreaterThanOrEqual; +}; + +getJasmineRequireObj().toBeInstanceOf = function(j$) { + var usageError = j$.formatErrorMsg('', 'expect(value).toBeInstanceOf()'); + + /** + * {@link expect} the actual to be an instance of the expected class + * @function + * @name matchers#toBeInstanceOf + * @since 3.5.0 + * @param {Object} expected - The class or constructor function to check for + * @example + * expect('foo').toBeInstanceOf(String); + * expect(3).toBeInstanceOf(Number); + * expect(new Error()).toBeInstanceOf(Error); + */ + function toBeInstanceOf(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + var actualType = actual && actual.constructor ? j$.fnNameFor(actual.constructor) : j$.pp(actual), + expectedType = expected ? j$.fnNameFor(expected) : j$.pp(expected), + expectedMatcher, + pass; + + try { + expectedMatcher = new j$.Any(expected); + pass = expectedMatcher.asymmetricMatch(actual); + } catch (error) { + throw new Error(usageError('Expected value is not a constructor function')); + } + + if (pass) { + return { + pass: true, + message: 'Expected instance of ' + actualType + ' not to be an instance of ' + expectedType + }; + } else { + return { + pass: false, + message: 'Expected instance of ' + actualType + ' to be an instance of ' + expectedType + }; + } + } + }; + } + + return toBeInstanceOf; +}; + +getJasmineRequireObj().toBeLessThan = function() { + /** + * {@link expect} the actual value to be less than the expected value. + * @function + * @name matchers#toBeLessThan + * @since 2.0.0 + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeLessThan(0); + */ + function toBeLessThan() { + return { + + compare: function(actual, expected) { + return { + pass: actual < expected + }; + } + }; + } + + return toBeLessThan; +}; + +getJasmineRequireObj().toBeLessThanOrEqual = function() { + /** + * {@link expect} the actual value to be less than or equal to the expected value. + * @function + * @name matchers#toBeLessThanOrEqual + * @since 2.0.0 + * @param {Number} expected - The expected value to compare against. + * @example + * expect(result).toBeLessThanOrEqual(123); + */ + function toBeLessThanOrEqual() { + return { + + compare: function(actual, expected) { + return { + pass: actual <= expected + }; + } + }; + } + + return toBeLessThanOrEqual; +}; + +getJasmineRequireObj().toBeNaN = function(j$) { + /** + * {@link expect} the actual value to be `NaN` (Not a Number). + * @function + * @name matchers#toBeNaN + * @since 1.3.0 + * @example + * expect(thing).toBeNaN(); + */ + function toBeNaN() { + return { + compare: function(actual) { + var result = { + pass: (actual !== actual) + }; + + if (result.pass) { + result.message = 'Expected actual not to be NaN.'; + } else { + result.message = function() { return 'Expected ' + j$.pp(actual) + ' to be NaN.'; }; + } + + return result; + } + }; + } + + return toBeNaN; +}; + +getJasmineRequireObj().toBeNegativeInfinity = function(j$) { + /** + * {@link expect} the actual value to be `-Infinity` (-infinity). + * @function + * @name matchers#toBeNegativeInfinity + * @since 2.6.0 + * @example + * expect(thing).toBeNegativeInfinity(); + */ + function toBeNegativeInfinity() { + return { + compare: function(actual) { + var result = { + pass: (actual === Number.NEGATIVE_INFINITY) + }; + + if (result.pass) { + result.message = 'Expected actual not to be -Infinity.'; + } else { + result.message = function() { return 'Expected ' + j$.pp(actual) + ' to be -Infinity.'; }; + } + + return result; + } + }; + } + + return toBeNegativeInfinity; +}; + +getJasmineRequireObj().toBeNull = function() { + /** + * {@link expect} the actual value to be `null`. + * @function + * @name matchers#toBeNull + * @since 1.3.0 + * @example + * expect(result).toBeNull(); + */ + function toBeNull() { + return { + compare: function(actual) { + return { + pass: actual === null + }; + } + }; + } + + return toBeNull; +}; + +getJasmineRequireObj().toBePositiveInfinity = function(j$) { + /** + * {@link expect} the actual value to be `Infinity` (infinity). + * @function + * @name matchers#toBePositiveInfinity + * @since 2.6.0 + * @example + * expect(thing).toBePositiveInfinity(); + */ + function toBePositiveInfinity() { + return { + compare: function(actual) { + var result = { + pass: (actual === Number.POSITIVE_INFINITY) + }; + + if (result.pass) { + result.message = 'Expected actual not to be Infinity.'; + } else { + result.message = function() { return 'Expected ' + j$.pp(actual) + ' to be Infinity.'; }; + } + + return result; + } + }; + } + + return toBePositiveInfinity; +}; + +getJasmineRequireObj().toBeTrue = function() { + /** + * {@link expect} the actual value to be `true`. + * @function + * @name matchers#toBeTrue + * @since 3.5.0 + * @example + * expect(result).toBeTrue(); + */ + function toBeTrue() { + return { + compare: function(actual) { + return { + pass: actual === true + }; + } + }; + } + + return toBeTrue; +}; + +getJasmineRequireObj().toBeTruthy = function() { + /** + * {@link expect} the actual value to be truthy. + * @function + * @name matchers#toBeTruthy + * @since 2.0.0 + * @example + * expect(thing).toBeTruthy(); + */ + function toBeTruthy() { + return { + compare: function(actual) { + return { + pass: !!actual + }; + } + }; + } + + return toBeTruthy; +}; + +getJasmineRequireObj().toBeUndefined = function() { + /** + * {@link expect} the actual value to be `undefined`. + * @function + * @name matchers#toBeUndefined + * @since 1.3.0 + * @example + * expect(result).toBeUndefined(): + */ + function toBeUndefined() { + return { + compare: function(actual) { + return { + pass: void 0 === actual + }; + } + }; + } + + return toBeUndefined; +}; + +getJasmineRequireObj().toContain = function() { + /** + * {@link expect} the actual value to contain a specific value. + * @function + * @name matchers#toContain + * @since 2.0.0 + * @param {Object} expected - The value to look for. + * @example + * expect(array).toContain(anElement); + * expect(string).toContain(substring); + */ + function toContain(util, customEqualityTesters) { + customEqualityTesters = customEqualityTesters || []; + + return { + compare: function(actual, expected) { + + return { + pass: util.contains(actual, expected, customEqualityTesters) + }; + } + }; + } + + return toContain; +}; + +getJasmineRequireObj().toEqual = function(j$) { + /** + * {@link expect} the actual value to be equal to the expected, using deep equality comparison. + * @function + * @name matchers#toEqual + * @since 1.3.0 + * @param {Object} expected - Expected value + * @example + * expect(bigObject).toEqual({"foo": ['bar', 'baz']}); + */ + function toEqual(util, customEqualityTesters) { + customEqualityTesters = customEqualityTesters || []; + + return { + compare: function(actual, expected) { + var result = { + pass: false + }, + diffBuilder = j$.DiffBuilder(); + + result.pass = util.equals(actual, expected, customEqualityTesters, diffBuilder); + + // TODO: only set error message if test fails + result.message = diffBuilder.getMessage(); + + return result; + } + }; + } + + return toEqual; +}; + +getJasmineRequireObj().toHaveBeenCalled = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('', 'expect().toHaveBeenCalled()'); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called. + * @function + * @name matchers#toHaveBeenCalled + * @since 1.3.0 + * @example + * expect(mySpy).toHaveBeenCalled(); + * expect(mySpy).not.toHaveBeenCalled(); + */ + function toHaveBeenCalled() { + return { + compare: function(actual) { + var result = {}; + + if (!j$.isSpy(actual)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); + } + + if (arguments.length > 1) { + throw new Error(getErrorMsg('Does not take arguments, use toHaveBeenCalledWith')); + } + + result.pass = actual.calls.any(); + + result.message = result.pass ? + 'Expected spy ' + actual.and.identity + ' not to have been called.' : + 'Expected spy ' + actual.and.identity + ' to have been called.'; + + return result; + } + }; + } + + return toHaveBeenCalled; +}; + +getJasmineRequireObj().toHaveBeenCalledBefore = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('', 'expect().toHaveBeenCalledBefore()'); + + /** + * {@link expect} the actual value (a {@link Spy}) to have been called before another {@link Spy}. + * @function + * @name matchers#toHaveBeenCalledBefore + * @since 2.6.0 + * @param {Spy} expected - {@link Spy} that should have been called after the `actual` {@link Spy}. + * @example + * expect(mySpy).toHaveBeenCalledBefore(otherSpy); + */ + function toHaveBeenCalledBefore() { + return { + compare: function(firstSpy, latterSpy) { + if (!j$.isSpy(firstSpy)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(firstSpy) + '.')); + } + if (!j$.isSpy(latterSpy)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(latterSpy) + '.')); + } + + var result = { pass: false }; + + if (!firstSpy.calls.count()) { + result.message = 'Expected spy ' + firstSpy.and.identity + ' to have been called.'; + return result; + } + if (!latterSpy.calls.count()) { + result.message = 'Expected spy ' + latterSpy.and.identity + ' to have been called.'; + return result; + } + + var latest1stSpyCall = firstSpy.calls.mostRecent().invocationOrder; + var first2ndSpyCall = latterSpy.calls.first().invocationOrder; + + result.pass = latest1stSpyCall < first2ndSpyCall; + + if (result.pass) { + result.message = 'Expected spy ' + firstSpy.and.identity + ' to not have been called before spy ' + latterSpy.and.identity + ', but it was'; + } else { + var first1stSpyCall = firstSpy.calls.first().invocationOrder; + var latest2ndSpyCall = latterSpy.calls.mostRecent().invocationOrder; + + if(first1stSpyCall < first2ndSpyCall) { + result.message = 'Expected latest call to spy ' + firstSpy.and.identity + ' to have been called before first call to spy ' + latterSpy.and.identity + ' (no interleaved calls)'; + } else if (latest2ndSpyCall > latest1stSpyCall) { + result.message = 'Expected first call to spy ' + latterSpy.and.identity + ' to have been called after latest call to spy ' + firstSpy.and.identity + ' (no interleaved calls)'; + } else { + result.message = 'Expected spy ' + firstSpy.and.identity + ' to have been called before spy ' + latterSpy.and.identity; + } + } + + return result; + } + }; + } + + return toHaveBeenCalledBefore; +}; + +getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('', 'expect().toHaveBeenCalledTimes()'); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called the specified number of times. + * @function + * @name matchers#toHaveBeenCalledTimes + * @since 2.4.0 + * @param {Number} expected - The number of invocations to look for. + * @example + * expect(mySpy).toHaveBeenCalledTimes(3); + */ + function toHaveBeenCalledTimes() { + return { + compare: function(actual, expected) { + if (!j$.isSpy(actual)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); + } + + var args = Array.prototype.slice.call(arguments, 0), + result = { pass: false }; + + if (!j$.isNumber_(expected)) { + throw new Error(getErrorMsg('The expected times failed is a required argument and must be a number.')); + } + + actual = args[0]; + var calls = actual.calls.count(); + var timesMessage = expected === 1 ? 'once' : expected + ' times'; + result.pass = calls === expected; + result.message = result.pass ? + 'Expected spy ' + actual.and.identity + ' not to have been called ' + timesMessage + '. It was called ' + calls + ' times.' : + 'Expected spy ' + actual.and.identity + ' to have been called ' + timesMessage + '. It was called ' + calls + ' times.'; + return result; + } + }; + } + + return toHaveBeenCalledTimes; +}; + +getJasmineRequireObj().toHaveBeenCalledWith = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('', 'expect().toHaveBeenCalledWith(...arguments)'); + + /** + * {@link expect} the actual (a {@link Spy}) to have been called with particular arguments at least once. + * @function + * @name matchers#toHaveBeenCalledWith + * @since 1.3.0 + * @param {...Object} - The arguments to look for + * @example + * expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2); + */ + function toHaveBeenCalledWith(util, customEqualityTesters) { + return { + compare: function() { + var args = Array.prototype.slice.call(arguments, 0), + actual = args[0], + expectedArgs = args.slice(1), + result = { pass: false }; + + if (!j$.isSpy(actual)) { + throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.')); + } + + if (!actual.calls.any()) { + result.message = function() { + return 'Expected spy ' + actual.and.identity + ' to have been called with:\n' + + ' ' + j$.pp(expectedArgs) + + '\nbut it was never called.'; + }; + return result; + } + + if (util.contains(actual.calls.allArgs(), expectedArgs, customEqualityTesters)) { + result.pass = true; + result.message = function() { + return 'Expected spy ' + actual.and.identity + ' not to have been called with:\n' + + ' ' + j$.pp(expectedArgs) + + '\nbut it was.'; + }; + } else { + result.message = function() { + var prettyPrintedCalls = actual.calls.allArgs().map(function(argsForCall) { + return ' ' + j$.pp(argsForCall); + }); + + var diffs = actual.calls.allArgs().map(function(argsForCall, callIx) { + var diffBuilder = new j$.DiffBuilder(); + util.equals(argsForCall, expectedArgs, customEqualityTesters, diffBuilder); + return 'Call ' + callIx + ':\n' + + diffBuilder.getMessage().replace(/^/mg, ' '); + }); + + return 'Expected spy ' + actual.and.identity + ' to have been called with:\n' + + ' ' + j$.pp(expectedArgs) + '\n' + '' + + 'but actual calls were:\n' + + prettyPrintedCalls.join(',\n') + '.\n\n' + + diffs.join('\n'); + }; + } + + return result; + } + }; + } + + return toHaveBeenCalledWith; +}; + +getJasmineRequireObj().toHaveClass = function(j$) { + /** + * {@link expect} the actual value to be a DOM element that has the expected class + * @function + * @name matchers#toHaveClass + * @since 3.0.0 + * @param {Object} expected - The class name to test for + * @example + * var el = document.createElement('div'); + * el.className = 'foo bar baz'; + * expect(el).toHaveClass('bar'); + */ + function toHaveClass(util, customEqualityTesters) { + return { + compare: function(actual, expected) { + if (!isElement(actual)) { + throw new Error(j$.pp(actual) + ' is not a DOM element'); + } + + return { + pass: actual.classList.contains(expected) + }; + } + }; + } + + function isElement(maybeEl) { + return maybeEl && + maybeEl.classList && + j$.isFunction_(maybeEl.classList.contains); + } + + return toHaveClass; +}; + +getJasmineRequireObj().toMatch = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('', 'expect().toMatch( || )'); + + /** + * {@link expect} the actual value to match a regular expression + * @function + * @name matchers#toMatch + * @since 1.3.0 + * @param {RegExp|String} expected - Value to look for in the string. + * @example + * expect("my string").toMatch(/string$/); + * expect("other string").toMatch("her"); + */ + function toMatch() { + return { + compare: function(actual, expected) { + if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { + throw new Error(getErrorMsg('Expected is not a String or a RegExp')); + } + + var regexp = new RegExp(expected); + + return { + pass: regexp.test(actual) + }; + } + }; + } + + return toMatch; +}; + +getJasmineRequireObj().toThrow = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('', 'expect(function() {}).toThrow()'); + + /** + * {@link expect} a function to `throw` something. + * @function + * @name matchers#toThrow + * @since 2.0.0 + * @param {Object} [expected] - Value that should be thrown. If not provided, simply the fact that something was thrown will be checked. + * @example + * expect(function() { return 'things'; }).toThrow('foo'); + * expect(function() { return 'stuff'; }).toThrow(); + */ + function toThrow(util) { + return { + compare: function(actual, expected) { + var result = { pass: false }, + threw = false, + thrown; + + if (typeof actual != 'function') { + throw new Error(getErrorMsg('Actual is not a Function')); + } + + try { + actual(); + } catch (e) { + threw = true; + thrown = e; + } + + if (!threw) { + result.message = 'Expected function to throw an exception.'; + return result; + } + + if (arguments.length == 1) { + result.pass = true; + result.message = function() { return 'Expected function not to throw, but it threw ' + j$.pp(thrown) + '.'; }; + + return result; + } + + if (util.equals(thrown, expected)) { + result.pass = true; + result.message = function() { return 'Expected function not to throw ' + j$.pp(expected) + '.'; }; + } else { + result.message = function() { return 'Expected function to throw ' + j$.pp(expected) + ', but it threw ' + j$.pp(thrown) + '.'; }; + } + + return result; + } + }; + } + + return toThrow; +}; + +getJasmineRequireObj().toThrowError = function(j$) { + + var getErrorMsg = j$.formatErrorMsg('', 'expect(function() {}).toThrowError(, )'); + + /** + * {@link expect} a function to `throw` an `Error`. + * @function + * @name matchers#toThrowError + * @since 2.0.0 + * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used. + * @param {RegExp|String} [message] - The message that should be set on the thrown `Error` + * @example + * expect(function() { return 'things'; }).toThrowError(MyCustomError, 'message'); + * expect(function() { return 'things'; }).toThrowError(MyCustomError, /bar/); + * expect(function() { return 'stuff'; }).toThrowError(MyCustomError); + * expect(function() { return 'other'; }).toThrowError(/foo/); + * expect(function() { return 'other'; }).toThrowError(); + */ + function toThrowError () { + return { + compare: function(actual) { + var errorMatcher = getMatcher.apply(null, arguments), + thrown; + + if (typeof actual != 'function') { + throw new Error(getErrorMsg('Actual is not a Function')); + } + + try { + actual(); + return fail('Expected function to throw an Error.'); + } catch (e) { + thrown = e; + } + + if (!j$.isError_(thrown)) { + return fail(function() { return 'Expected function to throw an Error, but it threw ' + j$.pp(thrown) + '.'; }); + } + + return errorMatcher.match(thrown); + } + }; + + function getMatcher() { + var expected, errorType; + + if (arguments[2]) { + errorType = arguments[1]; + expected = arguments[2]; + if (!isAnErrorType(errorType)) { + throw new Error(getErrorMsg('Expected error type is not an Error.')); + } + + return exactMatcher(expected, errorType); + } else if (arguments[1]) { + expected = arguments[1]; + + if (isAnErrorType(arguments[1])) { + return exactMatcher(null, arguments[1]); + } else { + return exactMatcher(arguments[1], null); + } + } else { + return anyMatcher(); + } + } + + function anyMatcher() { + return { + match: function(error) { + return pass('Expected function not to throw an Error, but it threw ' + j$.fnNameFor(error) + '.'); + } + }; + } + + function exactMatcher(expected, errorType) { + if (expected && !isStringOrRegExp(expected)) { + if (errorType) { + throw new Error(getErrorMsg('Expected error message is not a string or RegExp.')); + } else { + throw new Error(getErrorMsg('Expected is not an Error, string, or RegExp.')); + } + } + + function messageMatch(message) { + if (typeof expected == 'string') { + return expected == message; + } else { + return expected.test(message); + } + } + + var errorTypeDescription = errorType ? j$.fnNameFor(errorType) : 'an exception'; + + function thrownDescription(thrown) { + var thrownName = errorType ? j$.fnNameFor(thrown.constructor) : 'an exception', + thrownMessage = ''; + + if (expected) { + thrownMessage = ' with message ' + j$.pp(thrown.message); + } + + return thrownName + thrownMessage; + } + + function messageDescription() { + if (expected === null) { + return ''; + } else if (expected instanceof RegExp) { + return ' with a message matching ' + j$.pp(expected); + } else { + return ' with message ' + j$.pp(expected); + } + } + + function matches(error) { + return (errorType === null || error instanceof errorType) && + (expected === null || messageMatch(error.message)); + } + + return { + match: function(thrown) { + if (matches(thrown)) { + return pass(function() { + return 'Expected function not to throw ' + errorTypeDescription + messageDescription() + '.'; + }); + } else { + return fail(function() { + return 'Expected function to throw ' + errorTypeDescription + messageDescription() + + ', but it threw ' + thrownDescription(thrown) + '.'; + }); + } + } + }; + } + + function isStringOrRegExp(potential) { + return potential instanceof RegExp || (typeof potential == 'string'); + } + + function isAnErrorType(type) { + if (typeof type !== 'function') { + return false; + } + + var Surrogate = function() {}; + Surrogate.prototype = type.prototype; + return j$.isError_(new Surrogate()); + } + } + + function pass(message) { + return { + pass: true, + message: message + }; + } + + function fail(message) { + return { + pass: false, + message: message + }; + } + + return toThrowError; +}; + +getJasmineRequireObj().toThrowMatching = function(j$) { + var usageError = j$.formatErrorMsg('', 'expect(function() {}).toThrowMatching()'); + + /** + * {@link expect} a function to `throw` something matching a predicate. + * @function + * @name matchers#toThrowMatching + * @since 3.0.0 + * @param {Function} predicate - A function that takes the thrown exception as its parameter and returns true if it matches. + * @example + * expect(function() { throw new Error('nope'); }).toThrowMatching(function(thrown) { return thrown.message === 'nope'; }); + */ + function toThrowMatching() { + return { + compare: function(actual, predicate) { + var thrown; + + if (typeof actual !== 'function') { + throw new Error(usageError('Actual is not a Function')); + } + + if (typeof predicate !== 'function') { + throw new Error(usageError('Predicate is not a Function')); + } + + try { + actual(); + return fail('Expected function to throw an exception.'); + } catch (e) { + thrown = e; + } + + if (predicate(thrown)) { + return pass('Expected function not to throw an exception matching a predicate.'); + } else { + return fail(function() { + return 'Expected function to throw an exception matching a predicate, ' + + 'but it threw ' + thrownDescription(thrown) + '.'; + }); + } + } + }; + } + + function thrownDescription(thrown) { + if (thrown && thrown.constructor) { + return j$.fnNameFor(thrown.constructor) + ' with message ' + + j$.pp(thrown.message); + } else { + return j$.pp(thrown); + } + } + + function pass(message) { + return { + pass: true, + message: message + }; + } + + function fail(message) { + return { + pass: false, + message: message + }; + } + + return toThrowMatching; +}; + +getJasmineRequireObj().MockDate = function() { + function MockDate(global) { + var self = this; + var currentTime = 0; + + if (!global || !global.Date) { + self.install = function() {}; + self.tick = function() {}; + self.uninstall = function() {}; + return self; + } + + var GlobalDate = global.Date; + + self.install = function(mockDate) { + if (mockDate instanceof GlobalDate) { + currentTime = mockDate.getTime(); + } else { + currentTime = new GlobalDate().getTime(); + } + + global.Date = FakeDate; + }; + + self.tick = function(millis) { + millis = millis || 0; + currentTime = currentTime + millis; + }; + + self.uninstall = function() { + currentTime = 0; + global.Date = GlobalDate; + }; + + createDateProperties(); + + return self; + + function FakeDate() { + switch (arguments.length) { + case 0: + return new GlobalDate(currentTime); + case 1: + return new GlobalDate(arguments[0]); + case 2: + return new GlobalDate(arguments[0], arguments[1]); + case 3: + return new GlobalDate(arguments[0], arguments[1], arguments[2]); + case 4: + return new GlobalDate( + arguments[0], + arguments[1], + arguments[2], + arguments[3] + ); + case 5: + return new GlobalDate( + arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4] + ); + case 6: + return new GlobalDate( + arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4], + arguments[5] + ); + default: + return new GlobalDate( + arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4], + arguments[5], + arguments[6] + ); + } + } + + function createDateProperties() { + FakeDate.prototype = GlobalDate.prototype; + + FakeDate.now = function() { + if (GlobalDate.now) { + return currentTime; + } else { + throw new Error('Browser does not support Date.now()'); + } + }; + + FakeDate.toSource = GlobalDate.toSource; + FakeDate.toString = GlobalDate.toString; + FakeDate.parse = GlobalDate.parse; + FakeDate.UTC = GlobalDate.UTC; + } + } + + return MockDate; +}; + +getJasmineRequireObj().pp = function(j$) { + function PrettyPrinter() { + this.ppNestLevel_ = 0; + this.seen = []; + this.length = 0; + this.stringParts = []; + } + + function hasCustomToString(value) { + // value.toString !== Object.prototype.toString if value has no custom toString but is from another context (e.g. + // iframe, web worker) + try { + return ( + j$.isFunction_(value.toString) && + value.toString !== Object.prototype.toString && + value.toString() !== Object.prototype.toString.call(value) + ); + } catch (e) { + // The custom toString() threw. + return true; + } + } + + PrettyPrinter.prototype.format = function(value) { + this.ppNestLevel_++; + try { + if (j$.util.isUndefined(value)) { + this.emitScalar('undefined'); + } else if (value === null) { + this.emitScalar('null'); + } else if (value === 0 && 1 / value === -Infinity) { + this.emitScalar('-0'); + } else if (value === j$.getGlobal()) { + this.emitScalar(''); + } else if (value.jasmineToString) { + this.emitScalar(value.jasmineToString()); + } else if (typeof value === 'string') { + this.emitString(value); + } else if (j$.isSpy(value)) { + this.emitScalar('spy on ' + value.and.identity); + } else if (j$.isSpy(value.toString)) { + this.emitScalar('spy on ' + value.toString.and.identity); + } else if (value instanceof RegExp) { + this.emitScalar(value.toString()); + } else if (typeof value === 'function') { + this.emitScalar('Function'); + } else if (j$.isDomNode(value)) { + if (value.tagName) { + this.emitDomElement(value); + } else { + this.emitScalar('HTMLNode'); + } + } else if (value instanceof Date) { + this.emitScalar('Date(' + value + ')'); + } else if (j$.isSet(value)) { + this.emitSet(value); + } else if (j$.isMap(value)) { + this.emitMap(value); + } else if (j$.isTypedArray_(value)) { + this.emitTypedArray(value); + } else if ( + value.toString && + typeof value === 'object' && + !j$.isArray_(value) && + hasCustomToString(value) + ) { + try { + this.emitScalar(value.toString()); + } catch (e) { + this.emitScalar('has-invalid-toString-method'); + } + } else if (j$.util.arrayContains(this.seen, value)) { + this.emitScalar( + '' + ); + } else if (j$.isArray_(value) || j$.isA_('Object', value)) { + this.seen.push(value); + if (j$.isArray_(value)) { + this.emitArray(value); + } else { + this.emitObject(value); + } + this.seen.pop(); + } else { + this.emitScalar(value.toString()); + } + } catch (e) { + if (this.ppNestLevel_ > 1 || !(e instanceof MaxCharsReachedError)) { + throw e; + } + } finally { + this.ppNestLevel_--; + } + }; + + PrettyPrinter.prototype.iterateObject = function(obj, fn) { + var objKeys = keys(obj, j$.isArray_(obj)); + var isGetter = function isGetter(prop) {}; + + if (obj.__lookupGetter__) { + isGetter = function isGetter(prop) { + var getter = obj.__lookupGetter__(prop); + return !j$.util.isUndefined(getter) && getter !== null; + }; + } + var length = Math.min(objKeys.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + for (var i = 0; i < length; i++) { + var property = objKeys[i]; + fn(property, isGetter(property)); + } + + return objKeys.length > length; + }; + + PrettyPrinter.prototype.emitScalar = function(value) { + this.append(value); + }; + + PrettyPrinter.prototype.emitString = function(value) { + this.append("'" + value + "'"); + }; + + PrettyPrinter.prototype.emitArray = function(array) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Array'); + return; + } + var length = Math.min(array.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + this.append('[ '); + for (var i = 0; i < length; i++) { + if (i > 0) { + this.append(', '); + } + this.format(array[i]); + } + if (array.length > length) { + this.append(', ...'); + } + + var self = this; + var first = array.length === 0; + var truncated = this.iterateObject(array, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.formatProperty(array, property, isGetter); + }); + + if (truncated) { + this.append(', ...'); + } + + this.append(' ]'); + }; + + PrettyPrinter.prototype.emitSet = function(set) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Set'); + return; + } + this.append('Set( '); + var size = Math.min(set.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + var i = 0; + set.forEach(function(value, key) { + if (i >= size) { + return; + } + if (i > 0) { + this.append(', '); + } + this.format(value); + + i++; + }, this); + if (set.size > size) { + this.append(', ...'); + } + this.append(' )'); + }; + + PrettyPrinter.prototype.emitMap = function(map) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append('Map'); + return; + } + this.append('Map( '); + var size = Math.min(map.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); + var i = 0; + map.forEach(function(value, key) { + if (i >= size) { + return; + } + if (i > 0) { + this.append(', '); + } + this.format([key, value]); + + i++; + }, this); + if (map.size > size) { + this.append(', ...'); + } + this.append(' )'); + }; + + PrettyPrinter.prototype.emitObject = function(obj) { + var ctor = obj.constructor, + constructorName; + + constructorName = + typeof ctor === 'function' && obj instanceof ctor + ? j$.fnNameFor(obj.constructor) + : 'null'; + + this.append(constructorName); + + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + return; + } + + var self = this; + this.append('({ '); + var first = true; + + var truncated = this.iterateObject(obj, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.formatProperty(obj, property, isGetter); + }); + + if (truncated) { + this.append(', ...'); + } + + this.append(' })'); + }; + + PrettyPrinter.prototype.emitTypedArray = function(arr) { + var constructorName = j$.fnNameFor(arr.constructor), + limitedArray = Array.prototype.slice.call( + arr, + 0, + j$.MAX_PRETTY_PRINT_ARRAY_LENGTH + ), + itemsString = Array.prototype.join.call(limitedArray, ', '); + + if (limitedArray.length !== arr.length) { + itemsString += ', ...'; + } + + this.append(constructorName + ' [ ' + itemsString + ' ]'); + }; + + PrettyPrinter.prototype.emitDomElement = function(el) { + var tagName = el.tagName.toLowerCase(), + attrs = el.attributes, + i, + len = attrs.length, + out = '<' + tagName, + attr; + + for (i = 0; i < len; i++) { + attr = attrs[i]; + out += ' ' + attr.name; + + if (attr.value !== '') { + out += '="' + attr.value + '"'; + } + } + + out += '>'; + + if (el.childElementCount !== 0 || el.textContent !== '') { + out += '...'; + } + + this.append(out); + }; + + PrettyPrinter.prototype.formatProperty = function(obj, property, isGetter) { + this.append(property); + this.append(': '); + if (isGetter) { + this.append(''); + } else { + this.format(obj[property]); + } + }; + + PrettyPrinter.prototype.append = function(value) { + // This check protects us from the rare case where an object has overriden + // `toString()` with an invalid implementation (returning a non-string). + if (typeof value !== 'string') { + value = Object.prototype.toString.call(value); + } + + var result = truncate(value, j$.MAX_PRETTY_PRINT_CHARS - this.length); + this.length += result.value.length; + this.stringParts.push(result.value); + + if (result.truncated) { + throw new MaxCharsReachedError(); + } + }; + + function truncate(s, maxlen) { + if (s.length <= maxlen) { + return { value: s, truncated: false }; + } + + s = s.substring(0, maxlen - 4) + ' ...'; + return { value: s, truncated: true }; + } + + function MaxCharsReachedError() { + this.message = + 'Exceeded ' + + j$.MAX_PRETTY_PRINT_CHARS + + ' characters while pretty-printing a value'; + } + + MaxCharsReachedError.prototype = new Error(); + + function keys(obj, isArray) { + var allKeys = Object.keys + ? Object.keys(obj) + : (function(o) { + var keys = []; + for (var key in o) { + if (j$.util.has(o, key)) { + keys.push(key); + } + } + return keys; + })(obj); + + if (!isArray) { + return allKeys; + } + + if (allKeys.length === 0) { + return allKeys; + } + + var extraKeys = []; + for (var i = 0; i < allKeys.length; i++) { + if (!/^[0-9]+$/.test(allKeys[i])) { + extraKeys.push(allKeys[i]); + } + } + + return extraKeys; + } + return function(value) { + var prettyPrinter = new PrettyPrinter(); + prettyPrinter.format(value); + return prettyPrinter.stringParts.join(''); + }; +}; + +getJasmineRequireObj().QueueRunner = function(j$) { + function StopExecutionError() {} + StopExecutionError.prototype = new Error(); + j$.StopExecutionError = StopExecutionError; + + function once(fn) { + var called = false; + return function(arg) { + if (!called) { + called = true; + // Direct call using single parameter, because cleanup/next does not need more + fn(arg); + } + return null; + }; + } + + function emptyFn() {} + + function QueueRunner(attrs) { + var queueableFns = attrs.queueableFns || []; + this.queueableFns = queueableFns.concat(attrs.cleanupFns || []); + this.firstCleanupIx = queueableFns.length; + this.onComplete = attrs.onComplete || emptyFn; + this.clearStack = + attrs.clearStack || + function(fn) { + fn(); + }; + this.onException = attrs.onException || emptyFn; + this.userContext = attrs.userContext || new j$.UserContext(); + this.timeout = attrs.timeout || { + setTimeout: setTimeout, + clearTimeout: clearTimeout + }; + this.fail = attrs.fail || emptyFn; + this.globalErrors = attrs.globalErrors || { + pushListener: emptyFn, + popListener: emptyFn + }; + this.completeOnFirstError = !!attrs.completeOnFirstError; + this.errored = false; + + if (typeof this.onComplete !== 'function') { + throw new Error('invalid onComplete ' + JSON.stringify(this.onComplete)); + } + this.deprecated = attrs.deprecated; + } + + QueueRunner.prototype.execute = function() { + var self = this; + this.handleFinalError = function(message, source, lineno, colno, error) { + // Older browsers would send the error as the first parameter. HTML5 + // specifies the the five parameters above. The error instance should + // be preffered, otherwise the call stack would get lost. + self.onException(error || message); + }; + this.globalErrors.pushListener(this.handleFinalError); + this.run(0); + }; + + QueueRunner.prototype.skipToCleanup = function(lastRanIndex) { + if (lastRanIndex < this.firstCleanupIx) { + this.run(this.firstCleanupIx); + } else { + this.run(lastRanIndex + 1); + } + }; + + QueueRunner.prototype.clearTimeout = function(timeoutId) { + Function.prototype.apply.apply(this.timeout.clearTimeout, [ + j$.getGlobal(), + [timeoutId] + ]); + }; + + QueueRunner.prototype.setTimeout = function(fn, timeout) { + return Function.prototype.apply.apply(this.timeout.setTimeout, [ + j$.getGlobal(), + [fn, timeout] + ]); + }; + + QueueRunner.prototype.attempt = function attempt(iterativeIndex) { + var self = this, + completedSynchronously = true, + handleError = function handleError(error) { + onException(error); + next(error); + }, + cleanup = once(function cleanup() { + if (timeoutId !== void 0) { + self.clearTimeout(timeoutId); + } + self.globalErrors.popListener(handleError); + }), + next = once(function next(err) { + cleanup(); + + if (j$.isError_(err)) { + if (!(err instanceof StopExecutionError) && !err.jasmineMessage) { + self.fail(err); + } + self.errored = errored = true; + } + + function runNext() { + if (self.completeOnFirstError && errored) { + self.skipToCleanup(iterativeIndex); + } else { + self.run(iterativeIndex + 1); + } + } + + if (completedSynchronously) { + self.setTimeout(runNext); + } else { + runNext(); + } + }), + errored = false, + queueableFn = self.queueableFns[iterativeIndex], + timeoutId; + + next.fail = function nextFail() { + self.fail.apply(null, arguments); + self.errored = errored = true; + next(); + }; + + self.globalErrors.pushListener(handleError); + + if (queueableFn.timeout !== undefined) { + var timeoutInterval = queueableFn.timeout || j$.DEFAULT_TIMEOUT_INTERVAL; + timeoutId = self.setTimeout(function() { + var error = new Error( + 'Timeout - Async function did not complete within ' + + timeoutInterval + + 'ms ' + + (queueableFn.timeout + ? '(custom timeout)' + : '(set by jasmine.DEFAULT_TIMEOUT_INTERVAL)') + ); + onException(error); + next(); + }, timeoutInterval); + } + + try { + if (queueableFn.fn.length === 0) { + var maybeThenable = queueableFn.fn.call(self.userContext); + + if (maybeThenable && j$.isFunction_(maybeThenable.then)) { + maybeThenable.then(next, onPromiseRejection); + completedSynchronously = false; + return { completedSynchronously: false }; + } + } else { + queueableFn.fn.call(self.userContext, next); + completedSynchronously = false; + return { completedSynchronously: false }; + } + } catch (e) { + onException(e); + self.errored = errored = true; + } + + cleanup(); + return { completedSynchronously: true, errored: errored }; + + function onException(e) { + self.onException(e); + self.errored = errored = true; + } + + function onPromiseRejection(e) { + onException(e); + next(); + } + }; + + QueueRunner.prototype.run = function(recursiveIndex) { + var length = this.queueableFns.length, + self = this, + iterativeIndex; + + for ( + iterativeIndex = recursiveIndex; + iterativeIndex < length; + iterativeIndex++ + ) { + var result = this.attempt(iterativeIndex); + + if (!result.completedSynchronously) { + return; + } + + self.errored = self.errored || result.errored; + + if (this.completeOnFirstError && result.errored) { + this.skipToCleanup(iterativeIndex); + return; + } + } + + this.clearStack(function() { + self.globalErrors.popListener(self.handleFinalError); + self.onComplete(self.errored && new StopExecutionError()); + }); + }; + + return QueueRunner; +}; + +getJasmineRequireObj().ReportDispatcher = function(j$) { + function ReportDispatcher(methods, queueRunnerFactory) { + var dispatchedMethods = methods || []; + + for (var i = 0; i < dispatchedMethods.length; i++) { + var method = dispatchedMethods[i]; + this[method] = (function(m) { + return function() { + dispatch(m, arguments); + }; + })(method); + } + + var reporters = []; + var fallbackReporter = null; + + this.addReporter = function(reporter) { + reporters.push(reporter); + }; + + this.provideFallbackReporter = function(reporter) { + fallbackReporter = reporter; + }; + + this.clearReporters = function() { + reporters = []; + }; + + return this; + + function dispatch(method, args) { + if (reporters.length === 0 && fallbackReporter !== null) { + reporters.push(fallbackReporter); + } + var onComplete = args[args.length - 1]; + args = j$.util.argsToArray(args).splice(0, args.length - 1); + var fns = []; + for (var i = 0; i < reporters.length; i++) { + var reporter = reporters[i]; + addFn(fns, reporter, method, args); + } + + queueRunnerFactory({ + queueableFns: fns, + onComplete: onComplete, + isReporter: true + }); + } + + function addFn(fns, reporter, method, args) { + var fn = reporter[method]; + if (!fn) { + return; + } + + var thisArgs = j$.util.cloneArgs(args); + if (fn.length <= 1) { + fns.push({ + fn: function() { + return fn.apply(reporter, thisArgs); + } + }); + } else { + fns.push({ + fn: function(done) { + return fn.apply(reporter, thisArgs.concat([done])); + } + }); + } + } + } + + return ReportDispatcher; +}; + +getJasmineRequireObj().interface = function(jasmine, env) { + var jasmineInterface = { + /** + * Callback passed to parts of the Jasmine base interface. + * + * By default Jasmine assumes this function completes synchronously. + * If you have code that you need to test asynchronously, you can declare that you receive a `done` callback, return a Promise, or use the `async` keyword if it is supported in your environment. + * @callback implementationCallback + * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on. + * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion. + */ + + /** + * Create a group of specs (often called a suite). + * + * Calls to `describe` can be nested within other calls to compose your suite as a tree. + * @name describe + * @since 1.3.0 + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + describe: function(description, specDefinitions) { + return env.describe(description, specDefinitions); + }, + + /** + * A temporarily disabled [`describe`]{@link describe} + * + * Specs within an `xdescribe` will be marked pending and not executed + * @name xdescribe + * @since 1.3.0 + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + xdescribe: function(description, specDefinitions) { + return env.xdescribe(description, specDefinitions); + }, + + /** + * A focused [`describe`]{@link describe} + * + * If suites or specs are focused, only those that are focused will be executed + * @see fit + * @name fdescribe + * @since 2.1.0 + * @function + * @global + * @param {String} description Textual description of the group + * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs + */ + fdescribe: function(description, specDefinitions) { + return env.fdescribe(description, specDefinitions); + }, + + /** + * Define a single spec. A spec should contain one or more {@link expect|expectations} that test the state of the code. + * + * A spec whose expectations all succeed will be passing and a spec with any failures will fail. + * @name it + * @since 1.3.0 + * @function + * @global + * @param {String} description Textual description of what this spec is checking + * @param {implementationCallback} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec. + * @see async + */ + it: function() { + return env.it.apply(env, arguments); + }, + + /** + * A temporarily disabled [`it`]{@link it} + * + * The spec will report as `pending` and will not be executed. + * @name xit + * @since 1.3.0 + * @function + * @global + * @param {String} description Textual description of what this spec is checking. + * @param {implementationCallback} [testFunction] Function that contains the code of your test. Will not be executed. + */ + xit: function() { + return env.xit.apply(env, arguments); + }, + + /** + * A focused [`it`]{@link it} + * + * If suites or specs are focused, only those that are focused will be executed. + * @name fit + * @since 2.1.0 + * @function + * @global + * @param {String} description Textual description of what this spec is checking. + * @param {implementationCallback} testFunction Function that contains the code of your test. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec. + * @see async + */ + fit: function() { + return env.fit.apply(env, arguments); + }, + + /** + * Run some shared setup before each of the specs in the {@link describe} in which it is called. + * @name beforeEach + * @since 1.3.0 + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to setup your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach. + * @see async + */ + beforeEach: function() { + return env.beforeEach.apply(env, arguments); + }, + + /** + * Run some shared teardown after each of the specs in the {@link describe} in which it is called. + * @name afterEach + * @since 1.3.0 + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to teardown your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach. + * @see async + */ + afterEach: function() { + return env.afterEach.apply(env, arguments); + }, + + /** + * Run some shared setup once before all of the specs in the {@link describe} are run. + * + * _Note:_ Be careful, sharing the setup from a beforeAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail. + * @name beforeAll + * @since 2.1.0 + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to setup your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll. + * @see async + */ + beforeAll: function() { + return env.beforeAll.apply(env, arguments); + }, + + /** + * Run some shared teardown once after all of the specs in the {@link describe} are run. + * + * _Note:_ Be careful, sharing the teardown from a afterAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail. + * @name afterAll + * @since 2.1.0 + * @function + * @global + * @param {implementationCallback} [function] Function that contains the code to teardown your specs. + * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll. + * @see async + */ + afterAll: function() { + return env.afterAll.apply(env, arguments); + }, + + /** + * Create an expectation for a spec. + * @name expect + * @since 1.3.0 + * @function + * @global + * @param {Object} actual - Actual computed value to test expectations against. + * @return {matchers} + */ + expect: function(actual) { + return env.expect(actual); + }, + + /** + * Create an asynchronous expectation for a spec. Note that the matchers + * that are provided by an asynchronous expectation all return promises + * which must be either returned from the spec or waited for using `await` + * in order for Jasmine to associate them with the correct spec. + * @name expectAsync + * @since 3.3.0 + * @function + * @global + * @param {Object} actual - Actual computed value to test expectations against. + * @return {async-matchers} + * @example + * await expectAsync(somePromise).toBeResolved(); + * @example + * return expectAsync(somePromise).toBeResolved(); + */ + expectAsync: function(actual) { + return env.expectAsync(actual); + }, + + /** + * Mark a spec as pending, expectation results will be ignored. + * @name pending + * @since 2.0.0 + * @function + * @global + * @param {String} [message] - Reason the spec is pending. + */ + pending: function() { + return env.pending.apply(env, arguments); + }, + + /** + * Explicitly mark a spec as failed. + * @name fail + * @since 2.1.0 + * @function + * @global + * @param {String|Error} [error] - Reason for the failure. + */ + fail: function() { + return env.fail.apply(env, arguments); + }, + + /** + * Install a spy onto an existing object. + * @name spyOn + * @since 1.3.0 + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy}. + * @param {String} methodName - The name of the method to replace with a {@link Spy}. + * @returns {Spy} + */ + spyOn: function(obj, methodName) { + return env.spyOn(obj, methodName); + }, + + /** + * Install a spy on a property installed with `Object.defineProperty` onto an existing object. + * @name spyOnProperty + * @since 2.6.0 + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy} + * @param {String} propertyName - The name of the property to replace with a {@link Spy}. + * @param {String} [accessType=get] - The access type (get|set) of the property to {@link Spy} on. + * @returns {Spy} + */ + spyOnProperty: function(obj, methodName, accessType) { + return env.spyOnProperty(obj, methodName, accessType); + }, + + /** + * Installs spies on all writable and configurable properties of an object. + * @name spyOnAllFunctions + * @since 3.2.1 + * @function + * @global + * @param {Object} obj - The object upon which to install the {@link Spy}s + * @returns {Object} the spied object + */ + spyOnAllFunctions: function(obj) { + return env.spyOnAllFunctions(obj); + }, + + jsApiReporter: new jasmine.JsApiReporter({ + timer: new jasmine.Timer() + }), + + /** + * @namespace jasmine + */ + jasmine: jasmine + }; + + /** + * Add a custom equality tester for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addCustomEqualityTester + * @since 2.0.0 + * @function + * @param {Function} tester - A function which takes two arguments to compare and returns a `true` or `false` comparison result if it knows how to compare them, and `undefined` otherwise. + * @see custom_equality + */ + jasmine.addCustomEqualityTester = function(tester) { + env.addCustomEqualityTester(tester); + }; + + /** + * Add custom matchers for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addMatchers + * @since 2.0.0 + * @function + * @param {Object} matchers - Keys from this object will be the new matcher names. + * @see custom_matcher + */ + jasmine.addMatchers = function(matchers) { + return env.addMatchers(matchers); + }; + + /** + * Add custom async matchers for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addAsyncMatchers + * @since 3.5.0 + * @function + * @param {Object} matchers - Keys from this object will be the new async matcher names. + * @see custom_matcher + */ + jasmine.addAsyncMatchers = function(matchers) { + return env.addAsyncMatchers(matchers); + }; + + /** + * Get the currently booted mock {Clock} for this Jasmine environment. + * @name jasmine.clock + * @since 2.0.0 + * @function + * @returns {Clock} + */ + jasmine.clock = function() { + return env.clock; + }; + + /** + * Create a bare {@link Spy} object. This won't be installed anywhere and will not have any implementation behind it. + * @name jasmine.createSpy + * @since 1.3.0 + * @function + * @param {String} [name] - Name to give the spy. This will be displayed in failure messages. + * @param {Function} [originalFn] - Function to act as the real implementation. + * @return {Spy} + */ + jasmine.createSpy = function(name, originalFn) { + return env.createSpy(name, originalFn); + }; + + /** + * Create an object with multiple {@link Spy}s as its members. + * @name jasmine.createSpyObj + * @since 1.3.0 + * @function + * @param {String} [baseName] - Base name for the spies in the object. + * @param {String[]|Object} methodNames - Array of method names to create spies for, or Object whose keys will be method names and values the {@link Spy#and#returnValue|returnValue}. + * @param {String[]|Object} [propertyNames] - Array of property names to create spies for, or Object whose keys will be propertynames and values the {@link Spy#and#returnValue|returnValue}. + * @return {Object} + */ + jasmine.createSpyObj = function(baseName, methodNames, propertyNames) { + return env.createSpyObj(baseName, methodNames, propertyNames); + }; + + /** + * Add a custom spy strategy for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.addSpyStrategy + * @since 3.5.0 + * @function + * @param {String} name - The name of the strategy (i.e. what you call from `and`) + * @param {Function} factory - Factory function that returns the plan to be executed. + */ + jasmine.addSpyStrategy = function(name, factory) { + return env.addSpyStrategy(name, factory); + }; + + /** + * Set the default spy strategy for the current scope of specs. + * + * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}. + * @name jasmine.setDefaultSpyStrategy + * @function + * @param {Function} defaultStrategyFn - a function that assigns a strategy + * @example + * beforeEach(function() { + * jasmine.setDefaultSpyStrategy(and => and.returnValue(true)); + * }); + */ + jasmine.setDefaultSpyStrategy = function(defaultStrategyFn) { + return env.setDefaultSpyStrategy(defaultStrategyFn); + }; + + return jasmineInterface; +}; + +getJasmineRequireObj().Spy = function(j$) { + var nextOrder = (function() { + var order = 0; + + return function() { + return order++; + }; + })(); + + /** + * _Note:_ Do not construct this directly, use {@link spyOn}, {@link spyOnProperty}, {@link jasmine.createSpy}, or {@link jasmine.createSpyObj} + * @constructor + * @name Spy + */ + function Spy( + name, + originalFn, + customStrategies, + defaultStrategyFn, + getPromise + ) { + var numArgs = typeof originalFn === 'function' ? originalFn.length : 0, + wrapper = makeFunc(numArgs, function() { + return spy.apply(this, Array.prototype.slice.call(arguments)); + }), + strategyDispatcher = new SpyStrategyDispatcher({ + name: name, + fn: originalFn, + getSpy: function() { + return wrapper; + }, + customStrategies: customStrategies, + getPromise: getPromise + }), + callTracker = new j$.CallTracker(), + spy = function() { + /** + * @name Spy.callData + * @property {object} object - `this` context for the invocation. + * @property {number} invocationOrder - Order of the invocation. + * @property {Array} args - The arguments passed for this invocation. + */ + var callData = { + object: this, + invocationOrder: nextOrder(), + args: Array.prototype.slice.apply(arguments) + }; + + callTracker.track(callData); + var returnValue = strategyDispatcher.exec(this, arguments); + callData.returnValue = returnValue; + + return returnValue; + }; + + function makeFunc(length, fn) { + switch (length) { + case 1: + return function(a) { + return fn.apply(this, arguments); + }; + case 2: + return function(a, b) { + return fn.apply(this, arguments); + }; + case 3: + return function(a, b, c) { + return fn.apply(this, arguments); + }; + case 4: + return function(a, b, c, d) { + return fn.apply(this, arguments); + }; + case 5: + return function(a, b, c, d, e) { + return fn.apply(this, arguments); + }; + case 6: + return function(a, b, c, d, e, f) { + return fn.apply(this, arguments); + }; + case 7: + return function(a, b, c, d, e, f, g) { + return fn.apply(this, arguments); + }; + case 8: + return function(a, b, c, d, e, f, g, h) { + return fn.apply(this, arguments); + }; + case 9: + return function(a, b, c, d, e, f, g, h, i) { + return fn.apply(this, arguments); + }; + default: + return function() { + return fn.apply(this, arguments); + }; + } + } + + for (var prop in originalFn) { + if (prop === 'and' || prop === 'calls') { + throw new Error( + "Jasmine spies would overwrite the 'and' and 'calls' properties on the object being spied upon" + ); + } + + wrapper[prop] = originalFn[prop]; + } + + /** + * @member {SpyStrategy} - Accesses the default strategy for the spy. This strategy will be used + * whenever the spy is called with arguments that don't match any strategy + * created with {@link Spy#withArgs}. + * @name Spy#and + * @since 2.0.0 + * @example + * spyOn(someObj, 'func').and.returnValue(42); + */ + wrapper.and = strategyDispatcher.and; + /** + * Specifies a strategy to be used for calls to the spy that have the + * specified arguments. + * @name Spy#withArgs + * @since 3.0.0 + * @function + * @param {...*} args - The arguments to match + * @type {SpyStrategy} + * @example + * spyOn(someObj, 'func').withArgs(1, 2, 3).and.returnValue(42); + * someObj.func(1, 2, 3); // returns 42 + */ + wrapper.withArgs = function() { + return strategyDispatcher.withArgs.apply(strategyDispatcher, arguments); + }; + wrapper.calls = callTracker; + + if (defaultStrategyFn) { + defaultStrategyFn(wrapper.and); + } + + return wrapper; + } + + function SpyStrategyDispatcher(strategyArgs) { + var baseStrategy = new j$.SpyStrategy(strategyArgs); + var argsStrategies = new StrategyDict(function() { + return new j$.SpyStrategy(strategyArgs); + }); + + this.and = baseStrategy; + + this.exec = function(spy, args) { + var strategy = argsStrategies.get(args); + + if (!strategy) { + if (argsStrategies.any() && !baseStrategy.isConfigured()) { + throw new Error( + "Spy '" + + strategyArgs.name + + "' received a call with arguments " + + j$.pp(Array.prototype.slice.call(args)) + + ' but all configured strategies specify other arguments.' + ); + } else { + strategy = baseStrategy; + } + } + + return strategy.exec(spy, args); + }; + + this.withArgs = function() { + return { and: argsStrategies.getOrCreate(arguments) }; + }; + } + + function StrategyDict(strategyFactory) { + this.strategies = []; + this.strategyFactory = strategyFactory; + } + + StrategyDict.prototype.any = function() { + return this.strategies.length > 0; + }; + + StrategyDict.prototype.getOrCreate = function(args) { + var strategy = this.get(args); + + if (!strategy) { + strategy = this.strategyFactory(); + this.strategies.push({ + args: args, + strategy: strategy + }); + } + + return strategy; + }; + + StrategyDict.prototype.get = function(args) { + var i; + + for (i = 0; i < this.strategies.length; i++) { + if (j$.matchersUtil.equals(args, this.strategies[i].args)) { + return this.strategies[i].strategy; + } + } + }; + + return Spy; +}; + +getJasmineRequireObj().SpyFactory = function(j$) { + function SpyFactory(getCustomStrategies, getDefaultStrategyFn, getPromise) { + var self = this; + + this.createSpy = function(name, originalFn) { + return j$.Spy( + name, + originalFn, + getCustomStrategies(), + getDefaultStrategyFn(), + getPromise + ); + }; + + this.createSpyObj = function(baseName, methodNames, propertyNames) { + var baseNameIsCollection = + j$.isObject_(baseName) || j$.isArray_(baseName); + + if (baseNameIsCollection) { + propertyNames = methodNames; + methodNames = baseName; + baseName = 'unknown'; + } + + var obj = {}; + var spy, descriptor; + + var methods = normalizeKeyValues(methodNames); + for (var i = 0; i < methods.length; i++) { + spy = obj[methods[i][0]] = self.createSpy( + baseName + '.' + methods[i][0] + ); + if (methods[i].length > 1) { + spy.and.returnValue(methods[i][1]); + } + } + + var properties = normalizeKeyValues(propertyNames); + for (var i = 0; i < properties.length; i++) { + descriptor = { + get: self.createSpy(baseName + '.' + properties[i][0] + '.get'), + set: self.createSpy(baseName + '.' + properties[i][0] + '.set') + }; + if (properties[i].length > 1) { + descriptor.get.and.returnValue(properties[i][1]); + descriptor.set.and.returnValue(properties[i][1]); + } + Object.defineProperty(obj, properties[i][0], descriptor); + } + + if (methods.length === 0 && properties.length === 0) { + throw 'createSpyObj requires a non-empty array or object of method names to create spies for'; + } + + return obj; + }; + } + + function normalizeKeyValues(object) { + var result = []; + if (j$.isArray_(object)) { + for (var i = 0; i < object.length; i++) { + result.push([object[i]]); + } + } else if (j$.isObject_(object)) { + for (var key in object) { + if (object.hasOwnProperty(key)) { + result.push([key, object[key]]); + } + } + } + return result; + } + + return SpyFactory; +}; + +getJasmineRequireObj().SpyRegistry = function(j$) { + var spyOnMsg = j$.formatErrorMsg('', 'spyOn(, )'); + var spyOnPropertyMsg = j$.formatErrorMsg( + '', + 'spyOnProperty(, , [accessType])' + ); + + function SpyRegistry(options) { + options = options || {}; + var global = options.global || j$.getGlobal(); + var createSpy = options.createSpy; + var currentSpies = + options.currentSpies || + function() { + return []; + }; + + this.allowRespy = function(allow) { + this.respy = allow; + }; + + this.spyOn = function(obj, methodName) { + var getErrorMsg = spyOnMsg; + + if (j$.util.isUndefined(obj) || obj === null) { + throw new Error( + getErrorMsg( + 'could not find an object to spy upon for ' + methodName + '()' + ) + ); + } + + if (j$.util.isUndefined(methodName) || methodName === null) { + throw new Error(getErrorMsg('No method name supplied')); + } + + if (j$.util.isUndefined(obj[methodName])) { + throw new Error(getErrorMsg(methodName + '() method does not exist')); + } + + if (obj[methodName] && j$.isSpy(obj[methodName])) { + if (this.respy) { + return obj[methodName]; + } else { + throw new Error( + getErrorMsg(methodName + ' has already been spied upon') + ); + } + } + + var descriptor = Object.getOwnPropertyDescriptor(obj, methodName); + + if (descriptor && !(descriptor.writable || descriptor.set)) { + throw new Error( + getErrorMsg(methodName + ' is not declared writable or has no setter') + ); + } + + var originalMethod = obj[methodName], + spiedMethod = createSpy(methodName, originalMethod), + restoreStrategy; + + if ( + Object.prototype.hasOwnProperty.call(obj, methodName) || + (obj === global && methodName === 'onerror') + ) { + restoreStrategy = function() { + obj[methodName] = originalMethod; + }; + } else { + restoreStrategy = function() { + if (!delete obj[methodName]) { + obj[methodName] = originalMethod; + } + }; + } + + currentSpies().push({ + restoreObjectToOriginalState: restoreStrategy + }); + + obj[methodName] = spiedMethod; + + return spiedMethod; + }; + + this.spyOnProperty = function(obj, propertyName, accessType) { + var getErrorMsg = spyOnPropertyMsg; + + accessType = accessType || 'get'; + + if (j$.util.isUndefined(obj)) { + throw new Error( + getErrorMsg( + 'spyOn could not find an object to spy upon for ' + + propertyName + + '' + ) + ); + } + + if (j$.util.isUndefined(propertyName)) { + throw new Error(getErrorMsg('No property name supplied')); + } + + var descriptor = j$.util.getPropertyDescriptor(obj, propertyName); + + if (!descriptor) { + throw new Error(getErrorMsg(propertyName + ' property does not exist')); + } + + if (!descriptor.configurable) { + throw new Error( + getErrorMsg(propertyName + ' is not declared configurable') + ); + } + + if (!descriptor[accessType]) { + throw new Error( + getErrorMsg( + 'Property ' + + propertyName + + ' does not have access type ' + + accessType + ) + ); + } + + if (j$.isSpy(descriptor[accessType])) { + if (this.respy) { + return descriptor[accessType]; + } else { + throw new Error( + getErrorMsg( + propertyName + '#' + accessType + ' has already been spied upon' + ) + ); + } + } + + var originalDescriptor = j$.util.clone(descriptor), + spy = createSpy(propertyName, descriptor[accessType]), + restoreStrategy; + + if (Object.prototype.hasOwnProperty.call(obj, propertyName)) { + restoreStrategy = function() { + Object.defineProperty(obj, propertyName, originalDescriptor); + }; + } else { + restoreStrategy = function() { + delete obj[propertyName]; + }; + } + + currentSpies().push({ + restoreObjectToOriginalState: restoreStrategy + }); + + descriptor[accessType] = spy; + + Object.defineProperty(obj, propertyName, descriptor); + + return spy; + }; + + this.spyOnAllFunctions = function(obj) { + if (j$.util.isUndefined(obj)) { + throw new Error( + 'spyOnAllFunctions could not find an object to spy upon' + ); + } + + var pointer = obj, + props = [], + prop, + descriptor; + + while (pointer) { + for (prop in pointer) { + if ( + Object.prototype.hasOwnProperty.call(pointer, prop) && + pointer[prop] instanceof Function + ) { + descriptor = Object.getOwnPropertyDescriptor(pointer, prop); + if ( + (descriptor.writable || descriptor.set) && + descriptor.configurable + ) { + props.push(prop); + } + } + } + pointer = Object.getPrototypeOf(pointer); + } + + for (var i = 0; i < props.length; i++) { + this.spyOn(obj, props[i]); + } + + return obj; + }; + + this.clearSpies = function() { + var spies = currentSpies(); + for (var i = spies.length - 1; i >= 0; i--) { + var spyEntry = spies[i]; + spyEntry.restoreObjectToOriginalState(); + } + }; + } + + return SpyRegistry; +}; + +getJasmineRequireObj().SpyStrategy = function(j$) { + /** + * @interface SpyStrategy + */ + function SpyStrategy(options) { + options = options || {}; + + var self = this; + + /** + * Get the identifying information for the spy. + * @name SpyStrategy#identity + * @since 3.0.0 + * @member + * @type {String} + */ + this.identity = options.name || 'unknown'; + this.originalFn = options.fn || function() {}; + this.getSpy = options.getSpy || function() {}; + this.plan = this._defaultPlan = function() {}; + + var k, + cs = options.customStrategies || {}; + for (k in cs) { + if (j$.util.has(cs, k) && !this[k]) { + this[k] = createCustomPlan(cs[k]); + } + } + + var getPromise = + typeof options.getPromise === 'function' + ? options.getPromise + : function() {}; + + var requirePromise = function(name) { + var Promise = getPromise(); + + if (!Promise) { + throw new Error( + name + + ' requires global Promise, or `Promise` configured with `jasmine.getEnv().configure()`' + ); + } + + return Promise; + }; + + /** + * Tell the spy to return a promise resolving to the specified value when invoked. + * @name SpyStrategy#resolveTo + * @since 3.5.0 + * @function + * @param {*} value The value to return. + */ + this.resolveTo = function(value) { + var Promise = requirePromise('resolveTo'); + self.plan = function() { + return Promise.resolve(value); + }; + return self.getSpy(); + }; + + /** + * Tell the spy to return a promise rejecting with the specified value when invoked. + * @name SpyStrategy#rejectWith + * @since 3.5.0 + * @function + * @param {*} value The value to return. + */ + this.rejectWith = function(value) { + var Promise = requirePromise('rejectWith'); + + self.plan = function() { + return Promise.reject(value); + }; + return self.getSpy(); + }; + } + + function createCustomPlan(factory) { + return function() { + var plan = factory.apply(null, arguments); + + if (!j$.isFunction_(plan)) { + throw new Error('Spy strategy must return a function'); + } + + this.plan = plan; + return this.getSpy(); + }; + } + + /** + * Execute the current spy strategy. + * @name SpyStrategy#exec + * @since 2.0.0 + * @function + */ + SpyStrategy.prototype.exec = function(context, args) { + return this.plan.apply(context, args); + }; + + /** + * Tell the spy to call through to the real implementation when invoked. + * @name SpyStrategy#callThrough + * @since 2.0.0 + * @function + */ + SpyStrategy.prototype.callThrough = function() { + this.plan = this.originalFn; + return this.getSpy(); + }; + + /** + * Tell the spy to return the value when invoked. + * @name SpyStrategy#returnValue + * @since 2.0.0 + * @function + * @param {*} value The value to return. + */ + SpyStrategy.prototype.returnValue = function(value) { + this.plan = function() { + return value; + }; + return this.getSpy(); + }; + + /** + * Tell the spy to return one of the specified values (sequentially) each time the spy is invoked. + * @name SpyStrategy#returnValues + * @since 2.1.0 + * @function + * @param {...*} values - Values to be returned on subsequent calls to the spy. + */ + SpyStrategy.prototype.returnValues = function() { + var values = Array.prototype.slice.call(arguments); + this.plan = function() { + return values.shift(); + }; + return this.getSpy(); + }; + + /** + * Tell the spy to throw an error when invoked. + * @name SpyStrategy#throwError + * @since 2.0.0 + * @function + * @param {Error|String} something Thing to throw + */ + SpyStrategy.prototype.throwError = function(something) { + var error = something instanceof Error ? something : new Error(something); + this.plan = function() { + throw error; + }; + return this.getSpy(); + }; + + /** + * Tell the spy to call a fake implementation when invoked. + * @name SpyStrategy#callFake + * @since 2.0.0 + * @function + * @param {Function} fn The function to invoke with the passed parameters. + */ + SpyStrategy.prototype.callFake = function(fn) { + if (!(j$.isFunction_(fn) || j$.isAsyncFunction_(fn))) { + throw new Error( + 'Argument passed to callFake should be a function, got ' + fn + ); + } + this.plan = fn; + return this.getSpy(); + }; + + /** + * Tell the spy to do nothing when invoked. This is the default. + * @name SpyStrategy#stub + * @since 2.0.0 + * @function + */ + SpyStrategy.prototype.stub = function(fn) { + this.plan = function() {}; + return this.getSpy(); + }; + + SpyStrategy.prototype.isConfigured = function() { + return this.plan !== this._defaultPlan; + }; + + return SpyStrategy; +}; + +getJasmineRequireObj().StackTrace = function(j$) { + function StackTrace(error) { + var lines = error.stack.split('\n').filter(function(line) { + return line !== ''; + }); + + var extractResult = extractMessage(error.message, lines); + + if (extractResult) { + this.message = extractResult.message; + lines = extractResult.remainder; + } + + var parseResult = tryParseFrames(lines); + this.frames = parseResult.frames; + this.style = parseResult.style; + } + + var framePatterns = [ + // PhantomJS on Linux, Node, Chrome, IE, Edge + // e.g. " at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)" + // Note that the "function name" can include a surprisingly large set of + // characters, including angle brackets and square brackets. + { + re: /^\s*at ([^\)]+) \(([^\)]+)\)$/, + fnIx: 1, + fileLineColIx: 2, + style: 'v8' + }, + + // NodeJS alternate form, often mixed in with the Chrome style + // e.g. " at /some/path:4320:20 + { re: /\s*at (.+)$/, fileLineColIx: 1, style: 'v8' }, + + // PhantomJS on OS X, Safari, Firefox + // e.g. "run@http://localhost:8888/__jasmine__/jasmine.js:4320:27" + // or "http://localhost:8888/__jasmine__/jasmine.js:4320:27" + { + re: /^(([^@\s]+)@)?([^\s]+)$/, + fnIx: 2, + fileLineColIx: 3, + style: 'webkit' + } + ]; + + // regexes should capture the function name (if any) as group 1 + // and the file, line, and column as group 2. + function tryParseFrames(lines) { + var style = null; + var frames = lines.map(function(line) { + var convertedLine = first(framePatterns, function(pattern) { + var overallMatch = line.match(pattern.re), + fileLineColMatch; + if (!overallMatch) { + return null; + } + + fileLineColMatch = overallMatch[pattern.fileLineColIx].match( + /^(.*):(\d+):\d+$/ + ); + if (!fileLineColMatch) { + return null; + } + + style = style || pattern.style; + return { + raw: line, + file: fileLineColMatch[1], + line: parseInt(fileLineColMatch[2], 10), + func: overallMatch[pattern.fnIx] + }; + }); + + return convertedLine || { raw: line }; + }); + + return { + style: style, + frames: frames + }; + } + + function first(items, fn) { + var i, result; + + for (i = 0; i < items.length; i++) { + result = fn(items[i]); + + if (result) { + return result; + } + } + } + + function extractMessage(message, stackLines) { + var len = messagePrefixLength(message, stackLines); + + if (len > 0) { + return { + message: stackLines.slice(0, len).join('\n'), + remainder: stackLines.slice(len) + }; + } + } + + function messagePrefixLength(message, stackLines) { + if (!stackLines[0].match(/^Error/)) { + return 0; + } + + var messageLines = message.split('\n'); + var i; + + for (i = 1; i < messageLines.length; i++) { + if (messageLines[i] !== stackLines[i]) { + return 0; + } + } + + return messageLines.length; + } + + return StackTrace; +}; + +getJasmineRequireObj().Suite = function(j$) { + function Suite(attrs) { + this.env = attrs.env; + this.id = attrs.id; + this.parentSuite = attrs.parentSuite; + this.description = attrs.description; + this.expectationFactory = attrs.expectationFactory; + this.asyncExpectationFactory = attrs.asyncExpectationFactory; + this.expectationResultFactory = attrs.expectationResultFactory; + this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; + + this.beforeFns = []; + this.afterFns = []; + this.beforeAllFns = []; + this.afterAllFns = []; + + this.timer = attrs.timer || j$.noopTimer; + + this.children = []; + + /** + * @typedef SuiteResult + * @property {Int} id - The unique id of this suite. + * @property {String} description - The description text passed to the {@link describe} that made this suite. + * @property {String} fullName - The full description including all ancestors of this suite. + * @property {Expectation[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite. + * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite. + * @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite. + * @property {number} duration - The time in ms for Suite execution, including any before/afterAll, before/afterEach. + */ + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + failedExpectations: [], + deprecationWarnings: [], + duration: null + }; + } + + Suite.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Suite.prototype.expectAsync = function(actual) { + return this.asyncExpectationFactory(actual, this); + }; + + Suite.prototype.getFullName = function() { + var fullName = []; + for ( + var parentSuite = this; + parentSuite; + parentSuite = parentSuite.parentSuite + ) { + if (parentSuite.parentSuite) { + fullName.unshift(parentSuite.description); + } + } + return fullName.join(' '); + }; + + Suite.prototype.pend = function() { + this.markedPending = true; + }; + + Suite.prototype.beforeEach = function(fn) { + this.beforeFns.unshift(fn); + }; + + Suite.prototype.beforeAll = function(fn) { + this.beforeAllFns.push(fn); + }; + + Suite.prototype.afterEach = function(fn) { + this.afterFns.unshift(fn); + }; + + Suite.prototype.afterAll = function(fn) { + this.afterAllFns.unshift(fn); + }; + + Suite.prototype.startTimer = function() { + this.timer.start(); + }; + + Suite.prototype.endTimer = function() { + this.result.duration = this.timer.elapsed(); + }; + + function removeFns(queueableFns) { + for (var i = 0; i < queueableFns.length; i++) { + queueableFns[i].fn = null; + } + } + + Suite.prototype.cleanupBeforeAfter = function() { + removeFns(this.beforeAllFns); + removeFns(this.afterAllFns); + removeFns(this.beforeFns); + removeFns(this.afterFns); + }; + + Suite.prototype.addChild = function(child) { + this.children.push(child); + }; + + Suite.prototype.status = function() { + if (this.markedPending) { + return 'pending'; + } + + if (this.result.failedExpectations.length > 0) { + return 'failed'; + } else { + return 'passed'; + } + }; + + Suite.prototype.canBeReentered = function() { + return this.beforeAllFns.length === 0 && this.afterAllFns.length === 0; + }; + + Suite.prototype.getResult = function() { + this.result.status = this.status(); + return this.result; + }; + + Suite.prototype.sharedUserContext = function() { + if (!this.sharedContext) { + this.sharedContext = this.parentSuite + ? this.parentSuite.clonedSharedUserContext() + : new j$.UserContext(); + } + + return this.sharedContext; + }; + + Suite.prototype.clonedSharedUserContext = function() { + return j$.UserContext.fromExisting(this.sharedUserContext()); + }; + + Suite.prototype.onException = function() { + if (arguments[0] instanceof j$.errors.ExpectationFailed) { + return; + } + + var data = { + matcherName: '', + passed: false, + expected: '', + actual: '', + error: arguments[0] + }; + var failedExpectation = this.expectationResultFactory(data); + + if (!this.parentSuite) { + failedExpectation.globalErrorType = 'afterAll'; + } + + this.result.failedExpectations.push(failedExpectation); + }; + + Suite.prototype.addExpectationResult = function() { + if (isFailure(arguments)) { + var data = arguments[1]; + this.result.failedExpectations.push(this.expectationResultFactory(data)); + if (this.throwOnExpectationFailure) { + throw new j$.errors.ExpectationFailed(); + } + } + }; + + Suite.prototype.addDeprecationWarning = function(deprecation) { + if (typeof deprecation === 'string') { + deprecation = { message: deprecation }; + } + this.result.deprecationWarnings.push( + this.expectationResultFactory(deprecation) + ); + }; + + function isFailure(args) { + return !args[0]; + } + + return Suite; +}; + +if (typeof window == void 0 && typeof exports == 'object') { + /* globals exports */ + exports.Suite = jasmineRequire.Suite; +} + +getJasmineRequireObj().Timer = function() { + var defaultNow = (function(Date) { + return function() { + return new Date().getTime(); + }; + })(Date); + + function Timer(options) { + options = options || {}; + + var now = options.now || defaultNow, + startTime; + + this.start = function() { + startTime = now(); + }; + + this.elapsed = function() { + return now() - startTime; + }; + } + + return Timer; +}; + +getJasmineRequireObj().noopTimer = function() { + return { + start: function() {}, + elapsed: function() { + return 0; + } + }; +}; + +getJasmineRequireObj().TreeProcessor = function() { + function TreeProcessor(attrs) { + var tree = attrs.tree, + runnableIds = attrs.runnableIds, + queueRunnerFactory = attrs.queueRunnerFactory, + nodeStart = attrs.nodeStart || function() {}, + nodeComplete = attrs.nodeComplete || function() {}, + failSpecWithNoExpectations = !!attrs.failSpecWithNoExpectations, + orderChildren = + attrs.orderChildren || + function(node) { + return node.children; + }, + excludeNode = + attrs.excludeNode || + function(node) { + return false; + }, + stats = { valid: true }, + processed = false, + defaultMin = Infinity, + defaultMax = 1 - Infinity; + + this.processTree = function() { + processNode(tree, true); + processed = true; + return stats; + }; + + this.execute = function(done) { + if (!processed) { + this.processTree(); + } + + if (!stats.valid) { + throw 'invalid order'; + } + + var childFns = wrapChildren(tree, 0); + + queueRunnerFactory({ + queueableFns: childFns, + userContext: tree.sharedUserContext(), + onException: function() { + tree.onException.apply(tree, arguments); + }, + onComplete: done + }); + }; + + function runnableIndex(id) { + for (var i = 0; i < runnableIds.length; i++) { + if (runnableIds[i] === id) { + return i; + } + } + } + + function processNode(node, parentExcluded) { + var executableIndex = runnableIndex(node.id); + + if (executableIndex !== undefined) { + parentExcluded = false; + } + + if (!node.children) { + var excluded = parentExcluded || excludeNode(node); + stats[node.id] = { + excluded: excluded, + willExecute: !excluded && !node.markedPending, + segments: [ + { + index: 0, + owner: node, + nodes: [node], + min: startingMin(executableIndex), + max: startingMax(executableIndex) + } + ] + }; + } else { + var hasExecutableChild = false; + + var orderedChildren = orderChildren(node); + + for (var i = 0; i < orderedChildren.length; i++) { + var child = orderedChildren[i]; + + processNode(child, parentExcluded); + + if (!stats.valid) { + return; + } + + var childStats = stats[child.id]; + + hasExecutableChild = hasExecutableChild || childStats.willExecute; + } + + stats[node.id] = { + excluded: parentExcluded, + willExecute: hasExecutableChild + }; + + segmentChildren(node, orderedChildren, stats[node.id], executableIndex); + + if (!node.canBeReentered() && stats[node.id].segments.length > 1) { + stats = { valid: false }; + } + } + } + + function startingMin(executableIndex) { + return executableIndex === undefined ? defaultMin : executableIndex; + } + + function startingMax(executableIndex) { + return executableIndex === undefined ? defaultMax : executableIndex; + } + + function segmentChildren( + node, + orderedChildren, + nodeStats, + executableIndex + ) { + var currentSegment = { + index: 0, + owner: node, + nodes: [], + min: startingMin(executableIndex), + max: startingMax(executableIndex) + }, + result = [currentSegment], + lastMax = defaultMax, + orderedChildSegments = orderChildSegments(orderedChildren); + + function isSegmentBoundary(minIndex) { + return ( + lastMax !== defaultMax && + minIndex !== defaultMin && + lastMax < minIndex - 1 + ); + } + + for (var i = 0; i < orderedChildSegments.length; i++) { + var childSegment = orderedChildSegments[i], + maxIndex = childSegment.max, + minIndex = childSegment.min; + + if (isSegmentBoundary(minIndex)) { + currentSegment = { + index: result.length, + owner: node, + nodes: [], + min: defaultMin, + max: defaultMax + }; + result.push(currentSegment); + } + + currentSegment.nodes.push(childSegment); + currentSegment.min = Math.min(currentSegment.min, minIndex); + currentSegment.max = Math.max(currentSegment.max, maxIndex); + lastMax = maxIndex; + } + + nodeStats.segments = result; + } + + function orderChildSegments(children) { + var specifiedOrder = [], + unspecifiedOrder = []; + + for (var i = 0; i < children.length; i++) { + var child = children[i], + segments = stats[child.id].segments; + + for (var j = 0; j < segments.length; j++) { + var seg = segments[j]; + + if (seg.min === defaultMin) { + unspecifiedOrder.push(seg); + } else { + specifiedOrder.push(seg); + } + } + } + + specifiedOrder.sort(function(a, b) { + return a.min - b.min; + }); + + return specifiedOrder.concat(unspecifiedOrder); + } + + function executeNode(node, segmentNumber) { + if (node.children) { + return { + fn: function(done) { + var onStart = { + fn: function(next) { + nodeStart(node, next); + } + }; + + queueRunnerFactory({ + onComplete: function() { + var args = Array.prototype.slice.call(arguments, [0]); + node.cleanupBeforeAfter(); + nodeComplete(node, node.getResult(), function() { + done.apply(undefined, args); + }); + }, + queueableFns: [onStart].concat(wrapChildren(node, segmentNumber)), + userContext: node.sharedUserContext(), + onException: function() { + node.onException.apply(node, arguments); + } + }); + } + }; + } else { + return { + fn: function(done) { + node.execute( + done, + stats[node.id].excluded, + failSpecWithNoExpectations + ); + } + }; + } + } + + function wrapChildren(node, segmentNumber) { + var result = [], + segmentChildren = stats[node.id].segments[segmentNumber].nodes; + + for (var i = 0; i < segmentChildren.length; i++) { + result.push( + executeNode(segmentChildren[i].owner, segmentChildren[i].index) + ); + } + + if (!stats[node.id].willExecute) { + return result; + } + + return node.beforeAllFns.concat(result).concat(node.afterAllFns); + } + } + + return TreeProcessor; +}; + +getJasmineRequireObj().UserContext = function(j$) { + function UserContext() {} + + UserContext.fromExisting = function(oldContext) { + var context = new UserContext(); + + for (var prop in oldContext) { + if (oldContext.hasOwnProperty(prop)) { + context[prop] = oldContext[prop]; + } + } + + return context; + }; + + return UserContext; +}; + +getJasmineRequireObj().version = function() { + return '3.5.0'; +}; diff --git a/packages/splitjs/test/lib/jasmine-3.5.0/jasmine_favicon.png b/packages/splitjs/test/lib/jasmine-3.5.0/jasmine_favicon.png new file mode 100644 index 000000000..3b84583be Binary files /dev/null and b/packages/splitjs/test/lib/jasmine-3.5.0/jasmine_favicon.png differ diff --git a/packages/splitjs/test/split.spec.js b/packages/splitjs/test/split.spec.js new file mode 100644 index 000000000..cba25d6d4 --- /dev/null +++ b/packages/splitjs/test/split.spec.js @@ -0,0 +1,190 @@ +/* eslint-env jasmine */ +/* global Split */ +/* eslint-disable no-var, func-names, prefer-arrow-callback, object-shorthand, prefer-template */ + +function calcParts(expr) { + var re = /calc\(([\d]*\.?[\d]*?)%\s?-\s?([\d]+)px\)/ + var m = re.exec(expr) + + return { + percentage: parseFloat(m[1]), + pixels: parseInt(m[2], 10), + } +} + +describe('Split', function() { + beforeEach(function() { + document.body.style.width = '800px' + document.body.style.height = '600px' + + this.a = document.createElement('div') + this.b = document.createElement('div') + this.c = document.createElement('div') + + this.a.id = 'a' + this.b.id = 'b' + this.c.id = 'c' + + document.body.appendChild(this.a) + document.body.appendChild(this.b) + document.body.appendChild(this.c) + }) + + afterEach(function() { + document.body.removeChild(this.a) + document.body.removeChild(this.b) + document.body.removeChild(this.c) + }) + + it('splits in two when given two elements', function() { + Split(['#a', '#b']) + + expect(this.a.style.width).toContain('calc(50% - 5px)') + expect(this.b.style.width).toContain('calc(50% - 5px)') + }) + + it('splits in three when given three elements', function() { + Split(['#a', '#b', '#c']) + + expect(calcParts(this.a.style.width).percentage).toBeCloseTo(33.33) + expect(calcParts(this.b.style.width).percentage).toBeCloseTo(33.33) + expect(calcParts(this.c.style.width).percentage).toBeCloseTo(33.33) + + expect(calcParts(this.a.style.width).pixels).toBe(5) + expect(calcParts(this.b.style.width).pixels).toBe(10) + expect(calcParts(this.c.style.width).pixels).toBe(5) + }) + + it('splits vertically when direction is vertical', function() { + Split(['#a', '#b'], { + direction: 'vertical', + }) + + expect(this.a.style.height).toContain('calc(50% - 5px)') + expect(this.b.style.height).toContain('calc(50% - 5px)') + }) + + it('splits in percentages when given sizes', function() { + Split(['#a', '#b'], { + sizes: [25, 75], + }) + + expect(this.a.style.width).toContain('calc(25% - 5px)') + expect(this.b.style.width).toContain('calc(75% - 5px)') + }) + + it('splits in percentages when given sizes', function() { + Split(['#a', '#b'], { + sizes: [25, 75], + }) + + expect(this.a.style.width).toContain('calc(25% - 5px)') + expect(this.b.style.width).toContain('calc(75% - 5px)') + }) + + it('accounts for gutter size', function() { + Split(['#a', '#b'], { + gutterSize: 20, + }) + + expect(this.a.style.width).toContain('calc(50% - 10px)') + expect(this.b.style.width).toContain('calc(50% - 10px)') + }) + + it('accounts for gutter size with more than two elements', function() { + Split(['#a', '#b', '#c'], { + gutterSize: 20, + }) + + expect(calcParts(this.a.style.width).percentage).toBeCloseTo(33.33) + expect(calcParts(this.b.style.width).percentage).toBeCloseTo(33.33) + expect(calcParts(this.c.style.width).percentage).toBeCloseTo(33.33) + + expect(calcParts(this.a.style.width).pixels).toBe(10) + expect(calcParts(this.b.style.width).pixels).toBe(20) + expect(calcParts(this.c.style.width).pixels).toBe(10) + }) + + it('accounts for gutter size when direction is vertical', function() { + Split(['#a', '#b'], { + direction: 'vertical', + gutterSize: 20, + }) + + expect(this.a.style.height).toContain('calc(50% - 10px)') + expect(this.b.style.height).toContain('calc(50% - 10px)') + }) + + it('accounts for gutter size with more than two elements when direction is vertical', function() { + Split(['#a', '#b', '#c'], { + direction: 'vertical', + gutterSize: 20, + }) + + expect(calcParts(this.a.style.height).percentage).toBeCloseTo(33.33) + expect(calcParts(this.b.style.height).percentage).toBeCloseTo(33.33) + expect(calcParts(this.c.style.height).percentage).toBeCloseTo(33.33) + + expect(calcParts(this.a.style.height).pixels).toBe(10) + expect(calcParts(this.b.style.height).pixels).toBe(20) + expect(calcParts(this.c.style.height).pixels).toBe(10) + }) + + it('set size directly when given css values', function() { + Split(['#a', '#b'], { + sizes: ['150px', '640px'], + }) + + expect(this.a.style.width).toBe('150px') + expect(this.b.style.width).toBe('640px') + }) + + it('adjusts sizes using setSizes', function() { + var split = Split(['#a', '#b']) + + split.setSizes([70, 30]) + + expect(this.a.style.width).toContain('calc(70% - 5px)') + expect(this.b.style.width).toContain('calc(30% - 5px)') + }) + + it('collapse splits', function() { + var split = Split(['#a', '#b']) + + split.collapse(0) + + expect(this.a.getBoundingClientRect().width).toBeCloseTo(100, 0) + expect(this.b.getBoundingClientRect().width).toBeCloseTo(800 - 100 - 10, 0) + + split.collapse(1) + + expect(this.a.getBoundingClientRect().width).toBeCloseTo(800 - 100 - 10, 0) + expect(this.b.getBoundingClientRect().width).toBeCloseTo(100, 0) + }) + + it('returns sizes', function() { + var split = Split(['#a', '#b']) + var sizes = split.getSizes() + + expect(sizes).toEqual([50, 50]) + + split.setSizes([70, 30]) + + sizes = split.getSizes() + + expect(sizes).toEqual([70, 30]) + }) + + it('sets element styles using the elementStyle function', function() { + Split(['#a', '#b'], { + elementStyle: function(dimension, size) { + return { + width: size + '%', + } + }, + }) + + expect(this.a.style.width).toBe('50%') + expect(this.b.style.width).toBe('50%') + }) +}) diff --git a/packages/turndown-plugin-gfm/package.json b/packages/turndown-plugin-gfm/package.json index c50bbb1ba..7d69ecd39 100644 --- a/packages/turndown-plugin-gfm/package.json +++ b/packages/turndown-plugin-gfm/package.json @@ -5,18 +5,7 @@ "author": "Dom Christie", "private": true, "type": "module", - "main": "./dist/index.js", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - "./package.json": "./package.json", - ".": { - "development": "./src/index.js", - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "default": "./dist/index.js" - } - }, + "main": "./src/index.js", "gitHead": "05a29b450962bf05a8642bbd39446a1f679a96ba", "license": "MIT", "repository": { @@ -32,30 +21,6 @@ "github-flavored-markdown", "gfm" ], - "nx": { - "name": "turndown-plugin-gfm", - "sourceRoot": "packages/turndown-plugin-gfm/src", - "targets": { - "build": { - "executor": "@nx/esbuild:esbuild", - "outputs": [ - "{options.outputPath}" - ], - "options": { - "outputPath": "packages/turndown-plugin-gfm/dist", - "main": "packages/turndown-plugin-gfm/src/index.js", - "tsConfig": "packages/turndown-plugin-gfm/tsconfig.lib.json", - "format": [ - "esm" - ], - "declarationRootDir": "packages/turndown-plugin-gfm/src" - } - }, - "test": { - "command": "node packages/turndown-plugin-gfm/test/turndown-plugin-gfm-test.js" - } - } - }, "devDependencies": { "turndown": "7.2.1", "turndown-attendant": "0.0.3" diff --git a/patches/@nx__js.patch b/patches/@nx__js.patch deleted file mode 100644 index eb9a069f5..000000000 --- a/patches/@nx__js.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/src/utils/assets/copy-assets-handler.js b/src/utils/assets/copy-assets-handler.js -index 6b68205d833ce9e8277283ac31230c020d2921ec..2f0a7f018b03eae3b8f3ce1a4cf4790aaafed677 100644 ---- a/src/utils/assets/copy-assets-handler.js -+++ b/src/utils/assets/copy-assets-handler.js -@@ -39,12 +39,6 @@ class CopyAssetsHandler { - this.callback = opts.callback ?? exports.defaultFileEventHandler; - // TODO(jack): Should handle nested .gitignore files - this.ignore = (0, ignore_1.default)(); -- const gitignore = pathPosix.join(opts.rootDir, '.gitignore'); -- const nxignore = pathPosix.join(opts.rootDir, '.nxignore'); -- if ((0, node_fs_1.existsSync)(gitignore)) -- this.ignore.add((0, node_fs_1.readFileSync)(gitignore).toString()); -- if ((0, node_fs_1.existsSync)(nxignore)) -- this.ignore.add((0, node_fs_1.readFileSync)(nxignore).toString()); - this.assetGlobs = opts.assets.map((f) => { - let isGlob = false; - let pattern; diff --git a/patches/pnpm-PATH-reduction.patch b/patches/pnpm-PATH-reduction.patch new file mode 100644 index 000000000..8c0235216 --- /dev/null +++ b/patches/pnpm-PATH-reduction.patch @@ -0,0 +1,17 @@ +--- a/libexec/pnpm/dist/pnpm.cjs 2025-09-15 11:33:34.014095372 +0200 ++++ b/libexec/pnpm/dist/pnpm.cjs 2025-09-15 11:37:00.260553326 +0200 +@@ -68067,10 +68067,14 @@ + return false; + } + function spawn(cmd, args, options, log) { + const cmdWillOutput = willCmdOutput(options && options.stdio); + if (cmdWillOutput) startRunning(log); ++ const stupidPath = options.env["PATH"]; ++ const parts = stupidPath.split(":"); ++ const partsDedup = new Set(parts); ++ options.env["PATH"] = [...partsDedup].join(":"); + const raw = _spawn(cmd, args, options); + const cooked = new EventEmitter(); + raw.on("error", function(er) { + if (cmdWillOutput) stopRunning(log); + er.file = cmd; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aba6dc787..4b3dbf218 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,10 +5,10 @@ settings: excludeLinksFromLockfile: false overrides: - mermaid: 11.10.1 - preact: 10.27.1 + mermaid: 11.12.0 + preact: 10.27.2 roughjs: 4.6.6 - '@types/express-serve-static-core': 5.0.7 + '@types/express-serve-static-core': 5.1.0 flat@<5.0.1: '>=5.0.1' debug@>=3.2.0 <3.2.7: '>=3.2.7' nanoid@<3.3.8: '>=3.3.8' @@ -20,6 +20,7 @@ overrides: on-headers@<1.1.0: '>=1.1.0' form-data@>=4.0.0 <4.0.4: '>=4.0.4' form-data@>=3.0.0 <3.0.4: '>=3.0.4' + node-abi: 4.14.0 patchedDependencies: '@ckeditor/ckeditor5-code-block': @@ -28,9 +29,6 @@ patchedDependencies: '@ckeditor/ckeditor5-mention': hash: 5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d path: patches/@ckeditor__ckeditor5-mention.patch - '@nx/js': - hash: 7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7 - path: patches/@nx__js.patch ckeditor5: hash: 8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41 path: patches/ckeditor5.patch @@ -42,129 +40,96 @@ importers: '@electron/rebuild': specifier: 4.0.1 version: 4.0.1 - '@nx/devkit': - specifier: 21.3.11 - version: 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/esbuild': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/eslint': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/eslint-plugin': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-config-prettier@10.1.8(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(typescript@5.9.2) - '@nx/express': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.34.0(jiti@2.5.1))(express@4.21.2)(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2))(typescript@5.9.2) - '@nx/js': - specifier: 21.3.11 - version: 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/node': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2))(typescript@5.9.2) - '@nx/playwright': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@playwright/test@1.55.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(typescript@5.9.2) - '@nx/vite': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) - '@nx/web': - specifier: 21.3.11 - version: 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) + '@fast-csv/parse': + specifier: 5.0.5 + version: 5.0.5 '@playwright/test': - specifier: ^1.36.0 - version: 1.55.0 + specifier: 1.56.1 + version: 1.56.1 '@triliumnext/server': specifier: workspace:* version: link:apps/server '@types/express': - specifier: ^5.0.0 + specifier: 5.0.3 version: 5.0.3 '@types/node': - specifier: 22.18.0 - version: 22.18.0 + specifier: 22.18.12 + version: 22.18.12 '@vitest/coverage-v8': - specifier: ^3.0.5 + specifier: 3.2.4 version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) '@vitest/ui': - specifier: ^3.0.0 + specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) chalk: - specifier: 5.6.0 - version: 5.6.0 + specifier: 5.6.2 + version: 5.6.2 cross-env: - specifier: 10.0.0 - version: 10.0.0 + specifier: 10.1.0 + version: 10.1.0 dpdm: specifier: 3.14.0 version: 3.14.0 esbuild: - specifier: ^0.25.0 - version: 0.25.9 + specifier: 0.25.11 + version: 0.25.11 eslint: - specifier: ^9.8.0 - version: 9.34.0(jiti@2.5.1) + specifier: 9.38.0 + version: 9.38.0(jiti@2.6.1) eslint-config-prettier: - specifier: ^10.0.0 - version: 10.1.8(eslint@9.34.0(jiti@2.5.1)) + specifier: 10.1.8 + version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) eslint-plugin-playwright: - specifier: ^2.0.0 - version: 2.2.2(eslint@9.34.0(jiti@2.5.1)) + specifier: 2.2.2 + version: 2.2.2(eslint@9.38.0(jiti@2.6.1)) eslint-plugin-react-hooks: - specifier: 5.2.0 - version: 5.2.0(eslint@9.34.0(jiti@2.5.1)) + specifier: 7.0.0 + version: 7.0.0(eslint@9.38.0(jiti@2.6.1)) happy-dom: - specifier: ~18.0.0 - version: 18.0.1 + specifier: ~20.0.0 + version: 20.0.7 jiti: - specifier: 2.5.1 - version: 2.5.1 - jsdom: - specifier: ~26.1.0 - version: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 2.6.1 + version: 2.6.1 jsonc-eslint-parser: - specifier: ^2.1.0 - version: 2.4.0 - nx: - specifier: 21.3.11 - version: 21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)) + specifier: 2.4.1 + version: 2.4.1 react-refresh: - specifier: ^0.17.0 - version: 0.17.0 + specifier: 0.18.0 + version: 0.18.0 rollup-plugin-webpack-stats: - specifier: 2.1.4 - version: 2.1.4(rolldown@1.0.0-beta.29)(rollup@4.46.3)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + specifier: 2.1.6 + version: 2.1.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) tslib: - specifier: ^2.3.0 + specifier: 2.8.1 version: 2.8.1 tsx: - specifier: 4.20.5 - version: 4.20.5 + specifier: 4.20.6 + version: 4.20.6 typescript: specifier: ~5.9.0 - version: 5.9.2 + version: 5.9.3 typescript-eslint: - specifier: ^8.19.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) upath: specifier: 2.0.1 version: 2.0.1 vite: - specifier: ^7.0.0 - version: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + specifier: 7.1.11 + version: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-dts: specifier: ~4.5.0 - version: 4.5.4(@types/node@22.18.0)(rollup@4.46.3)(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + version: 4.5.4(@types/node@22.18.12)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) apps/client: dependencies: '@eslint/js': - specifier: 9.34.0 - version: 9.34.0 + specifier: 9.38.0 + version: 9.38.0 '@excalidraw/excalidraw': specifier: 0.18.0 version: 0.18.0(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0) @@ -188,13 +153,13 @@ importers: version: 6.1.19(@fullcalendar/core@6.1.19) '@maplibre/maplibre-gl-leaflet': specifier: 0.1.3 - version: 0.1.3(@types/leaflet@1.9.20)(leaflet@1.9.4)(maplibre-gl@5.6.1) + version: 0.1.3(@types/leaflet@1.9.21)(leaflet@1.9.4)(maplibre-gl@5.6.1) '@mermaid-js/layout-elk': - specifier: 0.1.9 - version: 0.1.9(mermaid@11.10.1) + specifier: 0.2.0 + version: 0.2.0(mermaid@11.12.0) '@mind-elixir/node-menu': specifier: 5.0.0 - version: 5.0.0(mind-elixir@5.0.6) + version: 5.0.0(mind-elixir@5.3.3) '@popperjs/core': specifier: 2.11.8 version: 2.11.8 @@ -213,6 +178,9 @@ importers: '@triliumnext/share-theme': specifier: workspace:* version: link:../../packages/share-theme + '@triliumnext/split.js': + specifier: workspace:* + version: link:../../packages/splitjs autocomplete.js: specifier: 0.38.1 version: 0.38.1 @@ -222,9 +190,12 @@ importers: boxicons: specifier: 2.1.4 version: 2.1.4 + color: + specifier: 5.0.2 + version: 5.0.2 dayjs: - specifier: 1.11.14 - version: 1.11.14 + specifier: 1.11.18 + version: 1.11.18 dayjs-plugin-utc: specifier: 0.1.2 version: 0.1.2 @@ -235,14 +206,14 @@ importers: specifier: 3.0.0 version: 3.0.0 force-graph: - specifier: 1.50.1 - version: 1.50.1 + specifier: 1.51.0 + version: 1.51.0 globals: - specifier: 16.3.0 - version: 16.3.0 + specifier: 16.4.0 + version: 16.4.0 i18next: - specifier: 25.4.2 - version: 25.4.2(typescript@5.9.2) + specifier: 25.6.0 + version: 25.6.0(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -256,8 +227,8 @@ importers: specifier: 2.15.6 version: 2.15.6 katex: - specifier: 0.16.22 - version: 0.16.22 + specifier: 0.16.25 + version: 0.16.25 knockout: specifier: 3.5.1 version: 3.5.1 @@ -271,14 +242,14 @@ importers: specifier: 8.11.1 version: 8.11.1 marked: - specifier: 16.2.1 - version: 16.2.1 + specifier: 16.4.1 + version: 16.4.1 mermaid: - specifier: 11.10.1 - version: 11.10.1 + specifier: 11.12.0 + version: 11.12.0 mind-elixir: - specifier: 5.0.6 - version: 5.0.6 + specifier: 5.3.3 + version: 5.3.3 normalize.css: specifier: 8.0.1 version: 8.0.1 @@ -286,14 +257,14 @@ importers: specifier: 9.4.3 version: 9.4.3 preact: - specifier: 10.27.1 - version: 10.27.1 + specifier: 10.27.2 + version: 10.27.2 react-i18next: - specifier: 15.7.2 - version: 15.7.2(i18next@25.4.2(typescript@5.9.2))(react-dom@19.1.0(react@16.14.0))(react@16.14.0)(typescript@5.9.2) - split.js: - specifier: 1.6.5 - version: 1.6.5 + specifier: 16.1.2 + version: 16.1.2(i18next@25.6.0(typescript@5.9.3))(react-dom@19.1.0(react@16.14.0))(react@16.14.0)(typescript@5.9.3) + reveal.js: + specifier: 5.2.1 + version: 5.2.1 svg-pan-zoom: specifier: 3.6.2 version: 3.6.2 @@ -309,7 +280,7 @@ importers: version: 5.0.0 '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.28.0)(preact@10.27.1)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/bootstrap': specifier: 5.2.10 version: 5.2.10 @@ -317,29 +288,32 @@ importers: specifier: 3.5.33 version: 3.5.33 '@types/leaflet': - specifier: 1.9.20 - version: 1.9.20 + specifier: 1.9.21 + version: 1.9.21 '@types/leaflet-gpx': - specifier: 1.3.7 - version: 1.3.7 + specifier: 1.3.8 + version: 1.3.8 '@types/mark.js': specifier: 8.11.12 version: 8.11.12 + '@types/reveal.js': + specifier: 5.2.1 + version: 5.2.1 '@types/tabulator-tables': - specifier: 6.2.10 - version: 6.2.10 + specifier: 6.2.11 + version: 6.2.11 copy-webpack-plugin: specifier: 13.0.1 - version: 13.0.1(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + version: 13.0.1(webpack@5.101.3(esbuild@0.25.11)) happy-dom: - specifier: 18.0.1 - version: 18.0.1 + specifier: 20.0.7 + version: 20.0.7 script-loader: specifier: 0.7.2 version: 0.7.2 vite-plugin-static-copy: - specifier: 3.1.2 - version: 3.1.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + specifier: 3.1.4 + version: 3.1.4(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) apps/db-compare: dependencies: @@ -360,10 +334,10 @@ importers: dependencies: '@electron/remote': specifier: 2.1.3 - version: 2.1.3(electron@37.4.0) + version: 2.1.3(electron@38.3.0) better-sqlite3: - specifier: ^12.0.0 - version: 12.2.0 + specifier: 12.4.1 + version: 12.4.1 electron-debug: specifier: 4.1.0 version: 4.1.0 @@ -381,29 +355,32 @@ importers: version: 2.38.5(jquery@3.7.1) devDependencies: '@electron-forge/cli': - specifier: 7.8.3 - version: 7.8.3(encoding@0.1.13) + specifier: 7.10.2 + version: 7.10.2(encoding@0.1.13)(esbuild@0.25.11) '@electron-forge/maker-deb': - specifier: 7.8.3 - version: 7.8.3 + specifier: 7.10.2 + version: 7.10.2 '@electron-forge/maker-dmg': - specifier: 7.8.3 - version: 7.8.3 + specifier: 7.10.2 + version: 7.10.2 '@electron-forge/maker-flatpak': - specifier: 7.8.3 - version: 7.8.3 + specifier: 7.10.2 + version: 7.10.2 '@electron-forge/maker-rpm': - specifier: 7.8.3 - version: 7.8.3 + specifier: 7.10.2 + version: 7.10.2 '@electron-forge/maker-squirrel': - specifier: 7.8.3 - version: 7.8.3 + specifier: 7.10.2 + version: 7.10.2 '@electron-forge/maker-zip': - specifier: 7.8.3 - version: 7.8.3 + specifier: 7.10.2 + version: 7.10.2 '@electron-forge/plugin-auto-unpack-natives': - specifier: 7.8.3 - version: 7.8.3 + specifier: 7.10.2 + version: 7.10.2 + '@triliumnext/commons': + specifier: workspace:* + version: link:../../packages/commons '@triliumnext/server': specifier: workspace:* version: link:../server @@ -412,49 +389,40 @@ importers: version: 1.0.2 copy-webpack-plugin: specifier: 13.0.1 - version: 13.0.1(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + version: 13.0.1(webpack@5.101.3(esbuild@0.25.11)) electron: - specifier: 37.4.0 - version: 37.4.0 + specifier: 38.3.0 + version: 38.3.0 prebuild-install: - specifier: ^7.1.1 + specifier: 7.1.3 version: 7.1.3 - apps/desktop-e2e: - devDependencies: - dotenv: - specifier: 17.2.1 - version: 17.2.1 - electron: - specifier: 37.4.0 - version: 37.4.0 - apps/dump-db: dependencies: better-sqlite3: - specifier: ^12.0.0 - version: 12.2.0 + specifier: 12.4.1 + version: 12.4.1 mime-types: - specifier: ^3.0.0 + specifier: 3.0.1 version: 3.0.1 sanitize-filename: - specifier: ^1.6.3 + specifier: 1.6.3 version: 1.6.3 tsx: - specifier: ^4.19.3 - version: 4.20.5 + specifier: 4.20.6 + version: 4.20.6 yargs: - specifier: ^18.0.0 + specifier: 18.0.0 version: 18.0.0 devDependencies: '@types/better-sqlite3': - specifier: ^7.6.11 + specifier: 7.6.13 version: 7.6.13 '@types/mime-types': - specifier: ^3.0.0 + specifier: 3.0.1 version: 3.0.1 '@types/yargs': - specifier: ^17.0.33 + specifier: 17.0.33 version: 17.0.33 apps/edit-docs: @@ -463,8 +431,8 @@ importers: specifier: 7.0.1 version: 7.0.1 better-sqlite3: - specifier: ^12.0.0 - version: 12.2.0 + specifier: 12.4.1 + version: 12.4.1 devDependencies: '@triliumnext/client': specifier: workspace:* @@ -477,29 +445,35 @@ importers: version: 11.0.4 copy-webpack-plugin: specifier: 13.0.1 - version: 13.0.1(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + version: 13.0.1(webpack@5.101.3(esbuild@0.25.11)) electron: - specifier: 37.4.0 - version: 37.4.0 + specifier: 38.3.0 + version: 38.3.0 fs-extra: - specifier: 11.3.1 - version: 11.3.1 + specifier: 11.3.2 + version: 11.3.2 apps/server: dependencies: better-sqlite3: - specifier: 12.2.0 - version: 12.2.0 + specifier: 12.4.1 + version: 12.4.1 + node-html-parser: + specifier: 7.0.1 + version: 7.0.1 devDependencies: '@anthropic-ai/sdk': - specifier: 0.60.0 - version: 0.60.0 + specifier: 0.67.0 + version: 0.67.0(zod@3.24.4) '@braintree/sanitize-url': specifier: 7.1.1 version: 7.1.1 '@electron/remote': specifier: 2.1.3 - version: 2.1.3(electron@37.4.0) + version: 2.1.3(electron@38.3.0) + '@preact/preset-vite': + specifier: 2.10.2 + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@triliumnext/commons': specifier: workspace:* version: link:../../packages/commons @@ -551,9 +525,6 @@ importers: '@types/js-yaml': specifier: 4.0.9 version: 4.0.9 - '@types/jsdom': - specifier: 21.1.7 - version: 21.1.7 '@types/mime-types': specifier: 3.0.1 version: 3.0.1 @@ -573,8 +544,8 @@ importers: specifier: 2.5.7 version: 2.5.7 '@types/serve-static': - specifier: 1.15.8 - version: 1.15.8 + specifier: 1.15.9 + version: 1.15.9 '@types/session-file-store': specifier: 1.2.5 version: 1.2.5 @@ -606,11 +577,14 @@ importers: specifier: 0.5.0 version: 0.5.0 axios: - specifier: 1.11.0 - version: 1.11.0(debug@4.4.1) + specifier: 1.12.2 + version: 1.12.2(debug@4.4.3) bindings: specifier: 1.5.0 version: 1.5.0 + bootstrap: + specifier: 5.3.8 + version: 5.3.8(@popperjs/core@2.11.8) chardet: specifier: 2.1.0 version: 2.1.0 @@ -633,20 +607,20 @@ importers: specifier: 3.2.2 version: 3.2.2 dayjs: - specifier: 1.11.14 - version: 1.11.14 + specifier: 1.11.18 + version: 1.11.18 debounce: specifier: 2.2.0 version: 2.2.0 debug: - specifier: 4.4.1 - version: 4.4.1(supports-color@6.0.0) + specifier: 4.4.3 + version: 4.4.3(supports-color@6.0.0) ejs: specifier: 3.1.10 version: 3.1.10 electron: - specifier: 37.4.0 - version: 37.4.0 + specifier: 38.3.0 + version: 38.3.0 electron-debug: specifier: 4.1.0 version: 4.1.0 @@ -660,14 +634,14 @@ importers: specifier: 5.1.0 version: 5.1.0 express-http-proxy: - specifier: 2.1.1 - version: 2.1.1 + specifier: 2.1.2 + version: 2.1.2 express-openid-connect: - specifier: ^2.17.1 + specifier: 2.19.2 version: 2.19.2(express@5.1.0) express-rate-limit: - specifier: 8.0.1 - version: 8.0.1(express@5.1.0) + specifier: 8.1.0 + version: 8.1.0(express@5.1.0) express-session: specifier: 1.18.2 version: 1.18.2 @@ -675,8 +649,8 @@ importers: specifier: 2.0.0 version: 2.0.0 fs-extra: - specifier: 11.3.1 - version: 11.3.1 + specifier: 11.3.2 + version: 11.3.2 helmet: specifier: 8.1.0 version: 8.1.0 @@ -693,8 +667,8 @@ importers: specifier: 7.0.6 version: 7.0.6 i18next: - specifier: 25.4.2 - version: 25.4.2(typescript@5.9.2) + specifier: 25.6.0 + version: 25.6.0(typescript@5.9.3) i18next-fs-backend: specifier: 2.6.0 version: 2.6.0 @@ -716,12 +690,9 @@ importers: js-yaml: specifier: 4.1.0 version: 4.1.0 - jsdom: - specifier: 26.1.0 - version: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) marked: - specifier: 16.2.1 - version: 16.2.1 + specifier: 16.4.1 + version: 16.4.1 mime-types: specifier: 3.0.1 version: 3.0.1 @@ -732,11 +703,11 @@ importers: specifier: 1.1.1 version: 1.1.1 ollama: - specifier: 0.5.17 - version: 0.5.17 + specifier: 0.6.0 + version: 0.6.0 openai: - specifier: 5.12.0 - version: 5.12.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@3.24.4) + specifier: 6.6.0 + version: 6.6.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@3.24.4) rand-token: specifier: 1.0.1 version: 1.0.1 @@ -774,7 +745,7 @@ importers: specifier: 5.0.1 version: 5.0.1(express@5.1.0) time2fa: - specifier: ^1.3.0 + specifier: 1.4.2 version: 1.4.2 tmp: specifier: 0.2.5 @@ -785,6 +756,9 @@ importers: unescape: specifier: 1.0.1 version: 1.0.1 + vite: + specifier: 7.1.11 + version: 7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: specifier: 8.18.3 version: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -798,66 +772,48 @@ importers: apps/server-e2e: devDependencies: dotenv: - specifier: 17.2.1 - version: 17.2.1 + specifier: 17.2.3 + version: 17.2.3 apps/website: dependencies: - '@inlang/paraglide-js': - specifier: ^2.0.0 - version: 2.2.0(babel-plugin-macros@3.1.0) + i18next: + specifier: 25.6.0 + version: 25.6.0(typescript@5.9.3) + i18next-http-backend: + specifier: 3.0.2 + version: 3.0.2(encoding@0.1.13) + preact: + specifier: 10.27.2 + version: 10.27.2 + preact-iso: + specifier: 2.11.0 + version: 2.11.0(preact-render-to-string@6.6.2(preact@10.27.2))(preact@10.27.2) + preact-render-to-string: + specifier: 6.6.2 + version: 6.6.2(preact@10.27.2) + react-i18next: + specifier: 16.1.2 + version: 16.1.2(i18next@25.6.0(typescript@5.9.3))(react-dom@19.1.0(react@16.14.0))(react@16.14.0)(typescript@5.9.3) devDependencies: - '@eslint/compat': - specifier: ^1.2.5 - version: 1.3.2(eslint@9.34.0(jiti@2.5.1)) - '@eslint/js': - specifier: ^9.18.0 - version: 9.34.0 - '@sveltejs/adapter-auto': - specifier: ^6.0.0 - version: 6.1.0(@sveltejs/kit@2.36.3(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))) - '@sveltejs/kit': - specifier: ^2.16.0 - version: 2.36.3(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) - '@sveltejs/vite-plugin-svelte': - specifier: ^6.0.0 - version: 6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) - '@tailwindcss/typography': - specifier: ^0.5.15 - version: 0.5.16(tailwindcss@4.1.12) - '@tailwindcss/vite': - specifier: ^4.0.0 - version: 4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + '@preact/preset-vite': + specifier: 2.10.2 + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) eslint: - specifier: ^9.18.0 - version: 9.34.0(jiti@2.5.1) - eslint-plugin-svelte: - specifier: ^3.0.0 - version: 3.11.0(eslint@9.34.0(jiti@2.5.1))(svelte@5.38.6)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.3.0)(typescript@5.9.2)) - globals: - specifier: ^16.0.0 - version: 16.3.0 - mdsvex: - specifier: ^0.12.3 - version: 0.12.6(svelte@5.38.6) - svelte: - specifier: ^5.0.0 - version: 5.38.6 - svelte-check: - specifier: ^4.0.0 - version: 4.3.1(picomatch@4.0.3)(svelte@5.38.6)(typescript@5.9.2) - tailwindcss: - specifier: ^4.0.0 - version: 4.1.12 + specifier: 9.38.0 + version: 9.38.0(jiti@2.6.1) + eslint-config-preact: + specifier: 2.0.0 + version: 2.0.0(eslint@9.38.0(jiti@2.6.1)) typescript: - specifier: ^5.0.0 - version: 5.9.2 - typescript-eslint: - specifier: ^8.20.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 5.9.3 + version: 5.9.3 + user-agent-data-types: + specifier: 0.4.2 + version: 0.4.2 vite: - specifier: ^7.0.0 - version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + specifier: 7.1.11 + version: 7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -877,12 +833,15 @@ importers: specifier: workspace:* version: link:../ckeditor5-mermaid ckeditor5: - specifier: 46.0.2 - version: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + specifier: 47.1.0 + version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) ckeditor5-premium-features: - specifier: 46.0.2 - version: 46.0.2(bufferutil@4.0.9)(ckeditor5@46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5) + specifier: 47.1.0 + version: 47.1.0(bufferutil@4.0.9)(ckeditor5@47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5) devDependencies: + '@smithy/middleware-retry': + specifier: 4.4.4 + version: 4.4.4 '@types/jquery': specifier: 3.5.33 version: 3.5.33 @@ -891,248 +850,248 @@ importers: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': specifier: 43.1.0 - version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.2) + version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 '@ckeditor/ckeditor5-package-tools': - specifier: ^4.0.0 - version: 4.0.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(bufferutil@4.0.9)(esbuild@0.25.9)(utf-8-validate@6.0.5) + specifier: 4.1.1 + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(bufferutil@4.0.9)(esbuild@0.25.11)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.41.0 - version: 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: ~8.46.0 + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: ^3.0.5 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(playwright@1.55.0)(utf-8-validate@6.0.5)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 3.2.4 + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': - specifier: ^3.0.5 + specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) ckeditor5: - specifier: 46.0.2 - version: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + specifier: 47.1.0 + version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: ^9.0.0 - version: 9.34.0(jiti@2.5.1) + specifier: 9.38.0 + version: 9.38.0(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + version: 12.1.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) http-server: - specifier: ^14.1.0 + specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: ^16.0.0 - version: 16.1.5 + specifier: 16.2.5 + version: 16.2.5 stylelint: - specifier: ^16.0.0 - version: 16.23.1(typescript@5.9.2) + specifier: 16.25.0 + version: 16.25.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(stylelint@16.23.1(typescript@5.9.2)) + version: 12.1.1(stylelint@16.25.0(typescript@5.9.3)) ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2) + specifier: 10.9.2 + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.9.3) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: ^3.0.5 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: ^9.0.7 - version: 9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.0 + version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-footnotes: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': specifier: 43.1.0 - version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.2) + version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 '@ckeditor/ckeditor5-package-tools': - specifier: ^4.0.0 - version: 4.0.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(bufferutil@4.0.9)(esbuild@0.25.9)(utf-8-validate@6.0.5) + specifier: 4.1.1 + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(bufferutil@4.0.9)(esbuild@0.25.11)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.41.0 - version: 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: ~8.46.0 + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: ^3.0.5 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(playwright@1.55.0)(utf-8-validate@6.0.5)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 3.2.4 + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': - specifier: ^3.0.5 + specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) ckeditor5: - specifier: 46.0.2 - version: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + specifier: 47.1.0 + version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: ^9.0.0 - version: 9.34.0(jiti@2.5.1) + specifier: 9.38.0 + version: 9.38.0(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + version: 12.1.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) http-server: - specifier: ^14.1.0 + specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: ^16.0.0 - version: 16.1.5 + specifier: 16.2.5 + version: 16.2.5 stylelint: - specifier: ^16.0.0 - version: 16.23.1(typescript@5.9.2) + specifier: 16.25.0 + version: 16.25.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(stylelint@16.23.1(typescript@5.9.2)) + version: 12.1.1(stylelint@16.25.0(typescript@5.9.3)) ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2) + specifier: 10.9.2 + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.9.3) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: ^3.0.5 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: ^9.0.7 - version: 9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.0 + version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-keyboard-marker: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': specifier: 43.1.0 - version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.2) + version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 '@ckeditor/ckeditor5-package-tools': - specifier: ^4.0.0 - version: 4.0.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(bufferutil@4.0.9)(esbuild@0.25.9)(utf-8-validate@6.0.5) + specifier: 4.1.1 + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(bufferutil@4.0.9)(esbuild@0.25.11)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.41.0 - version: 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: ~8.46.0 + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: ^3.0.5 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(playwright@1.55.0)(utf-8-validate@6.0.5)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 3.2.4 + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': - specifier: ^3.0.5 + specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) ckeditor5: - specifier: 46.0.2 - version: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + specifier: 47.1.0 + version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: ^9.0.0 - version: 9.34.0(jiti@2.5.1) + specifier: 9.38.0 + version: 9.38.0(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + version: 12.1.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) http-server: - specifier: ^14.1.0 + specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: ^16.0.0 - version: 16.1.5 + specifier: 16.2.5 + version: 16.2.5 stylelint: - specifier: ^16.0.0 - version: 16.23.1(typescript@5.9.2) + specifier: 16.25.0 + version: 16.25.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(stylelint@16.23.1(typescript@5.9.2)) + version: 12.1.1(stylelint@16.25.0(typescript@5.9.3)) ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2) + specifier: 10.9.2 + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.9.3) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: ^3.0.5 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: ^9.0.7 - version: 9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.0 + version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-math: dependencies: '@ckeditor/ckeditor5-icons': - specifier: 46.0.2 - version: 46.0.2 + specifier: 47.1.0 + version: 47.1.0 devDependencies: '@ckeditor/ckeditor5-dev-build-tools': specifier: 43.1.0 - version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.2) + version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-dev-utils': specifier: 43.1.0 - version: 43.1.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + version: 43.1.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 '@ckeditor/ckeditor5-package-tools': - specifier: ^4.0.0 - version: 4.0.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(bufferutil@4.0.9)(esbuild@0.25.9)(utf-8-validate@6.0.5) + specifier: 4.1.1 + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(bufferutil@4.0.9)(esbuild@0.25.11)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.41.0 - version: 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: ~8.46.0 + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: ^3.0.5 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(playwright@1.55.0)(utf-8-validate@6.0.5)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 3.2.4 + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': - specifier: ^3.0.5 + specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) ckeditor5: - specifier: 46.0.2 - version: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + specifier: 47.1.0 + version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: ^9.0.0 - version: 9.34.0(jiti@2.5.1) + specifier: 9.38.0 + version: 9.38.0(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + version: 12.1.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) http-server: - specifier: ^14.1.0 + specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: ^16.0.0 - version: 16.1.5 + specifier: 16.2.5 + version: 16.2.5 stylelint: - specifier: ^16.0.0 - version: 16.23.1(typescript@5.9.2) + specifier: 16.25.0 + version: 16.25.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(stylelint@16.23.1(typescript@5.9.2)) + version: 12.1.1(stylelint@16.25.0(typescript@5.9.3)) ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2) + specifier: 10.9.2 + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.9.3) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: ^3.0.5 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: ^9.0.7 - version: 9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.0 + version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-mermaid: dependencies: @@ -1140,78 +1099,78 @@ importers: specifier: 4.17.12 version: 4.17.12 lodash-es: - specifier: ^4.17.21 + specifier: 4.17.21 version: 4.17.21 devDependencies: '@ckeditor/ckeditor5-dev-build-tools': specifier: 43.1.0 - version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.2) + version: 43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 '@ckeditor/ckeditor5-package-tools': - specifier: ^4.0.0 - version: 4.0.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(bufferutil@4.0.9)(esbuild@0.25.9)(utf-8-validate@6.0.5) + specifier: 4.1.1 + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(bufferutil@4.0.9)(esbuild@0.25.11)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': - specifier: ~8.41.0 - version: 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: ~8.46.0 + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: ^3.0.5 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(playwright@1.55.0)(utf-8-validate@6.0.5)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 3.2.4 + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': - specifier: ^3.0.5 + specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) ckeditor5: - specifier: 46.0.2 - version: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + specifier: 47.1.0 + version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: ^9.0.0 - version: 9.34.0(jiti@2.5.1) + specifier: 9.38.0 + version: 9.38.0(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + version: 12.1.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) http-server: - specifier: ^14.1.0 + specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: ^16.0.0 - version: 16.1.5 + specifier: 16.2.5 + version: 16.2.5 stylelint: - specifier: ^16.0.0 - version: 16.23.1(typescript@5.9.2) + specifier: 16.25.0 + version: 16.25.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.1.1(stylelint@16.23.1(typescript@5.9.2)) + version: 12.1.1(stylelint@16.25.0(typescript@5.9.3)) ts-node: - specifier: ^10.9.1 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2) + specifier: 10.9.2 + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.9.3) typescript: - specifier: 5.9.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: ^3.0.5 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: - specifier: ^9.0.7 - version: 9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.20.0 + version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/codemirror: dependencies: '@codemirror/commands': - specifier: 6.8.1 - version: 6.8.1 + specifier: 6.9.0 + version: 6.9.0 '@codemirror/lang-css': specifier: 6.3.1 version: 6.3.1 '@codemirror/lang-html': - specifier: 6.4.9 - version: 6.4.9 + specifier: 6.4.11 + version: 6.4.11 '@codemirror/lang-javascript': specifier: 6.2.4 version: 6.2.4 @@ -1219,8 +1178,8 @@ importers: specifier: 6.0.2 version: 6.0.2 '@codemirror/lang-markdown': - specifier: 6.3.4 - version: 6.3.4 + specifier: 6.4.0 + version: 6.4.0 '@codemirror/lang-php': specifier: 6.0.2 version: 6.0.2 @@ -1231,101 +1190,104 @@ importers: specifier: 6.1.0 version: 6.1.0 '@codemirror/legacy-modes': - specifier: 6.5.1 - version: 6.5.1 + specifier: 6.5.2 + version: 6.5.2 '@codemirror/search': specifier: 6.5.11 version: 6.5.11 '@codemirror/view': - specifier: 6.38.1 - version: 6.38.1 + specifier: 6.38.6 + version: 6.38.6 '@fsegurai/codemirror-theme-abcdef': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-abyss': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-android-studio': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-andromeda': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-basic-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-basic-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-cobalt2': specifier: 6.0.2 - version: 6.0.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.0.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-forest': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-github-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-github-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-gruvbox-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-gruvbox-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-material-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-material-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-monokai': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-nord': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-palenight': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-solarized-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-solarized-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-tokyo-night-day': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-tokyo-night-storm': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-volcano': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-vscode-dark': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@fsegurai/codemirror-theme-vscode-light': specifier: 6.2.2 - version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1) + version: 6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1) '@replit/codemirror-indentation-markers': specifier: 6.5.3 - version: 6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1) + version: 6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6) '@replit/codemirror-lang-nix': specifier: 6.0.1 - version: 6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/lr@1.4.2) + version: 6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/lr@1.4.2) '@replit/codemirror-vim': specifier: 6.3.0 - version: 6.3.0(@codemirror/commands@6.8.1)(@codemirror/language@6.11.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1) + version: 6.3.0(@codemirror/commands@6.9.0)(@codemirror/language@6.11.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6) '@ssddanbrown/codemirror-lang-smarty': specifier: 1.0.0 version: 1.0.0 '@ssddanbrown/codemirror-lang-twig': specifier: 1.0.0 version: 1.0.0 + '@triliumnext/commons': + specifier: workspace:* + version: link:../commons codemirror-lang-elixir: specifier: 4.0.0 version: 4.0.0 @@ -1336,15 +1298,15 @@ importers: specifier: 0.5.0 version: 0.5.0 eslint-linter-browserify: - specifier: 9.34.0 - version: 9.34.0 + specifier: 9.38.0 + version: 9.38.0 packages/commons: {} packages/express-partial-content: dependencies: tslib: - specifier: ^2.3.0 + specifier: 2.8.1 version: 2.8.1 packages/highlightjs: @@ -1368,32 +1330,50 @@ importers: packages/share-theme: devDependencies: '@digitak/esrun': - specifier: ^3.2.24 + specifier: 3.2.26 version: 3.2.26 '@types/swagger-ui': - specifier: ^5.0.0 + specifier: 5.21.1 version: 5.21.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.0.0 - version: 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) dotenv: - specifier: ^17.0.0 - version: 17.2.1 + specifier: 17.2.3 + version: 17.2.3 esbuild: - specifier: ^0.25.0 - version: 0.25.9 + specifier: 0.25.11 + version: 0.25.11 eslint: - specifier: ^9.0.0 - version: 9.34.0(jiti@2.5.1) + specifier: 9.38.0 + version: 9.38.0(jiti@2.6.1) highlight.js: - specifier: ^11.8.0 + specifier: 11.11.1 version: 11.11.1 typescript: - specifier: ^5.2.2 - version: 5.9.2 + specifier: 5.9.3 + version: 5.9.3 + + packages/splitjs: + devDependencies: + '@rollup/plugin-buble': + specifier: 1.0.3 + version: 1.0.3(rollup@4.52.0) + karma: + specifier: 6.4.4 + version: 6.4.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + karma-chrome-launcher: + specifier: 3.2.0 + version: 3.2.0 + karma-firefox-launcher: + specifier: 2.1.3 + version: 2.1.3 + karma-jasmine: + specifier: 5.1.0 + version: 5.1.0(karma@6.4.4(bufferutil@4.0.9)(utf-8-validate@6.0.5)) packages/turndown-plugin-gfm: devDependencies: @@ -1410,15 +1390,20 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/install-pkg@1.0.0': - resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==} + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@antfu/utils@8.1.1': - resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + '@antfu/utils@9.2.0': + resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} - '@anthropic-ai/sdk@0.60.0': - resolution: {integrity: sha512-9zu/TXaUy8BZhXedDtt1wT3H4LOlpKDO1/ftiFpeR3N1PCr3KJFKkxxlQWWt1NNp08xSwUNJ3JNY8yhl8av6eQ==} + '@anthropic-ai/sdk@0.67.0': + resolution: {integrity: sha512-Buxbf6jYJ+pPtfCgXe1pcFtZmdXPrbdqhBjiscFt9irS1G0hCsmR/fPA+DwKTk4GPjqeNnnCYNecXH6uVZ4G/A==} hasBin: true + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + peerDependenciesMeta: + zod: + optional: true '@apidevtools/json-schema-ref-parser@9.1.2': resolution: {integrity: sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==} @@ -1435,8 +1420,8 @@ packages: peerDependencies: openapi-types: '>=7' - '@asamuzakjp/css-color@3.1.4': - resolution: {integrity: sha512-SeuBV4rnjpFNjI8HSgKUwteuFdkHwkboq31HWzznuqgySQir+jSTczoWVVL4jvOjKjuH80fMDG0Fvg1Sb+OJsA==} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} @@ -1559,10 +1544,6 @@ packages: resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} engines: {node: '>=18.0.0'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -1575,16 +1556,15 @@ packages: resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} - engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.28.4': + resolution: {integrity: sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -1595,31 +1575,10 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.0': - resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.4': - resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} @@ -1630,30 +1589,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -1666,10 +1605,6 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} @@ -1679,390 +1614,22 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-decorators@7.25.9': - resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-class-properties@7.12.13': resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-decorators@7.25.9': - resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoping@7.27.0': - resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.27.1': resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} engines: {node: '>=6.9.0'} @@ -2075,113 +1642,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.27.0': - resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-runtime@7.26.10': - resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.27.0': - resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-typescript@7.27.0': - resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': @@ -2196,16 +1658,17 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.0': - resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} '@babel/types@7.28.1': resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} engines: {node: '>=6.9.0'} - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} @@ -2217,8 +1680,8 @@ packages: '@braintree/sanitize-url@7.1.1': resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} - '@bufbuild/protobuf@2.7.0': - resolution: {integrity: sha512-qn6tAIZEw5i/wiESBF4nQxZkl86aY4KoO0IkUa2Lh+rya64oTOdJQFlZuMwI1Qz9VBJQrQC4QlSA2DNek5gCOA==} + '@bufbuild/protobuf@2.10.0': + resolution: {integrity: sha512-fdRs9PSrBF7QUntpZpq6BTw58fhgGJojgg39m9oFOJGZT+nip9b0so5cYY1oWl5pvemDLr0cPPsH46vwThEbpQ==} '@bundled-es-modules/cookie@2.0.1': resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} @@ -2244,62 +1707,62 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} - '@ckeditor/ckeditor-cloud-services-collaboration@53.0.0': - resolution: {integrity: sha512-fvPDzpWW6X0cPaz0nTV2e1kKIGCCUZWCYcgaY8Nfk/Lol1uqqhOaYqzL33ONDPf/TeEIrBNXDU+WtBPWLGMNIQ==} + '@ckeditor/ckeditor-cloud-services-collaboration@53.0.1': + resolution: {integrity: sha512-Em7T4xiwQjG9SJKSwLxxPOf33tDekOV3S1WoSBqi7Qp1icKedYwH3f7k2Zjfe/3XAC3EVNVhi18MhUjsEiO/Lw==} peerDependencies: '@ckeditor/ckeditor5-utils': '>= 37.0' ckeditor5: '>= 37.0' - '@ckeditor/ckeditor5-adapter-ckfinder@46.0.2': - resolution: {integrity: sha512-S4VO8l+WS8yVGpu9vB00rWNdFIR4NTAkuCP7iLlodB45KFgMobP1GTqF8EqNFIJEU2PHJz24R0kcsOyvfU6V/A==} + '@ckeditor/ckeditor5-adapter-ckfinder@47.1.0': + resolution: {integrity: sha512-h/ClAZBbqz0q5332OPLCQXBOx5EH3GHykJrGAK2+Wtx3CuhzJV+RhgEj3KLMQ2SaAR4DaLKamzCAiR2jIH6Y6Q==} - '@ckeditor/ckeditor5-ai@46.0.2': - resolution: {integrity: sha512-2k46VBNMWn8f+CS+5YrmcubLN6ztX8Zh6QPKJrT3C0TyeG0gUuUCa+fpiW71RRaxUgvYE/jq2IMMw2IrhraeBg==} + '@ckeditor/ckeditor5-ai@47.1.0': + resolution: {integrity: sha512-Gxut+IhAH3EjbkV1ftsE3sXHbqCALw3YUQVYaAq7lHzhEN/w/njdt5rbtgRPVZzpaqNRXqyOsktjjdljFiDUuw==} - '@ckeditor/ckeditor5-alignment@46.0.2': - resolution: {integrity: sha512-iCVJIkmJ+DT2Podmc0gH8Ntj7rYr9kziYLup1VHo/k8mKPfqC3a6o6ngT8ZtPdr1nZ4h4kozVjF+ge2BqnxzmQ==} + '@ckeditor/ckeditor5-alignment@47.1.0': + resolution: {integrity: sha512-oE6PLT5MRBayw87jOv5DgR0p6TU7mX18MJkaGEz98vuLW3npo1GEdkBtw72+05FwkKr2QCCZUZpg12DTf9Mc/g==} - '@ckeditor/ckeditor5-autoformat@46.0.2': - resolution: {integrity: sha512-IMEWvgRCYw4PkUsshIb7V54fqJvLLohFLH+CQ0RtjzGE8ZYDkuusu7cHDz8hgQwlDWH5X7VOvTdEdPzb0uRhjA==} + '@ckeditor/ckeditor5-autoformat@47.1.0': + resolution: {integrity: sha512-vnP5CNEDriVgFwUVocXyQ++yGrJnkp8V5YCQZv76nZPSed02soL62MRm6M9A4GOAXpEJMe7d5NWom73ieRfcVA==} - '@ckeditor/ckeditor5-autosave@46.0.2': - resolution: {integrity: sha512-DKUCaGzbpwJC4FdWLVQivjJAkOkNqAaCv4+xNESPQvq8pGzBqHPFTZl0ZBvGUxEUj7S1dypIHkVWqRywSNsKJg==} + '@ckeditor/ckeditor5-autosave@47.1.0': + resolution: {integrity: sha512-3wjI/RNSgXZhG4RMTwl/LByaZyHLV+cixKN0hRqkjULj/i0H05A4Gu485v62FDwBlil1NhPTfKyrmiM/N/7n8g==} - '@ckeditor/ckeditor5-basic-styles@46.0.2': - resolution: {integrity: sha512-KFMNihlxg7LG7wKhG9OgAOqY621qkdz9clzLPmaoZzFydDfoVlnumFlC3cLnhIK1HOJvDnUec3u9te49pbqllQ==} + '@ckeditor/ckeditor5-basic-styles@47.1.0': + resolution: {integrity: sha512-WxiFFKUlisz8B3ymeBFijshDWmqX649TEA+1nxgjXHr0L0UONCJfBExanrRUJND6AwHIh1n2IIAXwXvYMdqZbw==} - '@ckeditor/ckeditor5-block-quote@46.0.2': - resolution: {integrity: sha512-QWfqWPFQ4xFSzVgX8L3XqYYnUZE8/p3K23a2S35jwUJRrJl7PzyDNtzqbqohVWn5mGRXlO66qHdbyayrHTx0Lw==} + '@ckeditor/ckeditor5-block-quote@47.1.0': + resolution: {integrity: sha512-h+p/pFm0wNmozhFZcxxh6DmkGQCE3Jpukju0ovxiPnRO49PN+0cUsdbHuKYtJK6jxLfqwjfdHVOn1m+LyRRmkg==} - '@ckeditor/ckeditor5-bookmark@46.0.2': - resolution: {integrity: sha512-qtWBf55fyogvgwR/ftHPT6paMtqWKs1nKMxFkJI2ZAYkd7R1E8YYDmZGNjzbYTCRf8NLxJn6bBc9FCwZUfSxeA==} + '@ckeditor/ckeditor5-bookmark@47.1.0': + resolution: {integrity: sha512-B7Q0IzaN6iA80B3YkXihXo7gRad5TpKyhTI9x3XvbpCDzO+sBNyOEAy6d6CWmlhQsIZ6mn+hUn2q9N4nACybiw==} - '@ckeditor/ckeditor5-case-change@46.0.2': - resolution: {integrity: sha512-FhT7pbFSVjZ+NA6c+gA15jZHQs5tQqsOTMrMXXvPGJsW0T2nA2Dx9HuyvZujpvCrmMh4m4o0czRXLbtpljPoaw==} + '@ckeditor/ckeditor5-case-change@47.1.0': + resolution: {integrity: sha512-1N8CQjUlKx5nw3HCJrUQSNwzKBQbIPfePL8z7a9RyfrkDU9Inq1G2gQ2U9oaqthRYSEQmzymBk2tbP1+yFcuJA==} - '@ckeditor/ckeditor5-ckbox@46.0.2': - resolution: {integrity: sha512-Q2oqIktjDFi8X2fCE9oELZH02USd4QDcPUShUPRnr/FWcUllx3nXDhz/O+i4bvSh6ckSQKyneRlDtIx11bDbuQ==} + '@ckeditor/ckeditor5-ckbox@47.1.0': + resolution: {integrity: sha512-DgTxePr5fE7yaQCjaSMlKNf5j38NGjywg9//l7XeVvxLmJJgQrN7G7xaX/vl55H2jGZF0LrM4IyS9mbyfUj1bQ==} - '@ckeditor/ckeditor5-ckfinder@46.0.2': - resolution: {integrity: sha512-TC2ZIm1klZ6ZGP1aSbgqiQ6E4fx74pCGqtX5zj+Uk3E3yD48Yr7Wg4dO3eeKcVanIM2MRzg2kr2pGJVlTPcjUw==} + '@ckeditor/ckeditor5-ckfinder@47.1.0': + resolution: {integrity: sha512-eQPgvW+cSA2p5EVyoJv0NIOYorS5DoAxKdcBcxrKc433yuC7fKsZ1awp5aWJOUOfRzGLAa1WYikR7OKvmTjzYg==} - '@ckeditor/ckeditor5-clipboard@46.0.2': - resolution: {integrity: sha512-FL1Dy3CWRmdMrk31oCpYi9FZew3okXlfgkfLyjbXIgAdUiJ+b/9Tu2ZzR6fNjpAN6BYTiOjx5cDq8h8yMLUgwg==} + '@ckeditor/ckeditor5-clipboard@47.1.0': + resolution: {integrity: sha512-xxF9TuV6pWfos1okaS20CFTQN1CD3lOSyZXIJ/IodznpF7f9GYzhhvyOYXJO5fH6T8F0BbR5P94gon8QnAMivg==} - '@ckeditor/ckeditor5-cloud-services@46.0.2': - resolution: {integrity: sha512-auY6i4FCrdUiRCOGPUnIEcISKQad7rUm2fkjWHtS89v9sWabDq6BWLyuAFH8HNGjb81csrwb6b2bzMAL7M1rng==} + '@ckeditor/ckeditor5-cloud-services@47.1.0': + resolution: {integrity: sha512-yLH1eTxWMrzF16CFdu/RJAwzcGYaKKS+gQfX3aRjIphtkY9ebnS1SbelP12ZXUBp/vcTguSYjUrPUwnstoadew==} - '@ckeditor/ckeditor5-code-block@46.0.2': - resolution: {integrity: sha512-ADNMDWSmlvrle0j9vNR5WMNyWjVn8t1TVILmLOab2T0/LTZcTzFXdz5i6I/oKhoxKty7soB8lmCUfJqrXNIhTw==} + '@ckeditor/ckeditor5-code-block@47.1.0': + resolution: {integrity: sha512-FGQD/B5BXHesqgijjBV3wm4tBDNKMjGodsTPjW++NkezgBgzOWdBnl6svpMns+xjtEVFnhkjA9hQt6vbHevJmA==} - '@ckeditor/ckeditor5-collaboration-core@46.0.2': - resolution: {integrity: sha512-9iV/3vBsmFwUR3zS8fvLAFpkNmEejB3okrxT4fO9RWivc5HvD+F3FBwr+0apYZJJy/JYc/XHmmLlPhkfU93+DA==} + '@ckeditor/ckeditor5-collaboration-core@47.1.0': + resolution: {integrity: sha512-R4kr5NdGw2ZEcoHEAlVrcyBVdohT5KtKdeTJHcIUZL3LdVUTWbhCrIPLl4DqHQP6Dtzc47iD+pdudVz5kVSq9g==} - '@ckeditor/ckeditor5-comments@46.0.2': - resolution: {integrity: sha512-96gGYsct1Vm7UBW7nXH+fK/VW8NL9wIO4JvYjcDDGMoHms6blj9yOt3uZhgg+oi6ecxewf3cdEMNivcS1jBzJQ==} + '@ckeditor/ckeditor5-comments@47.1.0': + resolution: {integrity: sha512-OU21V8/J+7Q3bNZd+YMRTkQeu8Gcyl9H6L62cb1ZqEN6v3hnmHYWie9lW5lfvUpomymLwx259UZUivWA2eXpoQ==} - '@ckeditor/ckeditor5-core@46.0.2': - resolution: {integrity: sha512-nXFO2hlmz6gkGzt2/C1yqxwxNqmHxvHy3npIiIuVHWE+e+Zx1BzJjjNEUoZ/K9+6IW0uybhidzGdpdwS6apfpg==} + '@ckeditor/ckeditor5-core@47.1.0': + resolution: {integrity: sha512-CKE/cxzyAECL9rXMCTiQfNtIwy8x24zSyjQgU44FB59H/eUksw9FYaDdRgNs/PvW/gdW7JdCPiaOI3m28wYmHg==} '@ckeditor/ckeditor5-dev-build-tools@43.1.0': resolution: {integrity: sha512-e4dyv/8MtmrcABlTMeCaBi/H+/axxXfYIPB6shOLP/ZXLOnz6j5AEuw+v/KsJja5Y+A7JPPg48H8twaB/KftIQ==} @@ -2310,228 +1773,228 @@ packages: resolution: {integrity: sha512-dIjau68aLaaQtugLsHaCTuxhRL9t2bFmtTIsoUfMl1uHWpOWMdv2LeGEcDznZp633gZh6SDmrqLq2Bp2iOVBew==} engines: {node: '>=18.0.0', npm: '>=5.7.1'} - '@ckeditor/ckeditor5-dev-translations@50.3.1': - resolution: {integrity: sha512-QMAnbZtAaAcukpBoui1jJP3tDRxUqGGT8V87asLPW42u5LggmZ+Vw7ORtVc+2UCB/2M0ZvVYZDASjJ46NCJa9A==} + '@ckeditor/ckeditor5-dev-translations@53.2.0': + resolution: {integrity: sha512-FauIaK1TUTklU50wdNrBG6PxPH0ccErlTC5h6z49PhAl3O9/BHtNImpGTk5FwGB0b8Yi2SMoibsQbqwfBdNabg==} engines: {node: '>=22.0.0', npm: '>=5.7.1'} '@ckeditor/ckeditor5-dev-utils@43.1.0': resolution: {integrity: sha512-EM1zg0vWcFSkxbwOYV6YE6nPoBphfEHtRKzgk86ex9XbxoQvq8HdDvC0dkCSAfgX0oUrFxjLonQBJUTgCoD3YQ==} engines: {node: '>=18.0.0', npm: '>=5.7.1'} - '@ckeditor/ckeditor5-dev-utils@50.3.1': - resolution: {integrity: sha512-Yl0yxDEI9AKKqfVk51hNZKLsYL2s0kFA06kmDkIp+ADg+IkgZRlEIkcEIZht5qSg6N9HFjh0RQQ8O0sLxRiJBA==} + '@ckeditor/ckeditor5-dev-utils@53.2.0': + resolution: {integrity: sha512-zdQoHiYPwJ82FFg6GvTJc5p/dJGl2P8xK5w9Aj3Fbt5ELDeGHwYqPmFklv2jzitkO3z8rMNc3gea/ct241bb8w==} engines: {node: '>=22.0.0', npm: '>=5.7.1'} - '@ckeditor/ckeditor5-document-outline@46.0.2': - resolution: {integrity: sha512-C7itaqV2ldk4NGztcT7E/SdexuNFFdIDC25iYEQgN/lB80rQebT+Fq9ReD0168UlRTduA5y6jNyb1dZqoM3dng==} + '@ckeditor/ckeditor5-document-outline@47.1.0': + resolution: {integrity: sha512-eDnZN22zHETWTxwDqJ2knuLW2PQv481R42PZEZQq8iqWOXHWEfyuy73VhOoF+SqgZF/Zq6ZQwK8FSocd0WxmOg==} - '@ckeditor/ckeditor5-easy-image@46.0.2': - resolution: {integrity: sha512-TjSbCEd8x31k4IlZZmEXA76LW9l1IGzq/bIBX4lLjSF+X30XYVqn9jYzJnPzZ73dNZ1mbzL4gzWO20TaCNyTuA==} + '@ckeditor/ckeditor5-easy-image@47.1.0': + resolution: {integrity: sha512-V/8nSXle8D/XzC6NSmNatcYoZzy7SXOsNFbLgXN+2gOFguhexmgVagBAiHgGCUpZTNTmkQRTI5VpiI5mfAHt+g==} - '@ckeditor/ckeditor5-editor-balloon@46.0.2': - resolution: {integrity: sha512-ZZMFkZ1xP+O3JDFP03fsWZXrPbbzzV0ut2cyHvmTbvxsL8nWkByArbAyc4qs7ceF6wQ68PqLk1o+sPkEWHdVnw==} + '@ckeditor/ckeditor5-editor-balloon@47.1.0': + resolution: {integrity: sha512-M/d8zWQgGbtQPKAyYOBZdEeDBaQXiXmwUIi1rMULL7IGxQDvfHAHB6T7mu3GU39oay0HkM+LGWnz5GZ8oG7HNw==} - '@ckeditor/ckeditor5-editor-classic@46.0.2': - resolution: {integrity: sha512-LTgCEyKapUURBZHZ2y5Z5nmPrl1zl8+kTiTgtpUOgZMQURq/G5BLxx5fdSyF2P0pZAoDYbrDR4uc2ngMH+6lgg==} + '@ckeditor/ckeditor5-editor-classic@47.1.0': + resolution: {integrity: sha512-x4aegRral5LTV1kURmjnp/tLSE1nttH+MsVkrVLWJd0j2A0qj88BLSccmY71ybFgMcDKlwJD6kVT0ZNKsvRogw==} - '@ckeditor/ckeditor5-editor-decoupled@46.0.2': - resolution: {integrity: sha512-eunAH7bAC7Y0FkxK9ukecG2a7Jxm0NAXlaDIWBRBYmNOycUDnMjeD54Ax4udJ7SxJXiTFYYF6fUIZ/mQy/DHbQ==} + '@ckeditor/ckeditor5-editor-decoupled@47.1.0': + resolution: {integrity: sha512-rqTmzMot1rjCz3cqtQkVRou8RgVFItRXeCNY0Ljg3aLcAaNcbwYSYSeJtQpMoyhasSh3cCUqyG9PRnfNYpzTNQ==} - '@ckeditor/ckeditor5-editor-inline@46.0.2': - resolution: {integrity: sha512-XYERPRnt/KNSje/AXpT0aCr6BLpSDAXaGil7edmuPL09oC+gGfjEzvCJDyDHbPCEwOTu684AHVvjiJNKJiJOTQ==} + '@ckeditor/ckeditor5-editor-inline@47.1.0': + resolution: {integrity: sha512-By4mi4p7oReWx8SAyUtq7cIhF1BH63DABJLbj7kaT3MsFlMXOp4FheZpGEMFJbOt8jKx9Du1EU/PFWlUeNoPLw==} - '@ckeditor/ckeditor5-editor-multi-root@46.0.2': - resolution: {integrity: sha512-QUHS10vQ+9XqRfe/djzD6P4Q8rFav3ewXldW2D5trMpQ+d9HzpyyGnYOOHzM5P8VSpgXm1ma8lTuXtqeLnIhnw==} + '@ckeditor/ckeditor5-editor-multi-root@47.1.0': + resolution: {integrity: sha512-BjAOWtAOg8g1E8WJoRj73RoRpyTb1nLtHU2AgxLlaYubGcXfokVvyPz4VU2cDTUq3Zg6chjPeRw74ybLmI2LBg==} - '@ckeditor/ckeditor5-email@46.0.2': - resolution: {integrity: sha512-nFFEC9Q17llOUZPl0i/CCaVGudopFJvRpStw51ihUnb/DSnSlbe6278Ws+IS5XvW4WxuCaVFIJn3IhxAO8vBdw==} + '@ckeditor/ckeditor5-email@47.1.0': + resolution: {integrity: sha512-+45gmjhofgQ43GiGdnxsPKJWdblKLhiqFN1jc3+zbpYqNn/OVr58WWQG5Bb0brJP1UikbvU6IxOzKxfpZwggAg==} - '@ckeditor/ckeditor5-emoji@46.0.2': - resolution: {integrity: sha512-ZxjWu2JxnvX8ZyMQpmJ5VpaoXXtWWJxiO6MNeWjL/tcZ2DhD6/lQye7CLuAOvW4P5WBwrGKDdnk+vx7GLO6NIA==} + '@ckeditor/ckeditor5-emoji@47.1.0': + resolution: {integrity: sha512-8Kicj1md0PfdGtlUxK0kTrLJncYnrhj7OzVqen42ygxiU3PrZrdSApDBg0a8DVb0Skvjb2GhOcBCN7UZptK7LQ==} - '@ckeditor/ckeditor5-engine@46.0.2': - resolution: {integrity: sha512-KrOmMtfLON/5EFS7x8GgCTRfVE4rFniPCRfBPzNL6rA/eWOclLYvwUGHpI6+JAymZ5XzyPLb8ftn6KjG8vvC+w==} + '@ckeditor/ckeditor5-engine@47.1.0': + resolution: {integrity: sha512-uXlD+UKSb6wC5OBzQm5Sn0PYTYNpa4Jccdk61Z6U9h1lAZI4KV4SU12vRL5XG20bI0PIQvBo7Lhy7Va635kiqw==} - '@ckeditor/ckeditor5-enter@46.0.2': - resolution: {integrity: sha512-AZ+WhDEWDH4Ss6i7zd/YcuszlF5QKfkbGPQVsymsUziDvD/IuIQ1WtTDvLfdXbxGKI7amp9e1HCoilOJfv5uDw==} + '@ckeditor/ckeditor5-enter@47.1.0': + resolution: {integrity: sha512-Vkm4rPCTrimJ3LcdPPXQZc86Wb920kish6ckXTSkoPPAe9Ef2fVlKZYggWrXBI4VZ6tegTepSFpZiMqa1/a00w==} - '@ckeditor/ckeditor5-essentials@46.0.2': - resolution: {integrity: sha512-ckcjNJiT1KDfllMr6eiBO9t1GlQUELXotjvUW1H93+g87qvl2yFJa/WB7PCpFOc5Derq45/OQWGL5hjySAqGUA==} + '@ckeditor/ckeditor5-essentials@47.1.0': + resolution: {integrity: sha512-lpXxfBQ7GocQ4klO2GTZYSxJFhymI2WwxaKklI+rh729dcxsIsjih1sXwSLM6kqwPbveF/9WgDBy3I6kqzRmqg==} - '@ckeditor/ckeditor5-export-inline-styles@46.0.2': - resolution: {integrity: sha512-MN/t383ASCYXjYC4VXr58O7w2XqOpERGpgxRWj0WYYcFehh/5TSBPYDscCUEQwU2//wd1z0npyvDcA4l4i0pNg==} + '@ckeditor/ckeditor5-export-inline-styles@47.1.0': + resolution: {integrity: sha512-ZLsfoJtc+fbRKGjTJ38oleEXzAUYAFWhy8JPXZ7sGyGpZf0GuW6++XsTndo9+P2ROrCEycBr4BLNIbSVfWp6LQ==} - '@ckeditor/ckeditor5-export-pdf@46.0.2': - resolution: {integrity: sha512-zS/+tEQk6CTu+wCnypMgddhzwJlYDh74HOHHOCjK/cfkg3DUDndUziI+2P2ft4+QZAfkQhl+EeXxmm3q09OgIA==} + '@ckeditor/ckeditor5-export-pdf@47.1.0': + resolution: {integrity: sha512-Rcn07ZN4L6IaczxvCjxB+LP5Uuv047DQ4xX0F5YDmchvu0ru8Kwswj8rYGQYdqLkP5j8Fo8vkXglDCK2fMh6EA==} - '@ckeditor/ckeditor5-export-word@46.0.2': - resolution: {integrity: sha512-wJjUWNzEFxTOJgOfMLHnnVd+mKHJbGrJ3f5QM9L4kZpjUVDP+aw7QFvlX+Zw6RmI7+OXeFT55XaYcNVZF3dVeg==} + '@ckeditor/ckeditor5-export-word@47.1.0': + resolution: {integrity: sha512-gwIEUVunfamOtDKeGH0S8LYjQjYOEXZU5tEB3GU4rxMZ/YbJKmVkZ1mBu+Qmr1MxTmPCMtBUJ7BFL7U1dV+EHQ==} - '@ckeditor/ckeditor5-find-and-replace@46.0.2': - resolution: {integrity: sha512-k/gAR69CxdjeBf7mrGKWswdsVrdXoHRjCR7RbnTJH+tgzPpbn1sZydD2UacqqC5hON088whTokDY3KFd6zdbXA==} + '@ckeditor/ckeditor5-find-and-replace@47.1.0': + resolution: {integrity: sha512-H3c69XM7fLdlnt20gdNSU1fMwA+1yYfboFWQ07PlA8M/D9H7ZKUmBlI846flSssFp1kPLGhPDTryun6c7zERPg==} - '@ckeditor/ckeditor5-font@46.0.2': - resolution: {integrity: sha512-dKkjRE8+GU6+LtQP45nQSEJkvnW1xltdpHZQrZCKXlf/51b2gBg408JtSBhqc1NOT5t1ZxaJCKHnf91dd6g4Hg==} + '@ckeditor/ckeditor5-font@47.1.0': + resolution: {integrity: sha512-QiKlsqbcMAAlVAoxrBBxe062adBfTfTKHBLJ/VbBMBYszYaWNoG5VJKLQbXnKBVGWD07rE7rXa/vnenCvpT8hQ==} - '@ckeditor/ckeditor5-format-painter@46.0.2': - resolution: {integrity: sha512-TECgMz6ndYE8FiXJgTT20V4eLiWMSLSoMZeupX1BJBor1INZE8loEWi4NxgLP1SJzN3brk5hVoPqYdWlh3Az1w==} + '@ckeditor/ckeditor5-format-painter@47.1.0': + resolution: {integrity: sha512-k/D/OQD4aZg6FhWUEvSlMoElyxTpXpyB/ILQ6jR/WMCmOOjQk5+xaiisrAGEAOjQwwZ9IVvN7Ds63UDRVRMHRQ==} - '@ckeditor/ckeditor5-fullscreen@46.0.2': - resolution: {integrity: sha512-G+w2c5PpKRa9e5mZKR333FKkS1BH5bwKnkc0Xw4p2fowdIaytyv73fmUk2oQMTWEEe8sMMNfXCe69sfRSm4FmA==} + '@ckeditor/ckeditor5-fullscreen@47.1.0': + resolution: {integrity: sha512-LSC62HAW2cmThX2bJOPXcUrxy3sULGStj5G//PdTuxz1z6WbPbF4xst1ockHmaRJeoJUcdt89Qv7C0WFl3j4lw==} - '@ckeditor/ckeditor5-heading@46.0.2': - resolution: {integrity: sha512-AdvE53zuBGyuiBitaLPztWL/OyT3hG9F2kcdf1yG+RYovLXS6lG2Ut1tEL3jzmTNOoObWLQQ9Jpthj7gawXlQw==} + '@ckeditor/ckeditor5-heading@47.1.0': + resolution: {integrity: sha512-HD+mWG5W5kk5fE2G9TFP/ktiU1CU8sA6mOyO6epd+0nsSwacTynKJkszgTVsd9HeY6wZopdqTHa1Dun/9wsxPA==} - '@ckeditor/ckeditor5-highlight@46.0.2': - resolution: {integrity: sha512-wOLa7exXWaIObdFmXIWchgfDEUyk4+j2/B25NLXyYFhk+EVDOIA0le48Tq+nAM7cusA6PP4skwkUZCBOP31UIA==} + '@ckeditor/ckeditor5-highlight@47.1.0': + resolution: {integrity: sha512-K5sO/etY+Nh67r3dsXArPWI5UjOGKQdbS4k5AU30m0vCK9IfGO9BLCUzBnxo6JM91lfOhY96yCqg3zaOU/C0wg==} - '@ckeditor/ckeditor5-horizontal-line@46.0.2': - resolution: {integrity: sha512-TWpcU7xDQnqyKvvv30cYHy+57FTLEuNgUbKRs+ziP1Ywogd6X3jFVnmJk/WMCNc315v1IfDFiuaPbZn04zrmjA==} + '@ckeditor/ckeditor5-horizontal-line@47.1.0': + resolution: {integrity: sha512-ex+g4L0QvteKHtXGJXMu72wjCrMhQw+mEBWLZm20jLeaPf0eSkQ34ilTRFGwZTw/zfgqy69vMTbVV/SIDiYxvg==} - '@ckeditor/ckeditor5-html-embed@46.0.2': - resolution: {integrity: sha512-GJouBoKYKEP1NYrMSeu+vadP5vHsJgUBb/9yvx+kup/50u+HOylenBfVc+IdMMzZyU8ZoNw3wND5mgOpyQPLdQ==} + '@ckeditor/ckeditor5-html-embed@47.1.0': + resolution: {integrity: sha512-HMfnHzSRrpKDealBWtq3cpvRGZuODBssw7f1paQxML2W/pRLd6eSb/Rc9a0O3DB2/NhXq8Bbl9aDv9ungz+SLg==} - '@ckeditor/ckeditor5-html-support@46.0.2': - resolution: {integrity: sha512-DZAMx55Qxz7YQMy4qOCiNKf9oUp/FkAxqJRAG+102nweLQePq86w//oE6pc/mRo3q6U3/za8NLz6JP4L2duztw==} + '@ckeditor/ckeditor5-html-support@47.1.0': + resolution: {integrity: sha512-TBnmlJ1JjMO973Q4A/e+UEv99CMhBezUAdLKqQ3+EztivTEeEb6YV+pmli8HPf7n0DI6UbkU0Kj/mdFUNiIzog==} - '@ckeditor/ckeditor5-icons@46.0.2': - resolution: {integrity: sha512-QNLncoTeHgv4fU7Q/jv/qWH1nQMQ1JreWVQLysu1nEDlm4KiVLzP+8ng51BquY+wxw4rIVJTwZv1FYdyc6xlQw==} + '@ckeditor/ckeditor5-icons@47.1.0': + resolution: {integrity: sha512-2tlGXuQrXiQFxb2U+67kzlkl4/4IlDEt6R+sPQnP+QR7wJNXQnK9zk4M2bc30r91/91iuCjx+AIzKerm0VwFJg==} - '@ckeditor/ckeditor5-image@46.0.2': - resolution: {integrity: sha512-1b72bijZ4lhysL6K9ZZBQZPldMUZwoAar4DFHmCnM/WN6psf/MEyFce+hr5Qq/LFOvCiOeevuNz6DTDKO7eXSg==} + '@ckeditor/ckeditor5-image@47.1.0': + resolution: {integrity: sha512-BoVwiXD/l0yUxUsF9wLajo5p3b7TKamkKP7wAA/dkCUlWYzvzjQKwLwYoknNf3GgHLYuY5n6iRPvYQGvNsn6hg==} - '@ckeditor/ckeditor5-import-word@46.0.2': - resolution: {integrity: sha512-Bxg/0s9hb8PhcYQBaCU4vrNXZ1m4EjN4XpagoszNX18LMOh0/FXcJ7EqbqNtPPdwpbv9my5TyksWyjVG07KNaQ==} + '@ckeditor/ckeditor5-import-word@47.1.0': + resolution: {integrity: sha512-nEGc0putwWxOEkGuh6IRGxWLkxnR/mGELNtsaoHf0ajm751aQdugEaPm8gz/Q606kNCS6bWR2FOnjEhqtqRw/A==} - '@ckeditor/ckeditor5-indent@46.0.2': - resolution: {integrity: sha512-EKA4kM3uZexI6j7GzQyDuYNwY0ULRet0+AZTYbr4rEaB+Mo2zaJCJxuJw1RPTNBwE/9fVJyqYsPzb0UmSRqsGQ==} + '@ckeditor/ckeditor5-indent@47.1.0': + resolution: {integrity: sha512-iqYlsdOGsTjuJ+xUx0ee8aAVh9sDPishKx1UHJbwetlPyM1kUADvVNONVBHV5YLgT0M7Bk5/MzGwlyQAuVipxg==} '@ckeditor/ckeditor5-inspector@5.0.0': resolution: {integrity: sha512-WVCa1mtePJkLtI81Rn2E6orV0B2Az/+O7f+corJzYapoH5koVEe9TcVyoKRquKUWeBXMG+D1m72vmR2kuoLNhA==} - '@ckeditor/ckeditor5-language@46.0.2': - resolution: {integrity: sha512-eYwRnEkoWGabEZ4PVtSobORa+vnUQFuRetInuhDrkBwyMv9IjVUukS46AWHEjkPBO/rlI++O9SK1oOFyzOARCg==} + '@ckeditor/ckeditor5-language@47.1.0': + resolution: {integrity: sha512-nZJlfefKtf0sWvyQdTB361mQMSGSlYj2WbHV3gpabkgkE/ZCbL/Tr5aCJ2ulQo2/ksL2s7nDHFIWu8UUEeVhbw==} - '@ckeditor/ckeditor5-line-height@46.0.2': - resolution: {integrity: sha512-zVLlMblXhe0r8Yv5E52nX2d2Nc0yqaMDDqKa7r2gA2AB8dxMEGx+8GkiK219eYhy9+fVr1GLb1i0c592WXG7Rg==} + '@ckeditor/ckeditor5-line-height@47.1.0': + resolution: {integrity: sha512-OYxelEEVdjUo9LK1LQyT6IlD+YZWu6es/iga5PLnJvsyyGsf1yj+qMk8x4KaCBqd4OubPTsWwJzhWpmZOjmlZw==} - '@ckeditor/ckeditor5-link@46.0.2': - resolution: {integrity: sha512-5uliK3QCIOcEsq2bgZF5Qz88cmN0E1YXUrYc5uoqC8LF0lzOimE+EA+7/dJhBZCya8/+Y/rvvpJ8SHsjhd++kg==} + '@ckeditor/ckeditor5-link@47.1.0': + resolution: {integrity: sha512-8XwnVPnp2GaNzcyXEahDYM8Qjh/qkU/R1VyjMh7EKSnlZOdget/jKXltNNwJpX0ofPMcY0CnvqGGF42gM3Tlcg==} - '@ckeditor/ckeditor5-list-multi-level@46.0.2': - resolution: {integrity: sha512-zkHhLgQUfpaoY0GRu90IlQP5ANjQFc6PLTnwj3Z7Mx5Km3C7iwS3aTTkBlpl+QqLlhdjK2sJj5s1s4vDeIJ+0w==} + '@ckeditor/ckeditor5-list-multi-level@47.1.0': + resolution: {integrity: sha512-qWeIb+1L900bHbbRDk64HEOjzshJRRXYQMj9R73ccUor/AIkKIxEdWIt9LbCXgdmiOSNWd+AB+VWh5kr2ujUqQ==} - '@ckeditor/ckeditor5-list@46.0.2': - resolution: {integrity: sha512-0Pq5UU4SP9UOlcRhxpjCoGXfDxHeqdumn8qtNbL5X5yRGqRE4GsVgJ4CkOmtZNTy1JVv1clZ37NPKh5miqTP4A==} + '@ckeditor/ckeditor5-list@47.1.0': + resolution: {integrity: sha512-P18ZXzJcAGoA6+nIoXkZ27/Ny80HCcrH36ay1MwSxsuQKO8S894kEZb+QS/HvePsX2tso+bQsWw4WWBzbLfP2g==} - '@ckeditor/ckeditor5-markdown-gfm@46.0.2': - resolution: {integrity: sha512-+PaA5D10LnxqrsdW+UI45vqjR7C0l6vWAHFR+M99v7bxHEW+hQiLS6af8FhL/yv9Sno9AL4Oqdsee1HUU7hjHA==} + '@ckeditor/ckeditor5-markdown-gfm@47.1.0': + resolution: {integrity: sha512-oZh2sUX7VvI24ijosvilRqfrRkmUYdDaKdKxDfH8OBKiLnCPOccAhOMVy2LSBY1yvEEIUe2yq79nTC3i0uUkdg==} - '@ckeditor/ckeditor5-media-embed@46.0.2': - resolution: {integrity: sha512-HQqtmuZPGvMKvshVIkz9GQvnSxuvsuw1o99zHvkr73H2OpL2uRRgCwVLufKZpIsn6CMtNbWq9PlZxk6ZME6Nyg==} + '@ckeditor/ckeditor5-media-embed@47.1.0': + resolution: {integrity: sha512-ZbCYrJpEoKnXFLIwTeCqL6au/irByQq4UhElWFECMUchk3ZlJiSbTrVgrMxtzNdYxvlRGkNIizqPlukt4Xf5ig==} - '@ckeditor/ckeditor5-mention@46.0.2': - resolution: {integrity: sha512-/2FT0TmXyxgO5CWg841Yy5PF0uGT4mmp8NQYPpamfgP6E236L/aOTJP4kHtZV5uOSEnt6P48N59MTXswXA3Glg==} + '@ckeditor/ckeditor5-mention@47.1.0': + resolution: {integrity: sha512-5Bsf9224WU/ORVoOZnWWqaGA06DTs/+VLQvZhu5qmh17zL1o/JpSA0SrS9mQcf2StCW4HhX89MZhFSLb+2oOvQ==} - '@ckeditor/ckeditor5-merge-fields@46.0.2': - resolution: {integrity: sha512-HofRJmczkgwThlfOqIYttHjV1SbEkLuFlZ8YPbEx+CME555Ql40nEaYvDcLVzqo4QAC/uZe7Eg8Kzf99DBlbKQ==} + '@ckeditor/ckeditor5-merge-fields@47.1.0': + resolution: {integrity: sha512-yifXWcUKaxIlpW5myJfSlXAT52onHts2A1nBD4HxOXokT4OmoIaIcoaKtsgKm9p1dvPZBjvNCOX8t50DN26W2w==} - '@ckeditor/ckeditor5-minimap@46.0.2': - resolution: {integrity: sha512-Hi0qLjWLgGSwT1u3BlDc5tXMA5eHsDm6L9Sv+LiyxPFPBgX/HQhWT6L6x4jIexHQLlDhBO5o/Hp3tnlW57K5Kg==} + '@ckeditor/ckeditor5-minimap@47.1.0': + resolution: {integrity: sha512-fh3f0WTrULjd8rm/VWhVem/VYJgPjf+h+Zrnu8MeX0DHqRsNINdIUHNtYk2wUbIzQSgGtIVktK0LhLlN/XxRTA==} - '@ckeditor/ckeditor5-operations-compressor@46.0.2': - resolution: {integrity: sha512-PBLZ4yaOOQigBIHxTjKWa7xA7uSj2MHCcLsEvtBVZ8gXcTBtOK2WGLHdwplbnRzDWzf1z646EzrKz7TK7iZv4w==} + '@ckeditor/ckeditor5-operations-compressor@47.1.0': + resolution: {integrity: sha512-Vzh0z7lI4hI9Y2XJjzhzhE5uyalMdAbcDLY2qUoSi7ZQUu1m6IOEb4POlwzGYazkB8hXT24ACa9IwHBeE7GpcQ==} - '@ckeditor/ckeditor5-package-tools@4.0.2': - resolution: {integrity: sha512-Dznbs0xKNcvONJIb4FnvDC9LyUV20271N8FoSaAlCnZeNdrPoKlVJfcHAwsVPqLhtQ8mxfm6k7WnIC5aC6I9Bw==} + '@ckeditor/ckeditor5-package-tools@4.1.1': + resolution: {integrity: sha512-yqGcJO3wRRthYO26Zaax0++cDHPI3sQAy9eBeUFo4JznC7lkNPT5uGgov3ZSsgVA6uza4aDq7sWvNWFUdz+iOw==} hasBin: true - '@ckeditor/ckeditor5-page-break@46.0.2': - resolution: {integrity: sha512-8wSzQU0lwoqzMPFyZHYVJJRTc1GA5gwgtz7XVKKHtKRF9FsKmHYASHsEsjjX3TkU0dPTGnaqsttZ7mBGU9K9Ww==} + '@ckeditor/ckeditor5-page-break@47.1.0': + resolution: {integrity: sha512-PrCugSPny2icLp/ZKx1r6mkgtP1jJmc+kB4w56Dsmgf1ZorWniI53wmemaTDhIgGwnNfO9CjYdSy8Vb4vyB1ZA==} - '@ckeditor/ckeditor5-pagination@46.0.2': - resolution: {integrity: sha512-27GG7FyiOjSfWF695ekAbGJZvjPC/NCzOec5f5UrcjIa3MquR/6pXzbZBJHzs0JFe8gv2ghvFvPW9yQ1qo3JkA==} + '@ckeditor/ckeditor5-pagination@47.1.0': + resolution: {integrity: sha512-/NiJi0D2UAaxwNBsfmxwC81GpgVAaOUhxdQCI+AFGxnN/Uk8FylAdlVQ/i+WMneD/RhnDAg5h7JcSZfrsmy9hQ==} - '@ckeditor/ckeditor5-paragraph@46.0.2': - resolution: {integrity: sha512-Mg4BxYvIzonlLe9zzFZTyiiMbW40NLue9G26lWaCUz+O2z8ms5CShNc065t4alJiihJis5Dtuho8tvPDiRgCNg==} + '@ckeditor/ckeditor5-paragraph@47.1.0': + resolution: {integrity: sha512-B1tY1+kEncLFrGoD3YkpJIMNFSQvB4t8SVSei6+upD3YGkyf/VhmtYlnqBLRK2znQTlg76EJJcWlGv9zCJ9edw==} - '@ckeditor/ckeditor5-paste-from-office-enhanced@46.0.2': - resolution: {integrity: sha512-Ksb3p0Rs2a5omHQPcYh7zWDopoRC2ePGSjtTyxONtZO/8h0yL3tW0poQ/B8kCqAp1b9wBXA2jnDVPovqylu0MA==} + '@ckeditor/ckeditor5-paste-from-office-enhanced@47.1.0': + resolution: {integrity: sha512-X79cmPdTpdC2WN2NSQoTmclFFEDIVCHAQd6eUqvvArLvyJNosGxJQNBsdVY2V0FogWeybc0qWBY9n3VZA4Ipsg==} - '@ckeditor/ckeditor5-paste-from-office@46.0.2': - resolution: {integrity: sha512-eI08nXazXzdIBxKjiU7tANFAdqz1cb5+xRdzn6dmZj0QBLHdEMWZVLLng5XC2gPqB7V3gSA0XbuYeSLF6fTfQg==} + '@ckeditor/ckeditor5-paste-from-office@47.1.0': + resolution: {integrity: sha512-+96rw8TkId8o/im4zvq2EtdDzHHaP/+29PMcJ5ACmvq32tJgFsLCyo10asEWV+U/SiWUHNKBPgGLJeh/MdzlAw==} - '@ckeditor/ckeditor5-real-time-collaboration@46.0.2': - resolution: {integrity: sha512-QkMZZXRMFw1IoH90uSAgqJ/NnxSg70UIFKqUDjwzSNMs6XU46datkdG+NnvgJhp43ZUcI1mGoNoR7Ofpznz//g==} + '@ckeditor/ckeditor5-real-time-collaboration@47.1.0': + resolution: {integrity: sha512-QHJFOrmpWrD0l/iPy2OokmR7N1eDqQXtlBgMhNJRcZg+r/Rkcs+9a1glr8iYObjKIpzVMVLL+e2dRtlQZH6ioA==} - '@ckeditor/ckeditor5-remove-format@46.0.2': - resolution: {integrity: sha512-/Ez72jjpnvDqFtP4afNimyrqbt3xJn/ab7p4DoByqyuBJ/Wy7mkaRcw9dDO0oJB+GVWdcGeRWeYoFUYj3Yw0NQ==} + '@ckeditor/ckeditor5-remove-format@47.1.0': + resolution: {integrity: sha512-JShEW29roO0PyQKBCDUS6cACGuYWxnUhCRcBt+DFUhS5t51XPpDXasdYfGfeUJ9DeNL/0iPjKtQxcGUoMa5NtQ==} - '@ckeditor/ckeditor5-restricted-editing@46.0.2': - resolution: {integrity: sha512-WR8HciP0DcD1TB+i8zRVwroPMiCy9Z7m0kfirCSLmwWP8bn792XwU+kId9DrOWalNzfNh4BXoviaPpi0vtRcmA==} + '@ckeditor/ckeditor5-restricted-editing@47.1.0': + resolution: {integrity: sha512-vEBZKc3vkvFKOVfPn56Wl76YPCn73QmkkUMLGN2tf2ntvSoVEmlk+HTWaXYRG8bsbj2JtdijgW3wckCvNRW8ow==} - '@ckeditor/ckeditor5-revision-history@46.0.2': - resolution: {integrity: sha512-+vUymZSF6/lNCZkZlt6Ij785cqaVRzyACCimFQefj/U9TWIsrTHCLtKuwmH3D4AqutYy0ZFe++MMeHw4t2OU7Q==} + '@ckeditor/ckeditor5-revision-history@47.1.0': + resolution: {integrity: sha512-Y5Fb6yJPqQ/+dfg7inCLL7Nv4oV001Jr4ugHCX3w7gEOs1OL7mPV/hcFRevM8P2/Izy8o4VBdirEXRvbfsMw0g==} - '@ckeditor/ckeditor5-select-all@46.0.2': - resolution: {integrity: sha512-qC+HAZ0BWO4daXkZ84dAu7ynMRJfhtcnUP8pR/o2D6VxJO7Cu+5MwtwfoLmSiJAUGYwcxVd/iFq3RP7ZxS4Rew==} + '@ckeditor/ckeditor5-select-all@47.1.0': + resolution: {integrity: sha512-3k7TgWjcx7FFm0t6bS8Uc6YOhqehf815SsmtFN+JISoL9Ojm1yqLEUOOYuYPy0Voed70Mk2HBQvdEnuP9m6X1g==} - '@ckeditor/ckeditor5-show-blocks@46.0.2': - resolution: {integrity: sha512-J+C59BMbnAH4gPrkUlu/dccKR2NBUqrRIFa01hnDHk+ECYeJsBNlsENNPImxeay4hiF+p4cujhQnI8Xq1NkzQQ==} + '@ckeditor/ckeditor5-show-blocks@47.1.0': + resolution: {integrity: sha512-8ogD671z7j2DwlOa1W0KX7jcorTHbrLxqLYtiCeJljJv/sfHMtzfXc8PL81eiKDfSZwoNY2k5pwTWPyv30MRAg==} - '@ckeditor/ckeditor5-slash-command@46.0.2': - resolution: {integrity: sha512-71DM6PnGVu5KWgEpjyAWEsZ1qYfnIqcaXeTK2ZNtH2EwTp4UnMEC3fLEdkUpqDnc6RxiLScSnrmbBd6FNAczIA==} + '@ckeditor/ckeditor5-slash-command@47.1.0': + resolution: {integrity: sha512-E2F3gRgyA59pDLrjVJIUHw8Yzm0SvnYFU3CoPpmo7Rz5hunukP/iJLlnii8IIsYiJtclnS4/Nim3cMrHNS0X8A==} - '@ckeditor/ckeditor5-source-editing-enhanced@46.0.2': - resolution: {integrity: sha512-n8R39dRE8rzI76zO83EKuX2/fD19clT3vCrXwW/TNbTTCBqaDBVxjAAZe4NfCpaiHGiCZ1y3xyptY7XKtJX6vw==} + '@ckeditor/ckeditor5-source-editing-enhanced@47.1.0': + resolution: {integrity: sha512-6wqLEMZnzGg+WbK+eucM9q4QWMdDTDkleCFI5Tkbsegg3CsryIBNA4cx+vvTDHCPuB3eQl7OZVlkW2QeZQ1FBg==} - '@ckeditor/ckeditor5-source-editing@46.0.2': - resolution: {integrity: sha512-UdQELANPxAMhbbKTBCOfm/dMtqgQpMcU0D58LKjvvOT35ZGyjlrvZCKmXweFtfLPK5SmQhlS9z5/yy9JIH3pVQ==} + '@ckeditor/ckeditor5-source-editing@47.1.0': + resolution: {integrity: sha512-/UzbN04b3gK4FdY9nS6bdmh1KlkhHTOglCnvKDlx6XvC+E6qW2OzfU7D1b/k7sINSmVRGkt5L2NuZCHeAgX2/Q==} - '@ckeditor/ckeditor5-special-characters@46.0.2': - resolution: {integrity: sha512-X3XuIAchgFxmKcWcc513vzzsMcN6eOPOzQlQtVr9NKgUd/Zvw7YTyxCP1Wj2w9usgLn57p2ame/7GlBt/P1quw==} + '@ckeditor/ckeditor5-special-characters@47.1.0': + resolution: {integrity: sha512-r/FW9Xz589nLcr5pXOyhCPNLQp7XkjR17PgHTgJcQmJuEo396UTvoPz7eBfGkCDMjINmZj1cTNdJSL7/Xpqk5g==} - '@ckeditor/ckeditor5-style@46.0.2': - resolution: {integrity: sha512-LeP6kV0AeY1mrv6hbuQ2s10AEoJ64Vgv7XMAieg/fYE2/CIH0GAXE9/4Xt1+X8zCEddZ0HcbKCyCJG2l20xzyQ==} + '@ckeditor/ckeditor5-style@47.1.0': + resolution: {integrity: sha512-Mt40tqRfgebkbHVXq+8nD19gyIsNgnITiQoT+tFZynSlQieaifDo+9D3Aq70KdrxlHW4Muw5ryYe14Xy7Y+rwA==} - '@ckeditor/ckeditor5-table@46.0.2': - resolution: {integrity: sha512-dGkTe1vEk7iDEmoRCTQszyerXvO5hrJH702kwHV5md2dlXyyJBteAJ9qHiSxf1euC2mOMMUhq7n5DlqpFAFb8A==} + '@ckeditor/ckeditor5-table@47.1.0': + resolution: {integrity: sha512-49g66He4BFzfh/8m23BBhfxk/0FnJnEZ07SiQBWdAMfZSFubTz0/tCm38imf79h4bawUcaLSGP+UJBc6x/gg4w==} - '@ckeditor/ckeditor5-template@46.0.2': - resolution: {integrity: sha512-OCnBs3lMe9Owjrj8lKqnJfv/m3UuvNViquGQekDzdJqFzC7ZiakPosTsAUrWlf33asjEoSJc7CaBi2lIZ8xIwA==} + '@ckeditor/ckeditor5-template@47.1.0': + resolution: {integrity: sha512-UbvTewgi5dNo303+AwMb+V7CjwQLsUPSde8qnP0tnxWu5Bw8e0YkwJuzN1KRFqdMutbJtKDvTIi5DdELo37HNQ==} - '@ckeditor/ckeditor5-theme-lark@46.0.2': - resolution: {integrity: sha512-sHhwOZVg0e3SHm6caeHP67VlKojtoqxiu6oCwFduC+hK4s3OhQ3J/v+FIs7wGeFPz4ReBMAp63LNJVVcllRw+g==} + '@ckeditor/ckeditor5-theme-lark@47.1.0': + resolution: {integrity: sha512-gUAPApFbsViLKGgwHtCLigBYziFUmXDBa9UFmZUNSTZPWpTz/uxOOhwjrQvGqwAH/0W9pKR5TsxWaE2sJZaJPQ==} - '@ckeditor/ckeditor5-track-changes@46.0.2': - resolution: {integrity: sha512-U9Q8TgOyoKrGknJbfpkcodLGBV66DpRo+Nu3tZaIfodr/ek2eiwCHFHo4AHKS2xStC/6S3LMZDZhQS9n5eSpbA==} + '@ckeditor/ckeditor5-track-changes@47.1.0': + resolution: {integrity: sha512-NZYWWwYiJKlKZ2sGFxxDHEJS7S9dW+aPgD3VVNJMvFUnyukAb+8Fwm0leecgyWLmjDFp9y+FKEmgT+T3hamI6Q==} - '@ckeditor/ckeditor5-typing@46.0.2': - resolution: {integrity: sha512-jYrsRmE1rZ6c8jtOWVm6Q3FpIT9HWdJg6fK453w4upkjWM7lH3kXxtPgSLmEATUyO/ON91VNXEGA+LGml2MHnw==} + '@ckeditor/ckeditor5-typing@47.1.0': + resolution: {integrity: sha512-teg0UA6AWEMraXAsXYB8372ogIXfFaakOv6Vz8ppIsuKPZfHKJC5ixUd+oUzk03nv3QdtalQAALY8I8dnwl6dQ==} - '@ckeditor/ckeditor5-ui@46.0.2': - resolution: {integrity: sha512-c0Emy60YDY0EZl8nLPNaFoEA60cxQvfz8cD9uK7MYw9L5s4xSi+m0Nd0P2BR8gK/dfRnwiBnUyLDcu4yPMN1hw==} + '@ckeditor/ckeditor5-ui@47.1.0': + resolution: {integrity: sha512-fV/9LPGZgnWBFQcHq29idZI34OZoO5ej72asf0X+A2rMgdCrHPlVeVwiy6THLRE5CFn9qdramYB27eESxOPi6A==} - '@ckeditor/ckeditor5-undo@46.0.2': - resolution: {integrity: sha512-IOFL9rrYvk2KcNyFK9YPOENM3H7RRqtBNNmj9A9zntpqsoq+8QKqcY5BpcDeODrkOtmbrhwDwcwcek7uqI3S5g==} + '@ckeditor/ckeditor5-undo@47.1.0': + resolution: {integrity: sha512-e+GyEZLlx2LhHbaegWri3p1zgX6fjvQH7fzmFG2NZ5h1bgbsCW/+vHv5/r9cwU2/SudJqOeoQRXGQ8PHBp6/ZA==} - '@ckeditor/ckeditor5-upload@46.0.2': - resolution: {integrity: sha512-34lQ7Cx+/hiHAsY3yL+mwbD2Y1QPsqdr9VdgQU8McfwQNSh/PHBa5WplIMsdMRym8pEicj50nsli/hVl58FsZg==} + '@ckeditor/ckeditor5-upload@47.1.0': + resolution: {integrity: sha512-JP6Ao5xbNPoxKv4zWgYbVBA6u8CmOSkvLYp+P3+i4MCcwva4NH/dKwJL+Wqk8XxZ8eavhXNgMGs22Oqq2v18/Q==} - '@ckeditor/ckeditor5-uploadcare@46.0.2': - resolution: {integrity: sha512-5ma5RzDW2hHXPcqn3AbEX7ao8R/3V8Nm8RqXfdWyyIRr5uxdHh32pyp9MuiVPZZ8LGxzrZcXPXY5sVpxMEj06g==} + '@ckeditor/ckeditor5-uploadcare@47.1.0': + resolution: {integrity: sha512-hbh7PIfTUR+iISOrsN+PdgR9HcjxB+TM+c7Kk811M1zWQHo2UrZ+Krii5PWJeZaY+jv9hjZrGlQy4CagntjIQQ==} - '@ckeditor/ckeditor5-utils@46.0.2': - resolution: {integrity: sha512-7t9PAZurES75Nz7ICadfRoGT5SbXnbxu6L5PoAxmyIGFPKICdZ6I4mVILVraPSNwgFDm/Zg2RxmiCOMWFTlxMg==} + '@ckeditor/ckeditor5-utils@47.1.0': + resolution: {integrity: sha512-tx2AHkx8dqVp4YKieGbNmSZy88ekmsMIQyHMD04n6oMFz16a3mmqFCm9WJRpTaNvniGKh6TCxA48Kf2zwn7EmQ==} - '@ckeditor/ckeditor5-watchdog@46.0.2': - resolution: {integrity: sha512-QaXczfT5WgyteNVzbYWhZ0SBLQj/qXXRefMq0v1mpI9Iro44iMV7XmvOWhTVsskwTuNq32a1C5zMzfW0Ax69rQ==} + '@ckeditor/ckeditor5-watchdog@47.1.0': + resolution: {integrity: sha512-3cK0GKi8Et3dHln1E36Wmk30SzgLd2dgWDGaNUvfygQT9hBeKnWZ//cp/ZlBwbfEwJth/jAlcXUHsFR9T2Uwjw==} - '@ckeditor/ckeditor5-widget@46.0.2': - resolution: {integrity: sha512-uBcYwT7vTKCyuMXZIi0Qbs3neBQQp1sFFb/ClsX0elbh3UZEoVyr13uZIgl1+TrnVZa0scICJfWLbaiRHjVTXg==} + '@ckeditor/ckeditor5-widget@47.1.0': + resolution: {integrity: sha512-S04Ry1eVMyLV7yyc8bpmAY/7/bmD8FsrV5Gfk3ftL+voJi0+3B1WmptOcpkyiCC5PbbgjNX3f0NPYufEjjPNtQ==} - '@ckeditor/ckeditor5-word-count@46.0.2': - resolution: {integrity: sha512-U2b1DTchEE75ndHmDMmV3y/NXFFx9yIoSYzupsPJywKVTdBFdDZvSnulEocuP/YCgWTA1VWTiAirRTmccII/Qw==} + '@ckeditor/ckeditor5-word-count@47.1.0': + resolution: {integrity: sha512-e9sx/EUONwbdZFGU6bcJmrLMw18Fugecs3LiMQVVoVrFpMEywPhzzeRZUN6XX70qPXWHkDRQRnNSQXqhJ2lpxg==} '@codemirror/autocomplete@6.18.6': resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} @@ -2539,11 +2002,14 @@ packages: '@codemirror/commands@6.8.1': resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} + '@codemirror/commands@6.9.0': + resolution: {integrity: sha512-454TVgjhO6cMufsyyGN70rGIfJxJEjcqjBG2x2Y03Y/+Fm99d3O/Kv1QDYWuG6hvxsgmjXmBuATikIIYvERX+w==} + '@codemirror/lang-css@6.3.1': resolution: {integrity: sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==} - '@codemirror/lang-html@6.4.9': - resolution: {integrity: sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==} + '@codemirror/lang-html@6.4.11': + resolution: {integrity: sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==} '@codemirror/lang-javascript@6.2.4': resolution: {integrity: sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==} @@ -2554,8 +2020,8 @@ packages: '@codemirror/lang-markdown@6.3.2': resolution: {integrity: sha512-c/5MYinGbFxYl4itE9q/rgN/sMTjOr8XL5OWnC+EaRMLfCbVUmmubTJfdgpfcSS2SCaT7b+Q+xi3l6CgoE+BsA==} - '@codemirror/lang-markdown@6.3.4': - resolution: {integrity: sha512-fBm0BO03azXnTAsxhONDYHi/qWSI+uSEIpzKM7h/bkIc9fHnFp9y7KTMXKON0teNT97pFhc1a9DQTtWBYEZ7ug==} + '@codemirror/lang-markdown@6.4.0': + resolution: {integrity: sha512-ZeArR54seh4laFbUTVy0ZmQgO+C/cxxlW4jEoQMhL3HALScBpZBeZcLzrQmJsTEx4is9GzOe0bFAke2B1KZqeA==} '@codemirror/lang-php@6.0.2': resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==} @@ -2569,8 +2035,8 @@ packages: '@codemirror/language@6.11.0': resolution: {integrity: sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==} - '@codemirror/legacy-modes@6.5.1': - resolution: {integrity: sha512-DJYQQ00N1/KdESpZV7jg9hafof/iBNp9h7TYo1SLMk86TWl9uDsVdho2dzd81K+v4retmK6mdC7WpuOQDytQqw==} + '@codemirror/legacy-modes@6.5.2': + resolution: {integrity: sha512-/jJbwSTazlQEDOQw2FJ8LEEKVS72pU0lx6oM54kGpL8t/NJ2Jda3CZ4pcltiKTdqYSRk3ug1B3pil1gsjA6+8Q==} '@codemirror/lint@6.8.5': resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} @@ -2584,30 +2050,34 @@ packages: '@codemirror/theme-one-dark@6.1.2': resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==} - '@codemirror/view@6.38.1': - resolution: {integrity: sha512-RmTOkE7hRU3OVREqFVITWHz6ocgBjv08GoePscAakgVQfciA3SGCEk7mb9IzwW61cKKmlTpHXG6DUE5Ubx+MGQ==} + '@codemirror/view@6.38.6': + resolution: {integrity: sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@csstools/color-helpers@5.0.2': - resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} - '@csstools/css-calc@2.1.3': - resolution: {integrity: sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-color-parser@3.0.9': - resolution: {integrity: sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==} + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 '@csstools/css-parser-algorithms@3.0.5': resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} @@ -2659,88 +2129,88 @@ packages: '@digitak/grubber@3.1.4': resolution: {integrity: sha512-pqsnp2BUYlDoTXWG34HWgEJse/Eo1okRgNex8IG84wHrJp8h3SakeR5WhB4VxSA2+/D+frNYJ0ch3yXzsfNDoA==} - '@dual-bundle/import-meta-resolve@4.1.0': - resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + '@dual-bundle/import-meta-resolve@4.2.1': + resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} - '@electron-forge/cli@7.8.3': - resolution: {integrity: sha512-BSAjGGfVf0yp3NQhXYmyCw9T//YCQHuktMv4HXfDVfo7AoV6DA1oEhqldI4Q7aHKeRob5+yBkvRRYPiu5ayCPw==} + '@electron-forge/cli@7.10.2': + resolution: {integrity: sha512-X1RtS5IqNgzGDS2rr1q0Y74wU/m3DbU4vSgllNun1ZQv1BfMpDcKLhnKi3aeetoA0huLTpMVU9eWJ7bziI9fxA==} engines: {node: '>= 16.4.0'} hasBin: true - '@electron-forge/core-utils@7.8.3': - resolution: {integrity: sha512-8jhK7AvUKEqDyTMMuRhvS1TkE73YEnHYAxVvkJq35e1KdCwGbGnSRhaEs7OOqRfkKxfepdJ7BMKFSoKFeP+z0Q==} + '@electron-forge/core-utils@7.10.2': + resolution: {integrity: sha512-JXrk2hWR4q8KgZFABpojjuqql3tYeVIH6qmtbkNEkZEQq7YIxajJBCct7J7bWfNQTmHotsQ3k5KLknhyhTaBMw==} engines: {node: '>= 16.4.0'} - '@electron-forge/core@7.8.3': - resolution: {integrity: sha512-qX2vi/LP3HcSqSfLfzMeH2ll8SFZQnOk8VN/b3bq6XrBCbrfrSsTYYWakN6mmfalLJcQRm4jCEc6gcyuGO4i6Q==} + '@electron-forge/core@7.10.2': + resolution: {integrity: sha512-HAIuOtpOfGjA0cd55tbEV2gAv+A7tSZg9bonmVDYFEe6dBgbLk8a3+/1fJUdWW8fyFkg1wa8zK7pjP751bAXsA==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-base@7.8.3': - resolution: {integrity: sha512-WmF66cHdziaK8Asi7IRTLxZjCZ8IqXXHr6IPl4d5oatN6s5RG+HHzG1hiJ7LzlOEntqdSpE8Wh2nB2TmyR4huQ==} + '@electron-forge/maker-base@7.10.2': + resolution: {integrity: sha512-1QN4qnPVTjo+qWYG+s0kYv7XcuIowsPVvbl718FgJUcvkxyRjUA6kWHjFxRvdV6g7Sa2PzZBF+/Mrjpws1lehQ==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-deb@7.8.3': - resolution: {integrity: sha512-GZHJU06LRFJkv1wMc3bjMVzedQhyxnyMZqgDJjE9TIlXXZkN2EqGmKLw/HxwNRA1R8yuQeA4Ih6/dEB4bZTevg==} + '@electron-forge/maker-deb@7.10.2': + resolution: {integrity: sha512-4MPr9NW5UbEUbf9geZn5R/0O/QVIiy2EgUXOYOeKkA7oR8U6I1I3+BytYFHYcxbY6+PGhi1H1VTLJLITbHGVWw==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-dmg@7.8.3': - resolution: {integrity: sha512-N3yKU89D7pC/xPeblSQyBQT1DLKzZMl4V5kla6nc3LIA0oyjz99Gosv8IAj9vFkreQ5QRqpTIlu1ecDL9JY9dQ==} + '@electron-forge/maker-dmg@7.10.2': + resolution: {integrity: sha512-ksSX6/Ioxa3h3rEGIg26qfDcJgB3aFGivitRdSkEnzUCLWJSUoThEwLToA7CAq4J/4ZREK0PDJ7FPsB+F8CYfQ==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-flatpak@7.8.3': - resolution: {integrity: sha512-8+3rWKhBxqhr3Add11AaYTQ4l6YnoKJ6llX2i0Br62G1vGmlzuJHt1CTYLx+EzsznNgfcmzHN106ZubRrNhxJQ==} + '@electron-forge/maker-flatpak@7.10.2': + resolution: {integrity: sha512-LldkYGkIhri99+HqetGjNzi2cdXy32o5uLlr7fDLoiegm8WAkvvWxFTLdSDS1RP94f6PVOKR9KHqPauu5GaIYw==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-rpm@7.8.3': - resolution: {integrity: sha512-TqHHdF5D3Dy4NgG+pi8eRc18P1D0FF1LE+CqQF4MRof+XrpHhRtog5Ac4gWjvg1Wma6WjPyTdryHAkURsoBbuQ==} + '@electron-forge/maker-rpm@7.10.2': + resolution: {integrity: sha512-LQoeYzbY/z1yuBBA+bNutCJmhCA4NcXUbFO4OTqsIX8B6y1zNTYZT4JEuhoK7eBsP4/Rz6u/JnNp0XOyjftOUQ==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-squirrel@7.8.3': - resolution: {integrity: sha512-6XSEhZMbgfjAaCm8A54pNjn4ghfxJgPu4i7ok3PhP44WOrFPaPivLttpvKRnxRb0PGZstPjPBFcwL1F9S1trjA==} + '@electron-forge/maker-squirrel@7.10.2': + resolution: {integrity: sha512-Y5EhNSBXf4a7qcq+BK/x5qVDlQ1Gez5V+arUpDvVxf1zwvsB1aSyAjmoBrOKGYD9A5pJzjkMWMDw95MStl1W4A==} engines: {node: '>= 16.4.0'} - '@electron-forge/maker-zip@7.8.3': - resolution: {integrity: sha512-ytao285wKAjKBO6eULzLeqUDP5Zh7beQlGyHjgOMknk7FI0sNy+zGdh3CrCGIhkXSHU/DpukPwRu2SiKvIaIGA==} + '@electron-forge/maker-zip@7.10.2': + resolution: {integrity: sha512-APRqVPM+O1rj4O7sk5f8tqJpS5UgxcUJEsCnXN4JRpdRvsOlMopzYZdazlCLH9l7S+r4ZKirjtMluIGeYq8YOg==} engines: {node: '>= 16.4.0'} - '@electron-forge/plugin-auto-unpack-natives@7.8.3': - resolution: {integrity: sha512-7tRhySvfdTrBC4PEhAzjzjJGT5dBSU6jhy3XlQ8LJH50jHIT9bioQq6dfn/3iw/VaD1ftGWKx+HlntYCmBhViw==} + '@electron-forge/plugin-auto-unpack-natives@7.10.2': + resolution: {integrity: sha512-uQnahm1DECwqI8hBC7PKccyfovY/YqHNz8de3OxyjQDmwsqQfCA8Ucyh1E9n4NMEpw6Co8KLn+qF2BuIOsftLA==} engines: {node: '>= 16.4.0'} - '@electron-forge/plugin-base@7.8.3': - resolution: {integrity: sha512-0CzPQlO3BGu5bLCrx2Xqo6B1yoHhA9wG9boZE58ANr8Qma1NQfAWZU3LnMmF3EdWNTX76PxpZeeb3QbPNcxSuA==} + '@electron-forge/plugin-base@7.10.2': + resolution: {integrity: sha512-+4YLmkLZxvS6JFXYNI4dHt8Il8iIvwk2o6lCJGwNysOUq2KOZ3Wu1He4Ko8HhKcO1VWbFvslbh57oQn963Aryw==} engines: {node: '>= 16.4.0'} - '@electron-forge/publisher-base@7.8.3': - resolution: {integrity: sha512-kurRKVNyLsK2JgmVl88UHu0+qSH+PysMtk/xP0YX5sYNMVxRay8+S1T10tAh6Qom94KwpF3CLYtkebvxb/fq+A==} + '@electron-forge/publisher-base@7.10.2': + resolution: {integrity: sha512-2k2VOY0wOoAgQoQXn/u3EJ2Ka2v363+wC/+zUMTWGeRHW8pRwX84WX2SpsTttRzbsqAEMJYw5FAzgMBEQUTfpg==} engines: {node: '>= 16.4.0'} - '@electron-forge/shared-types@7.8.3': - resolution: {integrity: sha512-gkZtD7ALXHPDOthJo1rQYLDNfG09fdDRMWvjEgaXdF3Z69xXFfnOWPNuOkRUODNalMnuuGs6l7jDl+QFQgHlDg==} + '@electron-forge/shared-types@7.10.2': + resolution: {integrity: sha512-e2pd9RsdbKwsNf6UtKoolmJGy92Nc0/XO4SI91doV8cM954hM2XSYz3VHoqXebMFAF1JDfXoEUt6UCRbEDgMgw==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-base@7.8.3': - resolution: {integrity: sha512-C0tVODDNKoqhCf7T1HRONJs9DKAmjmk8Of0t8rVjT0ERDzMvLGlBByd785v5lFlKbGERyoaXsYltxPAu92G3aA==} + '@electron-forge/template-base@7.10.2': + resolution: {integrity: sha512-D9DbEx3rtikIhUyn4tcz2pJqHNU/+FXKNnzSvmrJoJ9LusR3C42OU9GtbU8oT3nawpnCGgPFIOGXrzexFPp6DA==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-vite-typescript@7.8.3': - resolution: {integrity: sha512-HJjjY9xmlpl0vx10mrXdWn2RYHExfazACxmDNNmGO1eq3eqrQk/3R+NDGyqMJ7ajBsRVbkQNt+wayH7HkRJUjA==} + '@electron-forge/template-vite-typescript@7.10.2': + resolution: {integrity: sha512-df7rpxxIOIyZn0RfQ1GIlLW7dXhxkerc9uZ3ozO4C7zfvip3z0Mg+wS1synktPfr4WISaPktIdnj3mVu6Uu7Mw==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-vite@7.8.3': - resolution: {integrity: sha512-tDL5h+UO5iOzdEYNVsSu4zkUVN4RTxti5iXzcBquKd9Kgt/A/M7xHeuKj7g1Ds7Ul/n2XcFvcfgLcRmiXQeVDA==} + '@electron-forge/template-vite@7.10.2': + resolution: {integrity: sha512-hR9HBOM902yq7zhFl8bO3w5ufMgitdd5ZwDzAdKITFh2ttZemHy9ha5S0K+R+4GoXHz8t7hUTHk8+iPy09qrpA==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-webpack-typescript@7.8.3': - resolution: {integrity: sha512-Xz3X7YJvot08Xm+0BLIS28GJH+0z9vEN9xYX76SOL4jqDcHH8lRFpNWcE2HsxxxRbCVH+s0etVmACZcWoujUrw==} + '@electron-forge/template-webpack-typescript@7.10.2': + resolution: {integrity: sha512-JtrLUAFbxxWJ1kU7b8MNyL5SO9/rY5UeNz1b9hvMvilW8GxyMWUen58dafgdnx3OpKLNZnhOOhgRagNppEzJOA==} engines: {node: '>= 16.4.0'} - '@electron-forge/template-webpack@7.8.3': - resolution: {integrity: sha512-1zkji5px1kDXbigFN5959anCf3HAVBvam3bHh2VejnCScegLQP3JBjAn2Nw2ILWq6ej5JNuA/V99b1dr11hPOw==} + '@electron-forge/template-webpack@7.10.2': + resolution: {integrity: sha512-VIUXA+XHM5SLjg7fIpOOmBsgi0LstkjrEz4gUzVL0AaITM7e+BCziIHld1ceXLbQ1FnKtrUGnQ9X/cHYxYvhHg==} engines: {node: '>= 16.4.0'} - '@electron-forge/tracer@7.8.3': - resolution: {integrity: sha512-YVVDaPEUOvR1z+DDdj8wR/vO9OSlC91wz4/2Iqe9rqQz8sztnnQBClMAZTqu9bkDTFyHrns8j8v7tPVuVS6ULQ==} + '@electron-forge/tracer@7.10.2': + resolution: {integrity: sha512-jhLLQbttfZViSOYn/3SJc8HML+jNZAytPVJwgGGd3coUiFysWJ2Xald99iqOiouPAhIigBfNPxQb/q/EbcDu4g==} engines: {node: '>= 14.17.5'} '@electron/asar@3.4.1': @@ -2800,14 +2270,14 @@ packages: engines: {node: '>=14.14'} hasBin: true - '@emnapi/core@1.4.5': - resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -2816,164 +2286,320 @@ packages: resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} engines: {node: '>=18'} - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} + '@esbuild/aix-ppc64@0.25.10': + resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.10': + resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.10': + resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.10': + resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.10': + resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.10': + resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.10': + resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.10': + resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.10': + resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.10': + resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.10': + resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.10': + resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.10': + resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.10': + resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.10': + resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.10': + resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.10': + resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.10': + resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.10': + resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.10': + resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.10': + resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.10': + resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.10': + resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.10': + resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.10': + resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.10': + resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -2982,21 +2608,12 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.3.2': - resolution: {integrity: sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.40 || 9 - peerDependenciesMeta: - eslint: - optional: true - - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.1': - resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} + '@eslint/config-helpers@0.4.1': + resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.14.0': @@ -3007,26 +2624,34 @@ packages: resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.34.0': - resolution: {integrity: sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==} + '@eslint/js@9.38.0': + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/markdown@6.6.0': resolution: {integrity: sha512-IsWPy2jU3gaQDlioDC4sT4I4kG1hX1OMWs/q2sWwJrPoMASHW/Z4SDw+6Aql6EsHejGbagYuJbFq9Zvx+Y1b1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.3.5': resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@excalidraw/excalidraw@0.18.0': resolution: {integrity: sha512-QkIiS+5qdy8lmDWTKsuy0sK/fen/LRDtbhm2lc2xcFcqhv2/zdg95bYnl+wnwwXGHo7kEmP65BSiMHE7PJ3Zpw==} peerDependencies: @@ -3049,6 +2674,9 @@ packages: '@exercism/highlightjs-gdscript@0.0.1': resolution: {integrity: sha512-LiCFDhXCr3iIEGESHEsSCpCI7qNa2suHcrBWeOYSEtEwCXc+IQpEh5i4K8qPcOMJB9ckVOgLgbSNML8TyvPCVg==} + '@fast-csv/parse@5.0.5': + resolution: {integrity: sha512-M0IbaXZDbxfOnpVE5Kps/a6FGlILLhtLsvWd9qNH3d2TxNnpbNkFf3KD26OmJX6MHq7PdQAl5htStDwnuwHx6w==} + '@file-type/xml@0.4.3': resolution: {integrity: sha512-pGRmkHf+NofNy/52r06HOTsEwdNnBsFEhN6U95s33P+ezuoxZEyBTV9lOB1/Zr0So6/9vDVfWZXLpgd0fy8cOQ==} @@ -3300,18 +2928,14 @@ packages: resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -3319,22 +2943,23 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@2.3.0': - resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + '@iconify/utils@3.0.1': + resolution: {integrity: sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==} - '@inlang/paraglide-js@2.2.0': - resolution: {integrity: sha512-pkpXu1LanvpcAbvpVPf7PgF11Uq7DliSEBngrcUN36l4ZOOpzn3QBTvVr/tJxvks0O67WseQgiMHet8KH7Oz5A==} - hasBin: true + '@inquirer/ansi@1.0.1': + resolution: {integrity: sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==} + engines: {node: '>=18'} - '@inlang/recommend-sherlock@0.2.1': - resolution: {integrity: sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg==} + '@inquirer/checkbox@3.0.1': + resolution: {integrity: sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==} + engines: {node: '>=18'} - '@inlang/sdk@2.4.9': - resolution: {integrity: sha512-cvz/C1rF5WBxzHbEoiBoI6Sz6q6M+TdxfWkEGBYTD77opY8i8WN01prUWXEM87GPF4SZcyIySez9U0Ccm12oFQ==} - engines: {node: '>=18.0.0'} + '@inquirer/confirm@4.0.1': + resolution: {integrity: sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==} + engines: {node: '>=18'} - '@inquirer/confirm@5.1.16': - resolution: {integrity: sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==} + '@inquirer/confirm@5.1.19': + resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -3342,8 +2967,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.2.0': - resolution: {integrity: sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==} + '@inquirer/core@10.3.0': + resolution: {integrity: sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -3351,12 +2976,64 @@ packages: '@types/node': optional: true + '@inquirer/core@9.2.1': + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + engines: {node: '>=18'} + + '@inquirer/editor@3.0.1': + resolution: {integrity: sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==} + engines: {node: '>=18'} + + '@inquirer/expand@3.0.1': + resolution: {integrity: sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==} + engines: {node: '>=18'} + '@inquirer/figures@1.0.13': resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} engines: {node: '>=18'} - '@inquirer/type@3.0.8': - resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + '@inquirer/figures@1.0.14': + resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==} + engines: {node: '>=18'} + + '@inquirer/input@3.0.1': + resolution: {integrity: sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==} + engines: {node: '>=18'} + + '@inquirer/number@2.0.1': + resolution: {integrity: sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==} + engines: {node: '>=18'} + + '@inquirer/password@3.0.1': + resolution: {integrity: sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==} + engines: {node: '>=18'} + + '@inquirer/prompts@6.0.1': + resolution: {integrity: sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==} + engines: {node: '>=18'} + + '@inquirer/rawlist@3.0.1': + resolution: {integrity: sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==} + engines: {node: '>=18'} + + '@inquirer/search@2.0.1': + resolution: {integrity: sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==} + engines: {node: '>=18'} + + '@inquirer/select@3.0.1': + resolution: {integrity: sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==} + engines: {node: '>=18'} + + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + + '@inquirer/type@2.0.0': + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.9': + resolution: {integrity: sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -3380,87 +3057,10 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/console@30.0.5': - resolution: {integrity: sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/diff-sequences@30.0.1': - resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/environment@30.0.5': - resolution: {integrity: sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/expect-utils@30.0.5': - resolution: {integrity: sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/expect@30.0.5': - resolution: {integrity: sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/fake-timers@30.0.5': - resolution: {integrity: sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/get-type@30.0.1': - resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/globals@30.0.5': - resolution: {integrity: sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/pattern@30.0.1': - resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/reporters@30.0.5': - resolution: {integrity: sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@30.0.5': - resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/snapshot-utils@30.0.5': - resolution: {integrity: sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/source-map@30.0.1': - resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/test-result@30.0.5': - resolution: {integrity: sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/test-sequencer@30.0.5': - resolution: {integrity: sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/transform@30.0.5': - resolution: {integrity: sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/types@30.0.5': - resolution: {integrity: sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jimp/core@1.6.0': resolution: {integrity: sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w==} engines: {node: '>=18'} @@ -3573,32 +3173,15 @@ packages: resolution: {integrity: sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA==} engines: {node: '>=18'} - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.10': - resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} '@jridgewell/sourcemap-codec@1.5.4': resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} @@ -3606,14 +3189,8 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -3627,14 +3204,32 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.2.0': - resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} + '@jsonjoy.com/buffers@1.0.0': + resolution: {integrity: sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/util@1.6.0': - resolution: {integrity: sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==} + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.14.0': + resolution: {integrity: sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -3660,8 +3255,8 @@ packages: '@lezer/highlight@1.2.1': resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} - '@lezer/html@1.3.10': - resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} + '@lezer/html@1.3.12': + resolution: {integrity: sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==} '@lezer/javascript@1.5.1': resolution: {integrity: sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==} @@ -3681,12 +3276,11 @@ packages: '@lezer/xml@1.0.6': resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} - '@lix-js/sdk@0.4.7': - resolution: {integrity: sha512-pRbW+joG12L0ULfMiWYosIW0plmW4AsUdiPCp+Z8rAsElJ+wJ6in58zhD3UwUcd4BNcpldEGjg6PdA7e0RgsDQ==} - engines: {node: '>=18'} - - '@lix-js/server-protocol-schema@0.1.1': - resolution: {integrity: sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ==} + '@listr2/prompt-adapter-inquirer@2.0.22': + resolution: {integrity: sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + '@inquirer/prompts': '>= 3 < 8' '@ljharb/resumer@0.0.1': resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==} @@ -3752,10 +3346,13 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@mermaid-js/layout-elk@0.1.9': - resolution: {integrity: sha512-HuvaqFZBr6yT9PpWYockvKAZPJVd89yn/UjOYPxhzbZxlybL2v+2BjVCg7MVH6vRs1irUohb/s42HEdec1CCZw==} + '@mdn/browser-compat-data@5.7.6': + resolution: {integrity: sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==} + + '@mermaid-js/layout-elk@0.2.0': + resolution: {integrity: sha512-vjjYGnCCjYlIA/rR7M//eFi0rHM6dsMyN1JQKfckpt30DTC/esrw36hcrvA2FNPHaqh3Q/SyBWzddyaky8EtUQ==} peerDependencies: - mermaid: 11.10.1 + mermaid: 11.12.0 '@mermaid-js/parser@0.6.2': resolution: {integrity: sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==} @@ -3785,14 +3382,11 @@ packages: resolution: {integrity: sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==} engines: {node: '>=18'} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@napi-rs/wasm-runtime@0.2.4': - resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - - '@napi-rs/wasm-runtime@1.0.3': - resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} @@ -3814,6 +3408,10 @@ packages: resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/agent@4.0.0': + resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/fs@1.1.1': resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} @@ -3848,144 +3446,21 @@ packages: resolution: {integrity: sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==} engines: {node: ^18.17.0 || >=20.5.0} - '@npmcli/package-json@6.2.0': - resolution: {integrity: sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==} - engines: {node: ^18.17.0 || >=20.5.0} + '@npmcli/package-json@7.0.0': + resolution: {integrity: sha512-wy5os0g17akBCVScLyDsDFFf4qC/MmUgIGAFw2pmBGJ/yAQfFbTR9gEaofy4HGm9Jf2MQBnKZICfNds2h3WpEg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/promise-spawn@8.0.2': - resolution: {integrity: sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==} + '@npmcli/promise-spawn@8.0.3': + resolution: {integrity: sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==} engines: {node: ^18.17.0 || >=20.5.0} '@npmcli/redact@3.2.2': resolution: {integrity: sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==} engines: {node: ^18.17.0 || >=20.5.0} - '@npmcli/run-script@9.1.0': - resolution: {integrity: sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@nx/devkit@21.3.11': - resolution: {integrity: sha512-JOV8TAa9K5+ZwTA/EUi0g5qcKEg5vmi0AyOUsrNUHlv3BgQnwZtPLDDTPPZ+ezq24o6YzgwueZWj3CLEdMHEDg==} - peerDependencies: - nx: 21.3.11 - - '@nx/esbuild@21.3.11': - resolution: {integrity: sha512-KODlvBH5JpuAJpDb98J093270TniNDPVDmLtVbAiPFJPRI5R7ElOLxO5gYtDNIlcQyVbrG6gb6I8RDFYz+nKeQ==} - peerDependencies: - esbuild: '>=0.25.0' - peerDependenciesMeta: - esbuild: - optional: true - - '@nx/eslint-plugin@21.3.11': - resolution: {integrity: sha512-BabOp+5qZx/GgCWVALiVm4wjrUOO5sqeItsAWtpocMsvYE8YRZ4+AekS/F2knTjJdcdrh51hxqv5ua3YTNFtfA==} - peerDependencies: - '@typescript-eslint/parser': ^6.13.2 || ^7.0.0 || ^8.0.0 - eslint-config-prettier: ^10.0.0 - peerDependenciesMeta: - eslint-config-prettier: - optional: true - - '@nx/eslint@21.3.11': - resolution: {integrity: sha512-9jeD8QuU3OMcItjtw0QHl5cwohLeA9R+lajNJoOjS2tUGXTHWb8NOcEZBXWMcML+eV1iloIDW8/P4jV4BYqP2w==} - peerDependencies: - '@zkochan/js-yaml': 0.0.7 - eslint: ^8.0.0 || ^9.0.0 - peerDependenciesMeta: - '@zkochan/js-yaml': - optional: true - - '@nx/express@21.3.11': - resolution: {integrity: sha512-8VcU8+TnXmD+yCi58YyeW13ULwFrHRVD5x/B2T8IKH7j//Vc15vIBkIisgcRt2tGlz3QdR0TLftOsouCTpFlfw==} - peerDependencies: - express: ^4.21.2 - peerDependenciesMeta: - express: - optional: true - - '@nx/jest@21.3.11': - resolution: {integrity: sha512-PkdNWeoUY81zr+jtUapBdvvh26lWYIhDNyUwTjIBFajX8EAlhJpvShKHs7QObmrwOMLMXwLHKINiSCw9rueOBQ==} - - '@nx/js@21.3.11': - resolution: {integrity: sha512-aN8g1TP3FMN6MFLvMrZNaoqSwAkBFH1PunKQV17w4nlPkimWICaCP2DhY5W3VoOpjQBbhQoqrRt4mVfgnEpyvA==} - peerDependencies: - verdaccio: ^6.0.5 - peerDependenciesMeta: - verdaccio: - optional: true - - '@nx/node@21.3.11': - resolution: {integrity: sha512-4B2onNmhrCaLlhwhDycMOisAuXmajAbl9gM8G6dS4Tc6z8QHXswlJG6rVP4VvR0ZZKtLeKGED2X5hpv9T1ikxw==} - - '@nx/nx-darwin-arm64@21.3.11': - resolution: {integrity: sha512-qXZrW6kfsfGG9n4cWugR2v8ys7P1SsbQuFahlbNSTd7g+ZxozaOnc7tyxW9XuY84KQ35HwP/QSu1E13fK5CXwQ==} - cpu: [arm64] - os: [darwin] - - '@nx/nx-darwin-x64@21.3.11': - resolution: {integrity: sha512-6NJEIGRITpFZYptJtr/wdnVuidAS/wONMMSwX5rgAqh5A9teI0vxZVOgG6n5f6NQyqEDvZ9ytcIvLsQWA4kJFg==} - cpu: [x64] - os: [darwin] - - '@nx/nx-freebsd-x64@21.3.11': - resolution: {integrity: sha512-9VZOM9mutzuZCUgijHXrIl3NgKt2CWuH/awLqDS8ijhLs6WfI5TYTa+mFwx90dfZZ4y/jy6XWXa2Ee3OShf7Hg==} - cpu: [x64] - os: [freebsd] - - '@nx/nx-linux-arm-gnueabihf@21.3.11': - resolution: {integrity: sha512-a05tAySKDEWt0TGoSnWp/l5+HL/CDJQkHfI9pXho85oDSkVRzhOInAn1EeZB/F+Q3PnJFsMHMhbuu2/nm3uYJA==} - cpu: [arm] - os: [linux] - - '@nx/nx-linux-arm64-gnu@21.3.11': - resolution: {integrity: sha512-MPeivf0ptNpzQYvww6zHIqVbE5dTT2isl/WqzGyy7NgSeYDpFXmouDCQaeKxo5WytMVRCvCw/NnWTQuCK6TjnA==} - cpu: [arm64] - os: [linux] - - '@nx/nx-linux-arm64-musl@21.3.11': - resolution: {integrity: sha512-/hJpc4VJsbxDEreXt5Ka9HJ3TBEHgIa9y/i+H9MmWOeapCdH1Edhx58Heuv9OaX7kK8Y8q0cSicv0dJCghiTjA==} - cpu: [arm64] - os: [linux] - - '@nx/nx-linux-x64-gnu@21.3.11': - resolution: {integrity: sha512-pTBHuloqTxpTHa/fdKjHkFFsfW16mEcTp37HDtoQpjPfcd9nO8CYO8OClaewr9khNqCnSbCLfSoIg/alnb7BWw==} - cpu: [x64] - os: [linux] - - '@nx/nx-linux-x64-musl@21.3.11': - resolution: {integrity: sha512-OhFjURB68rd6xld8t8fiNpopF2E7v+8/jfbpsku9c0gdV2UhzoxCeZwooe7qhQjCcjVO8JNOs4dAf7qs1VtpMw==} - cpu: [x64] - os: [linux] - - '@nx/nx-win32-arm64-msvc@21.3.11': - resolution: {integrity: sha512-pGE2Td13oEj7aeogwCL+2fjmpabQVSduKfGOTlt4YoMlM0w0bXYSWqwiGBMKbMA50qkhnVapwwkuWF38PgCIxg==} - cpu: [arm64] - os: [win32] - - '@nx/nx-win32-x64-msvc@21.3.11': - resolution: {integrity: sha512-KJqLL/Zyx96hs+7pKbo/fsU7ZTFSLeZLnYQu05o6fvJJ5I1+p85t212/7vkbKKWJncyMospQdzLr3zLG3A/u8A==} - cpu: [x64] - os: [win32] - - '@nx/playwright@21.3.11': - resolution: {integrity: sha512-15VfcWM8+DgOZ726vOpfSX0rTi3Em3XgfjySRWuJbGDRua4BZUcVQMxvDgj30jQRCygaefw4N910sHWwVhaCbA==} - peerDependencies: - '@playwright/test': ^1.36.0 - peerDependenciesMeta: - '@playwright/test': - optional: true - - '@nx/vite@21.3.11': - resolution: {integrity: sha512-aplSvXZOFrGnGZfYGNjz8wP9wrHl37o0UIFgN8pVB6PqWqEmxliVJ1ywFFtku6q1dKK29BB253xFjL63t7l+4w==} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - vitest: ^1.3.1 || ^2.0.0 || ^3.0.0 - - '@nx/web@21.3.11': - resolution: {integrity: sha512-nDXv9yJgqZGqD3iEGkacJ7HQ4AbIlPvXH3qdv1ZwJWn0hAt7gBh1TO24gKz38sB3bwZlORRXEAi3dG0XgGkdxA==} - - '@nx/workspace@21.3.11': - resolution: {integrity: sha512-DD2iu9Ip/faNQ5MXZk+UbbBxGofYKjzHsXKRvMNQ/OAVzP/u9z2CPXEmRKlRAEQoy1lInmyopwfEUWwK1v4x0g==} + '@npmcli/run-script@10.0.0': + resolution: {integrity: sha512-vaQj4nccJbAslopIvd49pQH2NhUp7G9pY4byUtmwhe37ZZuubGrx0eB9hW2F37uVNRuDDK6byFGXF+7JCuMSZg==} + engines: {node: ^20.17.0 || >=22.9.0} '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -4003,71 +3478,6 @@ packages: '@oxc-project/types@0.77.3': resolution: {integrity: sha512-5Vh+neJhhxuF0lYCjZXbxjqm2EO6YJ1jG+KuHntrd6VY67OMpYhWq2cZhUhy+xL9qLJVJRaeII7Xj9fciA6v7A==} - '@oxc-resolver/binding-darwin-arm64@5.3.0': - resolution: {integrity: sha512-hXem5ZAguS7IlSiHg/LK0tEfLj4eUo+9U6DaFwwBEGd0L0VIF9LmuiHydRyOrdnnmi9iAAFMAn/wl2cUoiuruA==} - cpu: [arm64] - os: [darwin] - - '@oxc-resolver/binding-darwin-x64@5.3.0': - resolution: {integrity: sha512-wgSwfsZkRbuYCIBLxeg1bYrtKnirAy+IJF0lwfz4z08clgdNBDbfGECJe/cd0csIZPpRcvPFe8317yf31sWhtA==} - cpu: [x64] - os: [darwin] - - '@oxc-resolver/binding-freebsd-x64@5.3.0': - resolution: {integrity: sha512-kzeE2WHgcRMmWjB071RdwEV5Pwke4o0WWslCKoh8if1puvxIxfzu3o7g6P2+v77BP5qop4cri+uvLABSO0WZjg==} - cpu: [x64] - os: [freebsd] - - '@oxc-resolver/binding-linux-arm-gnueabihf@5.3.0': - resolution: {integrity: sha512-I8np34yZP/XfIkZNDbw3rweqVgfjmHYpNX3xnJZWg+f4mgO9/UNWBwetSaqXeDZqvIch/aHak+q4HVrQhQKCqg==} - cpu: [arm] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-gnu@5.3.0': - resolution: {integrity: sha512-u2ndfeEUrW898eXM+qPxIN8TvTPjI90NDQBRgaxxkOfNw3xaotloeiZGz5+Yzlfxgvxr9DY9FdYkqhUhSnGhOw==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-arm64-musl@5.3.0': - resolution: {integrity: sha512-TzbjmFkcnESGuVItQ2diKacX8vu5G0bH3BHmIlmY4OSRLyoAlrJFwGKAHmh6C9+Amfcjo2rx8vdm7swzmsGC6Q==} - cpu: [arm64] - os: [linux] - - '@oxc-resolver/binding-linux-riscv64-gnu@5.3.0': - resolution: {integrity: sha512-NH3pjAqh8nuN29iRuRfTY42Vn03ctoR9VE8llfoUKUfhHUjFHYOXK5VSkhjj1usG8AeuesvqrQnLptCRQVTi/Q==} - cpu: [riscv64] - os: [linux] - - '@oxc-resolver/binding-linux-s390x-gnu@5.3.0': - resolution: {integrity: sha512-tuZtkK9sJYh2MC2uhol1M/8IMTB6ZQ5jmqP2+k5XNXnOb/im94Y5uV/u2lXwVyIuKHZZHtr+0d1HrOiNahoKpw==} - cpu: [s390x] - os: [linux] - - '@oxc-resolver/binding-linux-x64-gnu@5.3.0': - resolution: {integrity: sha512-VzhPYmZCtoES/ThcPdGSmMop7JlwgqtSvlgtKCW15ByV2JKyl8kHAHnPSBfpIooXb0ehFnRdxFtL9qtAEWy01g==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-linux-x64-musl@5.3.0': - resolution: {integrity: sha512-Hi39cWzul24rGljN4Vf1lxjXzQdCrdxO5oCT7KJP4ndSlqIUODJnfnMAP1YhcnIRvNvk+5E6sZtnEmFUd/4d8Q==} - cpu: [x64] - os: [linux] - - '@oxc-resolver/binding-wasm32-wasi@5.3.0': - resolution: {integrity: sha512-ddujvHhP3chmHnSXRlkPVUeYj4/B7eLZwL4yUid+df3WCbVh6DgoT9RmllZn21AhxgKtMdekDdyVJYKFd8tl4A==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@oxc-resolver/binding-win32-arm64-msvc@5.3.0': - resolution: {integrity: sha512-j1YYPLvUkMVNKmIFQZZJ7q6Do4cI3htUnyxNLwDSBVhSohvPIK2VG+IdtOAlWZGa7v+phEZsHfNbXVwB0oPYFQ==} - cpu: [arm64] - os: [win32] - - '@oxc-resolver/binding-win32-x64-msvc@5.3.0': - resolution: {integrity: sha512-LT9eOPPUqfZscQRd5mc08RBeDWOQf+dnOrKnanMallTGPe6g7+rcAlFTA8SWoJbcD45PV8yArFtCmSQSpzHZmg==} - cpu: [x64] - os: [win32] - '@panva/asn1.js@1.0.0': resolution: {integrity: sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==} engines: {node: '>=10.13.0'} @@ -4157,21 +3567,12 @@ packages: resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} engines: {node: '>= 10.0.0'} - '@phenomnomnominal/tsquery@5.0.1': - resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} - peerDependencies: - typescript: ^3 || ^4 || ^5 - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@playwright/test@1.55.0': - resolution: {integrity: sha512-04IXzPwHrW69XusN/SIdDdKZBzMfOT9UNT/YiJit/xpy2VuAoB8NHc8Aplb96zsWDddLnbkPL3TsmrS04ZU2xQ==} + '@playwright/test@1.56.1': + resolution: {integrity: sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==} engines: {node: '>=18'} hasBin: true @@ -4193,7 +3594,7 @@ packages: '@prefresh/core@1.5.5': resolution: {integrity: sha512-H6GTXUl4V4fe3ijz7yhSa/mZ+pGSOh7XaJb6uP/sQsagBx9yl0D1HKDaeoMQA8Ad2Xm27LqvbitMGSdY9UFSKQ==} peerDependencies: - preact: 10.27.1 + preact: 10.27.2 '@prefresh/utils@1.2.1': resolution: {integrity: sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==} @@ -4201,7 +3602,7 @@ packages: '@prefresh/vite@2.4.8': resolution: {integrity: sha512-H7vlo9UbJInuRbZhRQrdgVqLP7qKjDoX7TgYWWwIVhEHeHO0hZ4zyicvwBrV1wX5A3EPOmArgRkUaN7cPI2VXQ==} peerDependencies: - preact: 10.27.1 + preact: 10.27.2 vite: '>=2.0.0' '@promptbook/utils@0.69.5': @@ -4237,8 +3638,8 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@puppeteer/browsers@2.10.7': - resolution: {integrity: sha512-wHWLkQWBjHtajZeqCB74nsa/X70KheyOhySYBRmVQDJiNj0zjZR/naPCvdWjMhcG1LmjaMV/9WtTo5mpe8qWLw==} + '@puppeteer/browsers@2.10.10': + resolution: {integrity: sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==} engines: {node: '>=18'} hasBin: true @@ -4624,6 +4025,15 @@ packages: '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + '@rollup/plugin-buble@1.0.3': + resolution: {integrity: sha512-QYD9BKkJoof0FdCFeSYYhF6/Y8e0Mnf+098xGgmWOFJ4UPHlWujjqOYeVwEm2hJPOmlR5k7HPUdAjqtOWhN64Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/plugin-commonjs@25.0.8': resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} engines: {node: '>=14.0.0'} @@ -4701,8 +4111,8 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.46.3': - resolution: {integrity: sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==} + '@rollup/rollup-android-arm-eabi@4.52.0': + resolution: {integrity: sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==} cpu: [arm] os: [android] @@ -4711,8 +4121,8 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.46.3': - resolution: {integrity: sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==} + '@rollup/rollup-android-arm64@4.52.0': + resolution: {integrity: sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==} cpu: [arm64] os: [android] @@ -4721,8 +4131,8 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.46.3': - resolution: {integrity: sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==} + '@rollup/rollup-darwin-arm64@4.52.0': + resolution: {integrity: sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==} cpu: [arm64] os: [darwin] @@ -4731,8 +4141,8 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.46.3': - resolution: {integrity: sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==} + '@rollup/rollup-darwin-x64@4.52.0': + resolution: {integrity: sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==} cpu: [x64] os: [darwin] @@ -4741,8 +4151,8 @@ packages: cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.46.3': - resolution: {integrity: sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==} + '@rollup/rollup-freebsd-arm64@4.52.0': + resolution: {integrity: sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==} cpu: [arm64] os: [freebsd] @@ -4751,8 +4161,8 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.46.3': - resolution: {integrity: sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==} + '@rollup/rollup-freebsd-x64@4.52.0': + resolution: {integrity: sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==} cpu: [x64] os: [freebsd] @@ -4761,8 +4171,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.46.3': - resolution: {integrity: sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==} + '@rollup/rollup-linux-arm-gnueabihf@4.52.0': + resolution: {integrity: sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==} cpu: [arm] os: [linux] @@ -4771,8 +4181,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.46.3': - resolution: {integrity: sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==} + '@rollup/rollup-linux-arm-musleabihf@4.52.0': + resolution: {integrity: sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==} cpu: [arm] os: [linux] @@ -4781,8 +4191,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.46.3': - resolution: {integrity: sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==} + '@rollup/rollup-linux-arm64-gnu@4.52.0': + resolution: {integrity: sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==} cpu: [arm64] os: [linux] @@ -4791,28 +4201,28 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.46.3': - resolution: {integrity: sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==} + '@rollup/rollup-linux-arm64-musl@4.52.0': + resolution: {integrity: sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-loong64-gnu@4.52.0': + resolution: {integrity: sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.46.3': - resolution: {integrity: sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.46.3': - resolution: {integrity: sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==} + '@rollup/rollup-linux-ppc64-gnu@4.52.0': + resolution: {integrity: sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==} cpu: [ppc64] os: [linux] @@ -4821,8 +4231,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.46.3': - resolution: {integrity: sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==} + '@rollup/rollup-linux-riscv64-gnu@4.52.0': + resolution: {integrity: sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==} cpu: [riscv64] os: [linux] @@ -4831,8 +4241,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.46.3': - resolution: {integrity: sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==} + '@rollup/rollup-linux-riscv64-musl@4.52.0': + resolution: {integrity: sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==} cpu: [riscv64] os: [linux] @@ -4841,8 +4251,8 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.46.3': - resolution: {integrity: sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==} + '@rollup/rollup-linux-s390x-gnu@4.52.0': + resolution: {integrity: sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==} cpu: [s390x] os: [linux] @@ -4851,8 +4261,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.46.3': - resolution: {integrity: sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==} + '@rollup/rollup-linux-x64-gnu@4.52.0': + resolution: {integrity: sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==} cpu: [x64] os: [linux] @@ -4861,18 +4271,23 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.46.3': - resolution: {integrity: sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==} + '@rollup/rollup-linux-x64-musl@4.52.0': + resolution: {integrity: sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==} cpu: [x64] os: [linux] + '@rollup/rollup-openharmony-arm64@4.52.0': + resolution: {integrity: sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==} + cpu: [arm64] + os: [openharmony] + '@rollup/rollup-win32-arm64-msvc@4.40.0': resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.46.3': - resolution: {integrity: sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==} + '@rollup/rollup-win32-arm64-msvc@4.52.0': + resolution: {integrity: sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==} cpu: [arm64] os: [win32] @@ -4881,18 +4296,23 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.46.3': - resolution: {integrity: sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==} + '@rollup/rollup-win32-ia32-msvc@4.52.0': + resolution: {integrity: sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-x64-gnu@4.52.0': + resolution: {integrity: sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==} + cpu: [x64] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.40.0': resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.46.3': - resolution: {integrity: sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==} + '@rollup/rollup-win32-x64-msvc@4.52.0': + resolution: {integrity: sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==} cpu: [x64] os: [win32] @@ -4930,56 +4350,44 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sigstore/bundle@3.1.0': - resolution: {integrity: sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==} + '@sigstore/bundle@4.0.0': + resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/core@3.0.0': + resolution: {integrity: sha512-NgbJ+aW9gQl/25+GIEGYcCyi8M+ng2/5X04BMuIgoDfgvp18vDcoNHOQjQsG9418HGNYRxG3vfEXaR1ayD37gg==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/protobuf-specs@0.5.0': + resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==} engines: {node: ^18.17.0 || >=20.5.0} - '@sigstore/core@2.0.0': - resolution: {integrity: sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==} - engines: {node: ^18.17.0 || >=20.5.0} + '@sigstore/sign@4.0.0': + resolution: {integrity: sha512-5+IadiqPzRRMfvftHONzpeH2EzlDNuBiTMC3Lx7+9tLqn/4xbWVfSZA+YaOzKCn86k5BWfJ+aGO9v+pQmIyxqQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/protobuf-specs@0.4.3': - resolution: {integrity: sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA==} - engines: {node: ^18.17.0 || >=20.5.0} + '@sigstore/tuf@4.0.0': + resolution: {integrity: sha512-0QFuWDHOQmz7t66gfpfNO6aEjoFrdhkJaej/AOqb4kqWZVbPWFZifXZzkxyQBB1OwTbkhdT3LNpMFxwkTvf+2w==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/sign@3.1.0': - resolution: {integrity: sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/tuf@3.1.1': - resolution: {integrity: sha512-eFFvlcBIoGwVkkwmTi/vEQFSva3xs5Ot3WmBcjgjVdiaoelBLQaQ/ZBfhlG0MnG0cmTYScPpk7eDdGDWUcFUmg==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/verify@2.1.1': - resolution: {integrity: sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sinclair/typebox@0.31.28': - resolution: {integrity: sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==} - - '@sinclair/typebox@0.34.38': - resolution: {integrity: sha512-HpkxMmc2XmZKhvaKIZZThlHmx1L0I/V1hWK1NubtlFnr6ZqdiOpV72TKudZUNQjZNsyDBay72qFEhEvb+bcwcA==} + '@sigstore/verify@3.0.0': + resolution: {integrity: sha512-moXtHH33AobOhTZF8xcX1MpOFqdvfCk7v6+teJL8zymBiDXwEsQH6XG9HGx2VIxnJZNm4cNSzflTLDnQLmIdmw==} + engines: {node: ^20.17.0 || >=22.9.0} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@13.0.5': - resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - - '@smithy/abort-controller@4.0.4': - resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} + '@smithy/abort-controller@4.2.3': + resolution: {integrity: sha512-xWL9Mf8b7tIFuAlpjKtRPnHrR8XVrwTj5NPYO/QwZPtc0SDLsPxb56V5tzi5yspSMytISHybifez+4jlrx0vkQ==} engines: {node: '>=18.0.0'} '@smithy/config-resolver@4.1.4': resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.7.0': - resolution: {integrity: sha512-7ov8hu/4j0uPZv8b27oeOFtIBtlFmM3ibrPv/Omx1uUdoXvcpJ00U+H/OWWC/keAguLlcqwtyL2/jTlSnApgNQ==} + '@smithy/core@3.17.0': + resolution: {integrity: sha512-Tir3DbfoTO97fEGUZjzGeoXgcQAUBRDTmuH9A8lxuP8ATrgezrAJ6cLuRvwdKN4ZbYNlHgKlBX69Hyu3THYhtg==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.0.6': @@ -5006,8 +4414,8 @@ packages: resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.1.0': - resolution: {integrity: sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==} + '@smithy/fetch-http-handler@5.3.4': + resolution: {integrity: sha512-bwigPylvivpRLCm+YK9I5wRIYjFESSVwl8JQ1vVx/XhCw0PtCi558NwTnT2DaVCl5pYlImGuQTSwMsZ+pIavRw==} engines: {node: '>=18.0.0'} '@smithy/hash-node@4.0.4': @@ -5022,85 +4430,84 @@ packages: resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.0.0': - resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} '@smithy/middleware-content-length@4.0.4': resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.14': - resolution: {integrity: sha512-+BGLpK5D93gCcSEceaaYhUD/+OCGXM1IDaq/jKUQ+ujB0PTWlWN85noodKw/IPFZhIKFCNEe19PGd/reUMeLSQ==} - engines: {node: '>=18.0.0'} - deprecated: Please upgrade to @smithy/middleware-endpoint@4.1.15 or higher to fix a bug preventing the resolution of ENV and config file custom endpoints https://github.com/smithy-lang/smithy-typescript/issues/1645 - - '@smithy/middleware-retry@4.1.15': - resolution: {integrity: sha512-iKYUJpiyTQ33U2KlOZeUb0GwtzWR3C0soYcKuCnTmJrvt6XwTPQZhMfsjJZNw7PpQ3TU4Ati1qLSrkSJxnnSMQ==} + '@smithy/middleware-endpoint@4.3.4': + resolution: {integrity: sha512-/RJhpYkMOaUZoJEkddamGPPIYeKICKXOu/ojhn85dKDM0n5iDIhjvYAQLP3K5FPhgB203O3GpWzoK2OehEoIUw==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.0.8': - resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} + '@smithy/middleware-retry@4.4.4': + resolution: {integrity: sha512-vSgABQAkuUHRO03AhR2rWxVQ1un284lkBn+NFawzdahmzksAoOeVMnXXsuPViL4GlhRHXqFaMlc8Mj04OfQk1w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.0.4': - resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} + '@smithy/middleware-serde@4.2.3': + resolution: {integrity: sha512-8g4NuUINpYccxiCXM5s1/V+uLtts8NcX4+sPEbvYQDZk4XoJfDpq5y2FQxfmUL89syoldpzNzA0R9nhzdtdKnQ==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.1.3': - resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} + '@smithy/middleware-stack@4.2.3': + resolution: {integrity: sha512-iGuOJkH71faPNgOj/gWuEGS6xvQashpLwWB1HjHq1lNNiVfbiJLpZVbhddPuDbx9l4Cgl0vPLq5ltRfSaHfspA==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.1.0': - resolution: {integrity: sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==} + '@smithy/node-config-provider@4.3.3': + resolution: {integrity: sha512-NzI1eBpBSViOav8NVy1fqOlSfkLgkUjUTlohUSgAEhHaFWA3XJiLditvavIP7OpvTjDp5u2LhtlBhkBlEisMwA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.0.4': - resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} + '@smithy/node-http-handler@4.4.2': + resolution: {integrity: sha512-MHFvTjts24cjGo1byXqhXrbqm7uznFD/ESFx8npHMWTFQVdBZjrT1hKottmp69LBTRm/JQzP/sn1vPt0/r6AYQ==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.1.2': - resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} + '@smithy/property-provider@4.2.3': + resolution: {integrity: sha512-+1EZ+Y+njiefCohjlhyOcy1UNYjT+1PwGFHCxA/gYctjg3DQWAU19WigOXAco/Ql8hZokNehpzLd0/+3uCreqQ==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.0.4': - resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} + '@smithy/protocol-http@5.3.3': + resolution: {integrity: sha512-Mn7f/1aN2/jecywDcRDvWWWJF4uwg/A0XjFMJtj72DsgHTByfjRltSqcT9NyE9RTdBSN6X1RSXrhn/YWQl8xlw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.0.4': - resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} + '@smithy/querystring-builder@4.2.3': + resolution: {integrity: sha512-LOVCGCmwMahYUM/P0YnU/AlDQFjcu+gWbFJooC417QRB/lDJlWSn8qmPSDp+s4YVAHOgtgbNG4sR+SxF/VOcJQ==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.0.6': - resolution: {integrity: sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==} + '@smithy/querystring-parser@4.2.3': + resolution: {integrity: sha512-cYlSNHcTAX/wc1rpblli3aUlLMGgKZ/Oqn8hhjFASXMCXjIqeuQBei0cnq2JR8t4RtU9FpG6uyl6PxyArTiwKA==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.0.4': - resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} + '@smithy/service-error-classification@4.2.3': + resolution: {integrity: sha512-NkxsAxFWwsPsQiwFG2MzJ/T7uIR6AQNh1SzcxSUnmmIqIQMlLRQDKhc17M7IYjiuBXhrQRjQTo3CxX+DobS93g==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.3.3': + resolution: {integrity: sha512-9f9Ixej0hFhroOK2TxZfUUDR13WVa8tQzhSzPDgXe5jGL3KmaM9s8XN7RQwqtEypI82q9KHnKS71CJ+q/1xLtQ==} engines: {node: '>=18.0.0'} '@smithy/signature-v4@5.1.2': resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.4.6': - resolution: {integrity: sha512-3wfhywdzB/CFszP6moa5L3lf5/zSfQoH0kvVSdkyK2az5qZet0sn2PAHjcTDiq296Y4RP5yxF7B6S6+3oeBUCQ==} + '@smithy/smithy-client@4.9.0': + resolution: {integrity: sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==} engines: {node: '>=18.0.0'} - '@smithy/types@4.3.1': - resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} + '@smithy/types@4.8.0': + resolution: {integrity: sha512-QpELEHLO8SsQVtqP+MkEgCYTFW0pleGozfs3cZ183ZBj9z3VC1CX1/wtFMK64p+5bhtZo41SeLK1rBRtd25nHQ==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.0.4': - resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} + '@smithy/url-parser@4.2.3': + resolution: {integrity: sha512-I066AigYvY3d9VlU3zG9XzZg1yT10aNqvCaBTw9EPgu5GrsEl1aUkcMvhkIXascYH1A8W0LQo3B1Kr1cJNcQEw==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.0.0': - resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.0.0': - resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} engines: {node: '>=18.0.0'} '@smithy/util-body-length-node@4.0.0': @@ -5111,8 +4518,8 @@ packages: resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.0.0': - resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} engines: {node: '>=18.0.0'} '@smithy/util-config-provider@4.0.0': @@ -5131,50 +4538,47 @@ packages: resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.0.0': - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.0.4': - resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} + '@smithy/util-middleware@4.2.3': + resolution: {integrity: sha512-v5ObKlSe8PWUHCqEiX2fy1gNv6goiw6E5I/PN2aXg3Fb/hse0xeaAnSpXDiWl7x6LamVKq7senB+m5LOYHUAHw==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.0.6': - resolution: {integrity: sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==} + '@smithy/util-retry@4.2.3': + resolution: {integrity: sha512-lLPWnakjC0q9z+OtiXk+9RPQiYPNAovt2IXD3CP4LkOnd9NpUsxOjMx1SnoUVB7Orb7fZp67cQMtTBKMFDvOGg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.2.3': - resolution: {integrity: sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==} + '@smithy/util-stream@4.5.3': + resolution: {integrity: sha512-oZvn8a5bwwQBNYHT2eNo0EU8Kkby3jeIg1P2Lu9EQtqDxki1LIjGRJM6dJ5CZUig8QmLxWxqOKWvg3mVoOBs5A==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.0.0': - resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.0.0': - resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@sqlite.org/sqlite-wasm@3.48.0-build4': - resolution: {integrity: sha512-hI6twvUkzOmyGZhQMza1gpfqErZxXRw6JEsiVjUbo7tFanVD+8Oil0Ih3l2nGzHdxPI41zFmfUQG7GHqhciKZQ==} - hasBin: true - '@ssddanbrown/codemirror-lang-smarty@1.0.0': resolution: {integrity: sha512-F0ut1kmdbT3eORk3xVIKfQsGCZiQdh+6sLayBa0+FTex2gyIQlVQZRRA7bPSlchI3uZtWwNnqGNz5O/QLWRlFg==} '@ssddanbrown/codemirror-lang-twig@1.0.0': resolution: {integrity: sha512-7WIMIh8Ssc54TooGCY57WU2rKEqZZrcV2tZSVRPtd0gKYsrDEKCSLWpQjUWEx7bdgh3NKHUjq1O4ugIzI/+dwQ==} - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@stylistic/eslint-plugin@4.4.1': resolution: {integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5187,60 +4591,6 @@ packages: peerDependencies: stylelint: ^16.8.0 - '@sveltejs/acorn-typescript@1.0.5': - resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} - peerDependencies: - acorn: ^8.9.0 - - '@sveltejs/adapter-auto@6.1.0': - resolution: {integrity: sha512-shOuLI5D2s+0zTv2ab5M5PqfknXqWbKi+0UwB9yLTRIdzsK1R93JOO8jNhIYSHdW+IYXIYnLniu+JZqXs7h9Wg==} - peerDependencies: - '@sveltejs/kit': ^2.0.0 - - '@sveltejs/kit@2.36.3': - resolution: {integrity: sha512-MVzwZz1GFznEQbL3f0i2v9AIc3lZH01izQj6XfIrthmZAwOzyXJCgXbLRss8vk//HfYsE4w6Tz+ukbf3rScPNQ==} - engines: {node: '>=18.13'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.0.0 - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - - '@sveltejs/vite-plugin-svelte-inspector@5.0.1': - resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} - engines: {node: ^20.19 || ^22.12 || >=24} - peerDependencies: - '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 - svelte: ^5.0.0 - vite: ^6.3.0 || ^7.0.0 - - '@sveltejs/vite-plugin-svelte@6.1.3': - resolution: {integrity: sha512-3pppgIeIZs6nrQLazzKcdnTJ2IWiui/UucEPXKyFG35TKaHQrfkWBnv6hyJcLxFuR90t+LaoecrqTs8rJKWfSQ==} - engines: {node: ^20.19 || ^22.12 || >=24} - peerDependencies: - svelte: ^5.0.0 - vite: ^6.3.0 || ^7.0.0 - - '@swc-node/core@1.14.1': - resolution: {integrity: sha512-jrt5GUaZUU6cmMS+WTJEvGvaB6j1YNKPHPzC2PUi2BjaFbtxURHj6641Az6xN7b665hNniAIdvjxWcRml5yCnw==} - engines: {node: '>= 10'} - peerDependencies: - '@swc/core': '>= 1.13.3' - '@swc/types': '>= 0.1' - - '@swc-node/register@1.10.10': - resolution: {integrity: sha512-jYWaI2WNEKz8KZL3sExd2KVL1JMma1/J7z+9iTpv0+fRN7LGMF8VTGGuHI2bug/ztpdZU1G44FG/Kk6ElXL9CQ==} - peerDependencies: - '@swc/core': '>= 1.4.13' - typescript: '>= 4.3' - - '@swc-node/sourcemap-support@0.5.1': - resolution: {integrity: sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==} - '@swc/core-darwin-arm64@1.11.29': resolution: {integrity: sha512-whsCX7URzbuS5aET58c75Dloby3Gtj/ITk2vc4WW6pSDQKSPDuONsIcZ7B2ng8oz0K6ttbi4p3H/PNPQLJ4maQ==} engines: {node: '>=10'} @@ -5326,101 +4676,6 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tailwindcss/node@4.1.12': - resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} - - '@tailwindcss/oxide-android-arm64@4.1.12': - resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.1.12': - resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.1.12': - resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.1.12': - resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': - resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': - resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.1.12': - resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.1.12': - resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.1.12': - resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.1.12': - resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': - resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.1.12': - resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.1.12': - resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} - engines: {node: '>= 10'} - - '@tailwindcss/typography@0.5.16': - resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - - '@tailwindcss/vite@4.1.12': - resolution: {integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 - '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -5469,18 +4724,15 @@ packages: resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} - '@tufjs/models@3.0.1': - resolution: {integrity: sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==} - engines: {node: ^18.17.0 || >=20.5.0} + '@tufjs/models@4.0.0': + resolution: {integrity: sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==} + engines: {node: ^20.17.0 || >=22.9.0} '@tweenjs/tween.js@25.0.0': resolution: {integrity: sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==} - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} - - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@types/appdmg@0.5.5': resolution: {integrity: sha512-G+n6DgZTZFOteITE30LnWj+HRVIGr7wMlAiLWOO02uJFWVEitaPU9JVXm9wJokkgshBawb2O1OykdcsmkkZfgg==} @@ -5494,18 +4746,6 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - '@types/better-sqlite3@7.6.13': resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} @@ -5518,6 +4758,9 @@ packages: '@types/bootstrap@5.2.10': resolution: {integrity: sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==} + '@types/buble@0.19.2': + resolution: {integrity: sha512-uUD8zIfXMKThmFkahTXDGI3CthFH1kMg2dOm3KLi4GlC5cbARA64bEcUMbbWdWdE73eoc/iBB9PiTMqH0dNS2Q==} + '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -5553,6 +4796,9 @@ packages: '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/cssnano@5.1.3': resolution: {integrity: sha512-BahAZSSvuFXyhgJiwQgsfsNlStE9K/ULGL+YEzK4mmL2Vf02Pjl2yZs+KmbkAg3MxkC9WwMuFwuwnwvrg7CqvQ==} deprecated: This is a stub types definition. cssnano provides its own type definitions, so you do not need this installed. @@ -5683,8 +4929,8 @@ packages: '@types/express-http-proxy@1.6.7': resolution: {integrity: sha512-CEp9pbnwVI1RzN9PXc+KESMxwUW5r1O7tkWb5h7Wg/YAIf+KulD/zKev8fbbn+Ljt0Yvs8MXwV2W6Id+cKxe2Q==} - '@types/express-serve-static-core@5.0.7': - resolution: {integrity: sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==} + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} '@types/express-session@1.18.2': resolution: {integrity: sha512-k+I0BxwVXsnEU2hV77cCobC08kIsn4y44C3gC0b46uxZVMaXA04lSPgRLR/bSL2w0t0ShJiG8o4jPzRG/nscFg==} @@ -5728,24 +4974,12 @@ packages: '@types/ini@4.1.1': resolution: {integrity: sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==} - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jquery@3.5.33': resolution: {integrity: sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==} '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - '@types/jsdom@21.1.7': - resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -5755,11 +4989,11 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/leaflet-gpx@1.3.7': - resolution: {integrity: sha512-IDshIOLZ7dUUjRiCE3DuJcAGavgUCw0xQ93dc/3YvsA6jrFc+nx8eXr0tqZIf2SaWMgqiDj/n7N24WWNh/898g==} + '@types/leaflet-gpx@1.3.8': + resolution: {integrity: sha512-woIh3APM4FbrEQ+go3yaa4k5j4yn49YLVa1xfSB+T5aYwJn+O3pYhBBQvuxQJW68jpjcaAX/PTJRJLFJ+XT6ow==} - '@types/leaflet@1.9.20': - resolution: {integrity: sha512-rooalPMlk61LCaLOvBF2VIf9M47HgMQqi5xQ9QRi7c8PkdIe0WrIi5IxXUXQjAdL0c+vcQ01mYWbthzmp9GHWw==} + '@types/leaflet@1.9.21': + resolution: {integrity: sha512-TbAd9DaPGSnzp6QvtYngntMZgcRk+igFELwR2N99XZn7RXUdKgsXMR+28bUO0rPsWp8MIu/f47luLIQuSLYv/w==} '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} @@ -5800,17 +5034,20 @@ packages: '@types/multer@2.0.0': resolution: {integrity: sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==} - '@types/node-forge@1.3.13': - resolution: {integrity: sha512-zePQJSW5QkwSHKRApqWCVKeKoSOt4xvEnLENZPjyvm9Ezdf/EyDeJM7jqLzOwjVICQQzvLZ63T55MKdJB5H6ww==} + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/node-forge@1.3.14': + resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} - '@types/node@20.17.32': - resolution: {integrity: sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==} + '@types/node@20.19.18': + resolution: {integrity: sha512-KeYVbfnbsBCyKG8e3gmUqAfyZNcoj/qpEbHRkQkfZdKOBrU7QQ+BsTdfqLSWX9/m1ytYreMhpKvp+EZi3UFYAg==} - '@types/node@20.19.11': - resolution: {integrity: sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==} + '@types/node@20.19.22': + resolution: {integrity: sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==} '@types/node@22.15.21': resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} @@ -5818,11 +5055,17 @@ packages: '@types/node@22.15.30': resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} - '@types/node@22.18.0': - resolution: {integrity: sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==} + '@types/node@22.18.10': + resolution: {integrity: sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==} - '@types/node@24.3.0': - resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} + '@types/node@22.18.12': + resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} + + '@types/node@22.18.8': + resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} + + '@types/node@24.8.1': + resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -5859,6 +5102,9 @@ packages: '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + '@types/reveal.js@5.2.1': + resolution: {integrity: sha512-egr+amW5iilXo94kEGyJv24bJozsu/XAOHnhMHLnaJkHVxoui2gsWqzByaltA5zfXDTH2F4WyWnAkhHRcpytIQ==} + '@types/safe-compare@1.1.2': resolution: {integrity: sha512-kK/IM1+pvwCMom+Kezt/UlP8LMEwm8rP6UgGbRc6zUnhU/csoBQ5rWgmD2CJuHxiMiX+H1VqPGpo0kDluJGXYA==} @@ -5868,9 +5114,6 @@ packages: '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - '@types/send@0.17.5': resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} @@ -5880,8 +5123,8 @@ packages: '@types/serve-index@1.9.4': resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} + '@types/serve-static@1.15.9': + resolution: {integrity: sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==} '@types/session-file-store@1.2.5': resolution: {integrity: sha512-xjIyh40IznXLrvbAY/nmxu5cMcPcE3ZoDrSDvd02m6p8UjUgOtZAGI7Os5DDd6THuxClLWNhFo/awy1tYp64Bg==} @@ -5895,9 +5138,6 @@ packages: '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} @@ -5919,8 +5159,8 @@ packages: '@types/swagger-ui@5.21.1': resolution: {integrity: sha512-DUmUH59eeOtvAqcWwBduH2ws0cc5i95KHsXCS4FsOfbUq/clW8TN+HqRBj7q5p9MSsSNK43RziIGItNbrAGLxg==} - '@types/tabulator-tables@6.2.10': - resolution: {integrity: sha512-g6o0gG3lu/ozmxPw9rLY1p57T6rvV8OhbJKyzWwPwjdnN3JuSQ3gWxb06v2+dl2tdoqNXTvlylipSSKpS8UzzQ==} + '@types/tabulator-tables@6.2.11': + resolution: {integrity: sha512-vDyUwAsrMYH17YvkTuEPUx2Rp98JK0p3B74EsUlvYr08bP4l0NgXL+0tcDIon8Rd2GJeOFC0gW+/3MZ5a9nvSg==} '@types/through2@2.0.41': resolution: {integrity: sha512-ryQ0tidWkb1O1JuYvWKyMLYEtOWDqF5mHerJzKz/gQpoAaJq2l/dsMPBF0B5BNVT34rbARYJ5/tsZwLfUi2kwQ==} @@ -5937,9 +5177,6 @@ packages: '@types/turndown@5.0.5': resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -5952,6 +5189,9 @@ packages: '@types/which@2.0.2': resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -5975,11 +5215,11 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/eslint-plugin@8.41.0': - resolution: {integrity: sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw==} + '@typescript-eslint/eslint-plugin@8.46.2': + resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.41.0 + '@typescript-eslint/parser': ^8.46.2 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' @@ -5990,48 +5230,42 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.41.0': - resolution: {integrity: sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==} + '@typescript-eslint/parser@8.46.2': + resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.38.0': - resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.40.0': resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.41.0': - resolution: {integrity: sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ==} + '@typescript-eslint/project-service@8.46.1': + resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.38.0': - resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.40.0': resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.41.0': - resolution: {integrity: sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ==} + '@typescript-eslint/scope-manager@8.46.1': + resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.38.0': - resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/tsconfig-utils@8.40.0': resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} @@ -6039,18 +5273,17 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.41.0': - resolution: {integrity: sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw==} + '@typescript-eslint/tsconfig-utils@8.46.1': + resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.38.0': - resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/type-utils@8.40.0': resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} @@ -6059,30 +5292,24 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.41.0': - resolution: {integrity: sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ==} + '@typescript-eslint/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.38.0': - resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.40.0': resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.41.0': - resolution: {integrity: sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag==} + '@typescript-eslint/types@8.46.1': + resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.38.0': - resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/typescript-estree@8.40.0': resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} @@ -6090,18 +5317,17 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.41.0': - resolution: {integrity: sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ==} + '@typescript-eslint/typescript-estree@8.46.1': + resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.38.0': - resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@8.40.0': resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} @@ -6110,133 +5336,52 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.41.0': - resolution: {integrity: sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A==} + '@typescript-eslint/utils@8.46.1': + resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.38.0': - resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} + '@typescript-eslint/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@8.40.0': resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.41.0': - resolution: {integrity: sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg==} + '@typescript-eslint/visitor-keys@8.46.1': + resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} - cpu: [arm] - os: [android] + '@uploadcare/cname-prefix@6.17.0': + resolution: {integrity: sha512-UqomH1TtegTmltLhwnKTN4fPNzUlXx6LQZj0YNIkiA726ih+ao6oPS9ER1rvz/XX4e5EOl7/aj+AHHIscLPncQ==} - '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} - cpu: [arm64] - os: [android] + '@uploadcare/file-uploader@1.19.4': + resolution: {integrity: sha512-xCnXtQyvoujHEGEjZNNGiF/94PZ519nkp+hWovvn/w1WIRSwJ2finD214C54X50J4Yefw2f9KmkT8d8cqXnjtA==} - '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} - cpu: [arm64] - os: [darwin] - - '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} - cpu: [x64] - os: [darwin] - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} - cpu: [x64] - os: [freebsd] - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} - cpu: [arm] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} - cpu: [arm64] - os: [linux] - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} - cpu: [ppc64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} - cpu: [riscv64] - os: [linux] - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} - cpu: [s390x] - os: [linux] - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} - cpu: [x64] - os: [linux] - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} - cpu: [arm64] - os: [win32] - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} - cpu: [ia32] - os: [win32] - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} - cpu: [x64] - os: [win32] - - '@uploadcare/file-uploader@1.17.1': - resolution: {integrity: sha512-IRXejLHD+2S40eRZ6jGHG83yuHLledqAnWYlxC/hwMtO7kvXnZqAwYpnk5R+zTfg6Hj001Ah0Zatd0+Am6wIgw==} - - '@uploadcare/image-shrink@6.14.3': - resolution: {integrity: sha512-GCZOewwaGdU/FXgK8m1Ct6FHF7CH3LUGcBvsUxPrablkV2Dyl99XdMtyomaZgpsyfRDlVUbvkntDXEB3IZo92A==} + '@uploadcare/image-shrink@6.17.0': + resolution: {integrity: sha512-9ZIQR2Uad7BeSH0hqo7W/VenHCwnEqRjFpN6SGynTzG6BxoH/HK8NkuMKdJ8URFisW7dZSXpVMZrCL5kf7FfKA==} '@uploadcare/upload-client@6.14.3': resolution: {integrity: sha512-uZDXb2IuFchpNQdHDxDowKgGPd+9UOy0PIykWEPedMbbBYxh7/UUQ+G53E4KhKe7cV7BV4zoFxUrNx+Ij0lyPw==} engines: {node: '>=16'} + '@uploadcare/upload-client@6.17.0': + resolution: {integrity: sha512-ir6xo6HLy3TVn4lVJ+9fOOcq8vvgMmcXoSP/mM+l1CTKKJmd0hzXqNkZ1CYyz7PiRhLPUC6fprmUuA7rnVC87g==} + engines: {node: '>=16'} + '@vitest/browser@3.2.4': resolution: {integrity: sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==} peerDependencies: @@ -6309,6 +5454,9 @@ packages: '@volar/typescript@2.4.13': resolution: {integrity: sha512-Ukz4xv84swJPupZeoFsQoeJEOm7U9pqsEnaGGgt5ni3SCTa22m8oJP5Nng3Wed7Uw5RBELdLxxORX8YhJPyOgQ==} + '@vscode/sudo-prompt@9.3.1': + resolution: {integrity: sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA==} + '@vue/compiler-core@3.5.14': resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} @@ -6329,8 +5477,8 @@ packages: '@vue/shared@3.5.14': resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} - '@wdio/config@9.19.2': - resolution: {integrity: sha512-OVCzPQxav0QDk5rktQ6LYARZ5ueUuJXIqTXUpS3A9Jt6PF+ZUI5sbO/y+z+qHQXqDq+LkscmFsmkzgnoHzHcfg==} + '@wdio/config@9.20.0': + resolution: {integrity: sha512-ggwd3EMsVj/LTcbYw2h+hma+/7fQ1cTXMuy9B5WTkLjDlOtbLjsqs9QLt4BLIo1cdsxvAw/UVpRVUuYy7rTmtQ==} engines: {node: '>=18.20.0'} '@wdio/logger@9.18.0': @@ -6344,12 +5492,12 @@ packages: resolution: {integrity: sha512-FLTF0VL6+o5BSTCO7yLSXocm3kUnu31zYwzdsz4n9s5YWt83sCtzGZlZpt7TaTzb3jVUfxuHNQDTb8UMkCu0lQ==} engines: {node: '>=18.20.0'} - '@wdio/types@9.19.2': - resolution: {integrity: sha512-fBI7ljL+YcPXSXUhdk2+zVuz7IYP1aDMTq1eVmMme9GY0y67t0dCNPOt6xkCAEdL5dOcV6D2L1r6Cf/M2ifTvQ==} + '@wdio/types@9.20.0': + resolution: {integrity: sha512-zMmAtse2UMCSOW76mvK3OejauAdcFGuKopNRH7crI0gwKTZtvV89yXWRziz9cVXpFgfmJCjf9edxKFWdhuF5yw==} engines: {node: '>=18.20.0'} - '@wdio/utils@9.19.2': - resolution: {integrity: sha512-caimJiTsxDUfXn/gRAzcYTO3RydSl7XzD+QpjfWZYJjzr8a2XfNnj+Vdmr8gG4BSkiVHirW9mFCZeQp2eTD7rA==} + '@wdio/utils@9.20.0': + resolution: {integrity: sha512-T1ze005kncUTocYImSBQc/FAVcOwP/vOU4MDJFgzz/RTcps600qcKX98sVdWM5/ukXCVkjOufWteDHIbX5/tEA==} engines: {node: '>=18.20.0'} '@webassemblyjs/ast@1.14.1': @@ -6410,21 +5558,10 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - - '@yarnpkg/parsers@3.0.2': - resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} - engines: {node: '>=18.12.0'} - - '@zip.js/zip.js@2.7.72': - resolution: {integrity: sha512-3/A4JwrgkvGBlCxtItjxs8HrNbuTAAl/zlGkV6tC5Fb5k5nk4x2Dqxwl/YnUys5Ch+QB01eJ8Q5K/J2uXfy9Vw==} + '@zip.js/zip.js@2.8.2': + resolution: {integrity: sha512-PI6UdgpSeVoGvzguKHmy2bwOqI3UYkntLZOCpyJSKIi7234c5aJmQYkJB/P4P2YUJkqhbqvu7iM2/0eJZ178nA==} engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} - '@zkochan/js-yaml@0.0.7': - resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} - hasBin: true - abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -6452,6 +5589,12 @@ packages: resolution: {integrity: sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==} engines: {node: '>=12'} + acorn-dynamic-import@4.0.0: + resolution: {integrity: sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==} + deprecated: This is probably built in to whatever tool you're using. If you still need it... idk + peerDependencies: + acorn: ^6.0.0 + acorn-globals@6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} @@ -6474,13 +5617,13 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} engines: {node: '>=0.4.0'} hasBin: true - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true @@ -6489,10 +5632,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -6569,10 +5708,6 @@ packages: resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==} engines: {node: '>=6'} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -6581,8 +5716,8 @@ packages: resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} engines: {node: '>=12'} - ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + ansi-escapes@7.1.1: + resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} engines: {node: '>=18'} ansi-html-community@0.0.8: @@ -6602,8 +5737,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -6618,12 +5753,12 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} any-base@1.1.0: @@ -6685,17 +5820,34 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + array.prototype.reduce@1.0.8: resolution: {integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==} engines: {node: '>= 0.4'} + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -6707,6 +5859,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-metadata-inferer@0.8.1: + resolution: {integrity: sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==} + ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -6757,79 +5912,17 @@ packages: resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} engines: {node: '>=6.0.0'} - axios@1.11.0: - resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} + axios@1.12.2: + resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - babel-jest@30.0.5: - resolution: {integrity: sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - - babel-plugin-const-enum@1.2.0: - resolution: {integrity: sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-plugin-istanbul@7.0.0: - resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} - engines: {node: '>=12'} - - babel-plugin-jest-hoist@30.0.1: - resolution: {integrity: sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - babel-plugin-polyfill-corejs2@0.4.13: - resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.4: - resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-transform-hook-names@1.0.2: resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} peerDependencies: '@babel/core': ^7.12.10 - babel-plugin-transform-typescript-metadata@0.3.2: - resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} - peerDependencies: - '@babel/core': ^7 - '@babel/traverse': ^7 - peerDependenciesMeta: - '@babel/traverse': - optional: true - - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@30.0.1: - resolution: {integrity: sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -6842,11 +5935,11 @@ packages: bare-events@2.5.4: resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - bare-events@2.6.0: - resolution: {integrity: sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==} + bare-events@2.7.0: + resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} - bare-fs@4.1.6: - resolution: {integrity: sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==} + bare-fs@4.4.5: + resolution: {integrity: sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -6861,8 +5954,8 @@ packages: bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.6.5: - resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + bare-stream@2.7.0: + resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} peerDependencies: bare-buffer: '*' bare-events: '*' @@ -6872,16 +5965,27 @@ packages: bare-events: optional: true + bare-url@2.2.2: + resolution: {integrity: sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==} + base32-encode@1.2.0: resolution: {integrity: sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + base64url@3.0.1: resolution: {integrity: sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==} engines: {node: '>=6.0.0'} + baseline-browser-mapping@2.8.4: + resolution: {integrity: sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==} + hasBin: true + basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} @@ -6893,8 +5997,8 @@ packages: batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - better-sqlite3@12.2.0: - resolution: {integrity: sha512-eGbYq2CT+tos1fBwLQ/tkBt9J5M3JEHjku4hbvQUePCckkvVf14xWj+1m7dGoK81M/fOjFT7yM9UMeKT/+vFLQ==} + better-sqlite3@12.4.1: + resolution: {integrity: sha512-3yVdyZhklTiNrtg+4WqHpJpFDd+WHTg2oM7UcR80GqL05AOV0xEJzc6qNvFYoEtE+hRp1n9MpN6/+4yhlGkDXQ==} engines: {node: 20.x || 22.x || 23.x || 24.x} bezier-easing@2.1.0: @@ -6981,8 +6085,14 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + browserslist@4.26.2: + resolution: {integrity: sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buble@0.20.0: + resolution: {integrity: sha512-/1gnaMQE8xvd5qsNBl+iTuyjJ9XxeaVxAMF86dQ4EyxFJOZtsgOS8Ra+7WHgZTam5IFDtt4BguN0sH0tVTKrOw==} + hasBin: true buffer-alloc-unsafe@1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} @@ -7044,6 +6154,10 @@ packages: resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} engines: {node: ^18.17.0 || >=20.5.0} + cacache@20.0.1: + resolution: {integrity: sha512-+7LYcYGBYoNqTp1Rv7Ny1YjUo5E0/ftkQtraH3vkfAGgVHc+ouWdC8okAwQgQR7EVIdW6JTzTmhKFwzb+4okAQ==} + engines: {node: ^20.17.0 || >=22.9.0} + cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -7052,8 +6166,8 @@ packages: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} - cacheable@1.10.3: - resolution: {integrity: sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==} + cacheable@1.10.4: + resolution: {integrity: sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -7089,8 +6203,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001743: + resolution: {integrity: sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==} canvas-color-tracker@1.3.2: resolution: {integrity: sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==} @@ -7122,18 +6236,10 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.5.0: - resolution: {integrity: sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.6.0: - resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -7143,6 +6249,9 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.0: resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} @@ -7196,23 +6305,16 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - ci-info@4.3.0: - resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} - engines: {node: '>=8'} + ckeditor5-collaboration@47.1.0: + resolution: {integrity: sha512-r6lW8qpjURAuXVEIvKfuXSvde9zwOqMZrGMGTwaG/vWsCPaGc4jXWRaVTkcEcnmdxkaBgWim4KnIaGClKG49ug==} - cjs-module-lexer@2.1.0: - resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} - - ckeditor5-collaboration@46.0.2: - resolution: {integrity: sha512-VIL6EFMYDJ4+v1ih63b84VWya5XnuHF5X/bHGoswHCHj/1T4+9FsDhyWMCQYfGlKjR28YcpAFLGsVhNrhrLkdQ==} - - ckeditor5-premium-features@46.0.2: - resolution: {integrity: sha512-I1Ab/EaYNFM7ResUsn95o2nfl3b2P+ZNZ13vI1sRLzkYzDvaBfKsVgyF+pdNoAlF7VWZ2Epiqekzzzb05uueRg==} + ckeditor5-premium-features@47.1.0: + resolution: {integrity: sha512-nypG9BBIRG+p+8MLJ0zVsMSTw7uSbVihN8jUxEaM4k0xa/jIb9ZMpWBnV6hOr9i+rTNkoa8ZASLNxrZcQaPvVw==} peerDependencies: - ckeditor5: 46.0.2 + ckeditor5: 47.1.0 - ckeditor5@46.0.2: - resolution: {integrity: sha512-Ly+pG/OkF+9P7DaaaCp+VYJOm0+flxLR3Ue1thm10JnMvOW52XXYaRyoasAXoiGz6CC4lh0ZN7AtQSWu85oj3g==} + ckeditor5@47.1.0: + resolution: {integrity: sha512-Vnmt6eKIpiM+EpJSwxzCjJC5/9ykUhegwqWS9znAuAz2ZgBiVUFt54Y+CBhVpMru3z4zQ+NncVgCqoiU3ocHGQ==} clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} @@ -7230,10 +6332,6 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} - cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -7246,9 +6344,9 @@ packages: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@5.1.0: + resolution: {integrity: sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==} + engines: {node: '>=20'} cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} @@ -7287,14 +6385,6 @@ packages: resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} engines: {node: '>=6'} - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - codemirror-lang-elixir@4.0.0: resolution: {integrity: sha512-mzFesxo/t6KOxwnkqVd34R/q7yk+sMtHh6vUKGAvjwHmpL7bERHB+vQAsmU/nqrndkwVeJEHWGw/z/ybfdiudA==} @@ -7304,9 +6394,6 @@ packages: codemirror-lang-mermaid@0.5.0: resolution: {integrity: sha512-Taw/2gPCyNArQJCxIP/HSUif+3zrvD+6Ugt7KJZ2dUKou/8r3ZhcfG8krNTZfV2iu8AuGnymKuo7bLPFyqsh/A==} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - color-convert@0.5.3: resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} @@ -7334,10 +6421,18 @@ packages: color-parse@2.0.2: resolution: {integrity: sha512-eCtOz5w5ttWIUcaKLiktF+DxZO1R9KLNY/xhbV6CkhM7sR3GhVghmt6X6yOnzeaM24po+Z9/S1apbXMwA3Iepw==} + color-string@2.1.2: + resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==} + engines: {node: '>=18'} + color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + color@5.0.2: + resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} + engines: {node: '>=18'} + colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} @@ -7351,10 +6446,6 @@ packages: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} - columnify@1.6.0: - resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} - engines: {node: '>=8.0.0'} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -7370,8 +6461,8 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} commander@2.20.3: @@ -7397,10 +6488,6 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - comment-json@4.2.5: - resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} - engines: {node: '>= 6'} - comment-parser@1.4.1: resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} engines: {node: '>= 12.0.0'} @@ -7447,16 +6534,13 @@ packages: confbox@0.2.2: resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - connect-history-api-fallback@2.0.0: resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} engines: {node: '>=0.8'} - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} - engines: {node: ^14.18.0 || >=16.10.0} + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} @@ -7498,10 +6582,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookie@1.0.2: - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} - engines: {node: '>=18'} - cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -7514,12 +6594,13 @@ packages: peerDependencies: webpack: ^5.1.0 - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + corser@2.0.1: resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} engines: {node: '>= 0.4.0'} @@ -7565,8 +6646,8 @@ packages: cross-dirname@0.1.0: resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} - cross-env@10.0.0: - resolution: {integrity: sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==} + cross-env@10.1.0: + resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} hasBin: true @@ -7689,8 +6770,8 @@ packages: peerDependencies: postcss: ^8.4.31 - cssnano-preset-default@7.0.8: - resolution: {integrity: sha512-d+3R2qwrUV3g4LEMOjnndognKirBZISylDZAF/TPeCWVjEwlXS2e4eN4ICkoobRe7pD3H6lltinKVyS1AJhdjQ==} + cssnano-preset-default@7.0.9: + resolution: {integrity: sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.32 @@ -7743,8 +6824,8 @@ packages: peerDependencies: postcss: ^8.4.31 - cssnano@7.1.0: - resolution: {integrity: sha512-Pu3rlKkd0ZtlCUzBrKL1Z4YmhKppjC1H9jo7u1o4qaKqyhvixFgu5qLyNIAOjSTg9DjVPtUqdROq2EfpVMEe+w==} + cssnano@7.1.1: + resolution: {integrity: sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.32 @@ -7767,13 +6848,16 @@ packages: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} - cssstyle@4.3.1: - resolution: {integrity: sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==} + cssstyle@4.6.0: + resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + custom-event@1.0.1: + resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} + cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: @@ -7968,11 +7052,15 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + date-format@4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} + dayjs-plugin-utc@0.1.2: resolution: {integrity: sha512-ExERH5o3oo6jFOdkvMP3gytTCQ9Ksi5PtylclJWghr7k7m3o2U5QrwtdiJkOxLOH4ghr0EKhpqGefzGz1VvVJg==} - dayjs@1.11.14: - resolution: {integrity: sha512-E8fIdSxUlyqSA8XYGnNa3IkIzxtEmFjI+JU/6ic0P1zmSqyL6HyG5jHnpPjRguDNiaHLpfvHKWFiohNsJLqcJQ==} + dayjs@1.11.18: + resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==} de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} @@ -7989,23 +7077,6 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -8024,6 +7095,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -8039,6 +7119,9 @@ packages: decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} @@ -8050,22 +7133,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - dedent@1.6.0: - resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -8108,10 +7175,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -8172,8 +7235,12 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + detect-libc@2.1.1: + resolution: {integrity: sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==} + engines: {node: '>=8'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-node-es@1.1.0: @@ -8188,23 +7255,18 @@ packages: detect-pointer@1.0.3: resolution: {integrity: sha512-d0o/Puo3fiGSCXy6H039h9Kwz+mmYCGKZ/qtPFnpN3WfsumjC1C9b5KKvRu+aYnfdI8peqN/iAe7dPd85qIt2g==} - detect-port@1.6.1: - resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} - engines: {node: '>= 4.0.0'} - hasBin: true - detect-touch-events@2.0.2: resolution: {integrity: sha512-g8GWBkJLiIDRJfRXEdrd1wMXpNyGId2DkbfuwFahSb4OCvn717hyRJtAcEDISfp3zkwEhZ4Y4woHPA6DeyB3Fw==} - devalue@5.3.2: - resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} - devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + di@0.0.1: + resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} + diff@3.5.0: resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} engines: {node: '>=0.3.1'} @@ -8232,6 +7294,10 @@ packages: resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} engines: {node: '>=6'} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} @@ -8239,6 +7305,9 @@ packages: dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-serialize@2.2.1: + resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} + dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} @@ -8270,16 +7339,8 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dotenv-expand@11.0.7: - resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} - engines: {node: '>=12'} - - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - - dotenv@17.2.1: - resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dotignore@0.1.2: @@ -8368,6 +7429,9 @@ packages: electron-to-chromium@1.5.190: resolution: {integrity: sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==} + electron-to-chromium@1.5.219: + resolution: {integrity: sha512-JqaXfxHOS0WvKweEnrPHWRm8cnPVbdB7vXCQHPPFoAJFM3xig5/+/H08ZVkvJf4unvj8yncKy6MerOPj1NW1GQ==} + electron-window-state@5.0.3: resolution: {integrity: sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==} engines: {node: '>=8.0.0'} @@ -8376,8 +7440,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@37.4.0: - resolution: {integrity: sha512-HhsSdWowE5ODOeWNc/323Ug2C52mq/TqNBG+4uMeOA3G2dMXNc/nfyi0RYu1rJEgiaJLEjtHveeZZaYRYFsFCQ==} + electron@38.3.0: + resolution: {integrity: sha512-Wij4AzX4SAV0X/ktq+NrWrp5piTCSS8F6YWh1KAcG+QRtNzyns9XLKERP68nFHIwfprhxF2YCN2uj7nx9DaeJw==} engines: {node: '>= 12.20.55'} hasBin: true @@ -8387,10 +7451,6 @@ packages: emitter-listener@1.1.2: resolution: {integrity: sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==} - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -8424,9 +7484,6 @@ packages: encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} @@ -8437,17 +7494,17 @@ packages: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} engines: {node: '>=10.0.0'} - enhanced-resolve@5.18.2: - resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} - engines: {node: '>=10.13.0'} + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} - enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} + ent@2.2.2: + resolution: {integrity: sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==} + engines: {node: '>= 0.4'} entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -8482,6 +7539,10 @@ packages: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} @@ -8493,6 +7554,10 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} @@ -8504,6 +7569,10 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} @@ -8531,8 +7600,13 @@ packages: peerDependencies: webpack: ^4.40.0 || ^5.0.0 - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} + esbuild@0.25.10: + resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} engines: {node: '>=18'} hasBin: true @@ -8551,10 +7625,6 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -8574,18 +7644,29 @@ packages: eslint: ^9.0.0 typescript: ^5.0.0 + eslint-config-preact@2.0.0: + resolution: {integrity: sha512-TFj70lEE7y3R9DQAFJ/clRfVmyaXdwE3q56gA9zm+iTmlpYjtZKtV1jv/jtgdF2LqgvJjlGlGE1rHVwE9yNdkg==} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 + eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-linter-browserify@9.34.0: - resolution: {integrity: sha512-UmcPxTXLdP6CaxXZ8KOHlbGZuOicIaX/3yCjHj7uQRumB9qiFoIbjc5xrLaQvWo1wNSeBQ5c+IuPO+8717mKFQ==} + eslint-linter-browserify@9.38.0: + resolution: {integrity: sha512-uOR+eJFM+WQyyZAGeazz8D3XiS0a26bIK/uHSFZWQ7H8UK7hrUpHzMfcGZSzY1icM86LYCPhV3jYkVePWLjQGA==} eslint-plugin-ckeditor5-rules@12.1.1: resolution: {integrity: sha512-e0PhbA3sNWy4Djs6r+kVfWNvu6urJXucIUfqI2GKjgOfqYOhmpLNaudH6FHKAg/OM8g0ETb7TbG3Bc375ru+sg==} + eslint-plugin-compat@6.0.2: + resolution: {integrity: sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==} + engines: {node: '>=18.x'} + peerDependencies: + eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint-plugin-mocha@11.1.0: resolution: {integrity: sha512-rKntVWRsQFPbf8OkSgVNRVRrcVAPaGTyEgWCEyXaPDJkTl0v5/lwu1vTk5sWiUJU8l2sxwvGUZzSNrEKdVMeQw==} peerDependencies: @@ -8603,15 +7684,17 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-svelte@3.11.0: - resolution: {integrity: sha512-KliWlkieHyEa65aQIkRwUFfHzT5Cn4u3BQQsu3KlkJOs7c1u7ryn84EWaOjEzilbKgttT4OfBURA8Uc4JBSQIw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-react-hooks@7.0.0: + resolution: {integrity: sha512-fNXaOwvKwq2+pXiRpXc825Vd63+KM4DLL40Rtlycb8m7fYpp6efrTp1sa6ZbP/Ap58K2bEKFXRmhURE+CJAQWw==} + engines: {node: '>=18'} peerDependencies: - eslint: ^8.57.1 || ^9.0.0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - svelte: - optional: true + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -8621,6 +7704,10 @@ packages: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8629,8 +7716,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.34.0: - resolution: {integrity: sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==} + eslint@9.38.0: + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -8639,9 +7726,6 @@ packages: jiti: optional: true - esm-env@1.2.2: - resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} - espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -8659,9 +7743,6 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esrap@2.1.0: - resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} - esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -8701,10 +7782,17 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@3.0.2: + resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} + engines: {node: '>=18.0.0'} + execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} @@ -8716,10 +7804,6 @@ packages: exif-parser@0.1.12: resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} - exit-x@0.2.2: - resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} - engines: {node: '>= 0.8.0'} - expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -8728,15 +7812,14 @@ packages: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} - expect@30.0.5: - resolution: {integrity: sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - express-http-proxy@2.1.1: - resolution: {integrity: sha512-4aRQRqDQU7qNPV5av0/hLcyc0guB9UP71nCYrQEYml7YphTo8tmWf3nDZWdTJMMjFikyz9xKXaURor7Chygdwg==} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + express-http-proxy@2.1.2: + resolution: {integrity: sha512-FXcAcs7Nf/hF73Mzh0WDWPwaOlsEUL/fCHW3L4wU6DH79dypsaxmbnAildCLniFs7HQuuvoiR6bjNVUvGuTb5g==} engines: {node: '>=6.0.0'} express-openid-connect@2.19.2: @@ -8745,8 +7828,8 @@ packages: peerDependencies: express: '>= 4.17.0' - express-rate-limit@8.0.1: - resolution: {integrity: sha512-aZVCnybn7TVmxO4BtlmnvX+nuz8qHW124KKJ8dumsBsmv5ZLxE0pYu7S2nwyRBGHHCAzdmnGyrc5U/rksSPO7Q==} + express-rate-limit@8.1.0: + resolution: {integrity: sha512-4nLnATuKupnmwqiJc27b4dCFmB/T60ExgmtDD7waf4LdrbJ8CPZzZRHYErDYNhoz+ql8fUdYwM/opf90PoPAQA==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -8781,6 +7864,10 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} @@ -8833,20 +7920,9 @@ packages: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -8863,12 +7939,8 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - - file-entry-cache@10.1.3: - resolution: {integrity: sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==} + file-entry-cache@10.1.4: + resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -8908,6 +7980,10 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + finalhandler@1.3.1: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} @@ -8940,8 +8016,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.12: - resolution: {integrity: sha512-U+HqqpZPPXP5d24bWuRzjGqVqUcw64k4nZAbruniDwdRg0H10tvN7H6ku1tjhA4rg5B9GS3siEvwO2qjJJ6f8Q==} + flat-cache@6.1.13: + resolution: {integrity: sha512-gmtS2PaUjSPa4zjObEIn4WWliKyZzYljgxODBfxugpK6q6HU9ClXzgCJ+nlcPKY9Bt090ypTOLIFWkV0jbKFjw==} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -8974,8 +8050,8 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - force-graph@1.50.1: - resolution: {integrity: sha512-CtldBdsUHLmlnerVYe09V9Bxi5iz8GZce1WdBSkwGAFgNFTYn6cW90NQ1lOh/UVm0NhktMRHKugXrS9Sl8Bl3A==} + force-graph@1.51.0: + resolution: {integrity: sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==} engines: {node: '>=12'} foreground-child@3.3.1: @@ -9014,18 +8090,12 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - front-matter@4.0.2: - resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.1: - resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -9130,8 +8200,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} get-folder-size@2.0.1: @@ -9150,10 +8220,6 @@ packages: resolution: {integrity: sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==} engines: {node: '>= 4.0'} - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - get-port@7.1.0: resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} engines: {node: '>=16'} @@ -9181,9 +8247,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-them-args@1.3.2: - resolution: {integrity: sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==} - get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} @@ -9211,6 +8274,12 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regex.js@1.0.1: + resolution: {integrity: sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -9276,8 +8345,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} globalthis@1.0.4: @@ -9329,13 +8398,10 @@ packages: handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - happy-dom@18.0.1: - resolution: {integrity: sha512-qn+rKOW7KWpVTtgIUi6RVmTBZJSe2k0Db0vh1f7CWrWclkkc7/Q+FrOfkZIb2eiErLyqu5AXEzE7XthO9JVxRA==} + happy-dom@20.0.7: + resolution: {integrity: sha512-CywLfzmYxP5OYpuAG0usFY0CpxJtwYR+w8Mms5J8W29Y2Pzf6rbfQS2M523tRZTb0oLA+URopPtnAQX2fupHZQ==} engines: {node: '>=20.0.0'} - harmony-reflect@1.6.2: - resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -9348,10 +8414,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -9431,6 +8493,12 @@ packages: resolution: {integrity: sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==} engines: {node: '>=18.0.0'} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} @@ -9447,20 +8515,20 @@ packages: hoist-non-react-statics@2.5.5: resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==} - hookified@1.11.0: - resolution: {integrity: sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==} + hookified@1.12.0: + resolution: {integrity: sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} - hosted-git-info@8.1.0: resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} engines: {node: ^18.17.0 || >=20.5.0} + hosted-git-info@9.0.0: + resolution: {integrity: sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==} + engines: {node: ^20.17.0 || >=22.9.0} + hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -9574,10 +8642,6 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} - hasBin: true - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -9595,8 +8659,8 @@ packages: i18next-http-backend@3.0.2: resolution: {integrity: sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==} - i18next@25.4.2: - resolution: {integrity: sha512-gD4T25a6ovNXsfXY1TwHXXXLnD/K2t99jyYMCSimSCBnBRJVQr5j+VAaU83RJCPzrTGhVQ6dqIga66xO2rtd5g==} + i18next@25.6.0: + resolution: {integrity: sha512-tTn8fLrwBYtnclpL5aPXK/tAYBLWVvoHM1zdfXoRNLcI+RvtMsoZRV98ePlaW3khHYKuNh/Q65W/+NVFUeIwVw==} peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -9617,16 +8681,12 @@ packages: peerDependencies: postcss: ^8.1.0 - identity-obj-proxy@3.0.0: - resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} - engines: {node: '>=4'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore-walk@7.0.0: - resolution: {integrity: sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==} - engines: {node: ^18.17.0 || >=20.5.0} + ignore-walk@8.0.0: + resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==} + engines: {node: ^20.17.0 || >=22.9.0} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} @@ -9665,8 +8725,8 @@ packages: immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - immutable@5.1.3: - resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} @@ -9676,8 +8736,8 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} imul@1.0.1: resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} @@ -9753,10 +8813,6 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} - ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -9845,14 +8901,10 @@ packages: resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} engines: {node: '>=12'} - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} engines: {node: '>=18'} - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - is-generator-function@1.1.0: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} @@ -9890,8 +8942,12 @@ packages: is-my-json-valid@2.20.6: resolution: {integrity: sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==} - is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-network-error@1.2.0: + resolution: {integrity: sha512-32jdpRpJo8SeL7zOuBJbMLz/VTw9mDpTvcKzzR8DkXWsJbbE60gdiX8YOd0UAV6b8Skt+CMytzfgVVIRFidn0Q==} engines: {node: '>=16'} is-node-process@1.2.0: @@ -9945,9 +9001,6 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-reference@3.0.3: - resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -9992,9 +9045,6 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -10018,10 +9068,6 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} - is2@2.0.9: - resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} - engines: {node: '>=v0.10.0'} - isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} @@ -10062,6 +9108,10 @@ packages: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -10074,105 +9124,12 @@ packages: engines: {node: '>=10'} hasBin: true + jasmine-core@4.6.1: + resolution: {integrity: sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==} + javascript-stringify@1.6.0: resolution: {integrity: sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==} - jest-circus@30.0.5: - resolution: {integrity: sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-config@30.0.5: - resolution: {integrity: sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - peerDependencies: - '@types/node': '*' - esbuild-register: '>=3.4.0' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - esbuild-register: - optional: true - ts-node: - optional: true - - jest-diff@30.0.5: - resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-docblock@30.0.1: - resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-each@30.0.5: - resolution: {integrity: sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-environment-node@30.0.5: - resolution: {integrity: sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-haste-map@30.0.5: - resolution: {integrity: sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-leak-detector@30.0.5: - resolution: {integrity: sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-matcher-utils@30.0.5: - resolution: {integrity: sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-message-util@30.0.5: - resolution: {integrity: sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-mock@30.0.5: - resolution: {integrity: sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@30.0.1: - resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-resolve@30.0.5: - resolution: {integrity: sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-runner@30.0.5: - resolution: {integrity: sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-runtime@30.0.5: - resolution: {integrity: sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-snapshot@30.0.5: - resolution: {integrity: sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-util@30.0.5: - resolution: {integrity: sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-validate@30.0.5: - resolution: {integrity: sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - jest-watcher@30.0.5: - resolution: {integrity: sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-worker@26.6.2: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} @@ -10181,20 +9138,12 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jest-worker@30.0.5: - resolution: {integrity: sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jimp@1.6.0: resolution: {integrity: sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==} engines: {node: '>=18'} - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} - hasBin: true - - jiti@2.5.1: - resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true jju@1.4.0: @@ -10239,9 +9188,6 @@ packages: jquery@3.7.1: resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} - js-sha256@0.11.1: - resolution: {integrity: sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -10252,10 +9198,6 @@ packages: resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} hasBin: true - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -10285,9 +9227,8 @@ packages: canvas: optional: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true jsesc@3.1.0: @@ -10305,6 +9246,10 @@ packages: resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} engines: {node: ^18.17.0 || >=20.5.0} + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -10325,13 +9270,10 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@2.4.0: - resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + jsonc-eslint-parser@2.4.1: + resolution: {integrity: sha512-uuPNLJkKN8NXAlZlQ6kmUF9qO+T6Kyd7oV4+/7yy8Jz6+MZNyhPq8EdLpdfnPVzUC8qSf1b4j1azKaGnFsjmsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -10349,6 +9291,10 @@ packages: jsplumb@2.15.6: resolution: {integrity: sha512-sIpbpz5eMVM+vV+MQzFCidlaa1RsknrQs6LOTKYDjYUDdTAi2AN2bFi94TxB33TifcIsRNV1jebcaxg0tCoPzg==} + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -10360,8 +9306,25 @@ packages: resolution: {integrity: sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==} engines: {node: '>=12'} - katex@0.16.22: - resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} + karma-chrome-launcher@3.2.0: + resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==} + + karma-firefox-launcher@2.1.3: + resolution: {integrity: sha512-LMM2bseebLbYjODBOVt7TCPP9OI2vZIXCavIXhkO9m+10Uj5l7u/SKoeRmYx8FYHTVGZSpk6peX+3BMHC1WwNw==} + + karma-jasmine@5.1.0: + resolution: {integrity: sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==} + engines: {node: '>=12'} + peerDependencies: + karma: ^6.0.0 + + karma@6.4.4: + resolution: {integrity: sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==} + engines: {node: '>= 10'} + hasBin: true + + katex@0.16.25: + resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==} hasBin: true kdbush@4.0.2: @@ -10386,18 +9349,10 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - kill-port@1.6.1: - resolution: {integrity: sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw==} - hasBin: true - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} @@ -10411,16 +9366,12 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - kysely@0.27.6: - resolution: {integrity: sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==} - engines: {node: '>=14.0.0'} - langium@3.3.1: resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} engines: {node: '>=16.0.0'} - launch-editor@2.10.0: - resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} + launch-editor@2.11.1: + resolution: {integrity: sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==} layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -10443,10 +9394,6 @@ packages: engines: {node: '>=6'} hasBin: true - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -10535,12 +9482,8 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lint-staged@16.1.5: - resolution: {integrity: sha512-uAeQQwByI6dfV7wpt/gVqg+jAPaSp8WwOA8kKC/dv1qw14oGpnpAisY65ibGHUGDUv0rYaZ8CAJZ/1U8hUvC2A==} + lint-staged@16.2.5: + resolution: {integrity: sha512-o36wH3OX0jRWqDw5dOa8a8x6GXTKaLM+LvhRaucZxez0IxA+KNDUCiyjBfNgsMNmchwSX6urLSL7wShcUqAang==} engines: {node: '>=20.17'} hasBin: true @@ -10548,8 +9491,8 @@ packages: resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} engines: {node: '>=16.0.0'} - listr2@9.0.1: - resolution: {integrity: sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==} + listr2@9.0.4: + resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==} engines: {node: '>=20.0.0'} load-json-file@2.0.0: @@ -10571,9 +9514,6 @@ packages: locate-app@2.5.0: resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} - locate-character@3.0.0: - resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} - locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -10593,25 +9533,34 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isnil@4.0.0: + resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} + + lodash.isundefined@3.0.1: + resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -10653,6 +9602,10 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} + log4js@6.9.1: + resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} + engines: {node: '>=8.0'} + loglevel-plugin-prefix@0.8.4: resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} @@ -10680,8 +9633,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -10707,6 +9660,9 @@ packages: resolution: {integrity: sha512-yiLHa7cfJcGRFq4FrR4tMlpNHb4Vy4mWnpajlSSIFM5k4Lv8/7BbbDLzCAVogWNl0LlLhizRp1drXv0hK9h0Yw==} os: [darwin] + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -10739,13 +9695,14 @@ packages: resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} engines: {node: ^18.17.0 || >=20.5.0} + make-fetch-happen@15.0.2: + resolution: {integrity: sha512-sI1NY4lWlXBAfjmCtVWIIpBypbBdhHtcjnwnv+gtCnsaOffyFil3aidszGC8hgzJe+fT1qix05sWxmD/Bmf/oQ==} + engines: {node: ^20.17.0 || >=22.9.0} + make-fetch-happen@9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-age-cleaner@0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} engines: {node: '>=6'} @@ -10760,8 +9717,8 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@16.2.1: - resolution: {integrity: sha512-r3UrXED9lMlHF97jJByry90cwrZBBvZmjG1L68oYfuPMW+uDTnuMbyJDymCWwbTE+f+3LhpNDKfpR3a3saFyjA==} + marked@16.4.1: + resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==} engines: {node: '>= 20'} hasBin: true @@ -10830,11 +9787,6 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdsvex@0.12.6: - resolution: {integrity: sha512-pupx2gzWh3hDtm/iDW4WuCpljmyHbHi34r7ktOqpPGvyiM4MyfNgdJ3qMizXdgCErmvYC9Nn/qyjePy+4ss9Wg==} - peerDependencies: - svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 - media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -10847,8 +9799,8 @@ packages: resolution: {integrity: sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==} engines: {node: '>=6'} - memfs@4.17.2: - resolution: {integrity: sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==} + memfs@4.42.0: + resolution: {integrity: sha512-RG+4HMGyIVp6UWDWbFmZ38yKrSzblPnfJu0PyPt0hw52KW4PPlPp+HdV4qZBG0hLDuYVnf8wfQT4NymKXnlQjA==} engines: {node: '>= 4.0.0'} meow@13.2.0: @@ -10869,8 +9821,8 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.10.1: - resolution: {integrity: sha512-0PdeADVWURz7VMAX0+MiMcgfxFKY4aweSGsjgFihe3XlMKNqmai/cugMrqTd3WNHM93V+K+AZL6Wu6tB5HmxRw==} + mermaid@11.12.0: + resolution: {integrity: sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==} methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} @@ -11014,8 +9966,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - mind-elixir@5.0.6: - resolution: {integrity: sha512-1dRpnLC4m+/OAG28MSRL6TnaWvNtnvsEWE0UirbG3YYjWKEFxsnapR0V1Hy+azjmHVHYFHIh8t+rV1OqxTd5dA==} + mind-elixir@5.3.3: + resolution: {integrity: sha512-SR0DRZh7I4fV3c8IeL9cYgJiJeW+TgKOrHQTntqu14nhrxyZjVsDfeLUY/52PB8r1WsORsN0IKx0qGhneXmtJQ==} mini-css-extract-plugin@2.4.7: resolution: {integrity: sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==} @@ -11023,8 +9975,8 @@ packages: peerDependencies: webpack: ^5.0.0 - mini-css-extract-plugin@2.9.2: - resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} + mini-css-extract-plugin@2.9.4: + resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -11049,10 +10001,6 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -11139,8 +10087,8 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - mocha@11.7.1: - resolution: {integrity: sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==} + mocha@11.7.2: + resolution: {integrity: sha512-lkqVJPmqqG/w5jmmFtiRvtA2jkDyNVUcefFJKb2uyX4dekk8Okgqop3cgbFiaIvj8uCRJVTP5x9dfxGyXm2jvQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true @@ -11153,9 +10101,8 @@ packages: resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==} engines: {node: '>= 0.4'} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + morphdom@2.7.7: + resolution: {integrity: sha512-04GmsiBcalrSCNmzfo+UjU8tt3PhZJKzcOy+r1FlGA7/zri8wre3I1WkYN9PT3sIeIKfW9bpyElA+VzOg2E24g==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -11167,9 +10114,6 @@ packages: ms@2.1.1: resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -11203,6 +10147,10 @@ packages: murmurhash-js@1.0.0: resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -11210,8 +10158,8 @@ packages: nan@2.22.2: resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} - nano-spawn@1.0.2: - resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} + nano-spawn@2.0.0: + resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} engines: {node: '>=20.17'} nanoid@3.3.11: @@ -11232,11 +10180,6 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - napi-postinstall@0.3.2: - resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - hasBin: true - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -11270,12 +10213,8 @@ packages: nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - node-abi@3.75.0: - resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} - engines: {node: '>=10'} - - node-abi@4.9.0: - resolution: {integrity: sha512-0isb3h+AXUblx5Iv0mnYy2WsErH+dk2e9iXJXdKAtS076Q5hP+scQhp6P4tvDeVlOBlG3ROKvkpQHtbORllq2A==} + node-abi@4.14.0: + resolution: {integrity: sha512-E4n91K4Nk1Rch2KzD+edU2bfZTP4W42GypAUDXU4vu1A+4u9PvUNDkGI0dXbsy8ZeF3WGj0SD/uHxnXD/sW+3w==} engines: {node: '>=22.12.0'} node-addon-api@7.1.1: @@ -11318,6 +10257,11 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + node-gyp@11.4.2: + resolution: {integrity: sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + node-gyp@8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} engines: {node: '>= 10.12.0'} @@ -11326,15 +10270,15 @@ packages: node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - - node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + node-html-parser@7.0.1: + resolution: {integrity: sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA==} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.21: + resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} + nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -11371,33 +10315,33 @@ packages: resolution: {integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==} engines: {node: ^18.17.0 || >=20.5.0} - npm-install-checks@7.1.1: - resolution: {integrity: sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==} + npm-install-checks@7.1.2: + resolution: {integrity: sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ==} engines: {node: ^18.17.0 || >=20.5.0} npm-normalize-package-bin@4.0.0: resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} engines: {node: ^18.17.0 || >=20.5.0} - npm-package-arg@11.0.1: - resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} - engines: {node: ^16.14.0 || >=18.0.0} - npm-package-arg@12.0.2: resolution: {integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==} engines: {node: ^18.17.0 || >=20.5.0} - npm-packlist@10.0.0: - resolution: {integrity: sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==} + npm-package-arg@13.0.0: + resolution: {integrity: sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-packlist@10.0.1: + resolution: {integrity: sha512-vaC03b2PqJA6QqmwHi1jNU8fAPXEnnyv4j/W4PVfgm24C4/zZGSVut3z0YUeN0WIFCo1oGOL02+6LbvFK7JL4Q==} engines: {node: ^20.17.0 || >=22.9.0} npm-pick-manifest@10.0.0: resolution: {integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==} engines: {node: ^18.17.0 || >=20.5.0} - npm-registry-fetch@18.0.2: - resolution: {integrity: sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==} - engines: {node: ^18.17.0 || >=20.5.0} + npm-registry-fetch@19.0.0: + resolution: {integrity: sha512-DFxSAemHUwT/POaXAOY4NJmEWBPB0oKbwD6FFDE9hnt1nORkt/FXvgjD4hQjoKoHw9u0Ezws9SPXwV7xE/Gyww==} + engines: {node: ^20.17.0 || >=22.9.0} npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} @@ -11418,17 +10362,8 @@ packages: nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - nx@21.3.11: - resolution: {integrity: sha512-nj2snZ3mHZnbHcoB3NUdxbch9L1sQKV1XccLs1B79fmI/N5oOgWgctm/bWoZH2UH5b4A8ZLAMTsC6YnSJGbcaw==} - hasBin: true - peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true + nwsapi@2.2.22: + resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -11461,10 +10396,22 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + object.getownpropertydescriptors@2.1.8: resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} engines: {node: '>= 0.8'} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -11472,12 +10419,16 @@ packages: resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==} engines: {node: ^10.13.0 || >=12.0.0} - ollama@0.5.17: - resolution: {integrity: sha512-q5LmPtk6GLFouS+3aURIVl+qcAOPC4+Msmx7uBb3pd+fxI55WnGjmLZ0yijI/CYy79x0QPGx3BwC3u5zv9fBvQ==} + ollama@0.6.0: + resolution: {integrity: sha512-FHjdU2Ok5x2HZsxPui/MBJZ5J+HzmxoWYa/p9wk736eT+uAhS8nvIICar5YgwlG5MFNjDR6UA5F3RSKq+JseOA==} omggif@1.0.10: resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -11504,16 +10455,12 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - openai@5.12.0: - resolution: {integrity: sha512-vUdt02xiWgOHiYUmW0Hj1Qu9OKAiVQu5Bd547ktVCiMKC1BkB5L3ImeEnCyq3WpRKR6ZTaPgekzqdozwdPs7Lg==} + openai@6.6.0: + resolution: {integrity: sha512-1yWk4cBsHF5Bq9TreHYOHY7pbqdlT74COnm8vPx7WKn36StS+Hyk8DdAitnLaw67a5Cudkz5EmlFQjSrNnrA2w==} hasBin: true peerDependencies: ws: ^8.18.0 - zod: ^3.23.8 + zod: ^3.25 || ^4.0 peerDependenciesMeta: ws: optional: true @@ -11535,14 +10482,14 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} - ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} @@ -11550,9 +10497,6 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxc-resolver@5.3.0: - resolution: {integrity: sha512-FHqtZx0idP5QRPSNcI5g2ItmADg7fhR3XIeWg5eRMGfp44xqRpfkdvo+EX4ZceqV9bxvl0Z8vaqMqY0gYaNYNA==} - p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -11640,11 +10584,11 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} - pacote@21.0.0: - resolution: {integrity: sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==} + pacote@21.0.1: + resolution: {integrity: sha512-LHGIUQUrcDIJUej53KJz1BPvUuHrItrR2yrnN0Kl9657cJ0ZT6QJHk9wWPBnQZhYT5KLyZWrk9jaYc2aKDu4yw==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true @@ -11812,10 +10756,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -11833,10 +10773,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - pixelmatch@5.3.0: resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} hasBin: true @@ -11851,13 +10787,13 @@ packages: pkg-types@2.1.0: resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} - playwright-core@1.55.0: - resolution: {integrity: sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==} + playwright-core@1.56.1: + resolution: {integrity: sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==} engines: {node: '>=18'} hasBin: true - playwright@1.55.0: - resolution: {integrity: sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==} + playwright@1.56.1: + resolution: {integrity: sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==} engines: {node: '>=18'} hasBin: true @@ -11967,8 +10903,8 @@ packages: peerDependencies: postcss: ^8.4.31 - postcss-convert-values@7.0.6: - resolution: {integrity: sha512-MD/eb39Mr60hvgrqpXsgbiqluawYg/8K4nKsqRsuDX9f+xN1j6awZCUv/5tLH8ak3vYp/EMXwdcnXvfZYiejCQ==} + postcss-convert-values@7.0.7: + resolution: {integrity: sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.32 @@ -12087,17 +11023,11 @@ packages: peerDependencies: postcss: ^8.4.21 - postcss-load-config@3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss: ^8.4.21 postcss-loader@4.3.0: resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} @@ -12106,8 +11036,8 @@ packages: postcss: ^7.0.0 || ^8.0.1 webpack: ^4.0.0 || ^5.0.0 - postcss-loader@8.1.1: - resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} + postcss-loader@8.2.0: + resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -12608,16 +11538,6 @@ packages: peerDependencies: postcss: ^8.4.31 - postcss-scss@4.0.9: - resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.4.29 - - postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -12699,8 +11619,19 @@ packages: potpack@2.1.0: resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} - preact@10.27.1: - resolution: {integrity: sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==} + preact-iso@2.11.0: + resolution: {integrity: sha512-oThWJQcgcnaWh6UKy1qrBkxIWp5CkqvnHiFdLiDUxfNkGdpQ5veGQw9wOVS0NDp7X8xo98wxE4wng5jLv1e9Ug==} + peerDependencies: + preact: 10.27.2 + preact-render-to-string: '>=6.4.0' + + preact-render-to-string@6.6.2: + resolution: {integrity: sha512-VJ++Pkzv6+ZOmeN/9Qvx0mRdXqnei1Lo3uu9bGvYHhoMI1VUkDT44hcpGbiokl/kuuYTayYa3yvmYTLZMplfMA==} + peerDependencies: + preact: 10.27.2 + + preact@10.27.2: + resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} @@ -12715,25 +11646,10 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-format@30.0.5: - resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - prism-svelte@0.4.7: - resolution: {integrity: sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==} - - prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} - proc-log@2.0.1: resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - proc-log@5.0.0: resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -12791,12 +11707,12 @@ packages: psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -12805,9 +11721,6 @@ packages: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} engines: {node: '>=12.20'} - pure-rand@7.0.1: - resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} - purgecss@6.0.0: resolution: {integrity: sha512-s3EBxg5RSWmpqd0KGzNqPiaBbWDz1/As+2MzoYVGMqgDqRTLBhJW6sywfTBek7OwNfoS/6pS0xdtvChNhFj2cw==} hasBin: true @@ -12815,6 +11728,10 @@ packages: pwacompat@2.0.17: resolution: {integrity: sha512-6Du7IZdIy7cHiv7AhtDy4X2QRM8IAD5DII69mt5qWibC2d15ZU8DmBG1WdZKekG11cChSu4zkSUGPF9sweOl6w==} + qjobs@1.2.0: + resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} + engines: {node: '>=0.9'} + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -12895,10 +11812,10 @@ packages: peerDependencies: react: ^19.1.0 - react-i18next@15.7.2: - resolution: {integrity: sha512-xJxq7ibnhUlMvd82lNC4te1GxGUMoM1A05KKyqoqsBXVZtEvZg/fz/fnVzdlY/hhQ3SpP/79qCocZOtICGhd3g==} + react-i18next@16.1.2: + resolution: {integrity: sha512-AxZAojM6CsP9qWUu8d0XD0KXYBG6yyitcWRRPSRXgGVkJ47hCIy3Mc/sE9deB0k+OK9WcC04vSFoQC9QdMcd6Q==} peerDependencies: - i18next: '>= 25.4.1' + i18next: '>= 25.5.2' react: '>= 16.8.0' react-dom: '*' react-native: '*' @@ -12922,11 +11839,8 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} react-remove-scroll-bar@2.3.8: @@ -13030,29 +11944,26 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + regenerate-unicode-properties@8.2.0: + resolution: {integrity: sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==} engines: {node: '>=4'} regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + regexpu-core@4.5.4: + resolution: {integrity: sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==} engines: {node: '>=4'} - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + regjsgen@0.5.2: + resolution: {integrity: sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==} - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + regjsparser@0.6.9: + resolution: {integrity: sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==} hasBin: true rehype-dom-parse@5.0.2: @@ -13133,6 +12044,10 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} @@ -13167,6 +12082,10 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reveal.js@5.2.1: + resolution: {integrity: sha512-r7//6mIM5p34hFiDMvYfXgyjXqGRta+/psd9YtytsgRlrpRzFv4RbH76TXd2qD+7ZPZEbpBDhdRhJaFgfQ7zNQ==} + engines: {node: '>=18.0.0'} + rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} @@ -13199,8 +12118,8 @@ packages: resolution: {integrity: sha512-EsoOi8moHN6CAYyTZipxDDVTJn0j2nBCWor4wRU45RQ8ER2qREDykXLr3Ulz6hBh6oBKCFTQIjo21i0FXNo/IA==} hasBin: true - rollup-plugin-stats@1.5.0: - resolution: {integrity: sha512-TsWaV7ulwPA9JhqGJemrDJkvXNeNQb60lB13gIcT2kVDXlBM/PQD3GqVyhCJpvn43Y4YT5+VmWDRsbIAbuilBA==} + rollup-plugin-stats@1.5.1: + resolution: {integrity: sha512-WXx9F3i57DLKkB8mt6Zw3jN9sS8YOqTsfvuOG8RW0D95Wn5KHt2e9POh8sYWODgmTsiKK0Nm54ZjxLnp7yeCDw==} engines: {node: '>=18'} peerDependencies: rolldown: ^1.0.0-beta.0 @@ -13226,14 +12145,16 @@ packages: peerDependencies: rollup: ^3.0.0||^4.0.0 - rollup-plugin-webpack-stats@2.1.4: - resolution: {integrity: sha512-kv9W0rK9Qy1Q8/vkxEPGOwJvq7zVERnHD13At5Jv15FPPOXwxm1LblXtpuASeoM1ALhOPD0sJSDz64qgtSgh7g==} + rollup-plugin-webpack-stats@2.1.6: + resolution: {integrity: sha512-njKotmo0lWIbrTKJ5CrIPk9DuDsQziOo73rE3aQIAhecJj5o0ECBbE0vxgMor37o6TQ/IEAK8pDxzs4CqLdIJw==} engines: {node: '>=18'} peerDependencies: rolldown: ^1.0.0-beta.0 rollup: ^3.0.0 || ^4.0.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: + rolldown: + optional: true rollup: optional: true vite: @@ -13244,8 +12165,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.46.3: - resolution: {integrity: sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==} + rollup@4.52.0: + resolution: {integrity: sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -13259,8 +12180,8 @@ packages: rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} run-parallel@1.2.0: @@ -13272,10 +12193,6 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - safaridriver@1.0.0: resolution: {integrity: sha512-J92IFbskyo7OYB3Dt4aTdyhag1GlInrfbPCmMteb7aBK7PwlnGz1HI0+oyNN97j7pV9DqUAVoVgkNRMrfY47mQ==} engines: {node: '>=18.0.0'} @@ -13313,128 +12230,112 @@ packages: sanitize-html@2.17.0: resolution: {integrity: sha512-dLAADUSS8rBwhaevT12yCezvioCA+bmUTPH/u57xKPT8d++voeYE6HeluA/bPbQ15TwDBG2ii+QZIEmYx8VdxA==} - sass-embedded-android-arm64@1.87.0: - resolution: {integrity: sha512-uqeZoBuXm3W2KhxolScAAfWOLHL21e50g7AxlLmG0he7WZsWw6e9kSnmq301iLIFp4kvmXYXbXbNKAeu9ItRYA==} + sass-embedded-all-unknown@1.91.0: + resolution: {integrity: sha512-AXC1oPqDfLnLtcoxM+XwSnbhcQs0TxAiA5JDEstl6+tt6fhFLKxdyl1Hla39SFtxvMfB2QDUYE3Dmx49O59vYg==} + cpu: ['!arm', '!arm64', '!riscv64', '!x64'] + + sass-embedded-android-arm64@1.91.0: + resolution: {integrity: sha512-I8Eeg2CeVcZIhXcQLNEY6ZBRF0m7jc818/fypwMwvIdbxGWBekTzc3aKHTLhdBpFzGnDIyR4s7oB0/OjIpzD1A==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [android] - sass-embedded-android-arm@1.87.0: - resolution: {integrity: sha512-Z20u/Y1kFDpMbgiloR5YPLxNuMVeKQRC8e/n68oAAxf3u7rDSmNn2msi7USqgT1f2zdBBNawn/ifbFEla6JiHw==} + sass-embedded-android-arm@1.91.0: + resolution: {integrity: sha512-DSh1V8TlLIcpklAbn4NINEFs3yD2OzVTbawEXK93IH990upoGNFVNRTstFQ/gcvlbWph3Y3FjAJvo37zUO485A==} engines: {node: '>=14.0.0'} cpu: [arm] os: [android] - sass-embedded-android-ia32@1.87.0: - resolution: {integrity: sha512-hSWTqo2Igdig528cUb1W1+emw9d1J4+nqOoR4tERS04zcwRRFNDiuBT0o5meV7nkEwE982F+h57YdcRXj8gTtg==} - engines: {node: '>=14.0.0'} - cpu: [ia32] - os: [android] - - sass-embedded-android-riscv64@1.87.0: - resolution: {integrity: sha512-kBAPSjiTBLy5ua/0LRNAJwOAARhzFU7gP35fYORJcdBuz1lkIVPVnid1lh9qQ6Ce9MOJcr7VKFtGnTuqVeig5A==} + sass-embedded-android-riscv64@1.91.0: + resolution: {integrity: sha512-qmsl1a7IIJL0fCOwzmRB+6nxeJK5m9/W8LReXUrdgyJNH5RyxChDg+wwQPVATFffOuztmWMnlJ5CV2sCLZrXcQ==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [android] - sass-embedded-android-x64@1.87.0: - resolution: {integrity: sha512-ZHMrNdtdMSpJUYco2MesnlPwDTZftD3pqkkOMI2pbqarPoFUKJtP5k80nwCM0sJGtqfNE+O16w9yPght0CMiJg==} + sass-embedded-android-x64@1.91.0: + resolution: {integrity: sha512-/wN0HBLATOVSeN3Tzg0yxxNTo1IQvOxxxwFv7Ki/1/UCg2AqZPxTpNoZj/mn8tUPtiVogMGbC8qclYMq1aRZsQ==} engines: {node: '>=14.0.0'} cpu: [x64] os: [android] - sass-embedded-darwin-arm64@1.87.0: - resolution: {integrity: sha512-7TK1JWJdCIRSdZv5CJv/HpDz/wIfwUy2FoPz9sVOEj1pDTH0N+VfJd5VutCddIdoQN9jr0ap8vwkc65FbAxV2A==} + sass-embedded-darwin-arm64@1.91.0: + resolution: {integrity: sha512-gQ6ScInxAN+BDUXy426BSYLRawkmGYlHpQ9i6iOxorr64dtIb3l6eb9YaBV8lPlroUnugylmwN2B3FU9BuPfhA==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [darwin] - sass-embedded-darwin-x64@1.87.0: - resolution: {integrity: sha512-2JiQzt7FmgUC4MYT2QvbeH/Bi3e76WEhaYoc5P3WyTW8unsHksyTdMuTuYe0Qf9usIyt6bmm5no/4BBw7c8Cig==} + sass-embedded-darwin-x64@1.91.0: + resolution: {integrity: sha512-DSvFMtECL2blYVTFMO5fLeNr5bX437Lrz8R47fdo5438TRyOkSgwKTkECkfh3YbnrL86yJIN2QQlmBMF17Z/iw==} engines: {node: '>=14.0.0'} cpu: [x64] os: [darwin] - sass-embedded-linux-arm64@1.87.0: - resolution: {integrity: sha512-5z+mwJCbGZcg+q+MwdEVSh0ogFK7OSAe175Gsozzr/Izw34Q+RGUw9O82jsV2c4YNuTAQvzEHgIO5cvNvt3Quw==} + sass-embedded-linux-arm64@1.91.0: + resolution: {integrity: sha512-OnKCabD7f420ZEC/6YI9WhCVGMZF+ybZ5NbAB9SsG1xlxrKbWQ1s7CIl0w/6RDALtJ+Fjn8+mrxsxqakoAkeuA==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - sass-embedded-linux-arm@1.87.0: - resolution: {integrity: sha512-z5P6INMsGXiUcq1sRRbksyQUhalFFYjTEexuxfSYdK3U2YQMADHubQh8pGzkWvFRPOpnh83RiGuwvpaARYHnsw==} + sass-embedded-linux-arm@1.91.0: + resolution: {integrity: sha512-ppAZLp3eZ9oTjYdQDf4nM7EehDpkxq5H1hE8FOrx8LpY7pxn6QF+SRpAbRjdfFChRw0K7vh+IiCnQEMp7uLNAg==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] - sass-embedded-linux-ia32@1.87.0: - resolution: {integrity: sha512-Xzcp+YPp0iakGL148Jl57CO+MxLuj2jsry3M+rc1cSnDlvkjNVs6TMxaL70GFeV5HdU2V60voYcgE7adDUtJjw==} - engines: {node: '>=14.0.0'} - cpu: [ia32] - os: [linux] - - sass-embedded-linux-musl-arm64@1.87.0: - resolution: {integrity: sha512-HWE5eTRCoKzFZWsxOjDMTF5m4DDTQ0n7NJxSYiUXPBDydr9viPXbGOMYG7WVJLjiF7upr7DYo/mfp/SNTMlZyg==} + sass-embedded-linux-musl-arm64@1.91.0: + resolution: {integrity: sha512-VfbPpID1C5TT7rukob6CKgefx/TsLE+XZieMNd00hvfJ8XhqPr5DGvSMCNpXlwaedzTirbJu357m+n2PJI9TFQ==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - sass-embedded-linux-musl-arm@1.87.0: - resolution: {integrity: sha512-4PyqOWhRzyu06RRmpCCBOJdF4BOv7s446wrV6yODtEyyfSIDx3MJabo3KT0oJ1lTWSI/aU3R89bKx0JFXcIHHw==} + sass-embedded-linux-musl-arm@1.91.0: + resolution: {integrity: sha512-znEsNC2FurPF9+XwQQ6e/fVoic3e5D3/kMB41t/bE8byJVRdaPhkdsszt3pZUE56nNGYoCuieSXUkk7VvyPHsw==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] - sass-embedded-linux-musl-ia32@1.87.0: - resolution: {integrity: sha512-aQaPvlRn3kh93PLQvl6BcFKu8Ji92+42blFEkg6nMVvmugD5ZwH2TGFrX25ibx4CYxRpMS4ssF7a0i7vy5HB1Q==} - engines: {node: '>=14.0.0'} - cpu: [ia32] - os: [linux] - - sass-embedded-linux-musl-riscv64@1.87.0: - resolution: {integrity: sha512-o5DxcqiFzET3KRWo+futHr/lhAMBP3tJGGx8YIgpHQYfvDMbsvE0hiFC+nZ/GF9dbcGd+ceIQwfvE5mcc7Gsjw==} + sass-embedded-linux-musl-riscv64@1.91.0: + resolution: {integrity: sha512-ZfLGldKEEeZjuljKks835LTq7jDRI3gXsKKXXgZGzN6Yymd4UpBOGWiDQlWsWTvw5UwDU2xfFh0wSXbLGHTjVA==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [linux] - sass-embedded-linux-musl-x64@1.87.0: - resolution: {integrity: sha512-dKxWsu9Wu/CyfzQmHdeiGqrRSzJ85VUjbSx+aP1/7ttmps3SSg+YW95PuqnCOa7GSuSreC3dKKpXHTywUxMLQA==} + sass-embedded-linux-musl-x64@1.91.0: + resolution: {integrity: sha512-4kSiSGPKFMbLvTRbP/ibyiKheOA3fwsJKWU0SOuekSPmybMdrhNkTm0REp6+nehZRE60kC3lXmEV4a7w8Jrwyg==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - sass-embedded-linux-riscv64@1.87.0: - resolution: {integrity: sha512-Sy3ESZ4FwBiijvmTA9n+0p0w3MNCue1AgINVPzpAY27EFi0h49eqQm9SWfOkFqmkFS2zFRYowdQOr5Bbr2gOXA==} + sass-embedded-linux-riscv64@1.91.0: + resolution: {integrity: sha512-Y3Fj94SYYvMX9yo49T78yBgBWXtG3EyYUT5K05XyCYkcdl1mVXJSrEmqmRfe4vQGUCaSe/6s7MmsA9Q+mQez7Q==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [linux] - sass-embedded-linux-x64@1.87.0: - resolution: {integrity: sha512-+UfjakOcHHKTnEqB3EZ+KqzezQOe1emvy4Rs+eQhLyfekpYuNze/qlRvYxfKTmrtvDiUrIto8MXsyZfMLzkuMA==} + sass-embedded-linux-x64@1.91.0: + resolution: {integrity: sha512-XwIUaE7pQP/ezS5te80hlyheYiUlo0FolQ0HBtxohpavM+DVX2fjwFm5LOUJHrLAqP+TLBtChfFeLj1Ie4Aenw==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - sass-embedded-win32-arm64@1.87.0: - resolution: {integrity: sha512-m1DS6FYUE0/fv+vt38uQB/kxR4UjnyD+2zcSc298pFmA0aYh/XZIPWw7RxG1HL3KLE1ZrGyu3254MPoxRhs3ig==} + sass-embedded-unknown-all@1.91.0: + resolution: {integrity: sha512-Bj6v7ScQp/HtO91QBy6ood9AArSIN7/RNcT4E7P9QoY3o+e6621Vd28lV81vdepPrt6u6PgJoVKmLNODqB6Q+A==} + os: ['!android', '!darwin', '!linux', '!win32'] + + sass-embedded-win32-arm64@1.91.0: + resolution: {integrity: sha512-yDCwTiPRex03i1yo7LwiAl1YQ21UyfOxPobD7UjI8AE8ZcB0mQ28VVX66lsZ+qm91jfLslNFOFCD4v79xCG9hA==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [win32] - sass-embedded-win32-ia32@1.87.0: - resolution: {integrity: sha512-JztXLo59GMe2E6g+kCsyiERYhtZgkcyDYx6CrXoSTE5WaE+RbxRiCCCv8/1+hf406f08pUxJ8G0Ody7M5urtBA==} - engines: {node: '>=14.0.0'} - cpu: [ia32] - os: [win32] - - sass-embedded-win32-x64@1.87.0: - resolution: {integrity: sha512-4nQErpauvhgSo+7ClumGdjdf9sGx+U9yBgvhI0+zUw+D5YvraVgvA0Lk8Wuwntx2PqnvKUk8YDr/vxHJostv4Q==} + sass-embedded-win32-x64@1.91.0: + resolution: {integrity: sha512-wiuMz/cx4vsk6rYCnNyoGE5pd73aDJ/zF3qJDose3ZLT1/vV943doJE5pICnS/v5DrUqzV6a1CNq4fN+xeSgFQ==} engines: {node: '>=14.0.0'} cpu: [x64] os: [win32] - sass-embedded@1.87.0: - resolution: {integrity: sha512-1IA3iTJNh4BkkA/nidKiVwbmkxr9o6LsPegycHMX/JYs255zpocN5GdLF1+onohQCJxbs5ldr8osKV7qNaNBjg==} + sass-embedded@1.91.0: + resolution: {integrity: sha512-VTckYcH1AglrZ3VpPETilTo3Ef472XKwP13lrNfbOHSR6Eo5p27XTkIi+6lrCbuhBFFGAmy+4BRoLaeFUgn+eg==} engines: {node: '>=16.0.0'} hasBin: true @@ -13443,8 +12344,8 @@ packages: engines: {node: '>=12.0.0'} hasBin: true - sass@1.87.0: - resolution: {integrity: sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==} + sass@1.91.0: + resolution: {integrity: sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA==} engines: {node: '>=14.0.0'} hasBin: true @@ -13512,6 +12413,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -13553,9 +12459,6 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-cookie-parser@2.7.1: - resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -13593,9 +12496,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-exec@1.0.2: - resolution: {integrity: sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==} - shell-quote@1.8.3: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} @@ -13638,9 +12538,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sigstore@3.1.0: - resolution: {integrity: sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==} - engines: {node: ^18.17.0 || >=20.5.0} + sigstore@4.0.0: + resolution: {integrity: sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==} + engines: {node: ^20.17.0 || >=22.9.0} simple-code-frame@1.3.0: resolution: {integrity: sha512-MB4pQmETUBlNs62BBeRjIFGeuy/x6gGKh7+eRUemn1rCFhqo7K+4slPqsyizCbcbYLnaYqaoZ2FWsZ/jN06D8w==} @@ -13674,8 +12574,8 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} sliced@1.0.1: @@ -13688,6 +12588,9 @@ packages: smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + socket.io-client@4.7.0: resolution: {integrity: sha512-7Q8CeDrhuZzg4QLXl3tXlk5yb086oxYzehAVZRLiGCzCmtDneiHz1qHyyWcxhTgxXiokVpWQXoG/u60HoXSQew==} engines: {node: '>=10.0.0'} @@ -13696,6 +12599,10 @@ packages: resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} engines: {node: '>=10.0.0'} + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} @@ -13715,10 +12622,6 @@ packages: resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - socks@2.8.5: - resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - socks@2.8.7: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} @@ -13738,12 +12641,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - - source-map-support@0.5.19: - resolution: {integrity: sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -13759,6 +12656,10 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -13774,8 +12675,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -13792,9 +12693,6 @@ packages: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} - split.js@1.6.5: - resolution: {integrity: sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -13805,11 +12703,6 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - sqlite-wasm-kysely@0.3.0: - resolution: {integrity: sha512-TzjBNv7KwRw6E3pdKdlRyZiTmUIE0UttT/Sl56MVwVARl/u5gp978KepazCJZewFUnlWHz9i3NQd4kOtP/Afdg==} - peerDependencies: - kysely: '*' - sqlite3@5.1.7: resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} @@ -13839,10 +12732,6 @@ packages: resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} engines: {node: '>=16'} - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -13861,6 +12750,10 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + stream-buffers@2.2.0: resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} engines: {node: '>= 0.10.0'} @@ -13870,6 +12763,10 @@ packages: engines: {node: '>= 0.10.0'} hasBin: true + streamroller@3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -13877,8 +12774,8 @@ packages: streamx@2.22.0: resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} - streamx@2.22.1: - resolution: {integrity: sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} @@ -13891,10 +12788,6 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} @@ -13915,6 +12808,17 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -13948,18 +12852,14 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - strip-bom@5.0.0: resolution: {integrity: sha512-p+byADHF7SzEcVnLvc/r3uognM1hUhObuHXxJcgLCfD194XAkaLbjq3Wzb0N5G2tgIjH0dgT708Z51QxMeu60A==} engines: {node: '>=12'} @@ -14072,18 +12972,14 @@ packages: peerDependencies: stylelint: '>=16.0.0' - stylelint@16.23.1: - resolution: {integrity: sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==} + stylelint@16.25.0: + resolution: {integrity: sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==} engines: {node: '>=18.12.0'} hasBin: true stylis@4.3.6: resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - sudo-prompt@9.2.1: - resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - sugarss@4.0.1: resolution: {integrity: sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw==} engines: {node: '>=12.0'} @@ -14129,27 +13025,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.3.1: - resolution: {integrity: sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg==} - engines: {node: '>= 18.0.0'} - hasBin: true - peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - typescript: '>=5.0.0' - - svelte-eslint-parser@1.3.0: - resolution: {integrity: sha512-VCgMHKV7UtOGcGLGNFSbmdm6kEKjtzo5nnpGU/mnx4OsFY6bZ7QwRF5DUx+Hokw5Lvdyo8dpk8B1m8mliomrNg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - svelte: - optional: true - - svelte@5.38.6: - resolution: {integrity: sha512-ltBPlkvqk3bgCK7/N323atUpP3O3Y+DrGV4dcULrsSn4fZaaNnOmdplNznwfdWclAgvSr5rxjtzn/zJhRm6TKg==} - engines: {node: '>=18'} - svg-pan-zoom@3.6.2: resolution: {integrity: sha512-JwnvRWfVKw/Xzfe6jriFyfey/lWJLq4bUh2jwoR5ChWQuQoOH8FEh1l/bEp46iHHKHEJWIyFJETbazraxNWECg==} @@ -14200,10 +13075,6 @@ packages: resolution: {integrity: sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==} engines: {node: '>=16.0.0'} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} - engines: {node: ^14.18.0 || >=16.0.0} - table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} @@ -14211,23 +13082,16 @@ packages: tabulator-tables@6.3.1: resolution: {integrity: sha512-qFW7kfadtcaISQIibKAIy0f3eeIXUVi8242Vly1iJfMD79kfEGzfczNuPBN/80hDxHzQJXYbmJ8VipI40hQtfA==} - tailwindcss@4.1.12: - resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} - - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.2.3: + resolution: {integrity: sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==} engines: {node: '>=6'} tape@4.17.0: resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==} hasBin: true - tar-fs@3.1.0: - resolution: {integrity: sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-fs@3.1.1: + resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -14240,9 +13104,6 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} - tcp-port-used@1.0.2: - resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} - temp@0.9.4: resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} engines: {node: '>=6.0.0'} @@ -14269,20 +13130,11 @@ packages: uglify-js: optional: true - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + terser@5.44.0: + resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} hasBin: true - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} - engines: {node: '>=10'} - hasBin: true - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} @@ -14290,8 +13142,8 @@ packages: text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 @@ -14326,10 +13178,17 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyglobby@0.2.14: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -14355,13 +13214,14 @@ packages: tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + tmp@0.2.5: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - tn1150@0.1.0: resolution: {integrity: sha512-DbplOfQFkqG5IHcDyyrs/lkvSr3mPUVsFf/RbDppOshs22yTPnSJWEe6FkYd1txAwU/zcnR905ar2fi4kwF29w==} engines: {node: '>=0.12'} @@ -14408,16 +13268,12 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} - tree-dump@1.0.3: - resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -14434,6 +13290,9 @@ packages: truncate-utf8-bytes@1.0.2: resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -14444,8 +13303,8 @@ packages: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} - ts-loader@9.5.2: - resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} + ts-loader@9.5.4: + resolution: {integrity: sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==} engines: {node: '>=12.0.0'} peerDependencies: typescript: '*' @@ -14465,21 +13324,17 @@ packages: '@swc/wasm': optional: true - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.20.5: - resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==} + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} engines: {node: '>=18.0.0'} hasBin: true - tuf-js@3.1.0: - resolution: {integrity: sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg==} - engines: {node: ^18.17.0 || >=20.5.0} + tuf-js@4.0.0: + resolution: {integrity: sha512-Lq7ieeGvXDXwpoSmOSgLWVdsGGV9J4a77oDTAPe/Ltrqnnm/ETaRlBAQTH5JatEh8KXuE6sddf9qAv1Q2282Hg==} + engines: {node: ^20.17.0 || >=22.9.0} tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -14497,10 +13352,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} @@ -14559,8 +13410,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - typescript-eslint@8.41.0: - resolution: {integrity: sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw==} + typescript-eslint@8.46.2: + resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -14571,19 +13422,23 @@ packages: engines: {node: '>=12.20'} hasBin: true + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.8.2: resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} - engines: {node: '>=14.17'} + ua-parser-js@0.7.41: + resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} hasBin: true ufo@1.6.1: @@ -14601,14 +13456,11 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.10.0: - resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} undici@6.21.3: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} @@ -14622,20 +13474,20 @@ packages: resolution: {integrity: sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==} engines: {node: '>=0.10.0'} - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + unicode-canonical-property-names-ecmascript@1.0.4: + resolution: {integrity: sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==} engines: {node: '>=4'} - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + unicode-match-property-ecmascript@1.0.4: + resolution: {integrity: sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + unicode-match-property-value-ecmascript@1.2.0: + resolution: {integrity: sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==} engines: {node: '>=4'} - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + unicode-property-aliases-ecmascript@1.1.0: + resolution: {integrity: sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==} engines: {node: '>=4'} unidragger@3.0.1: @@ -14673,30 +13525,18 @@ packages: unist-util-find-after@5.0.0: resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} - unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -14720,13 +13560,6 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@2.3.5: - resolution: {integrity: sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==} - engines: {node: '>=18.12.0'} - - unrs-resolver@1.11.1: - resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - unused-filename@4.0.1: resolution: {integrity: sha512-ZX6U1J04K1FoSUeoX1OicAhw4d0aro2qo+L8RhJkiGTNtBNkd/Fi1Wxoc9HzcVu6HfOzm0si/N15JjxFmD1z6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -14778,6 +13611,9 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + user-agent-data-types@0.4.2: + resolution: {integrity: sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw==} + userhome@1.0.1: resolution: {integrity: sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==} engines: {node: '>= 0.8.0'} @@ -14803,10 +13639,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true @@ -14822,17 +13654,9 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - validate-npm-package-name@6.0.2: resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -14857,9 +13681,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - vfile-message@4.0.2: resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} @@ -14880,8 +13701,8 @@ packages: vite: optional: true - vite-plugin-static-copy@3.1.2: - resolution: {integrity: sha512-aVmYOzptLVOI2b1jL+cmkF7O6uhRv1u5fvOkQgbohWZp2CbR22kn9ZqkCUIt9umKF7UhdbsEpshn1rf4720QFg==} + vite-plugin-static-copy@3.1.4: + resolution: {integrity: sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -14897,8 +13718,8 @@ packages: peerDependencies: vite: 5.x || 6.x || 7.x - vite@7.0.0: - resolution: {integrity: sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==} + vite@7.1.11: + resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -14937,54 +13758,6 @@ packages: yaml: optional: true - vite@7.1.3: - resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vitefu@1.1.1: - resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 - peerDependenciesMeta: - vite: - optional: true - vitest@3.2.4: resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -15013,6 +13786,10 @@ packages: jsdom: optional: true + void-elements@2.0.1: + resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} + engines: {node: '>=0.10.0'} + void-elements@3.1.0: resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} engines: {node: '>=0.10.0'} @@ -15063,9 +13840,6 @@ packages: engines: {node: '>=10'} hasBin: true - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - warning@4.0.3: resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} @@ -15086,12 +13860,12 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webdriver@9.19.2: - resolution: {integrity: sha512-kw6dSwNzimU8/CkGVlM36pqWHZ7BhCwV4/d8fu6rpIYGeQbPwcNc4M90TfJuzYMA7Au3NdrwT/EVQgVLQ9Ju8Q==} + webdriver@9.20.0: + resolution: {integrity: sha512-Kk+AGV1xWLNHVpzUynQJDULMzbcO3IjXo3s0BzfC30OpGxhpaNmoazMQodhtv0Lp242Mb1VYXD89dCb4oAHc4w==} engines: {node: '>=18.20.0'} - webdriverio@9.19.2: - resolution: {integrity: sha512-xP/9odQ9tt2pEuMgo0Oobklhu1lObgL1KmejZeyxVStwnrSTbFmn1AAqPq5pfXizUsyv2PR5+id9frrarx/c4w==} + webdriverio@9.20.0: + resolution: {integrity: sha512-cqaXfahTzCFaQLlk++feZaze6tAsW8OSdaVRgmOGJRII1z2A4uh4YGHtusTpqOiZAST7OBPqycOwfh01G/Ktbg==} engines: {node: '>=18.20.0'} peerDependencies: puppeteer-core: '>=22.x || <=24.x' @@ -15114,8 +13888,8 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-dev-middleware@7.4.2: - resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + webpack-dev-middleware@7.4.3: + resolution: {integrity: sha512-5kA/PzpZzDz5mNOkcNLmU1UdjGeSSxd7rt1akWpI70jMNHLASiBPRaQZn0hgyhvhawfIwSnnLfDABIxL3ueyFg==} engines: {node: '>= 18.12.0'} peerDependencies: webpack: ^5.0.0 @@ -15147,11 +13921,8 @@ packages: resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - - webpack@5.100.2: - resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} + webpack@5.101.3: + resolution: {integrity: sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -15238,6 +14009,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + which@4.0.0: resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} engines: {node: ^16.13.0 || >=18.0.0} @@ -15263,8 +14039,8 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerpool@9.3.3: - resolution: {integrity: sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw==} + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} wrap-ansi@5.1.0: resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} @@ -15282,8 +14058,8 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} wrappy@1.0.2: @@ -15395,11 +14171,6 @@ packages: resolution: {integrity: sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==} engines: {node: '>= 6'} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.8.1: resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} @@ -15467,13 +14238,16 @@ packages: engines: {node: '>=8.0.0'} hasBin: true - zimmerframe@1.1.2: - resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} + zod-validation-error@3.5.3: + resolution: {integrity: sha512-OT5Y8lbUadqVZCsnyFaTQ4/O2mys4tj7PqhdbBCp7McPwvIEKfPtdA6QfPeFQK2/Rz5LgwmAXRJTugBNBi0btw==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + zod@3.24.4: resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} @@ -15499,17 +14273,21 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@antfu/install-pkg@1.0.0': + '@antfu/install-pkg@1.1.0': dependencies: - package-manager-detector: 0.2.11 - tinyexec: 0.3.2 + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 - '@antfu/utils@8.1.1': {} + '@antfu/utils@9.2.0': {} - '@anthropic-ai/sdk@0.60.0': {} + '@anthropic-ai/sdk@0.67.0(zod@3.24.4)': + dependencies: + json-schema-to-ts: 3.1.1 + optionalDependencies: + zod: 3.24.4 '@apidevtools/json-schema-ref-parser@9.1.2': dependencies: @@ -15532,13 +14310,14 @@ snapshots: openapi-types: 12.1.3 z-schema: 5.0.5 - '@asamuzakjp/css-color@3.1.4': + '@asamuzakjp/css-color@3.2.0': dependencies: - '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.0.9(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 + optional: true '@aws-crypto/crc32@5.2.0': dependencies: @@ -15590,34 +14369,34 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 + '@smithy/core': 3.17.0 '@smithy/eventstream-serde-browser': 4.0.4 '@smithy/eventstream-serde-config-resolver': 4.1.2 '@smithy/eventstream-serde-node': 4.0.4 - '@smithy/fetch-http-handler': 5.1.0 + '@smithy/fetch-http-handler': 5.3.4 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-retry': 4.1.15 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.1.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 + '@smithy/middleware-endpoint': 4.3.4 + '@smithy/middleware-retry': 4.4.4 + '@smithy/middleware-serde': 4.2.3 + '@smithy/middleware-stack': 4.2.3 + '@smithy/node-config-provider': 4.3.3 + '@smithy/node-http-handler': 4.4.2 + '@smithy/protocol-http': 5.3.3 + '@smithy/smithy-client': 4.9.0 + '@smithy/types': 4.8.0 + '@smithy/url-parser': 4.2.3 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.0.0 '@smithy/util-defaults-mode-browser': 4.0.22 '@smithy/util-defaults-mode-node': 4.0.22 '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-stream': 4.2.3 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-middleware': 4.2.3 + '@smithy/util-retry': 4.2.3 + '@smithy/util-stream': 4.5.3 + '@smithy/util-utf8': 4.2.0 '@types/uuid': 9.0.8 tslib: 2.8.1 uuid: 9.0.1 @@ -15639,30 +14418,30 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 - '@smithy/fetch-http-handler': 5.1.0 + '@smithy/core': 3.17.0 + '@smithy/fetch-http-handler': 5.3.4 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-retry': 4.1.15 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.1.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 + '@smithy/middleware-endpoint': 4.3.4 + '@smithy/middleware-retry': 4.4.4 + '@smithy/middleware-serde': 4.2.3 + '@smithy/middleware-stack': 4.2.3 + '@smithy/node-config-provider': 4.3.3 + '@smithy/node-http-handler': 4.4.2 + '@smithy/protocol-http': 5.3.3 + '@smithy/smithy-client': 4.9.0 + '@smithy/types': 4.8.0 + '@smithy/url-parser': 4.2.3 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.0.0 '@smithy/util-defaults-mode-browser': 4.0.22 '@smithy/util-defaults-mode-node': 4.0.22 '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-middleware': 4.2.3 + '@smithy/util-retry': 4.2.3 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -15671,17 +14450,17 @@ snapshots: dependencies: '@aws-sdk/types': 3.821.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.7.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 + '@smithy/core': 3.17.0 + '@smithy/node-config-provider': 4.3.3 + '@smithy/property-provider': 4.2.3 + '@smithy/protocol-http': 5.3.3 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-utf8': 4.0.0 + '@smithy/smithy-client': 4.9.0 + '@smithy/types': 4.8.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.3 + '@smithy/util-utf8': 4.2.0 fast-xml-parser: 4.4.1 tslib: 2.8.1 @@ -15689,21 +14468,21 @@ snapshots: dependencies: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/credential-provider-http@3.823.0': dependencies: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/node-http-handler': 4.1.0 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.3 + '@smithy/fetch-http-handler': 5.3.4 + '@smithy/node-http-handler': 4.4.2 + '@smithy/property-provider': 4.2.3 + '@smithy/protocol-http': 5.3.3 + '@smithy/smithy-client': 4.9.0 + '@smithy/types': 4.8.0 + '@smithy/util-stream': 4.5.3 tslib: 2.8.1 '@aws-sdk/credential-provider-ini@3.823.0': @@ -15717,9 +14496,9 @@ snapshots: '@aws-sdk/nested-clients': 3.823.0 '@aws-sdk/types': 3.821.0 '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/shared-ini-file-loader': 4.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -15734,9 +14513,9 @@ snapshots: '@aws-sdk/credential-provider-web-identity': 3.823.0 '@aws-sdk/types': 3.821.0 '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/shared-ini-file-loader': 4.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -15745,9 +14524,9 @@ snapshots: dependencies: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/shared-ini-file-loader': 4.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/credential-provider-sso@3.823.0': @@ -15756,9 +14535,9 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/token-providers': 3.823.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/shared-ini-file-loader': 4.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -15768,8 +14547,8 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/nested-clients': 3.823.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -15778,34 +14557,34 @@ snapshots: dependencies: '@aws-sdk/types': 3.821.0 '@smithy/eventstream-codec': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/middleware-eventstream@3.821.0': dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/middleware-host-header@3.821.0': dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/middleware-logger@3.821.0': dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/middleware-recursion-detection@3.821.0': dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/middleware-user-agent@3.823.0': @@ -15813,9 +14592,9 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 '@aws-sdk/util-endpoints': 3.821.0 - '@smithy/core': 3.7.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/core': 3.17.0 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/nested-clients@3.823.0': @@ -15833,30 +14612,30 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.0 - '@smithy/fetch-http-handler': 5.1.0 + '@smithy/core': 3.17.0 + '@smithy/fetch-http-handler': 5.3.4 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-retry': 4.1.15 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.1.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 + '@smithy/middleware-endpoint': 4.3.4 + '@smithy/middleware-retry': 4.4.4 + '@smithy/middleware-serde': 4.2.3 + '@smithy/middleware-stack': 4.2.3 + '@smithy/node-config-provider': 4.3.3 + '@smithy/node-http-handler': 4.4.2 + '@smithy/protocol-http': 5.3.3 + '@smithy/smithy-client': 4.9.0 + '@smithy/types': 4.8.0 + '@smithy/url-parser': 4.2.3 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.0.0 '@smithy/util-defaults-mode-browser': 4.0.22 '@smithy/util-defaults-mode-node': 4.0.22 '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-middleware': 4.2.3 + '@smithy/util-retry': 4.2.3 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -15864,10 +14643,10 @@ snapshots: '@aws-sdk/region-config-resolver@3.821.0': dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.3 + '@smithy/types': 4.8.0 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 + '@smithy/util-middleware': 4.2.3 tslib: 2.8.1 '@aws-sdk/token-providers@3.823.0': @@ -15875,22 +14654,22 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/nested-clients': 3.823.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/shared-ini-file-loader': 4.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt '@aws-sdk/types@3.821.0': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/util-endpoints@3.821.0': dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 '@smithy/util-endpoints': 3.0.6 tslib: 2.8.1 @@ -15901,7 +14680,7 @@ snapshots: '@aws-sdk/util-user-agent-browser@3.821.0': dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 bowser: 2.11.0 tslib: 2.8.1 @@ -15909,21 +14688,15 @@ snapshots: dependencies: '@aws-sdk/middleware-user-agent': 3.823.0 '@aws-sdk/types': 3.821.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@aws-sdk/xml-builder@3.821.0': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -15936,42 +14709,38 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.27.0': + '@babel/eslint-parser@7.28.4(@babel/core@7.28.0)(eslint@9.38.0(jiti@2.6.1))': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/core': 7.28.0 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 9.38.0(jiti@2.6.1) + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.28.0': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.25.9': - dependencies: - '@babel/types': 7.28.1 - '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.28.1 @@ -15980,50 +14749,12 @@ snapshots: dependencies: '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.26.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.28.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.28.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.2.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@6.0.0) - lodash.debounce: 4.0.8 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.25.9': - dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.28.0 @@ -16036,468 +14767,41 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-module-imports': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': - dependencies: - '@babel/types': 7.28.1 - '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.26.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.27.1': {} '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.25.9': - dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - transitivePeerDependencies: - - supports-color - '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.28.4 '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.4 - '@babel/parser@7.28.0': + '@babel/parser@7.28.4': dependencies: - '@babel/types': 7.28.1 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.4 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 - - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.0) - - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -16516,212 +14820,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.28.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.26.9(@babel/core@7.28.0)': - dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.28.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.28.0) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.28.0) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.28.0) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.28.0) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.28.0) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.28.0) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.28.0) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.28.0) - '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.28.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.28.0) - core-js-compat: 3.41.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.1 - esutils: 2.0.3 - - '@babel/preset-typescript@7.27.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.28.0) - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/runtime@7.27.6': {} - - '@babel/template@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 '@babel/traverse@7.27.0': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.0 - '@babel/types': 7.28.1 - debug: 4.4.1(supports-color@6.0.0) + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3(supports-color@6.0.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -16729,26 +14843,36 @@ snapshots: '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 '@babel/template': 7.27.2 - '@babel/types': 7.28.1 - debug: 4.4.1(supports-color@6.0.0) + '@babel/types': 7.28.4 + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color - '@babel/types@7.28.0': + '@babel/traverse@7.28.4': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3(supports-color@6.0.0) + transitivePeerDependencies: + - supports-color '@babel/types@7.28.1': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@bcoe/v8-coverage@0.2.3': {} + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@1.0.2': {} @@ -16756,7 +14880,7 @@ snapshots: '@braintree/sanitize-url@7.1.1': {} - '@bufbuild/protobuf@2.7.0': + '@bufbuild/protobuf@2.10.0': optional: true '@bundled-es-modules/cookie@2.0.1': @@ -16792,10 +14916,10 @@ snapshots: '@chevrotain/utils@11.0.3': {} - '@ckeditor/ckeditor-cloud-services-collaboration@53.0.0(@ckeditor/ckeditor5-utils@46.0.2)(bufferutil@4.0.9)(ckeditor5@46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5)': + '@ckeditor/ckeditor-cloud-services-collaboration@53.0.1(@ckeditor/ckeditor5-utils@47.1.0)(bufferutil@4.0.9)(ckeditor5@47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5)': dependencies: - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) protobufjs: 7.5.0 socket.io-client: 4.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) socket.io-parser: 4.2.4 @@ -16806,213 +14930,229 @@ snapshots: - supports-color - utf-8-validate - '@ckeditor/ckeditor5-adapter-ckfinder@46.0.2': + '@ckeditor/ckeditor5-adapter-ckfinder@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-upload': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-upload': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-ai@46.0.2': + '@ckeditor/ckeditor5-ai@47.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: '@aws-sdk/client-bedrock-runtime': 3.823.0 - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-table': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-cloud-services': 47.1.0 + '@ckeditor/ckeditor5-collaboration-core': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-markdown-gfm': 47.1.0 + '@ckeditor/ckeditor5-real-time-collaboration': 47.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + '@ckeditor/ckeditor5-table': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5-collaboration: 47.1.0 + diff: 8.0.2 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 es-toolkit: 1.39.5 + eventsource-parser: 3.0.2 + htmlparser2: 10.0.0 + morphdom: 2.7.7 transitivePeerDependencies: - aws-crt + - bufferutil + - supports-color + - utf-8-validate - '@ckeditor/ckeditor5-alignment@46.0.2': + '@ckeditor/ckeditor5-alignment@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-autoformat@46.0.2': + '@ckeditor/ckeditor5-autoformat@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-heading': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-heading': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-autosave@46.0.2': + '@ckeditor/ckeditor5-autosave@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-basic-styles@46.0.2': + '@ckeditor/ckeditor5-basic-styles@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-block-quote@46.0.2': + '@ckeditor/ckeditor5-block-quote@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-bookmark@46.0.2': + '@ckeditor/ckeditor5-bookmark@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-link': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-link': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-case-change@46.0.2': + '@ckeditor/ckeditor5-case-change@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-ckbox@46.0.2': + '@ckeditor/ckeditor5-ckbox@47.1.0': dependencies: - '@ckeditor/ckeditor5-cloud-services': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-image': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-upload': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-cloud-services': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-image': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-upload': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 blurhash: 2.0.5 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-ckfinder@46.0.2': + '@ckeditor/ckeditor5-ckfinder@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-image': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-image': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-clipboard@46.0.2': + '@ckeditor/ckeditor5-clipboard@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 es-toolkit: 1.39.5 - '@ckeditor/ckeditor5-cloud-services@46.0.2': + '@ckeditor/ckeditor5-cloud-services@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-code-block@46.0.2(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': + '@ckeditor/ckeditor5-code-block@47.1.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-collaboration-core@46.0.2': + '@ckeditor/ckeditor5-collaboration-core@47.1.0': dependencies: - '@ckeditor/ckeditor5-comments': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-theme-lark': 46.0.2 - '@ckeditor/ckeditor5-track-changes': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-comments': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-track-changes': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 '@types/luxon': 3.6.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + diff: 8.0.2 luxon: 3.6.1 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-comments@46.0.2': + '@ckeditor/ckeditor5-comments@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-collaboration-core': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-paragraph': 46.0.2 - '@ckeditor/ckeditor5-select-all': 46.0.2 - '@ckeditor/ckeditor5-source-editing': 46.0.2 - '@ckeditor/ckeditor5-theme-lark': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-undo': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - ckeditor5-collaboration: 46.0.2 + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-collaboration-core': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-paragraph': 47.1.0 + '@ckeditor/ckeditor5-select-all': 47.1.0 + '@ckeditor/ckeditor5-source-editing': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-undo': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5-collaboration: 47.1.0 es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-core@46.0.2': + '@ckeditor/ckeditor5-core@47.1.0': dependencies: - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-watchdog': 46.0.2 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-watchdog': 47.1.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color - '@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.2)': + '@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: '@rollup/plugin-commonjs': 25.0.8(rollup@4.40.0) '@rollup/plugin-json': 6.1.0(rollup@4.40.0) '@rollup/plugin-node-resolve': 15.3.1(rollup@4.40.0) '@rollup/plugin-swc': 0.3.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(rollup@4.40.0) '@rollup/plugin-terser': 0.4.4(rollup@4.40.0) - '@rollup/plugin-typescript': 11.1.6(rollup@4.40.0)(tslib@2.8.1)(typescript@5.9.2) + '@rollup/plugin-typescript': 11.1.6(rollup@4.40.0)(tslib@2.8.1)(typescript@5.9.3) '@rollup/pluginutils': 5.1.4(rollup@4.40.0) '@swc/core': 1.11.29(@swc/helpers@0.5.17) chalk: 5.4.1 @@ -17048,13 +15188,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-dev-translations@50.3.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9))': + '@ckeditor/ckeditor5-dev-translations@53.2.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11))': dependencies: - '@babel/parser': 7.28.0 - '@babel/traverse': 7.28.0 - '@ckeditor/ckeditor5-dev-utils': 50.3.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - chalk: 5.6.0 - fs-extra: 11.3.1 + '@babel/parser': 7.28.4 + '@babel/traverse': 7.28.4 + '@ckeditor/ckeditor5-dev-utils': 53.2.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + chalk: 5.6.2 + fs-extra: 11.3.2 glob: 11.0.3 plural-forms: 0.5.5 pofile: 1.1.4 @@ -17070,63 +15210,63 @@ snapshots: - uglify-js - webpack - '@ckeditor/ckeditor5-dev-utils@43.1.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9))': + '@ckeditor/ckeditor5-dev-utils@43.1.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11))': dependencies: '@ckeditor/ckeditor5-dev-translations': 43.1.0 chalk: 3.0.0 cli-cursor: 3.1.0 cli-spinners: 2.9.2 - css-loader: 5.2.7(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + css-loader: 5.2.7(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) cssnano: 6.1.2(postcss@8.5.3) del: 5.1.0 - esbuild-loader: 3.0.1(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - fs-extra: 11.3.1 + esbuild-loader: 3.0.1(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + fs-extra: 11.3.2 is-interactive: 1.0.0 javascript-stringify: 1.6.0 - mini-css-extract-plugin: 2.4.7(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + mini-css-extract-plugin: 2.4.7(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) mocha: 7.2.0 postcss: 8.5.3 postcss-import: 14.1.0(postcss@8.5.3) - postcss-loader: 4.3.0(postcss@8.5.3)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + postcss-loader: 4.3.0(postcss@8.5.3)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) postcss-mixins: 9.0.4(postcss@8.5.3) postcss-nesting: 13.0.1(postcss@8.5.3) - raw-loader: 4.0.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + raw-loader: 4.0.2(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) shelljs: 0.8.5 - style-loader: 2.0.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - terser-webpack-plugin: 4.2.3(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + style-loader: 2.0.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + terser-webpack-plugin: 4.2.3(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) through2: 3.0.2 transitivePeerDependencies: - bluebird - supports-color - webpack - '@ckeditor/ckeditor5-dev-utils@50.3.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9))': + '@ckeditor/ckeditor5-dev-utils@53.2.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11))': dependencies: - '@ckeditor/ckeditor5-dev-translations': 50.3.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + '@ckeditor/ckeditor5-dev-translations': 53.2.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) '@types/postcss-import': 14.0.3 '@types/through2': 2.0.41 - chalk: 5.6.0 + chalk: 5.6.2 cli-cursor: 5.0.0 cli-spinners: 3.2.0 - css-loader: 7.1.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - cssnano: 7.1.0(postcss@8.5.6) - esbuild-loader: 4.3.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - fs-extra: 11.3.1 + css-loader: 7.1.2(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + cssnano: 7.1.1(postcss@8.5.6) + esbuild-loader: 4.3.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + fs-extra: 11.3.2 glob: 11.0.3 is-interactive: 2.0.0 - mini-css-extract-plugin: 2.9.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - mocha: 11.7.1 - pacote: 21.0.0 + mini-css-extract-plugin: 2.9.4(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + mocha: 11.7.2 + pacote: 21.0.1 postcss: 8.5.6 postcss-import: 16.1.1(postcss@8.5.6) - postcss-loader: 8.1.1(postcss@8.5.6)(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + postcss-loader: 8.2.0(postcss@8.5.6)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) postcss-mixins: 11.0.3(postcss@8.5.6) postcss-nesting: 13.0.2(postcss@8.5.6) - raw-loader: 4.0.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + raw-loader: 4.0.2(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) shelljs: 0.10.0 simple-git: 3.28.0 - style-loader: 4.0.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + style-loader: 4.0.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) through2: 4.0.2 upath: 2.0.1 transitivePeerDependencies: @@ -17138,377 +15278,375 @@ snapshots: - uglify-js - webpack - '@ckeditor/ckeditor5-document-outline@46.0.2': + '@ckeditor/ckeditor5-document-outline@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-heading': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-heading': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - '@ckeditor/ckeditor5-easy-image@46.0.2': + '@ckeditor/ckeditor5-easy-image@47.1.0': dependencies: - '@ckeditor/ckeditor5-cloud-services': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-upload': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-cloud-services': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-upload': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-editor-balloon@46.0.2': + '@ckeditor/ckeditor5-editor-balloon@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + es-toolkit: 1.39.5 + + '@ckeditor/ckeditor5-editor-classic@47.1.0': + dependencies: + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + es-toolkit: 1.39.5 + + '@ckeditor/ckeditor5-editor-decoupled@47.1.0': + dependencies: + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + es-toolkit: 1.39.5 + + '@ckeditor/ckeditor5-editor-inline@47.1.0': + dependencies: + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + es-toolkit: 1.39.5 + + '@ckeditor/ckeditor5-editor-multi-root@47.1.0': + dependencies: + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-editor-classic@46.0.2': + '@ckeditor/ckeditor5-email@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - es-toolkit: 1.39.5 - - '@ckeditor/ckeditor5-editor-decoupled@46.0.2': - dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - es-toolkit: 1.39.5 - - '@ckeditor/ckeditor5-editor-inline@46.0.2': - dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - es-toolkit: 1.39.5 - - '@ckeditor/ckeditor5-editor-multi-root@46.0.2': - dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - es-toolkit: 1.39.5 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-export-inline-styles': 47.1.0 + '@ckeditor/ckeditor5-font': 47.1.0 + '@ckeditor/ckeditor5-html-support': 47.1.0 + '@ckeditor/ckeditor5-list': 47.1.0 + '@ckeditor/ckeditor5-table': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-email@46.0.2': + '@ckeditor/ckeditor5-emoji@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-export-inline-styles': 46.0.2 - '@ckeditor/ckeditor5-font': 46.0.2 - '@ckeditor/ckeditor5-html-support': 46.0.2 - '@ckeditor/ckeditor5-list': 46.0.2 - '@ckeditor/ckeditor5-table': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color - - '@ckeditor/ckeditor5-emoji@46.0.2': - dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-mention': 46.0.2(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d) - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-mention': 47.1.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d) + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 fuzzysort: 3.1.0 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-engine@46.0.2': + '@ckeditor/ckeditor5-engine@47.1.0': dependencies: - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-utils': 47.1.0 es-toolkit: 1.39.5 - '@ckeditor/ckeditor5-enter@46.0.2': + '@ckeditor/ckeditor5-enter@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + + '@ckeditor/ckeditor5-essentials@47.1.0': + dependencies: + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-select-all': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-undo': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-essentials@46.0.2': + '@ckeditor/ckeditor5-export-inline-styles@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-select-all': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-undo': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color - - '@ckeditor/ckeditor5-export-inline-styles@46.0.2': - dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) specificity: 0.4.1 - '@ckeditor/ckeditor5-export-pdf@46.0.2': + '@ckeditor/ckeditor5-export-pdf@47.1.0': dependencies: - '@ckeditor/ckeditor5-cloud-services': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-merge-fields': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-cloud-services': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-merge-fields': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-export-word@46.0.2': + '@ckeditor/ckeditor5-export-word@47.1.0': dependencies: - '@ckeditor/ckeditor5-cloud-services': 46.0.2 - '@ckeditor/ckeditor5-collaboration-core': 46.0.2 - '@ckeditor/ckeditor5-comments': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-merge-fields': 46.0.2 - '@ckeditor/ckeditor5-track-changes': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-cloud-services': 47.1.0 + '@ckeditor/ckeditor5-collaboration-core': 47.1.0 + '@ckeditor/ckeditor5-comments': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-merge-fields': 47.1.0 + '@ckeditor/ckeditor5-track-changes': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-find-and-replace@46.0.2': + '@ckeditor/ckeditor5-find-and-replace@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - '@ckeditor/ckeditor5-font@46.0.2': + '@ckeditor/ckeditor5-font@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-format-painter@46.0.2': + '@ckeditor/ckeditor5-format-painter@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-fullscreen@46.0.2': + '@ckeditor/ckeditor5-fullscreen@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-editor-classic': 46.0.2 - '@ckeditor/ckeditor5-editor-decoupled': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-editor-classic': 47.1.0 + '@ckeditor/ckeditor5-editor-decoupled': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-heading@46.0.2': + '@ckeditor/ckeditor5-heading@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-paragraph': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-paragraph': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-highlight@46.0.2': + '@ckeditor/ckeditor5-highlight@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - - '@ckeditor/ckeditor5-horizontal-line@46.0.2': - dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - - '@ckeditor/ckeditor5-html-embed@46.0.2': - dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-html-support@46.0.2': + '@ckeditor/ckeditor5-horizontal-line@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-heading': 46.0.2 - '@ckeditor/ckeditor5-image': 46.0.2 - '@ckeditor/ckeditor5-list': 46.0.2 - '@ckeditor/ckeditor5-remove-format': 46.0.2 - '@ckeditor/ckeditor5-table': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + + '@ckeditor/ckeditor5-html-embed@47.1.0': + dependencies: + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color + + '@ckeditor/ckeditor5-html-support@47.1.0': + dependencies: + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-heading': 47.1.0 + '@ckeditor/ckeditor5-image': 47.1.0 + '@ckeditor/ckeditor5-list': 47.1.0 + '@ckeditor/ckeditor5-remove-format': 47.1.0 + '@ckeditor/ckeditor5-table': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-icons@46.0.2': {} + '@ckeditor/ckeditor5-icons@47.1.0': {} - '@ckeditor/ckeditor5-image@46.0.2': + '@ckeditor/ckeditor5-image@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-undo': 46.0.2 - '@ckeditor/ckeditor5-upload': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-undo': 47.1.0 + '@ckeditor/ckeditor5-upload': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-import-word@46.0.2': + '@ckeditor/ckeditor5-import-word@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-cloud-services': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-merge-fields': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-cloud-services': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-merge-fields': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-indent@46.0.2': + '@ckeditor/ckeditor5-indent@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-heading': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-list': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-heading': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-list': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color '@ckeditor/ckeditor5-inspector@5.0.0': {} - '@ckeditor/ckeditor5-language@46.0.2': + '@ckeditor/ckeditor5-language@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-line-height@46.0.2': + '@ckeditor/ckeditor5-line-height@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-link@46.0.2': + '@ckeditor/ckeditor5-link@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-image': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-image': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-list-multi-level@46.0.2': + '@ckeditor/ckeditor5-list-multi-level@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-list': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-list': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-list@46.0.2': + '@ckeditor/ckeditor5-list@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-font': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-font': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-markdown-gfm@46.0.2': + '@ckeditor/ckeditor5-markdown-gfm@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 '@types/hast': 3.0.4 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) hast-util-from-dom: 5.0.1 hast-util-to-html: 9.0.5 hast-util-to-mdast: 10.1.2 @@ -17526,80 +15664,87 @@ snapshots: transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-media-embed@46.0.2': + '@ckeditor/ckeditor5-media-embed@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-undo': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-undo': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-mention@46.0.2(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)': + '@ckeditor/ckeditor5-mention@47.1.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color - '@ckeditor/ckeditor5-merge-fields@46.0.2': + '@ckeditor/ckeditor5-merge-fields@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-image': 46.0.2 - '@ckeditor/ckeditor5-mention': 46.0.2(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d) - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-image': 47.1.0 + '@ckeditor/ckeditor5-mention': 47.1.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d) + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color - '@ckeditor/ckeditor5-minimap@46.0.2': + '@ckeditor/ckeditor5-minimap@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color - '@ckeditor/ckeditor5-operations-compressor@46.0.2': + '@ckeditor/ckeditor5-operations-compressor@47.1.0': dependencies: - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 protobufjs: 7.5.0 - '@ckeditor/ckeditor5-package-tools@4.0.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(bufferutil@4.0.9)(esbuild@0.25.9)(utf-8-validate@6.0.5)': + '@ckeditor/ckeditor5-package-tools@4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(bufferutil@4.0.9)(esbuild@0.25.11)(utf-8-validate@6.0.5)': dependencies: - '@ckeditor/ckeditor5-dev-translations': 50.3.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - '@ckeditor/ckeditor5-dev-utils': 50.3.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + '@ckeditor/ckeditor5-dev-translations': 53.2.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + '@ckeditor/ckeditor5-dev-utils': 53.2.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) buffer: 6.0.3 - chalk: 5.4.1 - css-loader: 5.2.7(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - fs-extra: 11.3.1 - glob: 7.2.3 + chalk: 5.6.2 + css-loader: 5.2.7(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + fs-extra: 11.3.2 + glob: 11.0.3 minimist: 1.2.8 postcss: 8.5.6 - postcss-loader: 4.3.0(postcss@8.5.6)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + postcss-loader: 4.3.0(postcss@8.5.6)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) process: 0.11.10 - raw-loader: 4.0.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - style-loader: 2.0.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - stylelint: 16.23.1(typescript@5.0.4) - stylelint-config-ckeditor5: 2.0.1(stylelint@16.23.1(typescript@5.9.2)) - terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - ts-loader: 9.5.2(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) - ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.0.4) + raw-loader: 4.0.2(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + style-loader: 2.0.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + stylelint: 16.25.0(typescript@5.0.4) + stylelint-config-ckeditor5: 2.0.1(stylelint@16.25.0(typescript@5.9.3)) + terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + ts-loader: 9.5.4(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.0.4) typescript: 5.0.4 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) - webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + upath: 2.0.1 + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) + webpack-dev-server: 5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) transitivePeerDependencies: - '@rspack/core' - '@swc/core' @@ -17613,256 +15758,261 @@ snapshots: - utf-8-validate - webpack-cli - '@ckeditor/ckeditor5-page-break@46.0.2': + '@ckeditor/ckeditor5-page-break@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-pagination@46.0.2': + '@ckeditor/ckeditor5-pagination@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-theme-lark': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - '@ckeditor/ckeditor5-paragraph@46.0.2': + '@ckeditor/ckeditor5-paragraph@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 - '@ckeditor/ckeditor5-paste-from-office-enhanced@46.0.2': + '@ckeditor/ckeditor5-paste-from-office-enhanced@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-paste-from-office': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-paste-from-office': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-paste-from-office@46.0.2': + '@ckeditor/ckeditor5-paste-from-office@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-real-time-collaboration@46.0.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)': + '@ckeditor/ckeditor5-real-time-collaboration@47.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: - '@ckeditor/ckeditor-cloud-services-collaboration': 53.0.0(@ckeditor/ckeditor5-utils@46.0.2)(bufferutil@4.0.9)(ckeditor5@46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5) - '@ckeditor/ckeditor5-cloud-services': 46.0.2 - '@ckeditor/ckeditor5-comments': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-editor-multi-root': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-operations-compressor': 46.0.2 - '@ckeditor/ckeditor5-revision-history': 46.0.2 - '@ckeditor/ckeditor5-theme-lark': 46.0.2 - '@ckeditor/ckeditor5-track-changes': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - ckeditor5-collaboration: 46.0.2 + '@ckeditor/ckeditor-cloud-services-collaboration': 53.0.1(@ckeditor/ckeditor5-utils@47.1.0)(bufferutil@4.0.9)(ckeditor5@47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5) + '@ckeditor/ckeditor5-cloud-services': 47.1.0 + '@ckeditor/ckeditor5-comments': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-editor-multi-root': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-operations-compressor': 47.1.0 + '@ckeditor/ckeditor5-revision-history': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-track-changes': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5-collaboration: 47.1.0 es-toolkit: 1.39.5 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@ckeditor/ckeditor5-remove-format@46.0.2': + '@ckeditor/ckeditor5-remove-format@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-restricted-editing@46.0.2': + '@ckeditor/ckeditor5-restricted-editing@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-revision-history@46.0.2': + '@ckeditor/ckeditor5-revision-history@47.1.0': dependencies: - '@ckeditor/ckeditor5-autosave': 46.0.2 - '@ckeditor/ckeditor5-comments': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-editor-classic': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-autosave': 47.1.0 + '@ckeditor/ckeditor5-collaboration-core': 47.1.0 + '@ckeditor/ckeditor5-comments': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-editor-classic': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 '@types/luxon': 3.6.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - ckeditor5-collaboration: 46.0.2 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5-collaboration: 47.1.0 es-toolkit: 1.39.5 luxon: 3.6.1 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-select-all@46.0.2': + '@ckeditor/ckeditor5-select-all@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 - '@ckeditor/ckeditor5-show-blocks@46.0.2': + '@ckeditor/ckeditor5-show-blocks@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color - '@ckeditor/ckeditor5-slash-command@46.0.2': + '@ckeditor/ckeditor5-slash-command@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-heading': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-mention': 46.0.2(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d) - '@ckeditor/ckeditor5-style': 46.0.2 - '@ckeditor/ckeditor5-template': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-heading': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-mention': 47.1.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d) + '@ckeditor/ckeditor5-style': 47.1.0 + '@ckeditor/ckeditor5-template': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color - '@ckeditor/ckeditor5-source-editing-enhanced@46.0.2': + '@ckeditor/ckeditor5-source-editing-enhanced@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-theme-lark': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 '@codemirror/autocomplete': 6.18.6 '@codemirror/commands': 6.8.1 - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.11 '@codemirror/lang-markdown': 6.3.2 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 '@codemirror/theme-one-dark': 6.1.2 - '@codemirror/view': 6.38.1 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@codemirror/view': 6.38.6 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-source-editing@46.0.2': + '@ckeditor/ckeditor5-source-editing@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-theme-lark': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-special-characters@46.0.2': + '@ckeditor/ckeditor5-special-characters@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-style@46.0.2': + '@ckeditor/ckeditor5-style@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-html-support': 46.0.2 - '@ckeditor/ckeditor5-list': 46.0.2 - '@ckeditor/ckeditor5-table': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-html-support': 47.1.0 + '@ckeditor/ckeditor5-list': 47.1.0 + '@ckeditor/ckeditor5-table': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-table@46.0.2': + '@ckeditor/ckeditor5-table@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-template@46.0.2': + '@ckeditor/ckeditor5-template@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - '@ckeditor/ckeditor5-theme-lark@46.0.2': + '@ckeditor/ckeditor5-theme-lark@47.1.0': dependencies: - '@ckeditor/ckeditor5-ui': 46.0.2 + '@ckeditor/ckeditor5-ui': 47.1.0 - '@ckeditor/ckeditor5-track-changes@46.0.2': + '@ckeditor/ckeditor5-track-changes@47.1.0': dependencies: - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-code-block': 46.0.2(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95) - '@ckeditor/ckeditor5-comments': 46.0.2 - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-editor-multi-root': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-find-and-replace': 46.0.2 - '@ckeditor/ckeditor5-font': 46.0.2 - '@ckeditor/ckeditor5-heading': 46.0.2 - '@ckeditor/ckeditor5-highlight': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-image': 46.0.2 - '@ckeditor/ckeditor5-link': 46.0.2 - '@ckeditor/ckeditor5-list': 46.0.2 - '@ckeditor/ckeditor5-media-embed': 46.0.2 - '@ckeditor/ckeditor5-merge-fields': 46.0.2 - '@ckeditor/ckeditor5-restricted-editing': 46.0.2 - '@ckeditor/ckeditor5-style': 46.0.2 - '@ckeditor/ckeditor5-table': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - ckeditor5-collaboration: 46.0.2 + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-code-block': 47.1.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95) + '@ckeditor/ckeditor5-comments': 47.1.0 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-editor-multi-root': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-find-and-replace': 47.1.0 + '@ckeditor/ckeditor5-font': 47.1.0 + '@ckeditor/ckeditor5-heading': 47.1.0 + '@ckeditor/ckeditor5-highlight': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-image': 47.1.0 + '@ckeditor/ckeditor5-link': 47.1.0 + '@ckeditor/ckeditor5-list': 47.1.0 + '@ckeditor/ckeditor5-media-embed': 47.1.0 + '@ckeditor/ckeditor5-merge-fields': 47.1.0 + '@ckeditor/ckeditor5-restricted-editing': 47.1.0 + '@ckeditor/ckeditor5-style': 47.1.0 + '@ckeditor/ckeditor5-table': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5-collaboration: 47.1.0 es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-typing@46.0.2': + '@ckeditor/ckeditor5-typing@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 es-toolkit: 1.39.5 - '@ckeditor/ckeditor5-ui@46.0.2': + '@ckeditor/ckeditor5-ui@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-editor-multi-root': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-editor-multi-root': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 '@types/color-convert': 2.0.4 color-convert: 3.1.0 color-parse: 2.0.2 @@ -17871,83 +16021,92 @@ snapshots: transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-undo@46.0.2': + '@ckeditor/ckeditor5-undo@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 - '@ckeditor/ckeditor5-upload@46.0.2': + '@ckeditor/ckeditor5-upload@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 - '@ckeditor/ckeditor5-uploadcare@46.0.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)': + '@ckeditor/ckeditor5-uploadcare@47.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-image': 46.0.2 - '@ckeditor/ckeditor5-theme-lark': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-upload': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@uploadcare/file-uploader': 1.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-image': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-upload': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@uploadcare/file-uploader': 1.19.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) '@uploadcare/upload-client': 6.14.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - bufferutil - utf-8-validate - '@ckeditor/ckeditor5-utils@46.0.2': + '@ckeditor/ckeditor5-utils@47.1.0': dependencies: - '@ckeditor/ckeditor5-ui': 46.0.2 + '@ckeditor/ckeditor5-ui': 47.1.0 es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-watchdog@46.0.2': + '@ckeditor/ckeditor5-watchdog@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-editor-multi-root': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-editor-multi-root': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 es-toolkit: 1.39.5 transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-widget@46.0.2': + '@ckeditor/ckeditor5-widget@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 es-toolkit: 1.39.5 - '@ckeditor/ckeditor5-word-count@46.0.2': + '@ckeditor/ckeditor5-word-count@47.1.0': dependencies: - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@codemirror/autocomplete@6.18.6': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@codemirror/commands@6.8.1': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 + '@lezer/common': 1.2.3 + + '@codemirror/commands@6.9.0': + dependencies: + '@codemirror/language': 6.11.0 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@codemirror/lang-css@6.3.1': @@ -17958,17 +16117,17 @@ snapshots: '@lezer/common': 1.2.3 '@lezer/css': 1.1.11 - '@codemirror/lang-html@6.4.9': + '@codemirror/lang-html@6.4.11': dependencies: '@codemirror/autocomplete': 6.18.6 '@codemirror/lang-css': 6.3.1 '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@lezer/css': 1.1.11 - '@lezer/html': 1.3.10 + '@lezer/html': 1.3.12 '@codemirror/lang-javascript@6.2.4': dependencies: @@ -17976,7 +16135,7 @@ snapshots: '@codemirror/language': 6.11.0 '@codemirror/lint': 6.8.5 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@lezer/javascript': 1.5.1 @@ -17988,26 +16147,26 @@ snapshots: '@codemirror/lang-markdown@6.3.2': dependencies: '@codemirror/autocomplete': 6.18.6 - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@lezer/markdown': 1.4.3 - '@codemirror/lang-markdown@6.3.4': + '@codemirror/lang-markdown@6.4.0': dependencies: '@codemirror/autocomplete': 6.18.6 - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@lezer/markdown': 1.4.3 '@codemirror/lang-php@6.0.2': dependencies: - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 '@lezer/common': 1.2.3 @@ -18015,7 +16174,7 @@ snapshots: '@codemirror/lang-vue@0.1.3': dependencies: - '@codemirror/lang-html': 6.4.9 + '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.0 '@lezer/common': 1.2.3 @@ -18027,33 +16186,33 @@ snapshots: '@codemirror/autocomplete': 6.18.6 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@lezer/xml': 1.0.6 '@codemirror/language@6.11.0': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 style-mod: 4.1.2 - '@codemirror/legacy-modes@6.5.1': + '@codemirror/legacy-modes@6.5.2': dependencies: '@codemirror/language': 6.11.0 '@codemirror/lint@6.8.5': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 crelt: 1.0.6 '@codemirror/search@6.5.11': dependencies: '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 crelt: 1.0.6 '@codemirror/state@6.5.2': @@ -18064,33 +16223,38 @@ snapshots: dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@codemirror/view@6.38.1': + '@codemirror/view@6.38.6': dependencies: '@codemirror/state': 6.5.2 crelt: 1.0.6 style-mod: 4.1.2 w3c-keyname: 2.2.8 + '@colors/colors@1.5.0': {} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/color-helpers@5.0.2': {} + '@csstools/color-helpers@5.1.0': + optional: true - '@csstools/css-calc@2.1.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 + optional: true - '@csstools/css-color-parser@3.0.9(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/color-helpers': 5.0.2 - '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 + optional: true '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: @@ -18124,64 +16288,72 @@ snapshots: dependencies: '@digitak/grubber': 3.1.4 chokidar: 3.6.0 - esbuild: 0.25.9 + esbuild: 0.25.11 '@digitak/grubber@3.1.4': {} - '@dual-bundle/import-meta-resolve@4.1.0': {} + '@dual-bundle/import-meta-resolve@4.2.1': {} - '@electron-forge/cli@7.8.3(encoding@0.1.13)': + '@electron-forge/cli@7.10.2(encoding@0.1.13)(esbuild@0.25.11)': dependencies: - '@electron-forge/core': 7.8.3(encoding@0.1.13) - '@electron-forge/core-utils': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/core': 7.10.2(encoding@0.1.13)(esbuild@0.25.11) + '@electron-forge/core-utils': 7.10.2 + '@electron-forge/shared-types': 7.10.2 '@electron/get': 3.1.0 + '@inquirer/prompts': 6.0.1 + '@listr2/prompt-adapter-inquirer': 2.0.22(@inquirer/prompts@6.0.1) chalk: 4.1.2 commander: 11.1.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fs-extra: 10.1.0 listr2: 7.0.2 log-symbols: 4.1.0 semver: 7.7.2 transitivePeerDependencies: + - '@swc/core' - bluebird - encoding + - esbuild - supports-color + - uglify-js + - webpack-cli - '@electron-forge/core-utils@7.8.3': + '@electron-forge/core-utils@7.10.2': dependencies: - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/shared-types': 7.10.2 '@electron/rebuild': 3.7.2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) find-up: 5.0.0 fs-extra: 10.1.0 log-symbols: 4.1.0 + parse-author: 2.0.0 semver: 7.7.2 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/core@7.8.3(encoding@0.1.13)': + '@electron-forge/core@7.10.2(encoding@0.1.13)(esbuild@0.25.11)': dependencies: - '@electron-forge/core-utils': 7.8.3 - '@electron-forge/maker-base': 7.8.3 - '@electron-forge/plugin-base': 7.8.3 - '@electron-forge/publisher-base': 7.8.3 - '@electron-forge/shared-types': 7.8.3 - '@electron-forge/template-base': 7.8.3 - '@electron-forge/template-vite': 7.8.3 - '@electron-forge/template-vite-typescript': 7.8.3 - '@electron-forge/template-webpack': 7.8.3 - '@electron-forge/template-webpack-typescript': 7.8.3 - '@electron-forge/tracer': 7.8.3 + '@electron-forge/core-utils': 7.10.2 + '@electron-forge/maker-base': 7.10.2 + '@electron-forge/plugin-base': 7.10.2 + '@electron-forge/publisher-base': 7.10.2 + '@electron-forge/shared-types': 7.10.2 + '@electron-forge/template-base': 7.10.2 + '@electron-forge/template-vite': 7.10.2 + '@electron-forge/template-vite-typescript': 7.10.2 + '@electron-forge/template-webpack': 7.10.2 + '@electron-forge/template-webpack-typescript': 7.10.2(esbuild@0.25.11) + '@electron-forge/tracer': 7.10.2 '@electron/get': 3.1.0 '@electron/packager': 18.3.6 '@electron/rebuild': 3.7.2 '@malept/cross-spawn-promise': 2.0.0 + '@vscode/sudo-prompt': 9.3.1 chalk: 4.1.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fast-glob: 3.3.3 filenamify: 4.3.0 find-up: 5.0.0 @@ -18189,7 +16361,7 @@ snapshots: global-dirs: 3.0.1 got: 11.8.6 interpret: 3.1.1 - jiti: 2.5.1 + jiti: 2.6.1 listr2: 7.0.2 lodash: 4.17.21 log-symbols: 4.1.0 @@ -18197,36 +16369,39 @@ snapshots: rechoir: 0.8.0 semver: 7.7.2 source-map-support: 0.5.21 - sudo-prompt: 9.2.1 username: 5.1.0 transitivePeerDependencies: + - '@swc/core' - bluebird - encoding + - esbuild - supports-color + - uglify-js + - webpack-cli - '@electron-forge/maker-base@7.8.3': + '@electron-forge/maker-base@7.10.2': dependencies: - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/shared-types': 7.10.2 fs-extra: 10.1.0 which: 2.0.2 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/maker-deb@7.8.3': + '@electron-forge/maker-deb@7.10.2': dependencies: - '@electron-forge/maker-base': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/maker-base': 7.10.2 + '@electron-forge/shared-types': 7.10.2 optionalDependencies: electron-installer-debian: 3.2.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/maker-dmg@7.8.3': + '@electron-forge/maker-dmg@7.10.2': dependencies: - '@electron-forge/maker-base': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/maker-base': 7.10.2 + '@electron-forge/shared-types': 7.10.2 fs-extra: 10.1.0 optionalDependencies: electron-installer-dmg: 5.0.1 @@ -18234,10 +16409,10 @@ snapshots: - bluebird - supports-color - '@electron-forge/maker-flatpak@7.8.3': + '@electron-forge/maker-flatpak@7.10.2': dependencies: - '@electron-forge/maker-base': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/maker-base': 7.10.2 + '@electron-forge/shared-types': 7.10.2 fs-extra: 10.1.0 optionalDependencies: '@malept/electron-installer-flatpak': 0.11.4 @@ -18245,20 +16420,20 @@ snapshots: - bluebird - supports-color - '@electron-forge/maker-rpm@7.8.3': + '@electron-forge/maker-rpm@7.10.2': dependencies: - '@electron-forge/maker-base': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/maker-base': 7.10.2 + '@electron-forge/shared-types': 7.10.2 optionalDependencies: electron-installer-redhat: 3.4.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/maker-squirrel@7.8.3': + '@electron-forge/maker-squirrel@7.10.2': dependencies: - '@electron-forge/maker-base': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/maker-base': 7.10.2 + '@electron-forge/shared-types': 7.10.2 fs-extra: 10.1.0 optionalDependencies: electron-winstaller: 5.4.0 @@ -18266,10 +16441,10 @@ snapshots: - bluebird - supports-color - '@electron-forge/maker-zip@7.8.3': + '@electron-forge/maker-zip@7.10.2': dependencies: - '@electron-forge/maker-base': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/maker-base': 7.10.2 + '@electron-forge/shared-types': 7.10.2 cross-zip: 4.0.1 fs-extra: 10.1.0 got: 11.8.6 @@ -18277,31 +16452,31 @@ snapshots: - bluebird - supports-color - '@electron-forge/plugin-auto-unpack-natives@7.8.3': + '@electron-forge/plugin-auto-unpack-natives@7.10.2': dependencies: - '@electron-forge/plugin-base': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/plugin-base': 7.10.2 + '@electron-forge/shared-types': 7.10.2 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/plugin-base@7.8.3': + '@electron-forge/plugin-base@7.10.2': dependencies: - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/shared-types': 7.10.2 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/publisher-base@7.8.3': + '@electron-forge/publisher-base@7.10.2': dependencies: - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/shared-types': 7.10.2 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/shared-types@7.8.3': + '@electron-forge/shared-types@7.10.2': dependencies: - '@electron-forge/tracer': 7.8.3 + '@electron-forge/tracer': 7.10.2 '@electron/packager': 18.3.6 '@electron/rebuild': 3.7.2 listr2: 7.0.2 @@ -18309,55 +16484,62 @@ snapshots: - bluebird - supports-color - '@electron-forge/template-base@7.8.3': + '@electron-forge/template-base@7.10.2': dependencies: - '@electron-forge/core-utils': 7.8.3 - '@electron-forge/shared-types': 7.8.3 + '@electron-forge/core-utils': 7.10.2 + '@electron-forge/shared-types': 7.10.2 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fs-extra: 10.1.0 + semver: 7.7.2 username: 5.1.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/template-vite-typescript@7.8.3': + '@electron-forge/template-vite-typescript@7.10.2': dependencies: - '@electron-forge/shared-types': 7.8.3 - '@electron-forge/template-base': 7.8.3 + '@electron-forge/shared-types': 7.10.2 + '@electron-forge/template-base': 7.10.2 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/template-vite@7.8.3': + '@electron-forge/template-vite@7.10.2': dependencies: - '@electron-forge/shared-types': 7.8.3 - '@electron-forge/template-base': 7.8.3 + '@electron-forge/shared-types': 7.10.2 + '@electron-forge/template-base': 7.10.2 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/template-webpack-typescript@7.8.3': + '@electron-forge/template-webpack-typescript@7.10.2(esbuild@0.25.11)': dependencies: - '@electron-forge/shared-types': 7.8.3 - '@electron-forge/template-base': 7.8.3 + '@electron-forge/shared-types': 7.10.2 + '@electron-forge/template-base': 7.10.2 + fs-extra: 10.1.0 + typescript: 5.4.5 + webpack: 5.101.3(esbuild@0.25.11) + transitivePeerDependencies: + - '@swc/core' + - bluebird + - esbuild + - supports-color + - uglify-js + - webpack-cli + + '@electron-forge/template-webpack@7.10.2': + dependencies: + '@electron-forge/shared-types': 7.10.2 + '@electron-forge/template-base': 7.10.2 fs-extra: 10.1.0 transitivePeerDependencies: - bluebird - supports-color - '@electron-forge/template-webpack@7.8.3': - dependencies: - '@electron-forge/shared-types': 7.8.3 - '@electron-forge/template-base': 7.8.3 - fs-extra: 10.1.0 - transitivePeerDependencies: - - bluebird - - supports-color - - '@electron-forge/tracer@7.8.3': + '@electron-forge/tracer@7.10.2': dependencies: chrome-trace-event: 1.0.4 @@ -18369,7 +16551,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -18383,7 +16565,7 @@ snapshots: '@electron/get@3.1.0': dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -18398,13 +16580,13 @@ snapshots: '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': dependencies: env-paths: 2.2.1 - exponential-backoff: 3.1.2 + exponential-backoff: 3.1.3 glob: 8.1.0 graceful-fs: 4.2.11 make-fetch-happen: 10.2.1 nopt: 6.0.0 proc-log: 2.0.1 - semver: 7.7.2 + semver: 7.7.3 tar: 6.2.1 which: 2.0.2 transitivePeerDependencies: @@ -18413,7 +16595,7 @@ snapshots: '@electron/notarize@2.5.0': dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: @@ -18422,7 +16604,7 @@ snapshots: '@electron/osx-sign@1.3.3': dependencies: compare-version: 0.1.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -18438,10 +16620,10 @@ snapshots: '@electron/osx-sign': 1.3.3 '@electron/universal': 2.0.2 '@electron/windows-sign': 1.2.1 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) extract-zip: 2.0.1 filenamify: 4.3.0 - fs-extra: 11.3.1 + fs-extra: 11.3.2 galactus: 1.0.0 get-package-info: 1.0.0 junk: 3.1.0 @@ -18459,11 +16641,11 @@ snapshots: '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.4.1(supports-color@6.0.0) - detect-libc: 2.0.4 + debug: 4.4.3(supports-color@6.0.0) + detect-libc: 2.1.1 fs-extra: 10.1.0 got: 11.8.6 - node-abi: 3.75.0 + node-abi: 4.14.0 node-api-version: 0.2.1 ora: 5.4.1 read-binary-file-arch: 1.0.6 @@ -18478,11 +16660,11 @@ snapshots: dependencies: '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) detect-libc: 2.0.4 got: 11.8.6 graceful-fs: 4.2.11 - node-abi: 4.9.0 + node-abi: 4.14.0 node-api-version: 0.2.1 node-gyp: 11.2.0 ora: 5.4.1 @@ -18493,17 +16675,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/remote@2.1.3(electron@37.4.0)': + '@electron/remote@2.1.3(electron@38.3.0)': dependencies: - electron: 37.4.0 + electron: 38.3.0 '@electron/universal@2.0.2': dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) dir-compare: 4.2.0 - fs-extra: 11.3.1 + fs-extra: 11.3.2 minimatch: 9.0.5 plist: 3.1.0 transitivePeerDependencies: @@ -18512,134 +16694,213 @@ snapshots: '@electron/windows-sign@1.2.1': dependencies: cross-dirname: 0.1.0 - debug: 4.4.1(supports-color@6.0.0) - fs-extra: 11.3.1 + debug: 4.4.3(supports-color@6.0.0) + fs-extra: 11.3.2 minimist: 1.2.8 postject: 1.0.0-alpha.6 transitivePeerDependencies: - supports-color - '@emnapi/core@1.4.5': + '@emnapi/core@1.5.0': dependencies: - '@emnapi/wasi-threads': 1.0.4 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 + optional: true - '@emnapi/runtime@1.4.5': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 + optional: true - '@emnapi/wasi-threads@1.0.4': + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 + optional: true '@epic-web/invariant@1.0.0': {} '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/types': 8.46.1 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 - '@esbuild/aix-ppc64@0.25.9': + '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.9': + '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/android-arm@0.25.9': + '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-x64@0.25.9': + '@esbuild/android-arm64@0.25.11': optional: true - '@esbuild/darwin-arm64@0.25.9': + '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.9': + '@esbuild/android-arm@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.9': + '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.9': + '@esbuild/android-x64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.9': + '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/linux-arm@0.25.9': + '@esbuild/darwin-arm64@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.9': + '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.9': + '@esbuild/darwin-x64@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.9': + '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.9': + '@esbuild/freebsd-arm64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.9': + '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/linux-s390x@0.25.9': + '@esbuild/freebsd-x64@0.25.11': optional: true - '@esbuild/linux-x64@0.25.9': + '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.9': + '@esbuild/linux-arm64@0.25.11': optional: true - '@esbuild/netbsd-x64@0.25.9': + '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.9': + '@esbuild/linux-arm@0.25.11': optional: true - '@esbuild/openbsd-x64@0.25.9': + '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/openharmony-arm64@0.25.9': + '@esbuild/linux-ia32@0.25.11': optional: true - '@esbuild/sunos-x64@0.25.9': + '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/win32-arm64@0.25.9': + '@esbuild/linux-loong64@0.25.11': optional: true - '@esbuild/win32-ia32@0.25.9': + '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/win32-x64@0.25.9': + '@esbuild/linux-mips64el@0.25.11': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.34.0(jiti@2.5.1))': + '@esbuild/linux-ppc64@0.25.10': + optional: true + + '@esbuild/linux-ppc64@0.25.11': + optional: true + + '@esbuild/linux-riscv64@0.25.10': + optional: true + + '@esbuild/linux-riscv64@0.25.11': + optional: true + + '@esbuild/linux-s390x@0.25.10': + optional: true + + '@esbuild/linux-s390x@0.25.11': + optional: true + + '@esbuild/linux-x64@0.25.10': + optional: true + + '@esbuild/linux-x64@0.25.11': + optional: true + + '@esbuild/netbsd-arm64@0.25.10': + optional: true + + '@esbuild/netbsd-arm64@0.25.11': + optional: true + + '@esbuild/netbsd-x64@0.25.10': + optional: true + + '@esbuild/netbsd-x64@0.25.11': + optional: true + + '@esbuild/openbsd-arm64@0.25.10': + optional: true + + '@esbuild/openbsd-arm64@0.25.11': + optional: true + + '@esbuild/openbsd-x64@0.25.10': + optional: true + + '@esbuild/openbsd-x64@0.25.11': + optional: true + + '@esbuild/openharmony-arm64@0.25.10': + optional: true + + '@esbuild/openharmony-arm64@0.25.11': + optional: true + + '@esbuild/sunos-x64@0.25.10': + optional: true + + '@esbuild/sunos-x64@0.25.11': + optional: true + + '@esbuild/win32-arm64@0.25.10': + optional: true + + '@esbuild/win32-arm64@0.25.11': + optional: true + + '@esbuild/win32-ia32@0.25.10': + optional: true + + '@esbuild/win32-ia32@0.25.11': + optional: true + + '@esbuild/win32-x64@0.25.10': + optional: true + + '@esbuild/win32-x64@0.25.11': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': dependencies: - eslint: 9.34.0(jiti@2.5.1) + eslint: 9.38.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.3.2(eslint@9.34.0(jiti@2.5.1))': - optionalDependencies: - eslint: 9.34.0(jiti@2.5.1) - - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@6.0.0) + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@6.0.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.1': {} + '@eslint/config-helpers@0.4.1': + dependencies: + '@eslint/core': 0.16.0 '@eslint/core@0.14.0': dependencies: @@ -18649,10 +16910,14 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/core@0.16.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 @@ -18663,7 +16928,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.34.0': {} + '@eslint/js@9.38.0': {} '@eslint/markdown@6.6.0': dependencies: @@ -18678,13 +16943,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} '@eslint/plugin-kit@0.3.5': dependencies: '@eslint/core': 0.15.2 levn: 0.4.1 + '@eslint/plugin-kit@0.4.0': + dependencies: + '@eslint/core': 0.16.0 + levn: 0.4.1 + '@excalidraw/excalidraw@0.18.0(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: '@braintree/sanitize-url': 6.0.2 @@ -18733,7 +17003,7 @@ snapshots: '@excalidraw/mermaid-to-excalidraw@1.1.2': dependencies: '@excalidraw/markdown-to-text': 0.1.2 - mermaid: 11.10.1 + mermaid: 11.12.0 nanoid: 5.1.5 transitivePeerDependencies: - supports-color @@ -18742,6 +17012,15 @@ snapshots: '@exercism/highlightjs-gdscript@0.0.1': {} + '@fast-csv/parse@5.0.5': + dependencies: + lodash.escaperegexp: 4.1.2 + lodash.groupby: 4.6.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + lodash.isundefined: 3.0.1 + lodash.uniq: 4.5.0 + '@file-type/xml@0.4.3': dependencies: sax: 1.4.1 @@ -18764,177 +17043,177 @@ snapshots: '@floating-ui/utils@0.2.9': {} - '@fsegurai/codemirror-theme-abcdef@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-abcdef@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-abyss@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-abyss@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-android-studio@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-android-studio@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-andromeda@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-andromeda@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-basic-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-basic-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-basic-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-basic-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-cobalt2@6.0.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-cobalt2@6.0.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-forest@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-forest@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-github-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-github-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-github-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-github-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-gruvbox-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-gruvbox-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-gruvbox-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-gruvbox-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-material-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-material-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-material-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-material-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-monokai@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-monokai@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-nord@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-nord@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-palenight@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-palenight@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-solarized-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-solarized-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-solarized-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-solarized-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-tokyo-night-day@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-tokyo-night-day@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-volcano@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-volcano@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-vscode-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-vscode-dark@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 - '@fsegurai/codemirror-theme-vscode-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/highlight@1.2.1)': + '@fsegurai/codemirror-theme-vscode-light@6.2.2(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/highlight@1.2.1)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/highlight': 1.2.1 '@fullcalendar/core@6.1.19': dependencies: - preact: 10.27.1 + preact: 10.27.2 '@fullcalendar/daygrid@6.1.19(@fullcalendar/core@6.1.19)': dependencies: @@ -18968,25 +17247,23 @@ snapshots: '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} '@iconify/types@2.0.0': {} - '@iconify/utils@2.3.0': + '@iconify/utils@3.0.1': dependencies: - '@antfu/install-pkg': 1.0.0 - '@antfu/utils': 8.1.1 + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.2.0 '@iconify/types': 2.0.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) globals: 15.15.0 kolorist: 1.8.0 local-pkg: 1.1.1 @@ -18994,60 +17271,137 @@ snapshots: transitivePeerDependencies: - supports-color - '@inlang/paraglide-js@2.2.0(babel-plugin-macros@3.1.0)': - dependencies: - '@inlang/recommend-sherlock': 0.2.1 - '@inlang/sdk': 2.4.9(babel-plugin-macros@3.1.0) - commander: 11.1.0 - consola: 3.4.0 - json5: 2.2.3 - unplugin: 2.3.5 - urlpattern-polyfill: 10.1.0 - transitivePeerDependencies: - - babel-plugin-macros - - '@inlang/recommend-sherlock@0.2.1': - dependencies: - comment-json: 4.2.5 - - '@inlang/sdk@2.4.9(babel-plugin-macros@3.1.0)': - dependencies: - '@lix-js/sdk': 0.4.7(babel-plugin-macros@3.1.0) - '@sinclair/typebox': 0.31.28 - kysely: 0.27.6 - sqlite-wasm-kysely: 0.3.0(kysely@0.27.6) - uuid: 10.0.0 - transitivePeerDependencies: - - babel-plugin-macros - - '@inquirer/confirm@5.1.16(@types/node@22.18.0)': - dependencies: - '@inquirer/core': 10.2.0(@types/node@22.18.0) - '@inquirer/type': 3.0.8(@types/node@22.18.0) - optionalDependencies: - '@types/node': 22.18.0 + '@inquirer/ansi@1.0.1': optional: true - '@inquirer/core@10.2.0(@types/node@22.18.0)': + '@inquirer/checkbox@3.0.1': dependencies: + '@inquirer/core': 9.2.1 '@inquirer/figures': 1.0.13 - '@inquirer/type': 3.0.8(@types/node@22.18.0) + '@inquirer/type': 2.0.0 ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.3 + + '@inquirer/confirm@4.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/confirm@5.1.19(@types/node@22.18.12)': + dependencies: + '@inquirer/core': 10.3.0(@types/node@22.18.12) + '@inquirer/type': 3.0.9(@types/node@22.18.12) + optionalDependencies: + '@types/node': 22.18.12 + optional: true + + '@inquirer/core@10.3.0(@types/node@22.18.12)': + dependencies: + '@inquirer/ansi': 1.0.1 + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@22.18.12) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 optional: true - '@inquirer/figures@1.0.13': + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.13 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.18.12 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/editor@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + external-editor: 3.1.0 + + '@inquirer/expand@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/figures@1.0.13': {} + + '@inquirer/figures@1.0.14': optional: true - '@inquirer/type@3.0.8(@types/node@22.18.0)': + '@inquirer/input@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/number@2.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + + '@inquirer/password@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@6.0.1': + dependencies: + '@inquirer/checkbox': 3.0.1 + '@inquirer/confirm': 4.0.1 + '@inquirer/editor': 3.0.1 + '@inquirer/expand': 3.0.1 + '@inquirer/input': 3.0.1 + '@inquirer/number': 2.0.1 + '@inquirer/password': 3.0.1 + '@inquirer/rawlist': 3.0.1 + '@inquirer/search': 2.0.1 + '@inquirer/select': 3.0.1 + + '@inquirer/rawlist@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/search@2.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 2.0.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/select@3.0.1': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 2.0.0 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.3 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@3.0.9(@types/node@22.18.12)': optionalDependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 optional: true '@isaacs/balanced-match@4.0.1': {} @@ -19060,7 +17414,7 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -19069,159 +17423,8 @@ snapshots: dependencies: minipass: 7.1.2 - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - '@istanbuljs/schema@0.1.3': {} - '@jest/console@30.0.5': - dependencies: - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - chalk: 4.1.2 - jest-message-util: 30.0.5 - jest-util: 30.0.5 - slash: 3.0.0 - - '@jest/diff-sequences@30.0.1': {} - - '@jest/environment@30.0.5': - dependencies: - '@jest/fake-timers': 30.0.5 - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - jest-mock: 30.0.5 - - '@jest/expect-utils@30.0.5': - dependencies: - '@jest/get-type': 30.0.1 - - '@jest/expect@30.0.5': - dependencies: - expect: 30.0.5 - jest-snapshot: 30.0.5 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@30.0.5': - dependencies: - '@jest/types': 30.0.5 - '@sinonjs/fake-timers': 13.0.5 - '@types/node': 22.18.0 - jest-message-util: 30.0.5 - jest-mock: 30.0.5 - jest-util: 30.0.5 - - '@jest/get-type@30.0.1': {} - - '@jest/globals@30.0.5': - dependencies: - '@jest/environment': 30.0.5 - '@jest/expect': 30.0.5 - '@jest/types': 30.0.5 - jest-mock: 30.0.5 - transitivePeerDependencies: - - supports-color - - '@jest/pattern@30.0.1': - dependencies: - '@types/node': 22.18.0 - jest-regex-util: 30.0.1 - - '@jest/reporters@30.0.5': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.0.5 - '@jest/test-result': 30.0.5 - '@jest/transform': 30.0.5 - '@jest/types': 30.0.5 - '@jridgewell/trace-mapping': 0.3.29 - '@types/node': 22.18.0 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit-x: 0.2.2 - glob: 10.4.5 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - jest-message-util: 30.0.5 - jest-util: 30.0.5 - jest-worker: 30.0.5 - slash: 3.0.0 - string-length: 4.0.2 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@30.0.5': - dependencies: - '@sinclair/typebox': 0.34.38 - - '@jest/snapshot-utils@30.0.5': - dependencies: - '@jest/types': 30.0.5 - chalk: 4.1.2 - graceful-fs: 4.2.11 - natural-compare: 1.4.0 - - '@jest/source-map@30.0.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.30 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@30.0.5': - dependencies: - '@jest/console': 30.0.5 - '@jest/types': 30.0.5 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@30.0.5': - dependencies: - '@jest/test-result': 30.0.5 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.5 - slash: 3.0.0 - - '@jest/transform@30.0.5': - dependencies: - '@babel/core': 7.28.0 - '@jest/types': 30.0.5 - '@jridgewell/trace-mapping': 0.3.29 - babel-plugin-istanbul: 7.0.0 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.5 - jest-regex-util: 30.0.1 - jest-util: 30.0.5 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 5.0.1 - transitivePeerDependencies: - - supports-color - - '@jest/types@30.0.5': - dependencies: - '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.5 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.18.0 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - '@jimp/core@1.6.0': dependencies: '@jimp/file-ops': 1.6.0 @@ -19411,56 +17614,23 @@ snapshots: '@jimp/types': 1.6.0 tinycolor2: 1.6.0 - '@jridgewell/gen-mapping@0.3.12': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.29 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.10': + '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.29 - - '@jridgewell/source-map@0.3.6': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.4': {} '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jridgewell/trace-mapping@0.3.29': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 @@ -19476,23 +17646,42 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)': + '@jsonjoy.com/buffers@1.0.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@1.6.0(tslib@2.8.1)': + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 + '@jsonjoy.com/json-pack@1.14.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + '@keyv/serialize@1.1.0': {} '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -19512,7 +17701,7 @@ snapshots: dependencies: '@lezer/common': 1.2.3 - '@lezer/html@1.3.10': + '@lezer/html@1.3.12': dependencies: '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 @@ -19551,19 +17740,10 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@lix-js/sdk@0.4.7(babel-plugin-macros@3.1.0)': + '@listr2/prompt-adapter-inquirer@2.0.22(@inquirer/prompts@6.0.1)': dependencies: - '@lix-js/server-protocol-schema': 0.1.1 - dedent: 1.5.1(babel-plugin-macros@3.1.0) - human-id: 4.1.1 - js-sha256: 0.11.1 - kysely: 0.27.6 - sqlite-wasm-kysely: 0.3.0(kysely@0.27.6) - uuid: 10.0.0 - transitivePeerDependencies: - - babel-plugin-macros - - '@lix-js/server-protocol-schema@0.1.1': {} + '@inquirer/prompts': 6.0.1 + '@inquirer/type': 1.5.5 '@ljharb/resumer@0.0.1': dependencies: @@ -19585,7 +17765,7 @@ snapshots: '@malept/electron-installer-flatpak@0.11.4': dependencies: '@malept/flatpak-bundler': 0.4.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) electron-installer-common: 0.10.4 lodash: 4.17.21 semver: 7.7.2 @@ -19596,7 +17776,7 @@ snapshots: '@malept/flatpak-bundler@0.4.0': dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fs-extra: 9.1.0 lodash: 4.17.21 tmp-promise: 3.0.3 @@ -19623,9 +17803,9 @@ snapshots: '@mapbox/whoots-js@3.1.0': {} - '@maplibre/maplibre-gl-leaflet@0.1.3(@types/leaflet@1.9.20)(leaflet@1.9.4)(maplibre-gl@5.6.1)': + '@maplibre/maplibre-gl-leaflet@0.1.3(@types/leaflet@1.9.21)(leaflet@1.9.4)(maplibre-gl@5.6.1)': dependencies: - '@types/leaflet': 1.9.20 + '@types/leaflet': 1.9.21 leaflet: 1.9.4 maplibre-gl: 5.6.1 @@ -19641,33 +17821,35 @@ snapshots: '@marijn/find-cluster-break@1.0.2': {} - '@mermaid-js/layout-elk@0.1.9(mermaid@11.10.1)': + '@mdn/browser-compat-data@5.7.6': {} + + '@mermaid-js/layout-elk@0.2.0(mermaid@11.12.0)': dependencies: d3: 7.9.0 elkjs: 0.9.3 - mermaid: 11.10.1 + mermaid: 11.12.0 '@mermaid-js/parser@0.6.2': dependencies: langium: 3.3.1 - '@microsoft/api-extractor-model@7.30.6(@types/node@22.18.0)': + '@microsoft/api-extractor-model@7.30.6(@types/node@22.18.12)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@22.18.0) + '@rushstack/node-core-library': 5.13.1(@types/node@22.18.12) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.8(@types/node@22.18.0)': + '@microsoft/api-extractor@7.52.8(@types/node@22.18.12)': dependencies: - '@microsoft/api-extractor-model': 7.30.6(@types/node@22.18.0) + '@microsoft/api-extractor-model': 7.30.6(@types/node@22.18.12) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@22.18.0) + '@rushstack/node-core-library': 5.13.1(@types/node@22.18.12) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.3(@types/node@22.18.0) - '@rushstack/ts-command-line': 5.0.1(@types/node@22.18.0) + '@rushstack/terminal': 0.15.3(@types/node@22.18.12) + '@rushstack/ts-command-line': 5.0.1(@types/node@22.18.12) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -19686,9 +17868,9 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@mind-elixir/node-menu@5.0.0(mind-elixir@5.0.6)': + '@mind-elixir/node-menu@5.0.0(mind-elixir@5.3.3)': dependencies: - mind-elixir: 5.0.6 + mind-elixir: 5.3.3 '@mixmark-io/domino@2.2.0': {} @@ -19702,25 +17884,16 @@ snapshots: strict-event-emitter: 0.5.1 optional: true - '@napi-rs/wasm-runtime@0.2.12': + '@napi-rs/wasm-runtime@1.0.7': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 - '@tybys/wasm-util': 0.10.0 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@0.2.4': + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 - '@tybys/wasm-util': 0.9.0 - - '@napi-rs/wasm-runtime@1.0.3': - dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 - '@tybys/wasm-util': 0.10.0 - optional: true + eslint-scope: 5.1.1 '@noble/hashes@1.8.0': {} @@ -19746,29 +17919,39 @@ snapshots: transitivePeerDependencies: - supports-color + '@npmcli/agent@4.0.0': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 11.2.2 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.2 + semver: 7.7.3 '@npmcli/git@6.0.3': dependencies: - '@npmcli/promise-spawn': 8.0.2 + '@npmcli/promise-spawn': 8.0.3 ini: 5.0.0 lru-cache: 10.4.3 npm-pick-manifest: 10.0.0 proc-log: 5.0.0 promise-retry: 2.0.1 - semver: 7.7.2 + semver: 7.7.3 which: 5.0.0 '@npmcli/installed-package-contents@3.0.0': @@ -19788,339 +17971,33 @@ snapshots: '@npmcli/node-gyp@4.0.0': {} - '@npmcli/package-json@6.2.0': + '@npmcli/package-json@7.0.0': dependencies: '@npmcli/git': 6.0.3 - glob: 10.4.5 - hosted-git-info: 8.1.0 + glob: 11.0.3 + hosted-git-info: 9.0.0 json-parse-even-better-errors: 4.0.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-license: 3.0.4 - '@npmcli/promise-spawn@8.0.2': + '@npmcli/promise-spawn@8.0.3': dependencies: which: 5.0.0 '@npmcli/redact@3.2.2': {} - '@npmcli/run-script@9.1.0': + '@npmcli/run-script@10.0.0': dependencies: '@npmcli/node-gyp': 4.0.0 - '@npmcli/package-json': 6.2.0 - '@npmcli/promise-spawn': 8.0.2 - node-gyp: 11.2.0 + '@npmcli/package-json': 7.0.0 + '@npmcli/promise-spawn': 8.0.3 + node-gyp: 11.4.2 proc-log: 5.0.0 which: 5.0.0 transitivePeerDependencies: - supports-color - '@nx/devkit@21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))': - dependencies: - ejs: 3.1.10 - enquirer: 2.3.6 - ignore: 5.3.2 - minimatch: 9.0.3 - nx: 21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)) - semver: 7.7.2 - tmp: 0.2.5 - tslib: 2.8.1 - yargs-parser: 21.1.1 - - '@nx/esbuild@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - picocolors: 1.1.1 - tinyglobby: 0.2.14 - tsconfig-paths: 4.2.0 - tslib: 2.8.1 - optionalDependencies: - esbuild: 0.25.9 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - verdaccio - - '@nx/eslint-plugin@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint-config-prettier@10.1.8(eslint@9.34.0(jiti@2.5.1)))(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(typescript@5.9.2)': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.9.2) - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/type-utils': 8.38.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.38.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - chalk: 4.1.2 - confusing-browser-globals: 1.0.11 - globals: 15.15.0 - jsonc-eslint-parser: 2.4.0 - semver: 7.7.2 - tslib: 2.8.1 - optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.34.0(jiti@2.5.1)) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - eslint - - nx - - supports-color - - typescript - - verdaccio - - '@nx/eslint@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - eslint: 9.34.0(jiti@2.5.1) - semver: 7.7.2 - tslib: 2.8.1 - typescript: 5.8.3 - optionalDependencies: - '@zkochan/js-yaml': 0.0.7 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - verdaccio - - '@nx/express@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.34.0(jiti@2.5.1))(express@4.21.2)(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2))(typescript@5.9.2)': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/node': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2))(typescript@5.9.2) - tslib: 2.8.1 - optionalDependencies: - express: 4.21.2 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@types/node' - - '@zkochan/js-yaml' - - babel-plugin-macros - - debug - - esbuild-register - - eslint - - node-notifier - - nx - - supports-color - - ts-node - - typescript - - verdaccio - - '@nx/jest@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(babel-plugin-macros@3.1.0)(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2))(typescript@5.9.2)': - dependencies: - '@jest/reporters': 30.0.5 - '@jest/test-result': 30.0.5 - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.9.2) - identity-obj-proxy: 3.0.0 - jest-config: 30.0.5(@types/node@22.18.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2)) - jest-resolve: 30.0.5 - jest-util: 30.0.5 - minimatch: 9.0.3 - picocolors: 1.1.1 - resolve.exports: 2.0.3 - semver: 7.7.2 - tslib: 2.8.1 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@types/node' - - babel-plugin-macros - - debug - - esbuild-register - - node-notifier - - nx - - supports-color - - ts-node - - typescript - - verdaccio - - '@nx/js@21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))': - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.28.0) - '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.28.0) - '@babel/preset-env': 7.26.9(@babel/core@7.28.0) - '@babel/preset-typescript': 7.27.0(@babel/core@7.28.0) - '@babel/runtime': 7.27.6 - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/workspace': 21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)) - '@zkochan/js-yaml': 0.0.7 - babel-plugin-const-enum: 1.2.0(@babel/core@7.28.0) - babel-plugin-macros: 3.1.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0) - chalk: 4.1.2 - columnify: 1.6.0 - detect-port: 1.6.1 - enquirer: 2.3.6 - ignore: 5.3.2 - js-tokens: 4.0.0 - jsonc-parser: 3.2.0 - npm-package-arg: 11.0.1 - npm-run-path: 4.0.1 - ora: 5.3.0 - picocolors: 1.1.1 - picomatch: 4.0.2 - semver: 7.7.2 - source-map-support: 0.5.19 - tinyglobby: 0.2.14 - tslib: 2.8.1 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - '@nx/node@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(@zkochan/js-yaml@0.0.7)(babel-plugin-macros@3.1.0)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2))(typescript@5.9.2)': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/eslint': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/jest': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(babel-plugin-macros@3.1.0)(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2))(typescript@5.9.2) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - kill-port: 1.6.1 - tcp-port-used: 1.0.2 - tslib: 2.8.1 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@types/node' - - '@zkochan/js-yaml' - - babel-plugin-macros - - debug - - esbuild-register - - eslint - - node-notifier - - nx - - supports-color - - ts-node - - typescript - - verdaccio - - '@nx/nx-darwin-arm64@21.3.11': - optional: true - - '@nx/nx-darwin-x64@21.3.11': - optional: true - - '@nx/nx-freebsd-x64@21.3.11': - optional: true - - '@nx/nx-linux-arm-gnueabihf@21.3.11': - optional: true - - '@nx/nx-linux-arm64-gnu@21.3.11': - optional: true - - '@nx/nx-linux-arm64-musl@21.3.11': - optional: true - - '@nx/nx-linux-x64-gnu@21.3.11': - optional: true - - '@nx/nx-linux-x64-musl@21.3.11': - optional: true - - '@nx/nx-win32-arm64-msvc@21.3.11': - optional: true - - '@nx/nx-win32-x64-msvc@21.3.11': - optional: true - - '@nx/playwright@21.3.11(@babel/traverse@7.28.0)(@playwright/test@1.55.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(typescript@5.9.2)': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/eslint': 21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(@zkochan/js-yaml@0.0.7)(eslint@9.34.0(jiti@2.5.1))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.9.2) - minimatch: 9.0.3 - tslib: 2.8.1 - optionalDependencies: - '@playwright/test': 1.55.0 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@zkochan/js-yaml' - - debug - - eslint - - nx - - supports-color - - typescript - - verdaccio - - '@nx/vite@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.9.2) - '@swc/helpers': 0.5.17 - ajv: 8.17.1 - enquirer: 2.3.6 - picomatch: 4.0.2 - semver: 7.7.2 - tsconfig-paths: 4.2.0 - vite: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - typescript - - verdaccio - - '@nx/web@21.3.11(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)))': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@nx/js': 21.3.11(patch_hash=7201af3a8fb4840b046e4e18cc2758fa67ee3d0cf11d0783869dc828cfc79fc7)(@babel/traverse@7.28.0)(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - detect-port: 1.6.1 - http-server: 14.1.1 - picocolors: 1.1.1 - tslib: 2.8.1 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - verdaccio - - '@nx/workspace@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))': - dependencies: - '@nx/devkit': 21.3.11(nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17))) - '@zkochan/js-yaml': 0.0.7 - chalk: 4.1.2 - enquirer: 2.3.6 - nx: 21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)) - picomatch: 4.0.2 - tslib: 2.8.1 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug - '@open-draft/deferred-promise@2.2.0': optional: true @@ -20133,49 +18010,10 @@ snapshots: '@open-draft/until@2.1.0': optional: true - '@oxc-project/runtime@0.77.3': {} - - '@oxc-project/types@0.77.3': {} - - '@oxc-resolver/binding-darwin-arm64@5.3.0': + '@oxc-project/runtime@0.77.3': optional: true - '@oxc-resolver/binding-darwin-x64@5.3.0': - optional: true - - '@oxc-resolver/binding-freebsd-x64@5.3.0': - optional: true - - '@oxc-resolver/binding-linux-arm-gnueabihf@5.3.0': - optional: true - - '@oxc-resolver/binding-linux-arm64-gnu@5.3.0': - optional: true - - '@oxc-resolver/binding-linux-arm64-musl@5.3.0': - optional: true - - '@oxc-resolver/binding-linux-riscv64-gnu@5.3.0': - optional: true - - '@oxc-resolver/binding-linux-s390x-gnu@5.3.0': - optional: true - - '@oxc-resolver/binding-linux-x64-gnu@5.3.0': - optional: true - - '@oxc-resolver/binding-linux-x64-musl@5.3.0': - optional: true - - '@oxc-resolver/binding-wasm32-wasi@5.3.0': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - - '@oxc-resolver/binding-win32-arm64-msvc@5.3.0': - optional: true - - '@oxc-resolver/binding-win32-x64-msvc@5.3.0': + '@oxc-project/types@0.77.3': optional: true '@panva/asn1.js@1.0.0': {} @@ -20245,57 +18083,50 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.1 optional: true - '@phenomnomnominal/tsquery@5.0.1(typescript@5.9.2)': - dependencies: - esquery: 1.6.0 - typescript: 5.9.2 - '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': {} - - '@playwright/test@1.55.0': + '@playwright/test@1.56.1': dependencies: - playwright: 1.55.0 + playwright: 1.56.1 '@polka/url@1.0.0-next.29': {} '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.1)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': + '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@prefresh/vite': 2.4.8(preact@10.27.1)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + '@prefresh/vite': 2.4.8(preact@10.27.2)(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.1 picocolors: 1.1.1 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - vite-prerender-plugin: 0.5.11(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + vite: 7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-prerender-plugin: 0.5.11(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - preact - supports-color '@prefresh/babel-plugin@0.5.2': {} - '@prefresh/core@1.5.5(preact@10.27.1)': + '@prefresh/core@1.5.5(preact@10.27.2)': dependencies: - preact: 10.27.1 + preact: 10.27.2 '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.8(preact@10.27.1)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': + '@prefresh/vite@2.4.8(preact@10.27.2)(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@prefresh/babel-plugin': 0.5.2 - '@prefresh/core': 1.5.5(preact@10.27.1) + '@prefresh/core': 1.5.5(preact@10.27.2) '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 - preact: 10.27.1 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + preact: 10.27.2 + vite: 7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -20326,14 +18157,14 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@puppeteer/browsers@2.10.7': + '@puppeteer/browsers@2.10.10': dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.7.2 - tar-fs: 3.1.0 + semver: 7.7.3 + tar-fs: 3.1.1 yargs: 17.7.2 transitivePeerDependencies: - bare-buffer @@ -20341,7 +18172,7 @@ snapshots: '@radix-ui/primitive@1.0.0': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/primitive@1.1.1': {} @@ -20356,7 +18187,7 @@ snapshots: '@radix-ui/react-collection@1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.0(react@16.14.0) '@radix-ui/react-context': 1.0.0(react@16.14.0) '@radix-ui/react-primitive': 1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0) @@ -20366,7 +18197,7 @@ snapshots: '@radix-ui/react-compose-refs@1.0.0(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 react: 16.14.0 '@radix-ui/react-compose-refs@1.1.1(@types/react@19.1.7)(react@16.14.0)': @@ -20377,7 +18208,7 @@ snapshots: '@radix-ui/react-context@1.0.0(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 react: 16.14.0 '@radix-ui/react-context@1.1.1(@types/react@19.1.7)(react@16.14.0)': @@ -20388,7 +18219,7 @@ snapshots: '@radix-ui/react-direction@1.0.0(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 react: 16.14.0 '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': @@ -20423,7 +18254,7 @@ snapshots: '@radix-ui/react-id@1.0.0(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-layout-effect': 1.0.0(react@16.14.0) react: 16.14.0 @@ -20487,7 +18318,7 @@ snapshots: '@radix-ui/react-presence@1.0.0(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.0(react@16.14.0) '@radix-ui/react-use-layout-effect': 1.0.0(react@16.14.0) react: 16.14.0 @@ -20505,7 +18336,7 @@ snapshots: '@radix-ui/react-primitive@1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/react-slot': 1.0.1(react@16.14.0) react: 16.14.0 react-dom: 19.1.0(react@16.14.0) @@ -20521,7 +18352,7 @@ snapshots: '@radix-ui/react-roving-focus@1.0.2(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-collection': 1.0.1(react-dom@19.1.0(react@16.14.0))(react@16.14.0) '@radix-ui/react-compose-refs': 1.0.0(react@16.14.0) @@ -20536,7 +18367,7 @@ snapshots: '@radix-ui/react-slot@1.0.1(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/react-compose-refs': 1.0.0(react@16.14.0) react: 16.14.0 @@ -20549,7 +18380,7 @@ snapshots: '@radix-ui/react-tabs@1.0.2(react-dom@19.1.0(react@16.14.0))(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/primitive': 1.0.0 '@radix-ui/react-context': 1.0.0(react@16.14.0) '@radix-ui/react-direction': 1.0.0(react@16.14.0) @@ -20563,7 +18394,7 @@ snapshots: '@radix-ui/react-use-callback-ref@1.0.0(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 react: 16.14.0 '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.1.7)(react@16.14.0)': @@ -20574,7 +18405,7 @@ snapshots: '@radix-ui/react-use-controllable-state@1.0.0(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@radix-ui/react-use-callback-ref': 1.0.0(react@16.14.0) react: 16.14.0 @@ -20594,7 +18425,7 @@ snapshots: '@radix-ui/react-use-layout-effect@1.0.0(react@16.14.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 react: 16.14.0 '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.1.7)(react@16.14.0)': @@ -20619,29 +18450,29 @@ snapshots: '@radix-ui/rect@1.1.0': {} - '@replit/codemirror-indentation-markers@6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)': + '@replit/codemirror-indentation-markers@6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)': dependencies: '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 - '@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/lr@1.4.2)': + '@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)(@lezer/common@1.2.3)(@lezer/highlight@1.2.1)(@lezer/lr@1.4.2)': dependencies: '@codemirror/autocomplete': 6.18.6 '@codemirror/language': 6.11.0 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@replit/codemirror-vim@6.3.0(@codemirror/commands@6.8.1)(@codemirror/language@6.11.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.1)': + '@replit/codemirror-vim@6.3.0(@codemirror/commands@6.9.0)(@codemirror/language@6.11.0)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.38.6)': dependencies: - '@codemirror/commands': 6.8.1 + '@codemirror/commands': 6.9.0 '@codemirror/language': 6.11.0 '@codemirror/search': 6.5.11 '@codemirror/state': 6.5.2 - '@codemirror/view': 6.38.1 + '@codemirror/view': 6.38.6 '@rolldown/binding-android-arm64@1.0.0-beta.29': optional: true @@ -20675,7 +18506,7 @@ snapshots: '@rolldown/binding-wasm32-wasi@1.0.0-beta.29': dependencies: - '@napi-rs/wasm-runtime': 1.0.3 + '@napi-rs/wasm-runtime': 1.0.7 optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.29': @@ -20687,7 +18518,16 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-beta.29': optional: true - '@rolldown/pluginutils@1.0.0-beta.29': {} + '@rolldown/pluginutils@1.0.0-beta.29': + optional: true + + '@rollup/plugin-buble@1.0.3(rollup@4.52.0)': + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.52.0) + '@types/buble': 0.19.2 + buble: 0.20.0 + optionalDependencies: + rollup: 4.52.0 '@rollup/plugin-commonjs@25.0.8(rollup@4.40.0)': dependencies: @@ -20728,15 +18568,15 @@ snapshots: dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.39.0 + terser: 5.44.0 optionalDependencies: rollup: 4.40.0 - '@rollup/plugin-typescript@11.1.6(rollup@4.40.0)(tslib@2.8.1)(typescript@5.9.2)': + '@rollup/plugin-typescript@11.1.6(rollup@4.40.0)(tslib@2.8.1)(typescript@5.9.3)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.40.0) resolve: 1.22.10 - typescript: 5.9.2 + typescript: 5.9.3 optionalDependencies: rollup: 4.40.0 tslib: 2.8.1 @@ -20750,166 +18590,172 @@ snapshots: dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: rollup: 4.40.0 - '@rollup/pluginutils@5.1.4(rollup@4.46.3)': + '@rollup/pluginutils@5.1.4(rollup@4.52.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.46.3 + rollup: 4.52.0 '@rollup/rollup-android-arm-eabi@4.40.0': optional: true - '@rollup/rollup-android-arm-eabi@4.46.3': + '@rollup/rollup-android-arm-eabi@4.52.0': optional: true '@rollup/rollup-android-arm64@4.40.0': optional: true - '@rollup/rollup-android-arm64@4.46.3': + '@rollup/rollup-android-arm64@4.52.0': optional: true '@rollup/rollup-darwin-arm64@4.40.0': optional: true - '@rollup/rollup-darwin-arm64@4.46.3': + '@rollup/rollup-darwin-arm64@4.52.0': optional: true '@rollup/rollup-darwin-x64@4.40.0': optional: true - '@rollup/rollup-darwin-x64@4.46.3': + '@rollup/rollup-darwin-x64@4.52.0': optional: true '@rollup/rollup-freebsd-arm64@4.40.0': optional: true - '@rollup/rollup-freebsd-arm64@4.46.3': + '@rollup/rollup-freebsd-arm64@4.52.0': optional: true '@rollup/rollup-freebsd-x64@4.40.0': optional: true - '@rollup/rollup-freebsd-x64@4.46.3': + '@rollup/rollup-freebsd-x64@4.52.0': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.40.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.46.3': + '@rollup/rollup-linux-arm-gnueabihf@4.52.0': optional: true '@rollup/rollup-linux-arm-musleabihf@4.40.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.46.3': + '@rollup/rollup-linux-arm-musleabihf@4.52.0': optional: true '@rollup/rollup-linux-arm64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.46.3': + '@rollup/rollup-linux-arm64-gnu@4.52.0': optional: true '@rollup/rollup-linux-arm64-musl@4.40.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.46.3': + '@rollup/rollup-linux-arm64-musl@4.52.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.0': optional: true '@rollup/rollup-linux-loongarch64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.46.3': - optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.46.3': + '@rollup/rollup-linux-ppc64-gnu@4.52.0': optional: true '@rollup/rollup-linux-riscv64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.46.3': + '@rollup/rollup-linux-riscv64-gnu@4.52.0': optional: true '@rollup/rollup-linux-riscv64-musl@4.40.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.46.3': + '@rollup/rollup-linux-riscv64-musl@4.52.0': optional: true '@rollup/rollup-linux-s390x-gnu@4.40.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.46.3': + '@rollup/rollup-linux-s390x-gnu@4.52.0': optional: true '@rollup/rollup-linux-x64-gnu@4.40.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.46.3': + '@rollup/rollup-linux-x64-gnu@4.52.0': optional: true '@rollup/rollup-linux-x64-musl@4.40.0': optional: true - '@rollup/rollup-linux-x64-musl@4.46.3': + '@rollup/rollup-linux-x64-musl@4.52.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.0': optional: true '@rollup/rollup-win32-arm64-msvc@4.40.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.46.3': + '@rollup/rollup-win32-arm64-msvc@4.52.0': optional: true '@rollup/rollup-win32-ia32-msvc@4.40.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.46.3': + '@rollup/rollup-win32-ia32-msvc@4.52.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.0': optional: true '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.46.3': + '@rollup/rollup-win32-x64-msvc@4.52.0': optional: true - '@rushstack/node-core-library@5.13.1(@types/node@22.18.0)': + '@rushstack/node-core-library@5.13.1(@types/node@22.18.12)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 11.3.1 + fs-extra: 11.3.2 import-lazy: 4.0.0 jju: 1.4.0 resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.3(@types/node@22.18.0)': + '@rushstack/terminal@0.15.3(@types/node@22.18.12)': dependencies: - '@rushstack/node-core-library': 5.13.1(@types/node@22.18.0) + '@rushstack/node-core-library': 5.13.1(@types/node@22.18.12) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 - '@rushstack/ts-command-line@5.0.1(@types/node@22.18.0)': + '@rushstack/ts-command-line@5.0.1(@types/node@22.18.12)': dependencies: - '@rushstack/terminal': 0.15.3(@types/node@22.18.0) + '@rushstack/terminal': 0.15.3(@types/node@22.18.12) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -20926,266 +18772,255 @@ snapshots: '@sideway/pinpoint@2.0.0': {} - '@sigstore/bundle@3.1.0': + '@sigstore/bundle@4.0.0': dependencies: - '@sigstore/protobuf-specs': 0.4.3 + '@sigstore/protobuf-specs': 0.5.0 - '@sigstore/core@2.0.0': {} + '@sigstore/core@3.0.0': {} - '@sigstore/protobuf-specs@0.4.3': {} + '@sigstore/protobuf-specs@0.5.0': {} - '@sigstore/sign@3.1.0': + '@sigstore/sign@4.0.0': dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 - make-fetch-happen: 14.0.3 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 + make-fetch-happen: 15.0.2 proc-log: 5.0.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@sigstore/tuf@3.1.1': + '@sigstore/tuf@4.0.0': dependencies: - '@sigstore/protobuf-specs': 0.4.3 - tuf-js: 3.1.0 + '@sigstore/protobuf-specs': 0.5.0 + tuf-js: 4.0.0 transitivePeerDependencies: - supports-color - '@sigstore/verify@2.1.1': + '@sigstore/verify@3.0.0': dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 - - '@sinclair/typebox@0.31.28': {} - - '@sinclair/typebox@0.34.38': {} + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 '@sindresorhus/is@4.6.0': {} - '@sinonjs/commons@3.0.1': + '@smithy/abort-controller@4.2.3': dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@13.0.5': - dependencies: - '@sinonjs/commons': 3.0.1 - - '@smithy/abort-controller@4.0.4': - dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@smithy/config-resolver@4.1.4': dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.3 + '@smithy/types': 4.8.0 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 + '@smithy/util-middleware': 4.2.3 tslib: 2.8.1 - '@smithy/core@3.7.0': + '@smithy/core@3.17.0': dependencies: - '@smithy/middleware-serde': 4.0.8 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-stream': 4.2.3 - '@smithy/util-utf8': 4.0.0 + '@smithy/middleware-serde': 4.2.3 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.3 + '@smithy/util-stream': 4.5.3 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 '@smithy/credential-provider-imds@4.0.6': dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 + '@smithy/node-config-provider': 4.3.3 + '@smithy/property-provider': 4.2.3 + '@smithy/types': 4.8.0 + '@smithy/url-parser': 4.2.3 tslib: 2.8.1 '@smithy/eventstream-codec@4.0.4': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.3.1 - '@smithy/util-hex-encoding': 4.0.0 + '@smithy/types': 4.8.0 + '@smithy/util-hex-encoding': 4.2.0 tslib: 2.8.1 '@smithy/eventstream-serde-browser@4.0.4': dependencies: '@smithy/eventstream-serde-universal': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@smithy/eventstream-serde-config-resolver@4.1.2': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@smithy/eventstream-serde-node@4.0.4': dependencies: '@smithy/eventstream-serde-universal': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@smithy/eventstream-serde-universal@4.0.4': dependencies: '@smithy/eventstream-codec': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.1.0': + '@smithy/fetch-http-handler@5.3.4': dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/querystring-builder': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 + '@smithy/protocol-http': 5.3.3 + '@smithy/querystring-builder': 4.2.3 + '@smithy/types': 4.8.0 + '@smithy/util-base64': 4.3.0 tslib: 2.8.1 '@smithy/hash-node@4.0.4': dependencies: - '@smithy/types': 4.3.1 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/types': 4.8.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 '@smithy/invalid-dependency@4.0.4': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.0.0': + '@smithy/is-array-buffer@4.2.0': dependencies: tslib: 2.8.1 '@smithy/middleware-content-length@4.0.4': dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.14': + '@smithy/middleware-endpoint@4.3.4': dependencies: - '@smithy/core': 3.7.0 - '@smithy/middleware-serde': 4.0.8 - '@smithy/node-config-provider': 4.1.3 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-middleware': 4.0.4 + '@smithy/core': 3.17.0 + '@smithy/middleware-serde': 4.2.3 + '@smithy/node-config-provider': 4.3.3 + '@smithy/shared-ini-file-loader': 4.3.3 + '@smithy/types': 4.8.0 + '@smithy/url-parser': 4.2.3 + '@smithy/util-middleware': 4.2.3 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.15': + '@smithy/middleware-retry@4.4.4': dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/service-error-classification': 4.0.6 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - tslib: 2.8.1 - uuid: 9.0.1 - - '@smithy/middleware-serde@4.0.8': - dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.3 + '@smithy/protocol-http': 5.3.3 + '@smithy/service-error-classification': 4.2.3 + '@smithy/smithy-client': 4.9.0 + '@smithy/types': 4.8.0 + '@smithy/util-middleware': 4.2.3 + '@smithy/util-retry': 4.2.3 + '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.0.4': + '@smithy/middleware-serde@4.2.3': dependencies: - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.1.3': + '@smithy/middleware-stack@4.2.3': dependencies: - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.1.0': + '@smithy/node-config-provider@4.3.3': dependencies: - '@smithy/abort-controller': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/querystring-builder': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/shared-ini-file-loader': 4.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/property-provider@4.0.4': + '@smithy/node-http-handler@4.4.2': dependencies: - '@smithy/types': 4.3.1 + '@smithy/abort-controller': 4.2.3 + '@smithy/protocol-http': 5.3.3 + '@smithy/querystring-builder': 4.2.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/protocol-http@5.1.2': + '@smithy/property-provider@4.2.3': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.0.4': + '@smithy/protocol-http@5.3.3': dependencies: - '@smithy/types': 4.3.1 - '@smithy/util-uri-escape': 4.0.0 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.0.4': + '@smithy/querystring-builder@4.2.3': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 + '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.0.6': + '@smithy/querystring-parser@4.2.3': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 + tslib: 2.8.1 - '@smithy/shared-ini-file-loader@4.0.4': + '@smithy/service-error-classification@4.2.3': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 + + '@smithy/shared-ini-file-loader@4.3.3': + dependencies: + '@smithy/types': 4.8.0 tslib: 2.8.1 '@smithy/signature-v4@5.1.2': dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-uri-escape': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.3 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.4.6': + '@smithy/smithy-client@4.9.0': dependencies: - '@smithy/core': 3.7.0 - '@smithy/middleware-endpoint': 4.1.14 - '@smithy/middleware-stack': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.3 + '@smithy/core': 3.17.0 + '@smithy/middleware-endpoint': 4.3.4 + '@smithy/middleware-stack': 4.2.3 + '@smithy/protocol-http': 5.3.3 + '@smithy/types': 4.8.0 + '@smithy/util-stream': 4.5.3 tslib: 2.8.1 - '@smithy/types@4.3.1': + '@smithy/types@4.8.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.0.4': + '@smithy/url-parser@4.2.3': dependencies: - '@smithy/querystring-parser': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/querystring-parser': 4.2.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/util-base64@4.0.0': + '@smithy/util-base64@4.3.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.0.0': + '@smithy/util-body-length-browser@4.2.0': dependencies: tslib: 2.8.1 @@ -21198,9 +19033,9 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.0.0': + '@smithy/util-buffer-from@4.2.0': dependencies: - '@smithy/is-array-buffer': 4.0.0 + '@smithy/is-array-buffer': 4.2.0 tslib: 2.8.1 '@smithy/util-config-provider@4.0.0': @@ -21209,9 +19044,9 @@ snapshots: '@smithy/util-defaults-mode-browser@4.0.22': dependencies: - '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.3 + '@smithy/smithy-client': 4.9.0 + '@smithy/types': 4.8.0 bowser: 2.11.0 tslib: 2.8.1 @@ -21219,45 +19054,45 @@ snapshots: dependencies: '@smithy/config-resolver': 4.1.4 '@smithy/credential-provider-imds': 4.0.6 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.6 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.3 + '@smithy/property-provider': 4.2.3 + '@smithy/smithy-client': 4.9.0 + '@smithy/types': 4.8.0 tslib: 2.8.1 '@smithy/util-endpoints@3.0.6': dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.0.0': + '@smithy/util-hex-encoding@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.0.4': + '@smithy/util-middleware@4.2.3': dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/util-retry@4.0.6': + '@smithy/util-retry@4.2.3': dependencies: - '@smithy/service-error-classification': 4.0.6 - '@smithy/types': 4.3.1 + '@smithy/service-error-classification': 4.2.3 + '@smithy/types': 4.8.0 tslib: 2.8.1 - '@smithy/util-stream@4.2.3': + '@smithy/util-stream@4.5.3': dependencies: - '@smithy/fetch-http-handler': 5.1.0 - '@smithy/node-http-handler': 4.1.0 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/fetch-http-handler': 5.3.4 + '@smithy/node-http-handler': 4.4.2 + '@smithy/types': 4.8.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/util-uri-escape@4.0.0': + '@smithy/util-uri-escape@4.2.0': dependencies: tslib: 2.8.1 @@ -21266,15 +19101,17 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.0.0': + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': dependencies: - '@smithy/util-buffer-from': 4.0.0 tslib: 2.8.1 '@socket.io/component-emitter@3.1.2': {} - '@sqlite.org/sqlite-wasm@3.48.0-build4': {} - '@ssddanbrown/codemirror-lang-smarty@1.0.0': {} '@ssddanbrown/codemirror-lang-twig@1.0.0': @@ -21283,12 +19120,10 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@standard-schema/spec@1.0.0': {} - - '@stylistic/eslint-plugin@4.4.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@stylistic/eslint-plugin@4.4.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) + '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -21297,7 +19132,7 @@ snapshots: - supports-color - typescript - '@stylistic/stylelint-plugin@3.1.3(stylelint@16.23.1(typescript@5.9.2))': + '@stylistic/stylelint-plugin@3.1.3(stylelint@16.25.0(typescript@5.9.3))': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -21307,84 +19142,7 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 style-search: 0.1.0 - stylelint: 16.23.1(typescript@5.9.2) - - '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': - dependencies: - acorn: 8.15.0 - - '@sveltejs/adapter-auto@6.1.0(@sveltejs/kit@2.36.3(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))': - dependencies: - '@sveltejs/kit': 2.36.3(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) - - '@sveltejs/kit@2.36.3(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': - dependencies: - '@standard-schema/spec': 1.0.0 - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) - '@types/cookie': 0.6.0 - acorn: 8.15.0 - cookie: 1.0.2 - devalue: 5.3.2 - esm-env: 1.2.2 - kleur: 4.1.5 - magic-string: 0.30.18 - mrmime: 2.0.1 - sade: 1.8.1 - set-cookie-parser: 2.7.1 - sirv: 3.0.1 - svelte: 5.38.6 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': - dependencies: - '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) - debug: 4.4.1(supports-color@6.0.0) - svelte: 5.38.6 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.6)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) - debug: 4.4.1(supports-color@6.0.0) - deepmerge: 4.3.1 - kleur: 4.1.5 - magic-string: 0.30.17 - svelte: 5.38.6 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - vitefu: 1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) - transitivePeerDependencies: - - supports-color - - '@swc-node/core@1.14.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)': - dependencies: - '@swc/core': 1.11.29(@swc/helpers@0.5.17) - '@swc/types': 0.1.21 - optional: true - - '@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2)': - dependencies: - '@swc-node/core': 1.14.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21) - '@swc-node/sourcemap-support': 0.5.1 - '@swc/core': 1.11.29(@swc/helpers@0.5.17) - colorette: 2.0.20 - debug: 4.4.1(supports-color@6.0.0) - oxc-resolver: 5.3.0 - pirates: 4.0.7 - tslib: 2.8.1 - typescript: 5.9.2 - transitivePeerDependencies: - - '@swc/types' - - supports-color - optional: true - - '@swc-node/sourcemap-support@0.5.1': - dependencies: - source-map-support: 0.5.21 - tslib: 2.8.1 - optional: true + stylelint: 16.25.0(typescript@5.9.3) '@swc/core-darwin-arm64@1.11.29': optional: true @@ -21438,6 +19196,7 @@ snapshots: '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 + optional: true '@swc/types@0.1.21': dependencies: @@ -21449,89 +19208,10 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/node@4.1.12': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.3 - jiti: 2.5.1 - lightningcss: 1.30.1 - magic-string: 0.30.18 - source-map-js: 1.2.1 - tailwindcss: 4.1.12 - - '@tailwindcss/oxide-android-arm64@4.1.12': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.1.12': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.1.12': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.1.12': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.1.12': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.1.12': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.1.12': - optional: true - - '@tailwindcss/oxide@4.1.12': - dependencies: - detect-libc: 2.0.4 - tar: 7.4.3 - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.12 - '@tailwindcss/oxide-darwin-arm64': 4.1.12 - '@tailwindcss/oxide-darwin-x64': 4.1.12 - '@tailwindcss/oxide-freebsd-x64': 4.1.12 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 - '@tailwindcss/oxide-linux-x64-musl': 4.1.12 - '@tailwindcss/oxide-wasm32-wasi': 4.1.12 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 - - '@tailwindcss/typography@0.5.16(tailwindcss@4.1.12)': - dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - postcss-selector-parser: 6.0.10 - tailwindcss: 4.1.12 - - '@tailwindcss/vite@4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': - dependencies: - '@tailwindcss/node': 4.1.12 - '@tailwindcss/oxide': 4.1.12 - tailwindcss: 4.1.12 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -21545,7 +19225,7 @@ snapshots: '@tokenizer/inflate@0.2.7': dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fflate: 0.8.2 token-types: 6.0.0 transitivePeerDependencies: @@ -21571,25 +19251,21 @@ snapshots: '@tufjs/canonical-json@2.0.0': {} - '@tufjs/models@3.0.1': + '@tufjs/models@4.0.0': dependencies: '@tufjs/canonical-json': 2.0.0 minimatch: 9.0.5 '@tweenjs/tween.js@25.0.0': {} - '@tybys/wasm-util@0.10.0': + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true - '@tybys/wasm-util@0.9.0': - dependencies: - tslib: 2.8.1 - '@types/appdmg@0.5.5': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 optional: true '@types/archiver@6.0.3': @@ -21600,49 +19276,32 @@ snapshots: '@types/aria-query@5.0.4': {} - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.28.1 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 - - '@types/babel__traverse@7.20.7': - dependencies: - '@babel/types': 7.28.1 - '@types/better-sqlite3@7.6.13': dependencies: - '@types/node': 22.15.21 + '@types/node': 22.18.8 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/bootstrap@5.2.10': dependencies: '@popperjs/core': 2.11.8 + '@types/buble@0.19.2': + dependencies: + magic-string: 0.25.9 + '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/responselike': 1.0.3 '@types/chai@5.2.2': @@ -21666,24 +19325,29 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 5.0.7 - '@types/node': 22.18.0 + '@types/express-serve-static-core': 5.1.0 + '@types/node': 22.18.12 '@types/connect@3.4.38': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/cookie-parser@1.4.9(@types/express@5.0.3)': dependencies: '@types/express': 5.0.3 - '@types/cookie@0.6.0': {} + '@types/cookie@0.6.0': + optional: true '@types/cookiejar@2.1.5': {} - '@types/cssnano@5.1.3(postcss@8.5.3)': + '@types/cors@2.8.19': dependencies: - cssnano: 7.0.6(postcss@8.5.3) + '@types/node': 22.18.12 + + '@types/cssnano@5.1.3(postcss@8.5.6)': + dependencies: + cssnano: 7.1.1(postcss@8.5.6) transitivePeerDependencies: - postcss @@ -21836,9 +19500,9 @@ snapshots: dependencies: '@types/express': 5.0.3 - '@types/express-serve-static-core@5.0.7': + '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -21850,15 +19514,15 @@ snapshots: '@types/express@4.17.23': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.0.7 + '@types/express-serve-static-core': 5.1.0 '@types/qs': 6.14.0 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.9 '@types/express@5.0.3': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 5.0.7 - '@types/serve-static': 1.15.8 + '@types/express-serve-static-core': 5.1.0 + '@types/serve-static': 1.15.9 '@types/fs-extra@11.0.4': dependencies: @@ -21867,7 +19531,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 optional: true '@types/geojson-vt@3.2.5': @@ -21879,7 +19543,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/hast@3.0.4': dependencies: @@ -21893,47 +19557,31 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/ini@4.1.1': {} - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - '@types/jquery@3.5.33': dependencies: '@types/sizzle': 2.3.9 '@types/js-yaml@4.0.9': {} - '@types/jsdom@21.1.7': - dependencies: - '@types/node': 22.15.21 - '@types/tough-cookie': 4.0.5 - parse5: 7.3.0 - '@types/json-schema@7.0.15': {} '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/keyv@3.1.4': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 - '@types/leaflet-gpx@1.3.7': + '@types/leaflet-gpx@1.3.8': dependencies: - '@types/leaflet': 1.9.20 + '@types/leaflet': 1.9.21 - '@types/leaflet@1.9.20': + '@types/leaflet@1.9.21': dependencies: '@types/geojson': 7946.0.16 @@ -21959,7 +19607,7 @@ snapshots: '@types/mdast@4.0.4': dependencies: - '@types/unist': 2.0.11 + '@types/unist': 3.0.3 '@types/methods@1.1.4': {} @@ -21975,17 +19623,21 @@ snapshots: dependencies: '@types/express': 5.0.3 - '@types/node-forge@1.3.13': + '@types/mute-stream@0.0.4': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 + + '@types/node-forge@1.3.14': + dependencies: + '@types/node': 22.18.12 '@types/node@16.9.1': {} - '@types/node@20.17.32': + '@types/node@20.19.18': dependencies: - undici-types: 6.19.8 + undici-types: 6.21.0 - '@types/node@20.19.11': + '@types/node@20.19.22': dependencies: undici-types: 6.21.0 @@ -21997,13 +19649,21 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@22.18.0': + '@types/node@22.18.10': dependencies: undici-types: 6.21.0 - '@types/node@24.3.0': + '@types/node@22.18.12': dependencies: - undici-types: 7.10.0 + undici-types: 6.21.0 + + '@types/node@22.18.8': + dependencies: + undici-types: 6.21.0 + + '@types/node@24.8.1': + dependencies: + undici-types: 7.14.0 optional: true '@types/parse-json@4.0.2': {} @@ -22030,16 +19690,18 @@ snapshots: '@types/readdir-glob@1.1.5': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/resolve@1.20.2': {} '@types/responselike@1.0.3': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/retry@0.12.2': {} + '@types/reveal.js@5.2.1': {} + '@types/safe-compare@1.1.2': {} '@types/sanitize-html@2.16.0': @@ -22050,15 +19712,10 @@ snapshots: dependencies: '@types/node': 22.15.21 - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.18.0 - '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/serve-favicon@2.5.7': dependencies: @@ -22068,11 +19725,11 @@ snapshots: dependencies: '@types/express': 5.0.3 - '@types/serve-static@1.15.8': + '@types/serve-static@1.15.9': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.15.30 - '@types/send': 0.17.4 + '@types/node': 22.18.8 + '@types/send': 0.17.5 '@types/session-file-store@1.2.5': dependencies: @@ -22085,9 +19742,7 @@ snapshots: '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.18.0 - - '@types/stack-utils@2.0.3': {} + '@types/node': 22.18.12 '@types/statuses@2.0.6': optional: true @@ -22100,7 +19755,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 22.18.0 + '@types/node': 22.18.12 form-data: 4.0.4 '@types/supercluster@7.1.3': @@ -22115,27 +19770,26 @@ snapshots: '@types/swagger-ui-express@4.1.8': dependencies: '@types/express': 5.0.3 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.9 '@types/swagger-ui@5.21.1': {} - '@types/tabulator-tables@6.2.10': {} + '@types/tabulator-tables@6.2.11': {} '@types/through2@2.0.41': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 '@types/tmp@0.2.6': {} - '@types/tough-cookie@4.0.5': {} + '@types/tough-cookie@4.0.5': + optional: true '@types/trusted-types@2.0.7': optional: true '@types/turndown@5.0.5': {} - '@types/unist@2.0.11': {} - '@types/unist@3.0.3': {} '@types/uuid@9.0.8': {} @@ -22144,6 +19798,8 @@ snapshots: '@types/which@2.0.2': {} + '@types/wrap-ansi@3.0.0': {} + '@types/ws@8.18.1': dependencies: '@types/node': 22.15.21 @@ -22160,331 +19816,263 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 optional: true - '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.40.0 - '@typescript-eslint/type-utils': 8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.40.0 - eslint: 9.34.0(jiti@2.5.1) + eslint: 9.38.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/type-utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 - eslint: 9.34.0(jiti@2.5.1) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 9.38.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.40.0 '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.40.0 - debug: 4.4.1(supports-color@6.0.0) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 + debug: 4.4.3(supports-color@6.0.0) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.1(supports-color@6.0.0) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@6.0.0) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.40.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.2) - '@typescript-eslint/types': 8.38.0 - debug: 4.4.1(supports-color@6.0.0) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.40.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) '@typescript-eslint/types': 8.40.0 - debug: 4.4.1(supports-color@6.0.0) - typescript: 5.9.2 + debug: 4.4.3(supports-color@6.0.0) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.41.0(typescript@5.9.2)': + '@typescript-eslint/project-service@8.46.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - debug: 4.4.1(supports-color@6.0.0) - typescript: 5.9.2 + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 + debug: 4.4.3(supports-color@6.0.0) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.38.0': + '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3(supports-color@6.0.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/scope-manager@8.40.0': dependencies: '@typescript-eslint/types': 8.40.0 '@typescript-eslint/visitor-keys': 8.40.0 - '@typescript-eslint/scope-manager@8.41.0': + '@typescript-eslint/scope-manager@8.46.1': dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.9.2)': + '@typescript-eslint/scope-manager@8.46.2': dependencies: - typescript: 5.9.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 - '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/tsconfig-utils@8.41.0(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3)': dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.38.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.38.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1(supports-color@6.0.0) - eslint: 9.34.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + typescript: 5.9.3 - '@typescript-eslint/type-utils@8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1(supports-color@6.0.0) - eslint: 9.34.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3(supports-color@6.0.0) + eslint: 9.38.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - debug: 4.4.1(supports-color@6.0.0) - eslint: 9.34.0(jiti@2.5.1) - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3(supports-color@6.0.0) + eslint: 9.38.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.38.0': {} - '@typescript-eslint/types@8.40.0': {} - '@typescript-eslint/types@8.41.0': {} + '@typescript-eslint/types@8.46.1': {} - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.9.2)': - dependencies: - '@typescript-eslint/project-service': 8.38.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.9.2) - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 - debug: 4.4.1(supports-color@6.0.0) - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.46.2': {} - '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.40.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) + '@typescript-eslint/project-service': 8.40.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.3) '@typescript-eslint/types': 8.40.0 '@typescript-eslint/visitor-keys': 8.40.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 + debug: 4.4.3(supports-color@6.0.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.41.0(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.41.0(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.41.0(typescript@5.9.2) - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/visitor-keys': 8.41.0 - debug: 4.4.1(supports-color@6.0.0) + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@6.0.0) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.9.2) - typescript: 5.9.2 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.38.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.38.0 - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/typescript-estree': 8.38.0(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.40.0 '@typescript-eslint/types': 8.40.0 - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.41.0 - '@typescript-eslint/types': 8.41.0 - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.38.0': + '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.38.0 - eslint-visitor-keys: 4.2.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/visitor-keys@8.40.0': dependencies: '@typescript-eslint/types': 8.40.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.41.0': + '@typescript-eslint/visitor-keys@8.46.1': dependencies: - '@typescript-eslint/types': 8.41.0 + '@typescript-eslint/types': 8.46.1 + eslint-visitor-keys: 4.2.1 + + '@typescript-eslint/visitor-keys@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': - optional: true + '@uploadcare/cname-prefix@6.17.0': {} - '@unrs/resolver-binding-android-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.11.1': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.11.1': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.11.1': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 - optional: true - - '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - optional: true - - '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - optional: true - - '@uploadcare/file-uploader@1.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)': + '@uploadcare/file-uploader@1.19.4(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: '@symbiotejs/symbiote': 1.11.7 - '@uploadcare/image-shrink': 6.14.3 - '@uploadcare/upload-client': 6.14.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + '@uploadcare/cname-prefix': 6.17.0 + '@uploadcare/image-shrink': 6.17.0 + '@uploadcare/upload-client': 6.17.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) keyux: 0.7.2 transitivePeerDependencies: - bufferutil - utf-8-validate - '@uploadcare/image-shrink@6.14.3': {} + '@uploadcare/image-shrink@6.17.0': {} '@uploadcare/upload-client@6.14.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -22494,20 +20082,28 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser@3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(playwright@1.55.0)(utf-8-validate@6.0.5)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@uploadcare/upload-client@6.17.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': + dependencies: + form-data: 4.0.4 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@vitest/browser@3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 - magic-string: 0.30.17 + magic-string: 0.30.18 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) optionalDependencies: - playwright: 1.55.0 - webdriverio: 9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + playwright: 1.56.1 + webdriverio: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil - msw @@ -22517,7 +20113,7 @@ snapshots: '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4)': dependencies: '@istanbuljs/schema': 0.1.3 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 @@ -22526,7 +20122,7 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -22535,19 +20131,19 @@ snapshots: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.17 + magic-string: 0.30.18 magicast: 0.3.5 std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(playwright@1.55.0)(utf-8-validate@6.0.5)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) transitivePeerDependencies: - supports-color @@ -22559,23 +20155,14 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(vite@7.0.0(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.18 optionalDependencies: - msw: 2.7.5(@types/node@22.18.0)(typescript@5.9.2) - vite: 7.0.0(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - - '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - msw: 2.7.5(@types/node@22.18.0)(typescript@5.9.2) - vite: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + msw: 2.7.5(@types/node@22.18.12)(typescript@5.9.3) + vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -22590,7 +20177,7 @@ snapshots: '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + magic-string: 0.30.18 pathe: 2.0.3 '@vitest/spy@3.2.4': @@ -22604,9 +20191,9 @@ snapshots: flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.1 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: @@ -22626,9 +20213,11 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 + '@vscode/sudo-prompt@9.3.1': {} + '@vue/compiler-core@3.5.14': dependencies: - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 '@vue/shared': 3.5.14 entities: 4.5.0 estree-walker: 2.0.2 @@ -22644,7 +20233,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.9.2)': + '@vue/language-core@2.2.0(typescript@5.9.3)': dependencies: '@volar/language-core': 2.4.13 '@vue/compiler-dom': 3.5.14 @@ -22655,51 +20244,52 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 '@vue/shared@3.5.14': {} - '@wdio/config@9.19.2': + '@wdio/config@9.20.0': dependencies: '@wdio/logger': 9.18.0 - '@wdio/types': 9.19.2 - '@wdio/utils': 9.19.2 + '@wdio/types': 9.20.0 + '@wdio/utils': 9.20.0 deepmerge-ts: 7.1.5 glob: 10.4.5 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 + jiti: 2.6.1 transitivePeerDependencies: - bare-buffer - supports-color '@wdio/logger@9.18.0': dependencies: - chalk: 5.6.0 + chalk: 5.6.2 loglevel: 1.9.2 loglevel-plugin-prefix: 0.8.4 safe-regex2: 5.0.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 '@wdio/protocols@9.16.2': {} '@wdio/repl@9.16.2': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.22 - '@wdio/types@9.19.2': + '@wdio/types@9.20.0': dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.22 - '@wdio/utils@9.19.2': + '@wdio/utils@9.20.0': dependencies: - '@puppeteer/browsers': 2.10.7 + '@puppeteer/browsers': 2.10.10 '@wdio/logger': 9.18.0 - '@wdio/types': 9.19.2 + '@wdio/types': 9.20.0 decamelize: 6.0.1 deepmerge-ts: 7.1.5 edgedriver: 6.1.2 geckodriver: 5.0.0 get-port: 7.1.0 - import-meta-resolve: 4.1.0 + import-meta-resolve: 4.2.0 locate-app: 2.5.0 mitt: 3.0.1 safaridriver: 1.0.0 @@ -22793,18 +20383,7 @@ snapshots: '@xtuc/long@4.2.2': {} - '@yarnpkg/lockfile@1.1.0': {} - - '@yarnpkg/parsers@3.0.2': - dependencies: - js-yaml: 3.14.1 - tslib: 2.8.1 - - '@zip.js/zip.js@2.7.72': {} - - '@zkochan/js-yaml@0.0.7': - dependencies: - argparse: 2.0.1 + '@zip.js/zip.js@2.8.2': {} abab@2.0.6: {} @@ -22828,6 +20407,10 @@ snapshots: accessor-fn@1.5.3: {} + acorn-dynamic-import@4.0.0(acorn@6.4.2): + dependencies: + acorn: 6.4.2 + acorn-globals@6.0.0: dependencies: acorn: 7.4.1 @@ -22837,9 +20420,9 @@ snapshots: dependencies: acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@6.4.2): dependencies: - acorn: 8.14.1 + acorn: 6.4.2 acorn-jsx@5.3.2(acorn@8.15.0): dependencies: @@ -22849,19 +20432,17 @@ snapshots: acorn-walk@8.3.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 + + acorn@6.4.2: {} acorn@7.4.1: {} - acorn@8.14.1: {} - acorn@8.15.0: {} - address@1.2.2: {} - agent-base@6.0.2: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -22935,8 +20516,6 @@ snapshots: ansi-colors@3.2.3: {} - ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -22945,7 +20524,7 @@ snapshots: dependencies: type-fest: 1.4.0 - ansi-escapes@7.0.0: + ansi-escapes@7.1.1: dependencies: environment: 1.1.0 @@ -22957,7 +20536,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@3.2.1: dependencies: @@ -22969,9 +20548,10 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} - ansis@4.1.0: {} + ansis@4.2.0: + optional: true any-base@1.1.0: {} @@ -23051,27 +20631,67 @@ snapshots: array-flatten@1.1.1: {} - array-timsort@1.0.3: {} + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 array-union@2.1.0: {} + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + array.prototype.reduce@1.0.8: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-array-method-boxes-properly: 1.0.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 is-string: 1.1.1 + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -23080,13 +20700,17 @@ snapshots: assertion-error@2.0.1: {} + ast-metadata-inferer@0.8.1: + dependencies: + '@mdn/browser-compat-data': 5.7.6 + ast-types@0.13.4: dependencies: tslib: 2.8.1 ast-v8-to-istanbul@0.3.3: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 9.0.1 @@ -23123,122 +20747,20 @@ snapshots: await-to-js@3.0.0: {} - axios@1.11.0(debug@4.4.1): + axios@1.12.2(debug@4.4.3): dependencies: - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.3) form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axobject-query@4.1.0: {} - b4a@1.6.7: {} - babel-jest@30.0.5(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@jest/transform': 30.0.5 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.0 - babel-preset-jest: 30.0.1(@babel/core@7.28.0) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-const-enum@1.2.0(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@7.0.0: - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 6.0.3 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@30.0.1: - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.1 - '@types/babel__core': 7.20.5 - - babel-plugin-macros@3.1.0: - dependencies: - '@babel/runtime': 7.27.6 - cosmiconfig: 7.1.0 - resolve: 1.22.10 - - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.28.0): - dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.28.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.28.0) - core-js-compat: 3.41.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - babel-plugin-transform-hook-names@1.0.2(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 - babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.28.0)(@babel/traverse@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optionalDependencies: - '@babel/traverse': 7.28.0 - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.28.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) - - babel-preset-jest@30.0.1(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - babel-plugin-jest-hoist: 30.0.1 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) - bail@2.0.2: {} balanced-match@1.0.2: {} @@ -23248,14 +20770,16 @@ snapshots: bare-events@2.5.4: optional: true - bare-events@2.6.0: + bare-events@2.7.0: optional: true - bare-fs@4.1.6: + bare-fs@4.4.5: dependencies: - bare-events: 2.6.0 + bare-events: 2.7.0 bare-path: 3.0.0 - bare-stream: 2.6.5(bare-events@2.6.0) + bare-stream: 2.7.0(bare-events@2.7.0) + bare-url: 2.2.2 + fast-fifo: 1.3.2 optional: true bare-os@3.6.1: @@ -23266,11 +20790,16 @@ snapshots: bare-os: 3.6.1 optional: true - bare-stream@2.6.5(bare-events@2.6.0): + bare-stream@2.7.0(bare-events@2.7.0): dependencies: - streamx: 2.22.1 + streamx: 2.23.0 optionalDependencies: - bare-events: 2.6.0 + bare-events: 2.7.0 + optional: true + + bare-url@2.2.2: + dependencies: + bare-path: 3.0.0 optional: true base32-encode@1.2.0: @@ -23280,8 +20809,12 @@ snapshots: base64-js@1.5.1: {} + base64id@2.0.0: {} + base64url@3.0.1: {} + baseline-browser-mapping@2.8.4: {} + basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 @@ -23290,7 +20823,7 @@ snapshots: batch@0.6.1: {} - better-sqlite3@12.2.0: + better-sqlite3@12.4.1: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 @@ -23342,7 +20875,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -23403,14 +20936,28 @@ snapshots: browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001743 electron-to-chromium: 1.5.190 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) - bser@2.1.1: + browserslist@4.26.2: dependencies: - node-int64: 0.4.0 + baseline-browser-mapping: 2.8.4 + caniuse-lite: 1.0.30001743 + electron-to-chromium: 1.5.219 + node-releases: 2.0.21 + update-browserslist-db: 1.1.3(browserslist@4.26.2) + + buble@0.20.0: + dependencies: + acorn: 6.4.2 + acorn-dynamic-import: 4.0.0(acorn@6.4.2) + acorn-jsx: 5.3.2(acorn@6.4.2) + chalk: 2.4.2 + magic-string: 0.25.9 + minimist: 1.2.8 + regexpu-core: 4.5.4 buffer-alloc-unsafe@1.1.0: {} @@ -23447,7 +20994,7 @@ snapshots: bundle-name@4.1.0: dependencies: - run-applescript: 7.0.0 + run-applescript: 7.1.0 busboy@1.6.0: dependencies: @@ -23518,21 +21065,35 @@ snapshots: tar: 7.4.3 unique-filename: 4.0.0 + cacache@20.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 11.0.3 + lru-cache: 11.2.2 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + unique-filename: 4.0.0 + cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 + http-cache-semantics: 4.2.0 keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 - cacheable@1.10.3: + cacheable@1.10.4: dependencies: - hookified: 1.11.0 + hookified: 1.12.0 keyv: 5.5.0 call-bind-apply-helpers@1.0.2: @@ -23564,12 +21125,12 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 + browserslist: 4.26.2 + caniuse-lite: 1.0.30001743 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001743: {} canvas-color-tracker@1.3.2: dependencies: @@ -23605,11 +21166,7 @@ snapshots: chalk@5.4.1: {} - chalk@5.5.0: {} - - chalk@5.6.0: {} - - char-regex@1.0.2: {} + chalk@5.6.2: {} character-entities-html4@2.1.0: {} @@ -23617,6 +21174,8 @@ snapshots: character-entities@2.0.2: {} + chardet@0.7.0: {} + chardet@2.1.0: {} check-error@2.1.1: {} @@ -23710,112 +21269,108 @@ snapshots: chrome-trace-event@1.0.4: {} - ci-info@4.3.0: {} - - cjs-module-lexer@2.1.0: {} - - ckeditor5-collaboration@46.0.2: + ckeditor5-collaboration@47.1.0: dependencies: - '@ckeditor/ckeditor5-collaboration-core': 46.0.2 + '@ckeditor/ckeditor5-collaboration-core': 47.1.0 transitivePeerDependencies: - supports-color - ckeditor5-premium-features@46.0.2(bufferutil@4.0.9)(ckeditor5@46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5): + ckeditor5-premium-features@47.1.0(bufferutil@4.0.9)(ckeditor5@47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5): dependencies: - '@ckeditor/ckeditor5-ai': 46.0.2 - '@ckeditor/ckeditor5-case-change': 46.0.2 - '@ckeditor/ckeditor5-collaboration-core': 46.0.2 - '@ckeditor/ckeditor5-comments': 46.0.2 - '@ckeditor/ckeditor5-document-outline': 46.0.2 - '@ckeditor/ckeditor5-email': 46.0.2 - '@ckeditor/ckeditor5-export-inline-styles': 46.0.2 - '@ckeditor/ckeditor5-export-pdf': 46.0.2 - '@ckeditor/ckeditor5-export-word': 46.0.2 - '@ckeditor/ckeditor5-format-painter': 46.0.2 - '@ckeditor/ckeditor5-import-word': 46.0.2 - '@ckeditor/ckeditor5-line-height': 46.0.2 - '@ckeditor/ckeditor5-list-multi-level': 46.0.2 - '@ckeditor/ckeditor5-merge-fields': 46.0.2 - '@ckeditor/ckeditor5-pagination': 46.0.2 - '@ckeditor/ckeditor5-paste-from-office-enhanced': 46.0.2 - '@ckeditor/ckeditor5-real-time-collaboration': 46.0.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) - '@ckeditor/ckeditor5-revision-history': 46.0.2 - '@ckeditor/ckeditor5-slash-command': 46.0.2 - '@ckeditor/ckeditor5-source-editing-enhanced': 46.0.2 - '@ckeditor/ckeditor5-template': 46.0.2 - '@ckeditor/ckeditor5-track-changes': 46.0.2 - '@ckeditor/ckeditor5-uploadcare': 46.0.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) - '@ckeditor/ckeditor5-utils': 46.0.2 - ckeditor5: 46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + '@ckeditor/ckeditor5-ai': 47.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + '@ckeditor/ckeditor5-case-change': 47.1.0 + '@ckeditor/ckeditor5-collaboration-core': 47.1.0 + '@ckeditor/ckeditor5-comments': 47.1.0 + '@ckeditor/ckeditor5-document-outline': 47.1.0 + '@ckeditor/ckeditor5-email': 47.1.0 + '@ckeditor/ckeditor5-export-inline-styles': 47.1.0 + '@ckeditor/ckeditor5-export-pdf': 47.1.0 + '@ckeditor/ckeditor5-export-word': 47.1.0 + '@ckeditor/ckeditor5-format-painter': 47.1.0 + '@ckeditor/ckeditor5-import-word': 47.1.0 + '@ckeditor/ckeditor5-line-height': 47.1.0 + '@ckeditor/ckeditor5-list-multi-level': 47.1.0 + '@ckeditor/ckeditor5-merge-fields': 47.1.0 + '@ckeditor/ckeditor5-pagination': 47.1.0 + '@ckeditor/ckeditor5-paste-from-office-enhanced': 47.1.0 + '@ckeditor/ckeditor5-real-time-collaboration': 47.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + '@ckeditor/ckeditor5-revision-history': 47.1.0 + '@ckeditor/ckeditor5-slash-command': 47.1.0 + '@ckeditor/ckeditor5-source-editing-enhanced': 47.1.0 + '@ckeditor/ckeditor5-template': 47.1.0 + '@ckeditor/ckeditor5-track-changes': 47.1.0 + '@ckeditor/ckeditor5-uploadcare': 47.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + '@ckeditor/ckeditor5-utils': 47.1.0 + ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) transitivePeerDependencies: - aws-crt - bufferutil - supports-color - utf-8-validate - ckeditor5@46.0.2(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41): + ckeditor5@47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41): dependencies: - '@ckeditor/ckeditor5-adapter-ckfinder': 46.0.2 - '@ckeditor/ckeditor5-alignment': 46.0.2 - '@ckeditor/ckeditor5-autoformat': 46.0.2 - '@ckeditor/ckeditor5-autosave': 46.0.2 - '@ckeditor/ckeditor5-basic-styles': 46.0.2 - '@ckeditor/ckeditor5-block-quote': 46.0.2 - '@ckeditor/ckeditor5-bookmark': 46.0.2 - '@ckeditor/ckeditor5-ckbox': 46.0.2 - '@ckeditor/ckeditor5-ckfinder': 46.0.2 - '@ckeditor/ckeditor5-clipboard': 46.0.2 - '@ckeditor/ckeditor5-cloud-services': 46.0.2 - '@ckeditor/ckeditor5-code-block': 46.0.2(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95) - '@ckeditor/ckeditor5-core': 46.0.2 - '@ckeditor/ckeditor5-easy-image': 46.0.2 - '@ckeditor/ckeditor5-editor-balloon': 46.0.2 - '@ckeditor/ckeditor5-editor-classic': 46.0.2 - '@ckeditor/ckeditor5-editor-decoupled': 46.0.2 - '@ckeditor/ckeditor5-editor-inline': 46.0.2 - '@ckeditor/ckeditor5-editor-multi-root': 46.0.2 - '@ckeditor/ckeditor5-emoji': 46.0.2 - '@ckeditor/ckeditor5-engine': 46.0.2 - '@ckeditor/ckeditor5-enter': 46.0.2 - '@ckeditor/ckeditor5-essentials': 46.0.2 - '@ckeditor/ckeditor5-find-and-replace': 46.0.2 - '@ckeditor/ckeditor5-font': 46.0.2 - '@ckeditor/ckeditor5-fullscreen': 46.0.2 - '@ckeditor/ckeditor5-heading': 46.0.2 - '@ckeditor/ckeditor5-highlight': 46.0.2 - '@ckeditor/ckeditor5-horizontal-line': 46.0.2 - '@ckeditor/ckeditor5-html-embed': 46.0.2 - '@ckeditor/ckeditor5-html-support': 46.0.2 - '@ckeditor/ckeditor5-icons': 46.0.2 - '@ckeditor/ckeditor5-image': 46.0.2 - '@ckeditor/ckeditor5-indent': 46.0.2 - '@ckeditor/ckeditor5-language': 46.0.2 - '@ckeditor/ckeditor5-link': 46.0.2 - '@ckeditor/ckeditor5-list': 46.0.2 - '@ckeditor/ckeditor5-markdown-gfm': 46.0.2 - '@ckeditor/ckeditor5-media-embed': 46.0.2 - '@ckeditor/ckeditor5-mention': 46.0.2(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d) - '@ckeditor/ckeditor5-minimap': 46.0.2 - '@ckeditor/ckeditor5-page-break': 46.0.2 - '@ckeditor/ckeditor5-paragraph': 46.0.2 - '@ckeditor/ckeditor5-paste-from-office': 46.0.2 - '@ckeditor/ckeditor5-remove-format': 46.0.2 - '@ckeditor/ckeditor5-restricted-editing': 46.0.2 - '@ckeditor/ckeditor5-select-all': 46.0.2 - '@ckeditor/ckeditor5-show-blocks': 46.0.2 - '@ckeditor/ckeditor5-source-editing': 46.0.2 - '@ckeditor/ckeditor5-special-characters': 46.0.2 - '@ckeditor/ckeditor5-style': 46.0.2 - '@ckeditor/ckeditor5-table': 46.0.2 - '@ckeditor/ckeditor5-theme-lark': 46.0.2 - '@ckeditor/ckeditor5-typing': 46.0.2 - '@ckeditor/ckeditor5-ui': 46.0.2 - '@ckeditor/ckeditor5-undo': 46.0.2 - '@ckeditor/ckeditor5-upload': 46.0.2 - '@ckeditor/ckeditor5-utils': 46.0.2 - '@ckeditor/ckeditor5-watchdog': 46.0.2 - '@ckeditor/ckeditor5-widget': 46.0.2 - '@ckeditor/ckeditor5-word-count': 46.0.2 + '@ckeditor/ckeditor5-adapter-ckfinder': 47.1.0 + '@ckeditor/ckeditor5-alignment': 47.1.0 + '@ckeditor/ckeditor5-autoformat': 47.1.0 + '@ckeditor/ckeditor5-autosave': 47.1.0 + '@ckeditor/ckeditor5-basic-styles': 47.1.0 + '@ckeditor/ckeditor5-block-quote': 47.1.0 + '@ckeditor/ckeditor5-bookmark': 47.1.0 + '@ckeditor/ckeditor5-ckbox': 47.1.0 + '@ckeditor/ckeditor5-ckfinder': 47.1.0 + '@ckeditor/ckeditor5-clipboard': 47.1.0 + '@ckeditor/ckeditor5-cloud-services': 47.1.0 + '@ckeditor/ckeditor5-code-block': 47.1.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95) + '@ckeditor/ckeditor5-core': 47.1.0 + '@ckeditor/ckeditor5-easy-image': 47.1.0 + '@ckeditor/ckeditor5-editor-balloon': 47.1.0 + '@ckeditor/ckeditor5-editor-classic': 47.1.0 + '@ckeditor/ckeditor5-editor-decoupled': 47.1.0 + '@ckeditor/ckeditor5-editor-inline': 47.1.0 + '@ckeditor/ckeditor5-editor-multi-root': 47.1.0 + '@ckeditor/ckeditor5-emoji': 47.1.0 + '@ckeditor/ckeditor5-engine': 47.1.0 + '@ckeditor/ckeditor5-enter': 47.1.0 + '@ckeditor/ckeditor5-essentials': 47.1.0 + '@ckeditor/ckeditor5-find-and-replace': 47.1.0 + '@ckeditor/ckeditor5-font': 47.1.0 + '@ckeditor/ckeditor5-fullscreen': 47.1.0 + '@ckeditor/ckeditor5-heading': 47.1.0 + '@ckeditor/ckeditor5-highlight': 47.1.0 + '@ckeditor/ckeditor5-horizontal-line': 47.1.0 + '@ckeditor/ckeditor5-html-embed': 47.1.0 + '@ckeditor/ckeditor5-html-support': 47.1.0 + '@ckeditor/ckeditor5-icons': 47.1.0 + '@ckeditor/ckeditor5-image': 47.1.0 + '@ckeditor/ckeditor5-indent': 47.1.0 + '@ckeditor/ckeditor5-language': 47.1.0 + '@ckeditor/ckeditor5-link': 47.1.0 + '@ckeditor/ckeditor5-list': 47.1.0 + '@ckeditor/ckeditor5-markdown-gfm': 47.1.0 + '@ckeditor/ckeditor5-media-embed': 47.1.0 + '@ckeditor/ckeditor5-mention': 47.1.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d) + '@ckeditor/ckeditor5-minimap': 47.1.0 + '@ckeditor/ckeditor5-page-break': 47.1.0 + '@ckeditor/ckeditor5-paragraph': 47.1.0 + '@ckeditor/ckeditor5-paste-from-office': 47.1.0 + '@ckeditor/ckeditor5-remove-format': 47.1.0 + '@ckeditor/ckeditor5-restricted-editing': 47.1.0 + '@ckeditor/ckeditor5-select-all': 47.1.0 + '@ckeditor/ckeditor5-show-blocks': 47.1.0 + '@ckeditor/ckeditor5-source-editing': 47.1.0 + '@ckeditor/ckeditor5-special-characters': 47.1.0 + '@ckeditor/ckeditor5-style': 47.1.0 + '@ckeditor/ckeditor5-table': 47.1.0 + '@ckeditor/ckeditor5-theme-lark': 47.1.0 + '@ckeditor/ckeditor5-typing': 47.1.0 + '@ckeditor/ckeditor5-ui': 47.1.0 + '@ckeditor/ckeditor5-undo': 47.1.0 + '@ckeditor/ckeditor5-upload': 47.1.0 + '@ckeditor/ckeditor5-utils': 47.1.0 + '@ckeditor/ckeditor5-watchdog': 47.1.0 + '@ckeditor/ckeditor5-widget': 47.1.0 + '@ckeditor/ckeditor5-word-count': 47.1.0 transitivePeerDependencies: - supports-color @@ -23833,8 +21388,6 @@ snapshots: dependencies: restore-cursor: 5.1.0 - cli-spinners@2.6.1: {} - cli-spinners@2.9.2: {} cli-spinners@3.2.0: {} @@ -23844,13 +21397,12 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 - cli-truncate@4.0.0: + cli-truncate@5.1.0: dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 + slice-ansi: 7.1.2 + string-width: 8.1.0 - cli-width@4.1.0: - optional: true + cli-width@4.1.0: {} cliui@5.0.0: dependencies: @@ -23863,7 +21415,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - optional: true cliui@8.0.1: dependencies: @@ -23874,8 +21425,8 @@ snapshots: cliui@9.0.1: dependencies: string-width: 7.2.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 clone-response@1.0.3: dependencies: @@ -23893,10 +21444,6 @@ snapshots: clsx@1.1.1: {} - clsx@2.1.1: {} - - co@4.6.0: {} - codemirror-lang-elixir@4.0.0: dependencies: '@codemirror/language': 6.11.0 @@ -23914,8 +21461,6 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - collect-v8-coverage@1.0.2: {} - color-convert@0.5.3: optional: true @@ -23941,9 +21486,18 @@ snapshots: dependencies: color-name: 2.0.0 + color-string@2.1.2: + dependencies: + color-name: 2.0.0 + color-support@1.1.3: optional: true + color@5.0.2: + dependencies: + color-convert: 3.1.0 + color-string: 2.1.2 + colord@2.9.3: {} colorette@2.0.20: {} @@ -23953,11 +21507,6 @@ snapshots: colors@1.4.0: {} - columnify@1.6.0: - dependencies: - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -23968,7 +21517,7 @@ snapshots: commander@12.1.0: {} - commander@14.0.0: {} + commander@14.0.1: {} commander@2.20.3: {} @@ -23982,14 +21531,6 @@ snapshots: commander@9.5.0: {} - comment-json@4.2.5: - dependencies: - array-timsort: 1.0.3 - core-util-is: 1.0.3 - esprima: 4.0.1 - has-own-prop: 2.0.0 - repeat-string: 1.6.1 - comment-parser@1.4.1: {} commondir@1.0.1: {} @@ -24044,11 +21585,16 @@ snapshots: confbox@0.2.2: {} - confusing-browser-globals@1.0.11: {} - connect-history-api-fallback@2.0.0: {} - consola@3.4.0: {} + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color console-control-strings@1.1.0: optional: true @@ -24080,8 +21626,6 @@ snapshots: cookie@0.7.2: {} - cookie@1.0.2: {} - cookiejar@2.1.4: {} copy-anything@2.0.6: @@ -24089,21 +21633,22 @@ snapshots: is-what: 3.14.1 optional: true - copy-webpack-plugin@13.0.1(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + copy-webpack-plugin@13.0.1(webpack@5.101.3(esbuild@0.25.11)): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.2 serialize-javascript: 6.0.2 tinyglobby: 0.2.14 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) - - core-js-compat@3.41.0: - dependencies: - browserslist: 4.25.1 + webpack: 5.101.3(esbuild@0.25.11) core-util-is@1.0.3: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + corser@2.0.1: {} cose-base@1.0.3: @@ -24131,14 +21676,14 @@ snapshots: optionalDependencies: typescript: 5.0.4 - cosmiconfig@9.0.0(typescript@5.9.2): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 crc-32@0.3.0: {} @@ -24155,7 +21700,7 @@ snapshots: cross-dirname@0.1.0: {} - cross-env@10.0.0: + cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 cross-spawn: 7.0.6 @@ -24190,9 +21735,9 @@ snapshots: dependencies: http-errors: 2.0.0 - css-declaration-sorter@6.4.1(postcss@8.5.3): + css-declaration-sorter@6.4.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 css-declaration-sorter@7.2.0(postcss@8.5.3): dependencies: @@ -24204,7 +21749,7 @@ snapshots: css-functions-list@3.2.3: {} - css-loader@5.2.7(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + css-loader@5.2.7(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) loader-utils: 2.0.4 @@ -24215,10 +21760,10 @@ snapshots: postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 schema-utils: 3.3.0 - semver: 7.7.2 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + semver: 7.7.3 + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) - css-loader@7.1.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + css-loader@7.1.2(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -24227,14 +21772,14 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.6) postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) css-select@4.3.0: dependencies: boolbase: 1.0.0 - css-what: 6.1.0 + css-what: 6.2.2 domhandler: 4.3.1 domutils: 2.8.0 nth-check: 2.1.1 @@ -24285,42 +21830,42 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-default@5.2.14(postcss@8.5.3): + cssnano-preset-default@5.2.14(postcss@8.5.6): dependencies: - css-declaration-sorter: 6.4.1(postcss@8.5.3) - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-calc: 8.2.4(postcss@8.5.3) - postcss-colormin: 5.3.1(postcss@8.5.3) - postcss-convert-values: 5.1.3(postcss@8.5.3) - postcss-discard-comments: 5.1.2(postcss@8.5.3) - postcss-discard-duplicates: 5.1.0(postcss@8.5.3) - postcss-discard-empty: 5.1.1(postcss@8.5.3) - postcss-discard-overridden: 5.1.0(postcss@8.5.3) - postcss-merge-longhand: 5.1.7(postcss@8.5.3) - postcss-merge-rules: 5.1.4(postcss@8.5.3) - postcss-minify-font-values: 5.1.0(postcss@8.5.3) - postcss-minify-gradients: 5.1.1(postcss@8.5.3) - postcss-minify-params: 5.1.4(postcss@8.5.3) - postcss-minify-selectors: 5.2.1(postcss@8.5.3) - postcss-normalize-charset: 5.1.0(postcss@8.5.3) - postcss-normalize-display-values: 5.1.0(postcss@8.5.3) - postcss-normalize-positions: 5.1.1(postcss@8.5.3) - postcss-normalize-repeat-style: 5.1.1(postcss@8.5.3) - postcss-normalize-string: 5.1.0(postcss@8.5.3) - postcss-normalize-timing-functions: 5.1.0(postcss@8.5.3) - postcss-normalize-unicode: 5.1.1(postcss@8.5.3) - postcss-normalize-url: 5.1.0(postcss@8.5.3) - postcss-normalize-whitespace: 5.1.1(postcss@8.5.3) - postcss-ordered-values: 5.1.3(postcss@8.5.3) - postcss-reduce-initial: 5.1.2(postcss@8.5.3) - postcss-reduce-transforms: 5.1.0(postcss@8.5.3) - postcss-svgo: 5.1.0(postcss@8.5.3) - postcss-unique-selectors: 5.1.1(postcss@8.5.3) + css-declaration-sorter: 6.4.1(postcss@8.5.6) + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-calc: 8.2.4(postcss@8.5.6) + postcss-colormin: 5.3.1(postcss@8.5.6) + postcss-convert-values: 5.1.3(postcss@8.5.6) + postcss-discard-comments: 5.1.2(postcss@8.5.6) + postcss-discard-duplicates: 5.1.0(postcss@8.5.6) + postcss-discard-empty: 5.1.1(postcss@8.5.6) + postcss-discard-overridden: 5.1.0(postcss@8.5.6) + postcss-merge-longhand: 5.1.7(postcss@8.5.6) + postcss-merge-rules: 5.1.4(postcss@8.5.6) + postcss-minify-font-values: 5.1.0(postcss@8.5.6) + postcss-minify-gradients: 5.1.1(postcss@8.5.6) + postcss-minify-params: 5.1.4(postcss@8.5.6) + postcss-minify-selectors: 5.2.1(postcss@8.5.6) + postcss-normalize-charset: 5.1.0(postcss@8.5.6) + postcss-normalize-display-values: 5.1.0(postcss@8.5.6) + postcss-normalize-positions: 5.1.1(postcss@8.5.6) + postcss-normalize-repeat-style: 5.1.1(postcss@8.5.6) + postcss-normalize-string: 5.1.0(postcss@8.5.6) + postcss-normalize-timing-functions: 5.1.0(postcss@8.5.6) + postcss-normalize-unicode: 5.1.1(postcss@8.5.6) + postcss-normalize-url: 5.1.0(postcss@8.5.6) + postcss-normalize-whitespace: 5.1.1(postcss@8.5.6) + postcss-ordered-values: 5.1.3(postcss@8.5.6) + postcss-reduce-initial: 5.1.2(postcss@8.5.6) + postcss-reduce-transforms: 5.1.0(postcss@8.5.6) + postcss-svgo: 5.1.0(postcss@8.5.6) + postcss-unique-selectors: 5.1.1(postcss@8.5.6) cssnano-preset-default@6.1.2(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 css-declaration-sorter: 7.2.0(postcss@8.5.3) cssnano-utils: 4.0.2(postcss@8.5.3) postcss: 8.5.3 @@ -24386,15 +21931,15 @@ snapshots: postcss-svgo: 7.0.1(postcss@8.5.3) postcss-unique-selectors: 7.0.3(postcss@8.5.3) - cssnano-preset-default@7.0.8(postcss@8.5.6): + cssnano-preset-default@7.0.9(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 css-declaration-sorter: 7.2.0(postcss@8.5.6) cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 postcss-calc: 10.1.1(postcss@8.5.6) postcss-colormin: 7.0.4(postcss@8.5.6) - postcss-convert-values: 7.0.6(postcss@8.5.6) + postcss-convert-values: 7.0.7(postcss@8.5.6) postcss-discard-comments: 7.0.4(postcss@8.5.6) postcss-discard-duplicates: 7.0.2(postcss@8.5.6) postcss-discard-empty: 7.0.1(postcss@8.5.6) @@ -24428,9 +21973,9 @@ snapshots: postcss-discard-empty: 7.0.0(postcss@8.5.3) postcss-normalize-whitespace: 7.0.0(postcss@8.5.3) - cssnano-utils@3.1.0(postcss@8.5.3): + cssnano-utils@3.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 cssnano-utils@4.0.2(postcss@8.5.3): dependencies: @@ -24444,11 +21989,11 @@ snapshots: dependencies: postcss: 8.5.6 - cssnano@5.1.15(postcss@8.5.3): + cssnano@5.1.15(postcss@8.5.6): dependencies: - cssnano-preset-default: 5.2.14(postcss@8.5.3) + cssnano-preset-default: 5.2.14(postcss@8.5.6) lilconfig: 2.1.0 - postcss: 8.5.3 + postcss: 8.5.6 yaml: 1.10.2 cssnano@6.1.2(postcss@8.5.3): @@ -24463,9 +22008,9 @@ snapshots: lilconfig: 3.1.3 postcss: 8.5.3 - cssnano@7.1.0(postcss@8.5.6): + cssnano@7.1.1(postcss@8.5.6): dependencies: - cssnano-preset-default: 7.0.8(postcss@8.5.6) + cssnano-preset-default: 7.0.9(postcss@8.5.6) lilconfig: 3.1.3 postcss: 8.5.6 @@ -24485,14 +22030,17 @@ snapshots: dependencies: cssom: 0.3.8 - cssstyle@4.3.1: + cssstyle@4.6.0: dependencies: - '@asamuzakjp/css-color': 3.1.4 + '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 + optional: true csstype@3.1.3: optional: true + custom-event@1.0.1: {} + cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.2): dependencies: cose-base: 1.0.3 @@ -24703,6 +22251,7 @@ snapshots: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 + optional: true data-view-buffer@1.0.2: dependencies: @@ -24722,9 +22271,11 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + date-format@4.0.14: {} + dayjs-plugin-utc@0.1.2: {} - dayjs@1.11.14: {} + dayjs@1.11.18: {} de-indent@1.0.2: {} @@ -24734,25 +22285,21 @@ snapshots: dependencies: ms: 2.0.0 - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.1: - dependencies: - ms: 2.1.2 - debug@4.3.7: dependencies: ms: 2.1.3 - debug@4.4.1(supports-color@6.0.0): + debug@4.4.1: + dependencies: + ms: 2.1.3 + + debug@4.4.3(supports-color@6.0.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 6.0.0 - debug@4.4.1(supports-color@8.1.1): + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 optionalDependencies: @@ -24766,6 +22313,9 @@ snapshots: decimal.js@10.5.0: {} + decimal.js@10.6.0: + optional: true + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -24776,14 +22326,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.5.1(babel-plugin-macros@3.1.0): - optionalDependencies: - babel-plugin-macros: 3.1.0 - - dedent@1.6.0(babel-plugin-macros@3.1.0): - optionalDependencies: - babel-plugin-macros: 3.1.0 - deep-eql@5.0.2: {} deep-equal@1.1.2: @@ -24822,8 +22364,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-lazy-prop@3.0.0: {} define-properties@1.2.1: @@ -24882,7 +22422,10 @@ snapshots: detect-libc@2.0.4: {} - detect-newline@3.1.0: {} + detect-libc@2.1.1: {} + + detect-libc@2.1.2: + optional: true detect-node-es@1.1.0: {} @@ -24892,17 +22435,8 @@ snapshots: detect-pointer@1.0.3: {} - detect-port@1.6.1: - dependencies: - address: 1.2.2 - debug: 4.4.1(supports-color@6.0.0) - transitivePeerDependencies: - - supports-color - detect-touch-events@2.0.2: {} - devalue@5.3.2: {} - devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -24912,6 +22446,8 @@ snapshots: asap: 2.0.6 wrappy: 1.0.2 + di@0.0.1: {} + diff@3.5.0: {} diff@4.0.2: {} @@ -24933,12 +22469,23 @@ snapshots: dependencies: '@leichtgewicht/ip-codec': 2.0.5 + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + doctrine@3.0.0: dependencies: esutils: 2.0.3 dom-accessibility-api@0.5.16: {} + dom-serialize@2.2.1: + dependencies: + custom-event: 1.0.1 + ent: 2.2.2 + extend: 3.0.2 + void-elements: 2.0.1 + dom-serializer@1.4.1: dependencies: domelementtype: 2.3.0 @@ -24981,13 +22528,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dotenv-expand@11.0.7: - dependencies: - dotenv: 16.4.7 - - dotenv@16.4.7: {} - - dotenv@17.2.1: {} + dotenv@17.2.3: {} dotignore@0.1.2: dependencies: @@ -24996,11 +22537,11 @@ snapshots: dpdm@3.14.0: dependencies: chalk: 4.1.2 - fs-extra: 11.3.1 + fs-extra: 11.3.2 glob: 10.4.5 ora: 5.4.1 tslib: 2.8.1 - typescript: 5.9.2 + typescript: 5.9.3 yargs: 17.7.2 draggabilly@3.0.0: @@ -25033,7 +22574,7 @@ snapshots: edgedriver@6.1.2: dependencies: '@wdio/logger': 9.18.0 - '@zip.js/zip.js': 2.7.72 + '@zip.js/zip.js': 2.8.2 decamelize: 6.0.1 edge-paths: 3.0.5 fast-xml-parser: 5.2.5 @@ -25067,7 +22608,7 @@ snapshots: dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 1.1.1 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fs-extra: 9.1.0 glob: 7.2.3 lodash: 4.17.21 @@ -25083,7 +22624,7 @@ snapshots: electron-installer-debian@3.2.0: dependencies: '@malept/cross-spawn-promise': 1.1.1 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) electron-installer-common: 0.10.4 fs-extra: 9.1.0 get-folder-size: 2.0.1 @@ -25097,7 +22638,7 @@ snapshots: electron-installer-dmg@5.0.1: dependencies: '@types/appdmg': 0.5.5 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) minimist: 1.2.8 optionalDependencies: appdmg: 0.6.6 @@ -25108,7 +22649,7 @@ snapshots: electron-installer-redhat@3.4.0: dependencies: '@malept/cross-spawn-promise': 1.1.1 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) electron-installer-common: 0.10.4 fs-extra: 9.1.0 lodash: 4.17.21 @@ -25124,7 +22665,7 @@ snapshots: electron-localshortcut@3.2.1: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) electron-is-accelerator: 0.1.2 keyboardevent-from-electron-accelerator: 2.0.0 keyboardevents-areequal: 0.2.2 @@ -25139,6 +22680,8 @@ snapshots: electron-to-chromium@1.5.190: {} + electron-to-chromium@1.5.219: {} + electron-window-state@5.0.3: dependencies: jsonfile: 4.0.0 @@ -25147,7 +22690,7 @@ snapshots: electron-winstaller@5.4.0: dependencies: '@electron/asar': 3.4.1 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fs-extra: 7.0.1 lodash: 4.17.21 temp: 0.9.4 @@ -25157,10 +22700,10 @@ snapshots: - supports-color optional: true - electron@37.4.0: + electron@38.3.0: dependencies: '@electron/get': 2.0.3 - '@types/node': 22.18.0 + '@types/node': 22.18.10 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -25171,8 +22714,6 @@ snapshots: dependencies: shimmer: 1.2.1 - emittery@0.13.1: {} - emoji-regex@10.4.0: {} emoji-regex@7.0.3: {} @@ -25200,10 +22741,6 @@ snapshots: iconv-lite: 0.6.3 optional: true - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -25222,19 +22759,33 @@ snapshots: engine.io-parser@5.2.3: {} - enhanced-resolve@5.18.2: + engine.io@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.2 + '@types/cors': 2.8.19 + '@types/node': 22.18.12 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.2.3 - enquirer@2.3.6: + ent@2.2.2: dependencies: - ansi-colors: 4.1.3 + call-bound: 1.0.4 + es-errors: 1.3.0 + punycode: 1.4.1 + safe-regex-test: 1.1.0 entities@2.2.0: {} @@ -25311,12 +22862,88 @@ snapshots: unbox-primitive: 1.1.0 which-typed-array: 1.1.19 + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + es-array-method-boxes-properly@1.0.0: {} es-define-property@1.0.1: {} es-errors@1.3.0: {} + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: @@ -25330,6 +22957,10 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 @@ -25345,50 +22976,79 @@ snapshots: es6-promise@4.2.8: {} - esbuild-loader@3.0.1(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + esbuild-loader@3.0.1(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.11 get-tsconfig: 4.10.1 loader-utils: 2.0.4 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) webpack-sources: 1.4.3 - esbuild-loader@4.3.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + esbuild-loader@4.3.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.11 get-tsconfig: 4.10.1 loader-utils: 2.0.4 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) webpack-sources: 1.4.3 - esbuild@0.25.9: + esbuild@0.25.10: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + '@esbuild/aix-ppc64': 0.25.10 + '@esbuild/android-arm': 0.25.10 + '@esbuild/android-arm64': 0.25.10 + '@esbuild/android-x64': 0.25.10 + '@esbuild/darwin-arm64': 0.25.10 + '@esbuild/darwin-x64': 0.25.10 + '@esbuild/freebsd-arm64': 0.25.10 + '@esbuild/freebsd-x64': 0.25.10 + '@esbuild/linux-arm': 0.25.10 + '@esbuild/linux-arm64': 0.25.10 + '@esbuild/linux-ia32': 0.25.10 + '@esbuild/linux-loong64': 0.25.10 + '@esbuild/linux-mips64el': 0.25.10 + '@esbuild/linux-ppc64': 0.25.10 + '@esbuild/linux-riscv64': 0.25.10 + '@esbuild/linux-s390x': 0.25.10 + '@esbuild/linux-x64': 0.25.10 + '@esbuild/netbsd-arm64': 0.25.10 + '@esbuild/netbsd-x64': 0.25.10 + '@esbuild/openbsd-arm64': 0.25.10 + '@esbuild/openbsd-x64': 0.25.10 + '@esbuild/openharmony-arm64': 0.25.10 + '@esbuild/sunos-x64': 0.25.10 + '@esbuild/win32-arm64': 0.25.10 + '@esbuild/win32-ia32': 0.25.10 + '@esbuild/win32-x64': 0.25.10 + + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 escalade@3.2.0: {} @@ -25398,8 +23058,6 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -25412,68 +23070,110 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-ckeditor5@12.1.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): + eslint-config-ckeditor5@12.1.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint/js': 9.34.0 + '@eslint/js': 9.38.0 '@eslint/markdown': 6.6.0 - '@stylistic/eslint-plugin': 4.4.1(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) + '@stylistic/eslint-plugin': 4.4.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) eslint-plugin-ckeditor5-rules: 12.1.1 - eslint-plugin-mocha: 11.1.0(eslint@9.34.0(jiti@2.5.1)) - globals: 16.3.0 - typescript: 5.9.2 - typescript-eslint: 8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) + eslint-plugin-mocha: 11.1.0(eslint@9.38.0(jiti@2.6.1)) + globals: 16.4.0 + typescript: 5.9.3 + typescript-eslint: 8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - supports-color - eslint-config-prettier@10.1.8(eslint@9.34.0(jiti@2.5.1)): + eslint-config-preact@2.0.0(eslint@9.38.0(jiti@2.6.1)): dependencies: - eslint: 9.34.0(jiti@2.5.1) + '@babel/core': 7.28.0 + '@babel/eslint-parser': 7.28.4(@babel/core@7.28.0)(eslint@9.38.0(jiti@2.6.1)) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@eslint/js': 9.38.0 + eslint: 9.38.0(jiti@2.6.1) + eslint-plugin-compat: 6.0.2(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.38.0(jiti@2.6.1)) + globals: 16.4.0 + transitivePeerDependencies: + - supports-color - eslint-linter-browserify@9.34.0: {} + eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)): + dependencies: + eslint: 9.38.0(jiti@2.6.1) + + eslint-linter-browserify@9.38.0: {} eslint-plugin-ckeditor5-rules@12.1.1: dependencies: '@es-joy/jsdoccomment': 0.50.2 enhanced-resolve: 5.18.3 - fs-extra: 11.3.1 + fs-extra: 11.3.2 resolve.exports: 2.0.3 upath: 2.0.1 validate-npm-package-name: 6.0.2 yaml: 2.8.1 - eslint-plugin-mocha@11.1.0(eslint@9.34.0(jiti@2.5.1)): + eslint-plugin-compat@6.0.2(eslint@9.38.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) - eslint: 9.34.0(jiti@2.5.1) + '@mdn/browser-compat-data': 5.7.6 + ast-metadata-inferer: 0.8.1 + browserslist: 4.26.2 + caniuse-lite: 1.0.30001743 + eslint: 9.38.0(jiti@2.6.1) + find-up: 5.0.0 + globals: 15.15.0 + lodash.memoize: 4.1.2 + semver: 7.7.2 + + eslint-plugin-mocha@11.1.0(eslint@9.38.0(jiti@2.6.1)): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + eslint: 9.38.0(jiti@2.6.1) globals: 15.15.0 - eslint-plugin-playwright@2.2.2(eslint@9.34.0(jiti@2.5.1)): + eslint-plugin-playwright@2.2.2(eslint@9.38.0(jiti@2.6.1)): dependencies: - eslint: 9.34.0(jiti@2.5.1) + eslint: 9.38.0(jiti@2.6.1) globals: 13.24.0 - eslint-plugin-react-hooks@5.2.0(eslint@9.34.0(jiti@2.5.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.38.0(jiti@2.6.1)): dependencies: - eslint: 9.34.0(jiti@2.5.1) + eslint: 9.38.0(jiti@2.6.1) - eslint-plugin-svelte@3.11.0(eslint@9.34.0(jiti@2.5.1))(svelte@5.38.6)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.3.0)(typescript@5.9.2)): + eslint-plugin-react-hooks@7.0.0(eslint@9.38.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) - '@jridgewell/sourcemap-codec': 1.5.4 - eslint: 9.34.0(jiti@2.5.1) - esutils: 2.0.3 - globals: 16.3.0 - known-css-properties: 0.37.0 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.3.0)(typescript@5.9.2)) - postcss-safe-parser: 7.0.1(postcss@8.5.6) - semver: 7.7.2 - svelte-eslint-parser: 1.3.0(svelte@5.38.6) - optionalDependencies: - svelte: 5.38.6 + '@babel/core': 7.28.0 + '@babel/parser': 7.28.4 + eslint: 9.38.0(jiti@2.6.1) + hermes-parser: 0.25.1 + zod: 3.24.4 + zod-validation-error: 3.5.3(zod@3.24.4) transitivePeerDependencies: - - ts-node + - supports-color + + eslint-plugin-react@7.37.5(eslint@9.38.0(jiti@2.6.1)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.38.0(jiti@2.6.1) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 eslint-scope@5.1.1: dependencies: @@ -25485,29 +23185,30 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-visitor-keys@2.1.0: {} + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.1: {} - eslint@9.34.0(jiti@2.5.1): + eslint@9.38.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.1 + '@eslint/core': 0.16.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.34.0 - '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 + '@eslint/js': 9.38.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -25527,12 +23228,10 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 transitivePeerDependencies: - supports-color - esm-env@1.2.2: {} - espree@10.4.0: dependencies: acorn: 8.15.0 @@ -25541,8 +23240,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -25551,10 +23250,6 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@2.1.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -25581,8 +23276,15 @@ snapshots: eventemitter3@5.0.1: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.7.0 + optional: true + events@3.3.0: {} + eventsource-parser@3.0.2: {} + execa@1.0.0: dependencies: cross-spawn: 6.0.6 @@ -25607,26 +23309,17 @@ snapshots: exif-parser@0.1.12: {} - exit-x@0.2.2: {} - expand-template@2.0.3: {} expect-type@1.2.1: {} - expect@30.0.5: - dependencies: - '@jest/expect-utils': 30.0.5 - '@jest/get-type': 30.0.1 - jest-matcher-utils: 30.0.5 - jest-message-util: 30.0.5 - jest-mock: 30.0.5 - jest-util: 30.0.5 - exponential-backoff@3.1.2: {} - express-http-proxy@2.1.1: + exponential-backoff@3.1.3: {} + + express-http-proxy@2.1.2: dependencies: - debug: 3.2.7 + debug: 4.4.3(supports-color@6.0.0) es6-promise: 4.2.8 raw-body: 2.5.2 transitivePeerDependencies: @@ -25637,7 +23330,7 @@ snapshots: base64url: 3.0.1 clone: 2.1.2 cookie: 0.7.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) express: 5.1.0 futoin-hkdf: 1.5.3 http-errors: 1.8.1 @@ -25649,7 +23342,7 @@ snapshots: transitivePeerDependencies: - supports-color - express-rate-limit@8.0.1(express@5.1.0): + express-rate-limit@8.1.0(express@5.1.0): dependencies: express: 5.1.0 ip-address: 10.0.1 @@ -25711,7 +23404,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -25752,9 +23445,15 @@ snapshots: extend@3.0.2: {} + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + extract-zip@2.0.1: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -25806,22 +23505,10 @@ snapshots: dependencies: websocket-driver: 0.7.4 - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - fd-slicer@1.1.0: dependencies: pend: 1.2.0 - fdir@6.4.6(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - fdir@6.4.6(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -25833,13 +23520,9 @@ snapshots: fflate@0.8.2: {} - figures@3.2.0: + file-entry-cache@10.1.4: dependencies: - escape-string-regexp: 1.0.5 - - file-entry-cache@10.1.3: - dependencies: - flat-cache: 6.1.12 + flat-cache: 6.1.13 file-entry-cache@8.0.0: dependencies: @@ -25882,6 +23565,18 @@ snapshots: filter-obj@1.1.0: {} + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + finalhandler@1.3.1: dependencies: debug: 2.6.9 @@ -25896,7 +23591,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -25934,11 +23629,11 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.12: + flat-cache@6.1.13: dependencies: - cacheable: 1.10.3 + cacheable: 1.10.4 flatted: 3.3.3 - hookified: 1.11.0 + hookified: 1.12.0 flat@5.0.2: {} @@ -25948,11 +23643,11 @@ snapshots: dependencies: d3-selection: 3.0.0 kapsule: 1.16.3 - preact: 10.27.1 + preact: 10.27.2 flora-colossus@2.0.0: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fs-extra: 10.1.0 transitivePeerDependencies: - supports-color @@ -25962,15 +23657,15 @@ snapshots: imul: 1.0.1 optional: true - follow-redirects@1.15.9(debug@4.4.1): + follow-redirects@1.15.9(debug@4.4.3): optionalDependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) for-each@0.3.5: dependencies: is-callable: 1.2.7 - force-graph@1.50.1: + force-graph@1.51.0: dependencies: '@tweenjs/tween.js': 25.0.0 accessor-fn: 1.5.3 @@ -26021,19 +23716,13 @@ snapshots: fresh@2.0.0: {} - front-matter@4.0.2: - dependencies: - js-yaml: 3.14.1 - - fs-constants@1.0.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.3.1: + fs-extra@11.3.2: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -26107,7 +23796,7 @@ snapshots: galactus@1.0.0: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) flora-colossus: 2.0.0 fs-extra: 10.1.0 transitivePeerDependencies: @@ -26131,12 +23820,12 @@ snapshots: geckodriver@5.0.0: dependencies: '@wdio/logger': 9.18.0 - '@zip.js/zip.js': 2.7.72 + '@zip.js/zip.js': 2.8.2 decamelize: 6.0.1 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 node-fetch: 3.3.2 - tar-fs: 3.1.0 + tar-fs: 3.1.1 which: 5.0.0 transitivePeerDependencies: - bare-buffer @@ -26158,7 +23847,7 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.3.0: {} + get-east-asian-width@1.4.0: {} get-folder-size@2.0.1: dependencies: @@ -26190,8 +23879,6 @@ snapshots: transitivePeerDependencies: - supports-color - get-package-type@0.1.0: {} - get-port@7.1.0: {} get-proto@1.0.1: @@ -26217,8 +23904,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-them-args@1.3.2: {} - get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -26227,7 +23912,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -26250,6 +23935,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regex.js@1.0.1(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + glob-to-regexp@0.4.1: {} glob@10.4.5: @@ -26275,7 +23964,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.4 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 @@ -26345,7 +24034,7 @@ snapshots: globals@15.15.0: {} - globals@16.3.0: {} + globals@16.4.0: {} globalthis@1.0.4: dependencies: @@ -26407,22 +24096,18 @@ snapshots: handle-thing@2.0.1: {} - happy-dom@18.0.1: + happy-dom@20.0.7: dependencies: - '@types/node': 20.17.32 + '@types/node': 20.19.22 '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 - harmony-reflect@1.6.2: {} - has-bigints@1.1.0: {} has-flag@3.0.0: {} has-flag@4.0.0: {} - has-own-prop@2.0.0: {} - has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -26552,6 +24237,12 @@ snapshots: helmet@8.1.0: {} + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + highlight.js@11.11.1: {} highlightjs-cobol@0.3.3: @@ -26566,7 +24257,7 @@ snapshots: history@4.10.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.3 @@ -26575,18 +24266,18 @@ snapshots: hoist-non-react-statics@2.5.5: {} - hookified@1.11.0: {} + hookified@1.12.0: {} hosted-git-info@2.8.9: {} - hosted-git-info@7.0.2: - dependencies: - lru-cache: 10.4.3 - hosted-git-info@8.1.0: dependencies: lru-cache: 10.4.3 + hosted-git-info@9.0.0: + dependencies: + lru-cache: 11.2.2 + hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -26605,6 +24296,7 @@ snapshots: html-encoding-sniffer@4.0.0: dependencies: whatwg-encoding: 3.1.1 + optional: true html-escaper@2.0.2: {} @@ -26684,7 +24376,7 @@ snapshots: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -26692,14 +24384,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -26718,7 +24410,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9(debug@4.4.1) + follow-redirects: 1.15.9(debug@4.4.3) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -26750,19 +24442,17 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color - human-id@4.1.1: {} - human-signals@2.1.0: {} humanize-ms@1.2.1: @@ -26779,11 +24469,11 @@ snapshots: transitivePeerDependencies: - encoding - i18next@25.4.2(typescript@5.9.2): + i18next@25.6.0(typescript@5.9.3): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 iconv-lite@0.4.24: dependencies: @@ -26793,23 +24483,15 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - icss-utils@5.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 - identity-obj-proxy@3.0.0: - dependencies: - harmony-reflect: 1.6.2 - ieee754@1.2.1: {} - ignore-walk@7.0.0: + ignore-walk@8.0.0: dependencies: - minimatch: 9.0.5 + minimatch: 10.0.3 ignore@5.3.2: {} @@ -26841,7 +24523,7 @@ snapshots: immutable@4.3.7: {} - immutable@5.1.3: + immutable@5.1.4: optional: true import-fresh@3.3.1: @@ -26851,7 +24533,7 @@ snapshots: import-lazy@4.0.0: {} - import-meta-resolve@4.1.0: {} + import-meta-resolve@4.2.0: {} imul@1.0.1: optional: true @@ -26905,8 +24587,7 @@ snapshots: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 - - ip-regex@4.3.0: {} + optional: true ipaddr.js@1.9.1: {} @@ -26983,11 +24664,9 @@ snapshots: is-fullwidth-code-point@4.0.0: {} - is-fullwidth-code-point@5.0.0: + is-fullwidth-code-point@5.1.0: dependencies: - get-east-asian-width: 1.3.0 - - is-generator-fn@2.1.0: {} + get-east-asian-width: 1.4.0 is-generator-function@1.1.0: dependencies: @@ -27026,7 +24705,9 @@ snapshots: xtend: 4.0.2 optional: true - is-network-error@1.1.0: {} + is-negative-zero@2.0.3: {} + + is-network-error@1.2.0: {} is-node-process@1.2.0: optional: true @@ -27063,10 +24744,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - is-reference@3.0.3: - dependencies: - '@types/estree': 1.0.8 - is-regex@1.1.4: dependencies: call-bind: 1.0.8 @@ -27110,8 +24787,6 @@ snapshots: is-unicode-supported@0.1.0: {} - is-url@1.2.4: {} - is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -27134,12 +24809,6 @@ snapshots: dependencies: is-inside-container: 1.0.0 - is2@2.0.9: - dependencies: - deep-is: 0.1.4 - ip-regex: 4.3.0 - is-url: 1.2.4 - isarray@0.0.1: {} isarray@1.0.0: {} @@ -27157,7 +24826,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.2 @@ -27172,8 +24841,8 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.29 - debug: 4.4.1(supports-color@6.0.0) + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3(supports-color@6.0.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -27183,6 +24852,15 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -27200,284 +24878,19 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jasmine-core@4.6.1: {} + javascript-stringify@1.6.0: {} - jest-circus@30.0.5(babel-plugin-macros@3.1.0): - dependencies: - '@jest/environment': 30.0.5 - '@jest/expect': 30.0.5 - '@jest/test-result': 30.0.5 - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.6.0(babel-plugin-macros@3.1.0) - is-generator-fn: 2.1.0 - jest-each: 30.0.5 - jest-matcher-utils: 30.0.5 - jest-message-util: 30.0.5 - jest-runtime: 30.0.5 - jest-snapshot: 30.0.5 - jest-util: 30.0.5 - p-limit: 3.1.0 - pretty-format: 30.0.5 - pure-rand: 7.0.1 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@30.0.5(@types/node@22.18.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2)): - dependencies: - '@babel/core': 7.28.0 - '@jest/get-type': 30.0.1 - '@jest/pattern': 30.0.1 - '@jest/test-sequencer': 30.0.5 - '@jest/types': 30.0.5 - babel-jest: 30.0.5(@babel/core@7.28.0) - chalk: 4.1.2 - ci-info: 4.3.0 - deepmerge: 4.3.1 - glob: 10.4.5 - graceful-fs: 4.2.11 - jest-circus: 30.0.5(babel-plugin-macros@3.1.0) - jest-docblock: 30.0.1 - jest-environment-node: 30.0.5 - jest-regex-util: 30.0.1 - jest-resolve: 30.0.5 - jest-runner: 30.0.5 - jest-util: 30.0.5 - jest-validate: 30.0.5 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 30.0.5 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.18.0 - ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-diff@30.0.5: - dependencies: - '@jest/diff-sequences': 30.0.1 - '@jest/get-type': 30.0.1 - chalk: 4.1.2 - pretty-format: 30.0.5 - - jest-docblock@30.0.1: - dependencies: - detect-newline: 3.1.0 - - jest-each@30.0.5: - dependencies: - '@jest/get-type': 30.0.1 - '@jest/types': 30.0.5 - chalk: 4.1.2 - jest-util: 30.0.5 - pretty-format: 30.0.5 - - jest-environment-node@30.0.5: - dependencies: - '@jest/environment': 30.0.5 - '@jest/fake-timers': 30.0.5 - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - jest-mock: 30.0.5 - jest-util: 30.0.5 - jest-validate: 30.0.5 - - jest-haste-map@30.0.5: - dependencies: - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 30.0.1 - jest-util: 30.0.5 - jest-worker: 30.0.5 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-leak-detector@30.0.5: - dependencies: - '@jest/get-type': 30.0.1 - pretty-format: 30.0.5 - - jest-matcher-utils@30.0.5: - dependencies: - '@jest/get-type': 30.0.1 - chalk: 4.1.2 - jest-diff: 30.0.5 - pretty-format: 30.0.5 - - jest-message-util@30.0.5: - dependencies: - '@babel/code-frame': 7.27.1 - '@jest/types': 30.0.5 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 30.0.5 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@30.0.5: - dependencies: - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - jest-util: 30.0.5 - - jest-pnp-resolver@1.2.3(jest-resolve@30.0.5): - optionalDependencies: - jest-resolve: 30.0.5 - - jest-regex-util@30.0.1: {} - - jest-resolve@30.0.5: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.5 - jest-pnp-resolver: 1.2.3(jest-resolve@30.0.5) - jest-util: 30.0.5 - jest-validate: 30.0.5 - slash: 3.0.0 - unrs-resolver: 1.11.1 - - jest-runner@30.0.5: - dependencies: - '@jest/console': 30.0.5 - '@jest/environment': 30.0.5 - '@jest/test-result': 30.0.5 - '@jest/transform': 30.0.5 - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - chalk: 4.1.2 - emittery: 0.13.1 - exit-x: 0.2.2 - graceful-fs: 4.2.11 - jest-docblock: 30.0.1 - jest-environment-node: 30.0.5 - jest-haste-map: 30.0.5 - jest-leak-detector: 30.0.5 - jest-message-util: 30.0.5 - jest-resolve: 30.0.5 - jest-runtime: 30.0.5 - jest-util: 30.0.5 - jest-watcher: 30.0.5 - jest-worker: 30.0.5 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - - jest-runtime@30.0.5: - dependencies: - '@jest/environment': 30.0.5 - '@jest/fake-timers': 30.0.5 - '@jest/globals': 30.0.5 - '@jest/source-map': 30.0.1 - '@jest/test-result': 30.0.5 - '@jest/transform': 30.0.5 - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - chalk: 4.1.2 - cjs-module-lexer: 2.1.0 - collect-v8-coverage: 1.0.2 - glob: 10.4.5 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.5 - jest-message-util: 30.0.5 - jest-mock: 30.0.5 - jest-regex-util: 30.0.1 - jest-resolve: 30.0.5 - jest-snapshot: 30.0.5 - jest-util: 30.0.5 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - - jest-snapshot@30.0.5: - dependencies: - '@babel/core': 7.28.0 - '@babel/generator': 7.28.0 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.1 - '@jest/expect-utils': 30.0.5 - '@jest/get-type': 30.0.1 - '@jest/snapshot-utils': 30.0.5 - '@jest/transform': 30.0.5 - '@jest/types': 30.0.5 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) - chalk: 4.1.2 - expect: 30.0.5 - graceful-fs: 4.2.11 - jest-diff: 30.0.5 - jest-matcher-utils: 30.0.5 - jest-message-util: 30.0.5 - jest-util: 30.0.5 - pretty-format: 30.0.5 - semver: 7.7.2 - synckit: 0.11.11 - transitivePeerDependencies: - - supports-color - - jest-util@30.0.5: - dependencies: - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - chalk: 4.1.2 - ci-info: 4.3.0 - graceful-fs: 4.2.11 - picomatch: 4.0.3 - - jest-validate@30.0.5: - dependencies: - '@jest/get-type': 30.0.1 - '@jest/types': 30.0.5 - camelcase: 6.3.0 - chalk: 4.1.2 - leven: 3.1.0 - pretty-format: 30.0.5 - - jest-watcher@30.0.5: - dependencies: - '@jest/test-result': 30.0.5 - '@jest/types': 30.0.5 - '@types/node': 22.18.0 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 30.0.5 - string-length: 4.0.2 - jest-worker@26.6.2: dependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 22.18.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest-worker@30.0.5: - dependencies: - '@types/node': 22.18.0 - '@ungap/structured-clone': 1.3.0 - jest-util: 30.0.5 + '@types/node': 22.18.12 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -27511,9 +24924,7 @@ snapshots: '@jimp/types': 1.6.0 '@jimp/utils': 1.6.0 - jiti@1.21.7: {} - - jiti@2.5.1: {} + jiti@2.6.1: {} jju@1.4.0: {} @@ -27549,8 +24960,6 @@ snapshots: jquery@3.7.1: {} - js-sha256@0.11.1: {} - js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -27560,23 +24969,19 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} + jsbn@1.1.0: + optional: true jsdoc-type-pratt-parser@4.1.0: {} jsdom@16.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: abab: 2.0.6 - acorn: 8.14.1 + acorn: 8.15.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -27609,14 +25014,14 @@ snapshots: jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: - cssstyle: 4.3.1 + cssstyle: 4.6.0 data-urls: 5.0.0 - decimal.js: 10.5.0 + decimal.js: 10.6.0 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 + nwsapi: 2.2.22 parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 @@ -27633,8 +25038,9 @@ snapshots: - bufferutil - supports-color - utf-8-validate + optional: true - jsesc@3.0.2: {} + jsesc@0.5.0: {} jsesc@3.1.0: {} @@ -27644,6 +25050,11 @@ snapshots: json-parse-even-better-errors@4.0.0: {} + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.28.4 + ts-algebra: 2.0.0 + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -27657,14 +25068,12 @@ snapshots: json5@2.2.3: {} - jsonc-eslint-parser@2.4.0: + jsonc-eslint-parser@2.4.1: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.7.1 - - jsonc-parser@3.2.0: {} + semver: 7.7.2 jsonfile@4.0.0: optionalDependencies: @@ -27683,6 +25092,13 @@ snapshots: jsplumb@2.15.6: {} + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -27696,7 +25112,53 @@ snapshots: dependencies: lodash-es: 4.17.21 - katex@0.16.22: + karma-chrome-launcher@3.2.0: + dependencies: + which: 1.3.1 + + karma-firefox-launcher@2.1.3: + dependencies: + is-wsl: 2.2.0 + which: 3.0.1 + + karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.0.9)(utf-8-validate@6.0.5)): + dependencies: + jasmine-core: 4.6.1 + karma: 6.4.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + + karma@6.4.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): + dependencies: + '@colors/colors': 1.5.0 + body-parser: 1.20.3 + braces: 3.0.3 + chokidar: 3.6.0 + connect: 3.7.0 + di: 0.0.1 + dom-serialize: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + http-proxy: 1.18.1 + isbinaryfile: 4.0.10 + lodash: 4.17.21 + log4js: 6.9.1 + mime: 2.6.0 + minimatch: 3.1.2 + mkdirp: 0.5.6 + qjobs: 1.2.0 + range-parser: 1.2.1 + rimraf: 3.0.2 + socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + source-map: 0.6.1 + tmp: 0.2.5 + ua-parser-js: 0.7.41 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + katex@0.16.25: dependencies: commander: 8.3.0 @@ -27718,15 +25180,8 @@ snapshots: khroma@2.1.0: {} - kill-port@1.6.1: - dependencies: - get-them-args: 1.3.2 - shell-exec: 1.0.2 - kind-of@6.0.3: {} - kleur@4.1.5: {} - klona@2.0.6: {} knockout@3.5.1: {} @@ -27735,8 +25190,6 @@ snapshots: kolorist@1.8.0: {} - kysely@0.27.6: {} - langium@3.3.1: dependencies: chevrotain: 11.0.3 @@ -27745,7 +25198,7 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 - launch-editor@2.10.0: + launch-editor@2.11.1: dependencies: picocolors: 1.1.1 shell-quote: 1.8.3 @@ -27777,8 +25230,6 @@ snapshots: source-map: 0.6.1 optional: true - leven@3.1.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -27825,7 +25276,7 @@ snapshots: lightningcss@1.30.1: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.2 optionalDependencies: lightningcss-darwin-arm64: 1.30.1 lightningcss-darwin-x64: 1.30.1 @@ -27837,6 +25288,7 @@ snapshots: lightningcss-linux-x64-musl: 1.30.1 lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 + optional: true lilconfig@2.1.0: {} @@ -27846,22 +25298,15 @@ snapshots: lines-and-columns@1.2.4: {} - lines-and-columns@2.0.3: {} - - lint-staged@16.1.5: + lint-staged@16.2.5: dependencies: - chalk: 5.5.0 - commander: 14.0.0 - debug: 4.4.1(supports-color@6.0.0) - lilconfig: 3.1.3 - listr2: 9.0.1 + commander: 14.0.1 + listr2: 9.0.4 micromatch: 4.0.8 - nano-spawn: 1.0.2 + nano-spawn: 2.0.0 pidtree: 0.6.0 string-argv: 0.3.2 yaml: 2.8.1 - transitivePeerDependencies: - - supports-color listr2@7.0.2: dependencies: @@ -27872,14 +25317,14 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 8.1.0 - listr2@9.0.1: + listr2@9.0.4: dependencies: - cli-truncate: 4.0.0 + cli-truncate: 5.1.0 colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.1.0 rfdc: 1.4.1 - wrap-ansi: 9.0.0 + wrap-ansi: 9.0.2 load-json-file@2.0.0: dependencies: @@ -27908,8 +25353,6 @@ snapshots: type-fest: 4.26.0 userhome: 1.0.1 - locate-character@3.0.0: {} - locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -27930,17 +25373,23 @@ snapshots: lodash-es@4.17.21: {} - lodash.castarray@4.4.0: {} - lodash.clonedeep@4.5.0: {} lodash.debounce@4.0.8: {} + lodash.escaperegexp@4.1.2: {} + lodash.get@4.4.2: {} + lodash.groupby@4.6.0: {} + lodash.isequal@4.5.0: {} - lodash.isplainobject@4.0.6: {} + lodash.isfunction@3.0.9: {} + + lodash.isnil@4.0.0: {} + + lodash.isundefined@3.0.1: {} lodash.memoize@4.1.2: {} @@ -27972,16 +25421,26 @@ snapshots: ansi-escapes: 5.0.0 cli-cursor: 4.0.0 slice-ansi: 5.0.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi: 8.1.0 log-update@6.1.0: dependencies: - ansi-escapes: 7.0.0 + ansi-escapes: 7.1.1 cli-cursor: 5.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + log4js@6.9.1: + dependencies: + date-format: 4.0.14 + debug: 4.4.3(supports-color@6.0.0) + flatted: 3.3.3 + rfdc: 1.4.1 + streamroller: 3.1.5 + transitivePeerDependencies: + - supports-color loglevel-plugin-prefix@0.8.4: {} @@ -28001,7 +25460,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.2: {} lru-cache@5.1.1: dependencies: @@ -28022,6 +25481,10 @@ snapshots: nan: 2.22.2 optional: true + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -28032,8 +25495,8 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 source-map-js: 1.2.1 make-dir@2.1.0: @@ -28048,7 +25511,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 make-error@1.3.6: {} @@ -28090,6 +25553,22 @@ snapshots: transitivePeerDependencies: - supports-color + make-fetch-happen@15.0.2: + dependencies: + '@npmcli/agent': 4.0.0 + cacache: 20.0.1 + http-cache-semantics: 4.2.0 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + make-fetch-happen@9.1.0: dependencies: agentkeepalive: 4.6.0 @@ -28113,10 +25592,6 @@ snapshots: - supports-color optional: true - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - map-age-cleaner@0.1.3: dependencies: p-defer: 1.0.0 @@ -28154,7 +25629,7 @@ snapshots: markdown-table@3.0.4: {} - marked@16.2.1: {} + marked@16.4.1: {} matcher@3.0.0: dependencies: @@ -28303,16 +25778,6 @@ snapshots: mdn-data@2.12.2: {} - mdsvex@0.12.6(svelte@5.38.6): - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 2.0.11 - prism-svelte: 0.4.7 - prismjs: 1.30.0 - svelte: 5.38.6 - unist-util-visit: 2.0.3 - vfile-message: 2.0.4 - media-typer@0.3.0: {} media-typer@1.1.0: {} @@ -28323,11 +25788,13 @@ snapshots: mimic-fn: 2.1.0 p-is-promise: 2.1.0 - memfs@4.17.2: + memfs@4.42.0: dependencies: - '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) - tree-dump: 1.0.3(tslib@2.8.1) + '@jsonjoy.com/json-pack': 1.14.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.0.1(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 meow@13.2.0: {} @@ -28340,10 +25807,10 @@ snapshots: merge2@1.4.1: {} - mermaid@11.10.1: + mermaid@11.12.0: dependencies: '@braintree/sanitize-url': 7.1.1 - '@iconify/utils': 2.3.0 + '@iconify/utils': 3.0.1 '@mermaid-js/parser': 0.6.2 '@types/d3': 7.4.3 cytoscape: 3.31.2 @@ -28352,12 +25819,12 @@ snapshots: d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.11 - dayjs: 1.11.14 + dayjs: 1.11.18 dompurify: 3.2.5 - katex: 0.16.22 + katex: 0.16.25 khroma: 2.1.0 lodash-es: 4.17.21 - marked: 16.2.1 + marked: 16.4.1 roughjs: 4.6.6 stylis: 4.3.6 ts-dedent: 2.2.0 @@ -28546,7 +26013,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -28596,18 +26063,18 @@ snapshots: mimic-response@3.1.0: {} - mind-elixir@5.0.6: {} + mind-elixir@5.3.3: {} - mini-css-extract-plugin@2.4.7(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + mini-css-extract-plugin@2.4.7(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: schema-utils: 4.3.2 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) - mini-css-extract-plugin@2.9.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + mini-css-extract-plugin@2.9.4(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: schema-utils: 4.3.2 - tapable: 2.2.2 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + tapable: 2.2.3 + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) minimalistic-assert@1.0.1: {} @@ -28631,10 +26098,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.2 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -28726,11 +26189,11 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 - mocha@11.7.1: + mocha@11.7.2: dependencies: browser-stdout: 1.3.1 chokidar: 4.0.3 - debug: 4.4.1(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) diff: 7.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -28744,7 +26207,7 @@ snapshots: serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 9.3.3 + workerpool: 9.3.4 yargs: 17.7.2 yargs-parser: 21.1.1 yargs-unparser: 2.0.0 @@ -28754,7 +26217,7 @@ snapshots: ansi-colors: 3.2.3 browser-stdout: 1.3.1 chokidar: 3.3.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) diff: 3.5.0 escape-string-regexp: 1.0.5 find-up: 3.0.0 @@ -28785,7 +26248,7 @@ snapshots: hasown: 2.0.2 isarray: 2.0.5 - mri@1.2.0: {} + morphdom@2.7.7: {} mrmime@2.0.1: {} @@ -28793,16 +26256,14 @@ snapshots: ms@2.1.1: {} - ms@2.1.2: {} - ms@2.1.3: {} - msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2): + msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.16(@types/node@22.18.0) + '@inquirer/confirm': 5.1.19(@types/node@22.18.12) '@mswjs/interceptors': 0.37.6 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -28818,7 +26279,7 @@ snapshots: type-fest: 4.41.0 yargs: 17.7.2 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - '@types/node' optional: true @@ -28854,13 +26315,15 @@ snapshots: murmurhash-js@1.0.0: {} + mute-stream@1.0.0: {} + mute-stream@2.0.0: optional: true nan@2.22.2: optional: true - nano-spawn@1.0.2: {} + nano-spawn@2.0.0: {} nanoid@3.3.11: {} @@ -28870,8 +26333,6 @@ snapshots: napi-build-utils@2.0.0: {} - napi-postinstall@0.3.2: {} - natural-compare@1.4.0: {} needle@3.3.1: @@ -28894,11 +26355,7 @@ snapshots: nice-try@1.0.5: {} - node-abi@3.75.0: - dependencies: - semver: 7.7.2 - - node-abi@4.9.0: + node-abi@4.14.0: dependencies: semver: 7.7.2 @@ -28942,7 +26399,22 @@ snapshots: proc-log: 5.0.0 semver: 7.7.2 tar: 7.4.3 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + + node-gyp@11.4.2: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + tar: 7.4.3 + tinyglobby: 0.2.15 which: 5.0.0 transitivePeerDependencies: - supports-color @@ -28969,12 +26441,15 @@ snapshots: css-select: 5.2.2 he: 1.2.0 - node-int64@0.4.0: {} - - node-machine-id@1.1.12: {} + node-html-parser@7.0.1: + dependencies: + css-select: 5.2.2 + he: 1.2.0 node-releases@2.0.19: {} + node-releases@2.0.21: {} + nopt@5.0.0: dependencies: abbrev: 1.1.1 @@ -29007,46 +26482,46 @@ snapshots: dependencies: npm-normalize-package-bin: 4.0.0 - npm-install-checks@7.1.1: + npm-install-checks@7.1.2: dependencies: - semver: 7.7.2 + semver: 7.7.3 npm-normalize-package-bin@4.0.0: {} - npm-package-arg@11.0.1: - dependencies: - hosted-git-info: 7.0.2 - proc-log: 3.0.0 - semver: 7.7.2 - validate-npm-package-name: 5.0.1 - npm-package-arg@12.0.2: dependencies: hosted-git-info: 8.1.0 proc-log: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 validate-npm-package-name: 6.0.2 - npm-packlist@10.0.0: + npm-package-arg@13.0.0: dependencies: - ignore-walk: 7.0.0 + hosted-git-info: 9.0.0 + proc-log: 5.0.0 + semver: 7.7.3 + validate-npm-package-name: 6.0.2 + + npm-packlist@10.0.1: + dependencies: + ignore-walk: 8.0.0 npm-pick-manifest@10.0.0: dependencies: - npm-install-checks: 7.1.1 + npm-install-checks: 7.1.2 npm-normalize-package-bin: 4.0.0 npm-package-arg: 12.0.2 - semver: 7.7.2 + semver: 7.7.3 - npm-registry-fetch@18.0.2: + npm-registry-fetch@19.0.0: dependencies: '@npmcli/redact': 3.2.2 jsonparse: 1.3.1 - make-fetch-happen: 14.0.3 + make-fetch-happen: 15.0.2 minipass: 7.1.2 minipass-fetch: 4.0.1 minizlib: 3.0.2 - npm-package-arg: 12.0.2 + npm-package-arg: 13.0.0 proc-log: 5.0.0 transitivePeerDependencies: - supports-color @@ -29073,58 +26548,8 @@ snapshots: nwsapi@2.2.20: {} - nx@21.3.11(@swc-node/register@1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2))(@swc/core@1.11.29(@swc/helpers@0.5.17)): - dependencies: - '@napi-rs/wasm-runtime': 0.2.4 - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.2 - '@zkochan/js-yaml': 0.0.7 - axios: 1.11.0(debug@4.4.1) - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 8.0.1 - dotenv: 16.4.7 - dotenv-expand: 11.0.7 - enquirer: 2.3.6 - figures: 3.2.0 - flat: 5.0.2 - front-matter: 4.0.2 - ignore: 5.3.2 - jest-diff: 30.0.5 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 9.0.3 - node-machine-id: 1.1.12 - npm-run-path: 4.0.1 - open: 8.4.2 - ora: 5.3.0 - resolve.exports: 2.0.3 - semver: 7.7.2 - string-width: 4.2.3 - tar-stream: 2.2.0 - tmp: 0.2.5 - tree-kill: 1.2.2 - tsconfig-paths: 4.2.0 - tslib: 2.8.1 - yaml: 2.8.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@nx/nx-darwin-arm64': 21.3.11 - '@nx/nx-darwin-x64': 21.3.11 - '@nx/nx-freebsd-x64': 21.3.11 - '@nx/nx-linux-arm-gnueabihf': 21.3.11 - '@nx/nx-linux-arm64-gnu': 21.3.11 - '@nx/nx-linux-arm64-musl': 21.3.11 - '@nx/nx-linux-x64-gnu': 21.3.11 - '@nx/nx-linux-x64-musl': 21.3.11 - '@nx/nx-win32-arm64-msvc': 21.3.11 - '@nx/nx-win32-x64-msvc': 21.3.11 - '@swc-node/register': 1.10.10(@swc/core@1.11.29(@swc/helpers@0.5.17))(@swc/types@0.1.21)(typescript@5.9.2) - '@swc/core': 1.11.29(@swc/helpers@0.5.17) - transitivePeerDependencies: - - debug + nwsapi@2.2.22: + optional: true object-assign@4.1.1: {} @@ -29157,26 +26582,51 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + object.getownpropertydescriptors@2.1.8: dependencies: array.prototype.reduce: 1.0.8 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-object-atoms: 1.1.1 gopd: 1.2.0 safe-array-concat: 1.1.3 + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + obuf@1.1.2: {} oidc-token-hash@5.1.0: {} - ollama@0.5.17: + ollama@0.6.0: dependencies: whatwg-fetch: 3.6.20 omggif@1.0.10: {} + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -29204,13 +26654,7 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - openai@5.12.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@3.24.4): + openai@6.6.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@3.24.4): optionalDependencies: ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) zod: 3.24.4 @@ -29238,17 +26682,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@5.3.0: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - ora@5.4.1: dependencies: bl: 4.1.0 @@ -29261,6 +26694,8 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + os-tmpdir@1.0.2: {} + outvariant@1.4.3: optional: true @@ -29270,23 +26705,6 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-resolver@5.3.0: - optionalDependencies: - '@oxc-resolver/binding-darwin-arm64': 5.3.0 - '@oxc-resolver/binding-darwin-x64': 5.3.0 - '@oxc-resolver/binding-freebsd-x64': 5.3.0 - '@oxc-resolver/binding-linux-arm-gnueabihf': 5.3.0 - '@oxc-resolver/binding-linux-arm64-gnu': 5.3.0 - '@oxc-resolver/binding-linux-arm64-musl': 5.3.0 - '@oxc-resolver/binding-linux-riscv64-gnu': 5.3.0 - '@oxc-resolver/binding-linux-s390x-gnu': 5.3.0 - '@oxc-resolver/binding-linux-x64-gnu': 5.3.0 - '@oxc-resolver/binding-linux-x64-musl': 5.3.0 - '@oxc-resolver/binding-wasm32-wasi': 5.3.0 - '@oxc-resolver/binding-win32-arm64-msvc': 5.3.0 - '@oxc-resolver/binding-win32-x64-msvc': 5.3.0 - optional: true - p-cancelable@2.1.1: {} p-defer@1.0.0: {} @@ -29341,7 +26759,7 @@ snapshots: p-retry@6.2.1: dependencies: '@types/retry': 0.12.2 - is-network-error: 1.1.0 + is-network-error: 1.2.0 retry: 0.13.1 p-timeout@3.2.0: @@ -29356,7 +26774,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.4 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) get-uri: 6.0.5 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -29372,29 +26790,27 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.11: - dependencies: - quansync: 0.2.10 + package-manager-detector@1.3.0: {} - pacote@21.0.0: + pacote@21.0.1: dependencies: '@npmcli/git': 6.0.3 '@npmcli/installed-package-contents': 3.0.0 - '@npmcli/package-json': 6.2.0 - '@npmcli/promise-spawn': 8.0.2 - '@npmcli/run-script': 9.1.0 - cacache: 19.0.1 + '@npmcli/package-json': 7.0.0 + '@npmcli/promise-spawn': 8.0.3 + '@npmcli/run-script': 10.0.0 + cacache: 20.0.1 fs-minipass: 3.0.3 minipass: 7.1.2 - npm-package-arg: 12.0.2 - npm-packlist: 10.0.0 + npm-package-arg: 13.0.0 + npm-packlist: 10.0.1 npm-pick-manifest: 10.0.0 - npm-registry-fetch: 18.0.2 + npm-registry-fetch: 19.0.0 proc-log: 5.0.0 promise-retry: 2.0.1 - sigstore: 3.1.0 + sigstore: 4.0.0 ssri: 12.0.0 - tar: 6.2.1 + tar: 7.4.3 transitivePeerDependencies: - supports-color @@ -29492,7 +26908,7 @@ snapshots: path-scurry@2.0.0: dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.2 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -29543,8 +26959,6 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -29554,8 +26968,6 @@ snapshots: pify@4.0.1: optional: true - pirates@4.0.7: {} - pixelmatch@5.3.0: dependencies: pngjs: 6.0.0 @@ -29576,11 +26988,11 @@ snapshots: exsolve: 1.0.5 pathe: 2.0.3 - playwright-core@1.55.0: {} + playwright-core@1.56.1: {} - playwright@1.55.0: + playwright@1.56.1: dependencies: - playwright-core: 1.55.0 + playwright-core: 1.56.1 optionalDependencies: fsevents: 2.3.2 @@ -29623,7 +27035,7 @@ snapshots: portfinder@1.0.36: dependencies: async: 3.2.6 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -29641,9 +27053,9 @@ snapshots: postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-calc@8.2.4(postcss@8.5.3): + postcss-calc@8.2.4(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 @@ -29653,17 +27065,17 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 - postcss-colormin@5.3.1(postcss@8.5.3): + postcss-colormin@5.3.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-colormin@6.1.0(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.3 @@ -29671,7 +27083,7 @@ snapshots: postcss-colormin@7.0.2(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.3 @@ -29679,39 +27091,39 @@ snapshots: postcss-colormin@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-convert-values@5.1.3(postcss@8.5.3): + postcss-convert-values@5.1.3(postcss@8.5.6): dependencies: - browserslist: 4.25.1 - postcss: 8.5.3 + browserslist: 4.26.2 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-convert-values@6.1.0(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-convert-values@7.0.4(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.3 postcss-value-parser: 4.2.0 - postcss-convert-values@7.0.6(postcss@8.5.6): + postcss-convert-values@7.0.7(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-discard-comments@5.1.2(postcss@8.5.3): + postcss-discard-comments@5.1.2(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-discard-comments@6.0.2(postcss@8.5.3): dependencies: @@ -29727,9 +27139,9 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 7.1.0 - postcss-discard-duplicates@5.1.0(postcss@8.5.3): + postcss-discard-duplicates@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-discard-duplicates@6.0.3(postcss@8.5.3): dependencies: @@ -29743,9 +27155,9 @@ snapshots: dependencies: postcss: 8.5.6 - postcss-discard-empty@5.1.1(postcss@8.5.3): + postcss-discard-empty@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-discard-empty@6.0.3(postcss@8.5.3): dependencies: @@ -29759,9 +27171,9 @@ snapshots: dependencies: postcss: 8.5.6 - postcss-discard-overridden@5.1.0(postcss@8.5.3): + postcss-discard-overridden@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-discard-overridden@6.0.2(postcss@8.5.3): dependencies: @@ -29794,55 +27206,47 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.3 - postcss-js@4.0.1(postcss@8.5.6): + postcss-js@4.1.0(postcss@8.5.6): dependencies: camelcase-css: 2.0.1 postcss: 8.5.6 - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.3.0)(typescript@5.9.2)): - dependencies: - lilconfig: 2.1.0 - yaml: 1.10.2 - optionalDependencies: - postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.3.0)(typescript@5.9.2) - - postcss-loader@4.3.0(postcss@8.5.3)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + postcss-loader@4.3.0(postcss@8.5.3)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 loader-utils: 2.0.4 postcss: 8.5.3 schema-utils: 3.3.0 - semver: 7.7.2 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + semver: 7.7.3 + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) - postcss-loader@4.3.0(postcss@8.5.6)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + postcss-loader@4.3.0(postcss@8.5.6)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 loader-utils: 2.0.4 postcss: 8.5.6 schema-utils: 3.3.0 - semver: 7.7.2 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + semver: 7.7.3 + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) - postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: cosmiconfig: 9.0.0(typescript@5.0.4) - jiti: 1.21.7 + jiti: 2.6.1 postcss: 8.5.6 - semver: 7.7.2 + semver: 7.7.3 optionalDependencies: - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) transitivePeerDependencies: - typescript - postcss-merge-longhand@5.1.7(postcss@8.5.3): + postcss-merge-longhand@5.1.7(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.5.3) + stylehacks: 5.1.1(postcss@8.5.6) postcss-merge-longhand@6.0.5(postcss@8.5.3): dependencies: @@ -29862,17 +27266,17 @@ snapshots: postcss-value-parser: 4.2.0 stylehacks: 7.0.6(postcss@8.5.6) - postcss-merge-rules@5.1.4(postcss@8.5.3): + postcss-merge-rules@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-merge-rules@6.1.1(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 cssnano-utils: 4.0.2(postcss@8.5.3) postcss: 8.5.3 @@ -29880,7 +27284,7 @@ snapshots: postcss-merge-rules@7.0.4(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 cssnano-utils: 5.0.0(postcss@8.5.3) postcss: 8.5.3 @@ -29888,15 +27292,15 @@ snapshots: postcss-merge-rules@7.0.6(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 postcss-selector-parser: 7.1.0 - postcss-minify-font-values@5.1.0(postcss@8.5.3): + postcss-minify-font-values@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-minify-font-values@6.1.0(postcss@8.5.3): @@ -29914,11 +27318,11 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-gradients@5.1.1(postcss@8.5.3): + postcss-minify-gradients@5.1.1(postcss@8.5.6): dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-minify-gradients@6.0.3(postcss@8.5.3): @@ -29942,37 +27346,37 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-params@5.1.4(postcss@8.5.3): + postcss-minify-params@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 + browserslist: 4.26.2 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-minify-params@6.1.0(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 cssnano-utils: 4.0.2(postcss@8.5.3) postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-minify-params@7.0.2(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 cssnano-utils: 5.0.0(postcss@8.5.3) postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-minify-params@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 cssnano-utils: 5.0.1(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-minify-selectors@5.2.1(postcss@8.5.3): + postcss-minify-selectors@5.2.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-minify-selectors@6.0.4(postcss@8.5.3): @@ -29995,10 +27399,10 @@ snapshots: postcss-mixins@11.0.3(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-js: 4.0.1(postcss@8.5.6) + postcss-js: 4.1.0(postcss@8.5.6) postcss-simple-vars: 7.0.1(postcss@8.5.6) sugarss: 4.0.1(postcss@8.5.6) - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 postcss-mixins@9.0.4(postcss@8.5.3): dependencies: @@ -30008,21 +27412,10 @@ snapshots: postcss-simple-vars: 7.0.1(postcss@8.5.3) sugarss: 4.0.1(postcss@8.5.3) - postcss-modules-extract-imports@3.1.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 - postcss-modules-local-by-default@4.2.0(postcss@8.5.3): - dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-selector-parser: 7.1.0 - postcss-value-parser: 4.2.0 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): dependencies: icss-utils: 5.1.0(postcss@8.5.6) @@ -30030,21 +27423,11 @@ snapshots: postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-selector-parser: 7.1.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): dependencies: postcss: 8.5.6 postcss-selector-parser: 7.1.0 - postcss-modules-values@4.0.0(postcss@8.5.3): - dependencies: - icss-utils: 5.1.0(postcss@8.5.3) - postcss: 8.5.3 - postcss-modules-values@4.0.0(postcss@8.5.6): dependencies: icss-utils: 5.1.0(postcss@8.5.6) @@ -30064,9 +27447,9 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 7.1.0 - postcss-normalize-charset@5.1.0(postcss@8.5.3): + postcss-normalize-charset@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-normalize-charset@6.0.2(postcss@8.5.3): dependencies: @@ -30080,9 +27463,9 @@ snapshots: dependencies: postcss: 8.5.6 - postcss-normalize-display-values@5.1.0(postcss@8.5.3): + postcss-normalize-display-values@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-normalize-display-values@6.0.2(postcss@8.5.3): @@ -30100,9 +27483,9 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-positions@5.1.1(postcss@8.5.3): + postcss-normalize-positions@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-normalize-positions@6.0.2(postcss@8.5.3): @@ -30120,9 +27503,9 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@5.1.1(postcss@8.5.3): + postcss-normalize-repeat-style@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-normalize-repeat-style@6.0.2(postcss@8.5.3): @@ -30140,9 +27523,9 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-string@5.1.0(postcss@8.5.3): + postcss-normalize-string@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-normalize-string@6.0.2(postcss@8.5.3): @@ -30160,9 +27543,9 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@5.1.0(postcss@8.5.3): + postcss-normalize-timing-functions@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-normalize-timing-functions@6.0.2(postcss@8.5.3): @@ -30180,34 +27563,34 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@5.1.1(postcss@8.5.3): + postcss-normalize-unicode@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 - postcss: 8.5.3 + browserslist: 4.26.2 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-normalize-unicode@6.1.0(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-unicode@7.0.2(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-unicode@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-url@5.1.0(postcss@8.5.3): + postcss-normalize-url@5.1.0(postcss@8.5.6): dependencies: normalize-url: 6.1.0 - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-normalize-url@6.0.2(postcss@8.5.3): @@ -30225,9 +27608,9 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@5.1.1(postcss@8.5.3): + postcss-normalize-whitespace@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-normalize-whitespace@6.0.2(postcss@8.5.3): @@ -30245,10 +27628,10 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-ordered-values@5.1.3(postcss@8.5.3): + postcss-ordered-values@5.1.3(postcss@8.5.6): dependencies: - cssnano-utils: 3.1.0(postcss@8.5.3) - postcss: 8.5.3 + cssnano-utils: 3.1.0(postcss@8.5.6) + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-ordered-values@6.0.2(postcss@8.5.3): @@ -30269,33 +27652,33 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 - postcss-reduce-initial@5.1.2(postcss@8.5.3): + postcss-reduce-initial@5.1.2(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 - postcss: 8.5.3 + postcss: 8.5.6 postcss-reduce-initial@6.1.0(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 postcss: 8.5.3 postcss-reduce-initial@7.0.2(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 postcss: 8.5.3 postcss-reduce-initial@7.0.4(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 caniuse-api: 3.0.0 postcss: 8.5.6 - postcss-reduce-transforms@5.1.0(postcss@8.5.3): + postcss-reduce-transforms@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 postcss-reduce-transforms@6.0.2(postcss@8.5.3): @@ -30319,15 +27702,6 @@ snapshots: dependencies: postcss: 8.5.6 - postcss-scss@4.0.9(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-selector-parser@6.0.10: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 @@ -30346,9 +27720,9 @@ snapshots: dependencies: postcss: 8.5.6 - postcss-svgo@5.1.0(postcss@8.5.3): + postcss-svgo@5.1.0(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-value-parser: 4.2.0 svgo: 2.8.0 @@ -30370,9 +27744,9 @@ snapshots: postcss-value-parser: 4.2.0 svgo: 4.0.0 - postcss-unique-selectors@5.1.1(postcss@8.5.3): + postcss-unique-selectors@5.1.1(postcss@8.5.6): dependencies: - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 postcss-unique-selectors@6.0.4(postcss@8.5.3): @@ -30410,21 +27784,30 @@ snapshots: potpack@2.1.0: {} - preact@10.27.1: {} + preact-iso@2.11.0(preact-render-to-string@6.6.2(preact@10.27.2))(preact@10.27.2): + dependencies: + preact: 10.27.2 + preact-render-to-string: 6.6.2(preact@10.27.2) + + preact-render-to-string@6.6.2(preact@10.27.2): + dependencies: + preact: 10.27.2 + + preact@10.27.2: {} prebuild-install@7.1.3: dependencies: - detect-libc: 2.0.4 + detect-libc: 2.1.1 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.75.0 - pump: 3.0.2 + node-abi: 4.14.0 + pump: 3.0.3 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 3.1.0 + tar-fs: 3.1.1 tunnel-agent: 0.6.0 transitivePeerDependencies: - bare-buffer @@ -30437,20 +27820,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 - pretty-format@30.0.5: - dependencies: - '@jest/schemas': 30.0.5 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - prism-svelte@0.4.7: {} - - prismjs@1.30.0: {} - proc-log@2.0.1: {} - proc-log@3.0.0: {} - proc-log@5.0.0: {} process-nextick-args@2.0.1: {} @@ -30486,7 +27857,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.18.0 + '@types/node': 22.18.12 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -30499,7 +27870,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -30518,33 +27889,30 @@ snapshots: dependencies: punycode: 2.3.1 - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - pump@3.0.3: dependencies: end-of-stream: 1.4.5 once: 1.4.0 + punycode@1.4.1: {} + punycode@2.3.1: {} pupa@3.1.0: dependencies: escape-goat: 4.0.0 - pure-rand@7.0.1: {} - purgecss@6.0.0: dependencies: commander: 12.1.0 glob: 10.4.5 - postcss: 8.5.3 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 pwacompat@2.0.17: {} + qjobs@1.2.0: {} + qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -30604,11 +27972,11 @@ snapshots: raw-loader@0.5.1: {} - raw-loader@4.0.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + raw-loader@4.0.2(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) rc@1.2.8: dependencies: @@ -30630,15 +27998,15 @@ snapshots: react: 16.14.0 scheduler: 0.26.0 - react-i18next@15.7.2(i18next@25.4.2(typescript@5.9.2))(react-dom@19.1.0(react@16.14.0))(react@16.14.0)(typescript@5.9.2): + react-i18next@16.1.2(i18next@25.6.0(typescript@5.9.3))(react-dom@19.1.0(react@16.14.0))(react@16.14.0)(typescript@5.9.3): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 - i18next: 25.4.2(typescript@5.9.2) + i18next: 25.6.0(typescript@5.9.3) react: 16.14.0 optionalDependencies: react-dom: 19.1.0(react@16.14.0) - typescript: 5.9.2 + typescript: 5.9.3 react-interactive@0.8.3(react@16.14.0): dependencies: @@ -30651,9 +28019,7 @@ snapshots: react-is@17.0.2: {} - react-is@18.3.1: {} - - react-refresh@0.17.0: {} + react-refresh@0.18.0: {} react-remove-scroll-bar@2.3.8(@types/react@19.1.7)(react@16.14.0): dependencies: @@ -30711,7 +28077,7 @@ snapshots: read-binary-file-arch@1.0.6: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -30784,23 +28150,19 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.9 + es-abstract: 1.24.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 - regenerate-unicode-properties@10.2.0: + regenerate-unicode-properties@8.2.0: dependencies: regenerate: 1.4.2 regenerate@1.4.2: {} - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.27.6 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -30810,20 +28172,20 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regexpu-core@6.2.0: + regexpu-core@4.5.4: dependencies: regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 + regenerate-unicode-properties: 8.2.0 + regjsgen: 0.5.2 + regjsparser: 0.6.9 + unicode-match-property-ecmascript: 1.0.4 + unicode-match-property-value-ecmascript: 1.2.0 - regjsgen@0.8.0: {} + regjsgen@0.5.2: {} - regjsparser@0.12.0: + regjsparser@0.6.9: dependencies: - jsesc: 3.0.2 + jsesc: 0.5.0 rehype-dom-parse@5.0.2: dependencies: @@ -30890,7 +28252,8 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - repeat-string@1.6.1: {} + repeat-string@1.6.1: + optional: true require-directory@2.1.1: {} @@ -30926,6 +28289,12 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 @@ -30957,6 +28326,8 @@ snapshots: reusify@1.1.0: {} + reveal.js@5.2.1: {} + rfdc@1.4.1: {} rgb2hex@0.2.5: {} @@ -30992,7 +28363,7 @@ snapshots: '@oxc-project/runtime': 0.77.3 '@oxc-project/types': 0.77.3 '@rolldown/pluginutils': 1.0.0-beta.29 - ansis: 4.1.0 + ansis: 4.2.0 optionalDependencies: '@rolldown/binding-android-arm64': 1.0.0-beta.29 '@rolldown/binding-darwin-arm64': 1.0.0-beta.29 @@ -31008,28 +28379,29 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.29 '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.29 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.29 + optional: true - rollup-plugin-stats@1.5.0(rolldown@1.0.0-beta.29)(rollup@4.46.3)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): + rollup-plugin-stats@1.5.1(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: rolldown: 1.0.0-beta.29 - rollup: 4.46.3 - vite: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + rollup: 4.52.0 + vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) rollup-plugin-styles@4.0.0(rollup@4.40.0): dependencies: '@rollup/pluginutils': 4.2.1 - '@types/cssnano': 5.1.3(postcss@8.5.3) + '@types/cssnano': 5.1.3(postcss@8.5.6) cosmiconfig: 7.1.0 - cssnano: 5.1.15(postcss@8.5.3) + cssnano: 5.1.15(postcss@8.5.6) fs-extra: 10.1.0 - icss-utils: 5.1.0(postcss@8.5.3) + icss-utils: 5.1.0(postcss@8.5.6) mime-types: 2.1.35 p-queue: 6.6.2 - postcss: 8.5.3 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.3) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.3) - postcss-modules-scope: 3.2.1(postcss@8.5.3) - postcss-modules-values: 4.0.0(postcss@8.5.3) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) postcss-value-parser: 4.2.0 query-string: 7.1.3 resolve: 1.22.10 @@ -31042,13 +28414,13 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.40.0) rollup: 4.40.0 - rollup-plugin-webpack-stats@2.1.4(rolldown@1.0.0-beta.29)(rollup@4.46.3)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): + rollup-plugin-webpack-stats@2.1.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - rolldown: 1.0.0-beta.29 - rollup-plugin-stats: 1.5.0(rolldown@1.0.0-beta.29)(rollup@4.46.3)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + rollup-plugin-stats: 1.5.1(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: - rollup: 4.46.3 - vite: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + rolldown: 1.0.0-beta.29 + rollup: 4.52.0 + vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) rollup@4.40.0: dependencies: @@ -31076,30 +28448,32 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 - rollup@4.46.3: + rollup@4.52.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.46.3 - '@rollup/rollup-android-arm64': 4.46.3 - '@rollup/rollup-darwin-arm64': 4.46.3 - '@rollup/rollup-darwin-x64': 4.46.3 - '@rollup/rollup-freebsd-arm64': 4.46.3 - '@rollup/rollup-freebsd-x64': 4.46.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.46.3 - '@rollup/rollup-linux-arm-musleabihf': 4.46.3 - '@rollup/rollup-linux-arm64-gnu': 4.46.3 - '@rollup/rollup-linux-arm64-musl': 4.46.3 - '@rollup/rollup-linux-loongarch64-gnu': 4.46.3 - '@rollup/rollup-linux-ppc64-gnu': 4.46.3 - '@rollup/rollup-linux-riscv64-gnu': 4.46.3 - '@rollup/rollup-linux-riscv64-musl': 4.46.3 - '@rollup/rollup-linux-s390x-gnu': 4.46.3 - '@rollup/rollup-linux-x64-gnu': 4.46.3 - '@rollup/rollup-linux-x64-musl': 4.46.3 - '@rollup/rollup-win32-arm64-msvc': 4.46.3 - '@rollup/rollup-win32-ia32-msvc': 4.46.3 - '@rollup/rollup-win32-x64-msvc': 4.46.3 + '@rollup/rollup-android-arm-eabi': 4.52.0 + '@rollup/rollup-android-arm64': 4.52.0 + '@rollup/rollup-darwin-arm64': 4.52.0 + '@rollup/rollup-darwin-x64': 4.52.0 + '@rollup/rollup-freebsd-arm64': 4.52.0 + '@rollup/rollup-freebsd-x64': 4.52.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.0 + '@rollup/rollup-linux-arm-musleabihf': 4.52.0 + '@rollup/rollup-linux-arm64-gnu': 4.52.0 + '@rollup/rollup-linux-arm64-musl': 4.52.0 + '@rollup/rollup-linux-loong64-gnu': 4.52.0 + '@rollup/rollup-linux-ppc64-gnu': 4.52.0 + '@rollup/rollup-linux-riscv64-gnu': 4.52.0 + '@rollup/rollup-linux-riscv64-musl': 4.52.0 + '@rollup/rollup-linux-s390x-gnu': 4.52.0 + '@rollup/rollup-linux-x64-gnu': 4.52.0 + '@rollup/rollup-linux-x64-musl': 4.52.0 + '@rollup/rollup-openharmony-arm64': 4.52.0 + '@rollup/rollup-win32-arm64-msvc': 4.52.0 + '@rollup/rollup-win32-ia32-msvc': 4.52.0 + '@rollup/rollup-win32-x64-gnu': 4.52.0 + '@rollup/rollup-win32-x64-msvc': 4.52.0 fsevents: 2.3.3 roughjs@4.6.6: @@ -31111,7 +28485,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -31119,9 +28493,10 @@ snapshots: transitivePeerDependencies: - supports-color - rrweb-cssom@0.8.0: {} + rrweb-cssom@0.8.0: + optional: true - run-applescript@7.0.0: {} + run-applescript@7.1.0: {} run-parallel@1.2.0: dependencies: @@ -31134,10 +28509,6 @@ snapshots: tslib: 2.8.1 optional: true - sade@1.8.1: - dependencies: - mri: 1.2.0 - safaridriver@1.0.0: {} safe-array-concat@1.1.3: @@ -31186,97 +28557,93 @@ snapshots: parse-srcset: 1.0.2 postcss: 8.5.3 - sass-embedded-android-arm64@1.87.0: - optional: true - - sass-embedded-android-arm@1.87.0: - optional: true - - sass-embedded-android-ia32@1.87.0: - optional: true - - sass-embedded-android-riscv64@1.87.0: - optional: true - - sass-embedded-android-x64@1.87.0: - optional: true - - sass-embedded-darwin-arm64@1.87.0: - optional: true - - sass-embedded-darwin-x64@1.87.0: - optional: true - - sass-embedded-linux-arm64@1.87.0: - optional: true - - sass-embedded-linux-arm@1.87.0: - optional: true - - sass-embedded-linux-ia32@1.87.0: - optional: true - - sass-embedded-linux-musl-arm64@1.87.0: - optional: true - - sass-embedded-linux-musl-arm@1.87.0: - optional: true - - sass-embedded-linux-musl-ia32@1.87.0: - optional: true - - sass-embedded-linux-musl-riscv64@1.87.0: - optional: true - - sass-embedded-linux-musl-x64@1.87.0: - optional: true - - sass-embedded-linux-riscv64@1.87.0: - optional: true - - sass-embedded-linux-x64@1.87.0: - optional: true - - sass-embedded-win32-arm64@1.87.0: - optional: true - - sass-embedded-win32-ia32@1.87.0: - optional: true - - sass-embedded-win32-x64@1.87.0: - optional: true - - sass-embedded@1.87.0: + sass-embedded-all-unknown@1.91.0: dependencies: - '@bufbuild/protobuf': 2.7.0 + sass: 1.91.0 + optional: true + + sass-embedded-android-arm64@1.91.0: + optional: true + + sass-embedded-android-arm@1.91.0: + optional: true + + sass-embedded-android-riscv64@1.91.0: + optional: true + + sass-embedded-android-x64@1.91.0: + optional: true + + sass-embedded-darwin-arm64@1.91.0: + optional: true + + sass-embedded-darwin-x64@1.91.0: + optional: true + + sass-embedded-linux-arm64@1.91.0: + optional: true + + sass-embedded-linux-arm@1.91.0: + optional: true + + sass-embedded-linux-musl-arm64@1.91.0: + optional: true + + sass-embedded-linux-musl-arm@1.91.0: + optional: true + + sass-embedded-linux-musl-riscv64@1.91.0: + optional: true + + sass-embedded-linux-musl-x64@1.91.0: + optional: true + + sass-embedded-linux-riscv64@1.91.0: + optional: true + + sass-embedded-linux-x64@1.91.0: + optional: true + + sass-embedded-unknown-all@1.91.0: + dependencies: + sass: 1.91.0 + optional: true + + sass-embedded-win32-arm64@1.91.0: + optional: true + + sass-embedded-win32-x64@1.91.0: + optional: true + + sass-embedded@1.91.0: + dependencies: + '@bufbuild/protobuf': 2.10.0 buffer-builder: 0.2.0 colorjs.io: 0.5.2 - immutable: 5.1.3 + immutable: 5.1.4 rxjs: 7.8.2 supports-color: 8.1.1 sync-child-process: 1.0.2 varint: 6.0.0 optionalDependencies: - sass-embedded-android-arm: 1.87.0 - sass-embedded-android-arm64: 1.87.0 - sass-embedded-android-ia32: 1.87.0 - sass-embedded-android-riscv64: 1.87.0 - sass-embedded-android-x64: 1.87.0 - sass-embedded-darwin-arm64: 1.87.0 - sass-embedded-darwin-x64: 1.87.0 - sass-embedded-linux-arm: 1.87.0 - sass-embedded-linux-arm64: 1.87.0 - sass-embedded-linux-ia32: 1.87.0 - sass-embedded-linux-musl-arm: 1.87.0 - sass-embedded-linux-musl-arm64: 1.87.0 - sass-embedded-linux-musl-ia32: 1.87.0 - sass-embedded-linux-musl-riscv64: 1.87.0 - sass-embedded-linux-musl-x64: 1.87.0 - sass-embedded-linux-riscv64: 1.87.0 - sass-embedded-linux-x64: 1.87.0 - sass-embedded-win32-arm64: 1.87.0 - sass-embedded-win32-ia32: 1.87.0 - sass-embedded-win32-x64: 1.87.0 + sass-embedded-all-unknown: 1.91.0 + sass-embedded-android-arm: 1.91.0 + sass-embedded-android-arm64: 1.91.0 + sass-embedded-android-riscv64: 1.91.0 + sass-embedded-android-x64: 1.91.0 + sass-embedded-darwin-arm64: 1.91.0 + sass-embedded-darwin-x64: 1.91.0 + sass-embedded-linux-arm: 1.91.0 + sass-embedded-linux-arm64: 1.91.0 + sass-embedded-linux-musl-arm: 1.91.0 + sass-embedded-linux-musl-arm64: 1.91.0 + sass-embedded-linux-musl-riscv64: 1.91.0 + sass-embedded-linux-musl-x64: 1.91.0 + sass-embedded-linux-riscv64: 1.91.0 + sass-embedded-linux-x64: 1.91.0 + sass-embedded-unknown-all: 1.91.0 + sass-embedded-win32-arm64: 1.91.0 + sass-embedded-win32-x64: 1.91.0 optional: true sass@1.51.0: @@ -31285,10 +28652,10 @@ snapshots: immutable: 4.3.7 source-map-js: 1.2.1 - sass@1.87.0: + sass@1.91.0: dependencies: chokidar: 4.0.3 - immutable: 5.1.3 + immutable: 5.1.4 source-map-js: 1.2.1 optionalDependencies: '@parcel/watcher': 2.5.1 @@ -31303,6 +28670,7 @@ snapshots: saxes@6.0.0: dependencies: xmlchars: 2.2.0 + optional: true scheduler@0.19.1: dependencies: @@ -31334,7 +28702,7 @@ snapshots: selfsigned@2.4.1: dependencies: - '@types/node-forge': 1.3.13 + '@types/node-forge': 1.3.14 node-forge: 1.3.1 semver-compare@1.0.0: @@ -31352,6 +28720,8 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -31372,7 +28742,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -31443,8 +28813,6 @@ snapshots: set-blocking@2.0.0: {} - set-cookie-parser@2.7.1: {} - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -31485,8 +28853,6 @@ snapshots: shebang-regex@3.0.0: {} - shell-exec@1.0.2: {} - shell-quote@1.8.3: {} shelljs@0.10.0: @@ -31536,14 +28902,14 @@ snapshots: signal-exit@4.1.0: {} - sigstore@3.1.0: + sigstore@4.0.0: dependencies: - '@sigstore/bundle': 3.1.0 - '@sigstore/core': 2.0.0 - '@sigstore/protobuf-specs': 0.4.3 - '@sigstore/sign': 3.1.0 - '@sigstore/tuf': 3.1.1 - '@sigstore/verify': 2.1.1 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 + '@sigstore/sign': 4.0.0 + '@sigstore/tuf': 4.0.0 + '@sigstore/verify': 3.0.0 transitivePeerDependencies: - supports-color @@ -31563,7 +28929,7 @@ snapshots: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -31585,13 +28951,13 @@ snapshots: slice-ansi@5.0.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 - slice-ansi@7.1.0: + slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 sliced@1.0.1: {} @@ -31599,6 +28965,15 @@ snapshots: smob@1.5.0: {} + socket.io-adapter@2.5.5(bufferutil@4.0.9)(utf-8-validate@6.0.5): + dependencies: + debug: 4.3.7 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + socket.io-client@4.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@socket.io/component-emitter': 3.1.2 @@ -31617,6 +28992,20 @@ snapshots: transitivePeerDependencies: - supports-color + socket.io@4.8.1(bufferutil@4.0.9)(utf-8-validate@6.0.5): + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io-adapter: 2.5.5(bufferutil@4.0.9)(utf-8-validate@6.0.5) + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + sockjs@0.3.24: dependencies: faye-websocket: 0.11.4 @@ -31626,7 +29015,7 @@ snapshots: socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) socks: 2.8.4 transitivePeerDependencies: - supports-color @@ -31635,7 +29024,7 @@ snapshots: socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -31643,8 +29032,8 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@6.0.0) - socks: 2.8.5 + debug: 4.4.3(supports-color@6.0.0) + socks: 2.8.7 transitivePeerDependencies: - supports-color @@ -31654,11 +29043,6 @@ snapshots: smart-buffer: 4.2.0 optional: true - socks@2.8.5: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - socks@2.8.7: dependencies: ip-address: 10.0.1 @@ -31676,16 +29060,6 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map-support@0.5.19: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -31697,6 +29071,8 @@ snapshots: source-map@0.7.6: {} + sourcemap-codec@1.4.8: {} + space-separated-tokens@2.0.2: {} spacetrim@0.11.59: {} @@ -31704,20 +29080,20 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.21 + spdx-license-ids: 3.0.22 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 + spdx-license-ids: 3.0.22 - spdx-license-ids@3.0.21: {} + spdx-license-ids@3.0.22: {} spdy-transport@3.0.0: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -31728,7 +29104,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -31740,18 +29116,12 @@ snapshots: split-on-first@1.1.0: {} - split.js@1.6.5: {} - split2@4.2.0: {} sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - - sqlite-wasm-kysely@0.3.0(kysely@0.27.6): - dependencies: - '@sqlite.org/sqlite-wasm': 3.48.0-build4 - kysely: 0.27.6 + sprintf-js@1.1.3: + optional: true sqlite3@5.1.7: dependencies: @@ -31786,10 +29156,6 @@ snapshots: stack-trace@1.0.0-pre2: {} - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - stackback@0.0.2: {} statuses@1.5.0: {} @@ -31800,6 +29166,11 @@ snapshots: std-env@3.9.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + stream-buffers@2.2.0: optional: true @@ -31808,6 +29179,14 @@ snapshots: commander: 2.20.3 limiter: 1.1.5 + streamroller@3.1.5: + dependencies: + date-format: 4.0.14 + debug: 4.4.3(supports-color@6.0.0) + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + streamsearch@1.1.0: {} streamx@2.22.0: @@ -31817,12 +29196,11 @@ snapshots: optionalDependencies: bare-events: 2.5.4 - streamx@2.22.1: + streamx@2.23.0: dependencies: + events-universal: 1.0.1 fast-fifo: 1.3.2 text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.6.0 optional: true strict-event-emitter@0.5.1: @@ -31832,11 +29210,6 @@ snapshots: string-argv@0.3.2: {} - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - string-width@2.1.1: dependencies: is-fullwidth-code-point: 2.0.0 @@ -31858,13 +29231,39 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 string.prototype.trim@1.2.10: dependencies: @@ -31914,14 +29313,12 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} - strip-bom@4.0.0: {} - strip-bom@5.0.0: {} strip-eof@1.0.0: {} @@ -31956,84 +29353,84 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 4.1.0 - style-loader@2.0.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + style-loader@2.0.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) - style-loader@4.0.0(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + style-loader@4.0.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) style-mod@4.1.2: {} style-search@0.1.0: {} - stylehacks@5.1.1(postcss@8.5.3): + stylehacks@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.25.1 - postcss: 8.5.3 + browserslist: 4.26.2 + postcss: 8.5.6 postcss-selector-parser: 6.1.2 stylehacks@6.1.1(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.3 postcss-selector-parser: 6.1.2 stylehacks@7.0.4(postcss@8.5.3): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.3 postcss-selector-parser: 6.1.2 stylehacks@7.0.6(postcss@8.5.6): dependencies: - browserslist: 4.25.1 + browserslist: 4.26.2 postcss: 8.5.6 postcss-selector-parser: 7.1.0 - stylelint-config-ckeditor5@12.1.1(stylelint@16.23.1(typescript@5.9.2)): + stylelint-config-ckeditor5@12.1.1(stylelint@16.25.0(typescript@5.9.3)): dependencies: - '@stylistic/stylelint-plugin': 3.1.3(stylelint@16.23.1(typescript@5.9.2)) - stylelint: 16.23.1(typescript@5.9.2) - stylelint-config-recommended: 16.0.0(stylelint@16.23.1(typescript@5.9.2)) - stylelint-plugin-ckeditor5-rules: 12.1.1(stylelint@16.23.1(typescript@5.9.2)) + '@stylistic/stylelint-plugin': 3.1.3(stylelint@16.25.0(typescript@5.9.3)) + stylelint: 16.25.0(typescript@5.9.3) + stylelint-config-recommended: 16.0.0(stylelint@16.25.0(typescript@5.9.3)) + stylelint-plugin-ckeditor5-rules: 12.1.1(stylelint@16.25.0(typescript@5.9.3)) - stylelint-config-ckeditor5@2.0.1(stylelint@16.23.1(typescript@5.9.2)): + stylelint-config-ckeditor5@2.0.1(stylelint@16.25.0(typescript@5.9.3)): dependencies: - stylelint: 16.23.1(typescript@5.9.2) - stylelint-config-recommended: 3.0.0(stylelint@16.23.1(typescript@5.9.2)) + stylelint: 16.25.0(typescript@5.9.3) + stylelint-config-recommended: 3.0.0(stylelint@16.25.0(typescript@5.9.3)) - stylelint-config-recommended@16.0.0(stylelint@16.23.1(typescript@5.9.2)): + stylelint-config-recommended@16.0.0(stylelint@16.25.0(typescript@5.9.3)): dependencies: - stylelint: 16.23.1(typescript@5.9.2) + stylelint: 16.25.0(typescript@5.9.3) - stylelint-config-recommended@3.0.0(stylelint@16.23.1(typescript@5.9.2)): + stylelint-config-recommended@3.0.0(stylelint@16.25.0(typescript@5.9.3)): dependencies: - stylelint: 16.23.1(typescript@5.9.2) + stylelint: 16.25.0(typescript@5.9.3) - stylelint-plugin-ckeditor5-rules@12.1.1(stylelint@16.23.1(typescript@5.9.2)): + stylelint-plugin-ckeditor5-rules@12.1.1(stylelint@16.25.0(typescript@5.9.3)): dependencies: - stylelint: 16.23.1(typescript@5.9.2) + stylelint: 16.25.0(typescript@5.9.3) - stylelint@16.23.1(typescript@5.0.4): + stylelint@16.25.0(typescript@5.0.4): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) - '@dual-bundle/import-meta-resolve': 4.1.0 + '@dual-bundle/import-meta-resolve': 4.2.1 balanced-match: 2.0.0 colord: 2.9.3 cosmiconfig: 9.0.0(typescript@5.0.4) css-functions-list: 3.2.3 css-tree: 3.1.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.3 + file-entry-cache: 10.1.4 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -32062,22 +29459,22 @@ snapshots: - supports-color - typescript - stylelint@16.23.1(typescript@5.9.2): + stylelint@16.25.0(typescript@5.9.3): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0) - '@dual-bundle/import-meta-resolve': 4.1.0 + '@dual-bundle/import-meta-resolve': 4.2.1 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.9.2) + cosmiconfig: 9.0.0(typescript@5.9.3) css-functions-list: 3.2.3 css-tree: 3.1.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.3 + file-entry-cache: 10.1.4 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -32108,8 +29505,6 @@ snapshots: stylis@4.3.6: {} - sudo-prompt@9.2.1: {} - sugarss@4.0.1(postcss@8.5.3): dependencies: postcss: 8.5.3 @@ -32120,7 +29515,7 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -32128,7 +29523,7 @@ snapshots: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) fast-safe-stringify: 2.1.1 form-data: 4.0.4 formidable: 3.5.4 @@ -32172,46 +29567,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.3.1(picomatch@4.0.3)(svelte@5.38.6)(typescript@5.9.2): - dependencies: - '@jridgewell/trace-mapping': 0.3.29 - chokidar: 4.0.3 - fdir: 6.4.6(picomatch@4.0.3) - picocolors: 1.1.1 - sade: 1.8.1 - svelte: 5.38.6 - typescript: 5.9.2 - transitivePeerDependencies: - - picomatch - - svelte-eslint-parser@1.3.0(svelte@5.38.6): - dependencies: - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - postcss: 8.5.6 - postcss-scss: 4.0.9(postcss@8.5.6) - postcss-selector-parser: 7.1.0 - optionalDependencies: - svelte: 5.38.6 - - svelte@5.38.6: - dependencies: - '@jridgewell/remapping': 2.3.5 - '@jridgewell/sourcemap-codec': 1.5.5 - '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@types/estree': 1.0.8 - acorn: 8.15.0 - aria-query: 5.3.2 - axobject-query: 4.1.0 - clsx: 2.1.1 - esm-env: 1.2.2 - esrap: 2.1.0 - is-reference: 3.0.3 - locate-character: 3.0.0 - magic-string: 0.30.18 - zimmerframe: 1.1.2 - svg-pan-zoom@3.6.2: {} svg-tags@1.0.0: {} @@ -32230,7 +29585,7 @@ snapshots: dependencies: '@trysound/sax': 0.2.0 commander: 7.2.0 - css-select: 5.1.0 + css-select: 5.2.2 css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 @@ -32282,10 +29637,6 @@ snapshots: sync-message-port@1.1.3: optional: true - synckit@0.11.11: - dependencies: - '@pkgr/core': 0.2.9 - table@6.9.0: dependencies: ajv: 8.17.1 @@ -32296,9 +29647,7 @@ snapshots: tabulator-tables@6.3.1: {} - tailwindcss@4.1.12: {} - - tapable@2.2.2: {} + tapable@2.2.3: {} tape@4.17.0: dependencies: @@ -32319,24 +29668,16 @@ snapshots: resolve: 1.22.10 string.prototype.trim: 1.2.10 - tar-fs@3.1.0: + tar-fs@3.1.1: dependencies: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.1.6 + bare-fs: 4.4.5 bare-path: 3.0.0 transitivePeerDependencies: - bare-buffer - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - tar-stream@3.1.7: dependencies: b4a: 1.6.7 @@ -32361,20 +29702,13 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - tcp-port-used@1.0.2: - dependencies: - debug: 4.3.1 - is2: 2.0.9 - transitivePeerDependencies: - - supports-color - temp@0.9.4: dependencies: mkdirp: 0.5.6 rimraf: 2.6.3 optional: true - terser-webpack-plugin@4.2.3(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + terser-webpack-plugin@4.2.3(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -32383,44 +29717,42 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.39.0 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + terser: 5.44.0 + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) webpack-sources: 1.4.3 transitivePeerDependencies: - bluebird - terser-webpack-plugin@5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + terser-webpack-plugin@5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - terser: 5.43.1 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + terser: 5.44.0 + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) optionalDependencies: '@swc/core': 1.11.29(@swc/helpers@0.5.17) - esbuild: 0.25.9 + esbuild: 0.25.11 - terser@5.39.0: + terser-webpack-plugin@5.3.14(esbuild@0.25.11)(webpack@5.101.3(esbuild@0.25.11)): dependencies: - '@jridgewell/source-map': 0.3.6 + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.44.0 + webpack: 5.101.3(esbuild@0.25.11) + optionalDependencies: + esbuild: 0.25.11 + + terser@5.44.0: + dependencies: + '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 - terser@5.43.1: - dependencies: - '@jridgewell/source-map': 0.3.10 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 @@ -32431,7 +29763,7 @@ snapshots: dependencies: b4a: 1.6.7 - thingies@1.21.0(tslib@2.8.1): + thingies@2.5.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -32461,9 +29793,16 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.0.1: {} + tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 tinypool@1.1.1: {} @@ -32474,20 +29813,24 @@ snapshots: tinyspy@4.0.3: {} - tldts-core@6.1.86: {} + tldts-core@6.1.86: + optional: true tldts@6.1.86: dependencies: tldts-core: 6.1.86 + optional: true tmp-promise@3.0.3: dependencies: tmp: 0.2.5 optional: true - tmp@0.2.5: {} + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 - tmpl@1.0.5: {} + tmp@0.2.5: {} tn1150@0.1.0: dependencies: @@ -32525,6 +29868,7 @@ snapshots: tough-cookie@5.1.2: dependencies: tldts: 6.1.86 + optional: true tr46@0.0.3: {} @@ -32535,13 +29879,12 @@ snapshots: tr46@5.1.1: dependencies: punycode: 2.3.1 + optional: true - tree-dump@1.0.3(tslib@2.8.1): + tree-dump@1.1.0(tslib@2.8.1): dependencies: tslib: 2.8.1 - tree-kill@1.2.2: {} - trim-lines@3.0.1: {} trim-repeated@1.0.0: @@ -32556,31 +29899,33 @@ snapshots: dependencies: utf8-byte-length: 1.0.5 - ts-api-utils@2.1.0(typescript@5.9.2): + ts-algebra@2.0.0: {} + + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 ts-dedent@2.2.0: {} - ts-loader@9.5.2(typescript@5.0.4)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + ts-loader@9.5.4(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.2 + enhanced-resolve: 5.18.3 micromatch: 4.0.8 - semver: 7.7.2 + semver: 7.7.3 source-map: 0.7.6 typescript: 5.0.4 - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.0.4): + ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.0.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.18.0 - acorn: 8.14.1 + '@types/node': 22.18.12 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -32592,67 +29937,40 @@ snapshots: optionalDependencies: '@swc/core': 1.11.29(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.0)(typescript@5.9.2): + ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@22.18.12)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.18.0 - acorn: 8.14.1 + '@types/node': 22.18.12 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.2 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.11.29(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.3.0)(typescript@5.9.2): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 24.3.0 - acorn: 8.14.1 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.9.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.11.29(@swc/helpers@0.5.17) - optional: true - - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - tslib@2.8.1: {} - tsx@4.20.5: + tsx@4.20.6: dependencies: - esbuild: 0.25.9 + esbuild: 0.25.10 get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 - tuf-js@3.1.0: + tuf-js@4.0.0: dependencies: - '@tufjs/models': 3.0.1 - debug: 4.4.1(supports-color@6.0.0) - make-fetch-happen: 14.0.3 + '@tufjs/models': 4.0.0 + debug: 4.4.3(supports-color@6.0.0) + make-fetch-happen: 15.0.2 transitivePeerDependencies: - supports-color @@ -32686,8 +30004,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.13.1: optional: true @@ -32747,35 +30063,37 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.40.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 + '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.40.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - typescript-eslint@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.41.0(@typescript-eslint/parser@8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.41.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.41.0(eslint@9.34.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.34.0(jiti@2.5.1) - typescript: 5.9.2 + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 transitivePeerDependencies: - supports-color typescript@5.0.4: {} + typescript@5.4.5: {} + typescript@5.8.2: {} - typescript@5.8.3: {} + typescript@5.9.3: {} - typescript@5.9.2: {} + ua-parser-js@0.7.41: {} ufo@1.6.1: {} @@ -32792,11 +30110,9 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@6.19.8: {} - undici-types@6.21.0: {} - undici-types@7.10.0: + undici-types@7.14.0: optional: true undici@6.21.3: {} @@ -32807,16 +30123,16 @@ snapshots: dependencies: extend-shallow: 2.0.1 - unicode-canonical-property-names-ecmascript@2.0.1: {} + unicode-canonical-property-names-ecmascript@1.0.4: {} - unicode-match-property-ecmascript@2.0.0: + unicode-match-property-ecmascript@1.0.4: dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 + unicode-canonical-property-names-ecmascript: 1.0.4 + unicode-property-aliases-ecmascript: 1.1.0 - unicode-match-property-value-ecmascript@2.2.0: {} + unicode-match-property-value-ecmascript@1.2.0: {} - unicode-property-aliases-ecmascript@2.1.0: {} + unicode-property-aliases-ecmascript@1.1.0: {} unidragger@3.0.1: dependencies: @@ -32865,8 +30181,6 @@ snapshots: '@types/unist': 3.0.3 unist-util-is: 6.0.0 - unist-util-is@4.1.0: {} - unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -32875,30 +30189,15 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 - unist-util-visit@2.0.3: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -32916,36 +30215,6 @@ snapshots: unpipe@1.0.0: {} - unplugin@2.3.5: - dependencies: - acorn: 8.15.0 - picomatch: 4.0.3 - webpack-virtual-modules: 0.6.2 - - unrs-resolver@1.11.1: - dependencies: - napi-postinstall: 0.3.2 - optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.1 - '@unrs/resolver-binding-android-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-arm64': 1.11.1 - '@unrs/resolver-binding-darwin-x64': 1.11.1 - '@unrs/resolver-binding-freebsd-x64': 1.11.1 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 - '@unrs/resolver-binding-linux-x64-musl': 1.11.1 - '@unrs/resolver-binding-wasm32-wasi': 1.11.1 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - unused-filename@4.0.1: dependencies: escape-string-regexp: 5.0.0 @@ -32959,6 +30228,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.1.3(browserslist@4.26.2): + dependencies: + browserslist: 4.26.2 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -32991,6 +30266,8 @@ snapshots: dependencies: react: 16.14.0 + user-agent-data-types@0.4.2: {} + userhome@1.0.1: {} username@5.1.0: @@ -33013,8 +30290,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@10.0.0: {} - uuid@11.1.0: {} uuid@8.3.2: {} @@ -33023,19 +30298,11 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.29 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@5.0.1: {} - validate-npm-package-name@6.0.2: {} validator@13.15.0: {} @@ -33051,11 +30318,6 @@ snapshots: vary@1.1.2: {} - vfile-message@2.0.4: - dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position: 2.0.3 - vfile-message@4.0.2: dependencies: '@types/unist': 3.0.3 @@ -33066,13 +30328,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1): + vite-node@3.2.4(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.0.0(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -33087,145 +30349,120 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@22.18.0)(rollup@4.46.3)(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@22.18.12)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.52.8(@types/node@22.18.0) - '@rollup/pluginutils': 5.1.4(rollup@4.46.3) + '@microsoft/api-extractor': 7.52.8(@types/node@22.18.12) + '@rollup/pluginutils': 5.1.4(rollup@4.52.0) '@volar/typescript': 2.4.13 - '@vue/language-core': 2.2.0(typescript@5.9.2) + '@vue/language-core': 2.2.0(typescript@5.9.3) compare-versions: 6.1.1 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 5.9.2 + typescript: 5.9.3 optionalDependencies: - vite: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@3.1.2(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): + vite-plugin-static-copy@3.1.4(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 - fs-extra: 11.3.1 p-map: 7.0.3 picocolors: 1.1.1 - tinyglobby: 0.2.14 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + tinyglobby: 0.2.15 + vite: 7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-svgo@2.0.0(typescript@5.9.2)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): + vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: svgo: 3.3.2 - typescript: 5.9.2 - vite: 7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + typescript: 5.9.3 + vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-prerender-plugin@0.5.11(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): + vite-prerender-plugin@0.5.11(vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: kolorist: 1.8.0 - magic-string: 0.30.17 + magic-string: 0.30.18 node-html-parser: 6.1.13 simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite@7.0.0(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1): + vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.6 - rollup: 4.40.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 22.18.0 - fsevents: 2.3.3 - jiti: 2.5.1 - less: 4.1.3 - lightningcss: 1.30.1 - sass: 1.87.0 - sass-embedded: 1.87.0 - terser: 5.43.1 - tsx: 4.20.5 - yaml: 2.8.1 - - vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1): - dependencies: - esbuild: 0.25.9 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.46.3 - tinyglobby: 0.2.14 + rollup: 4.52.0 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.18.0 + '@types/node': 22.18.12 fsevents: 2.3.3 - jiti: 2.5.1 + jiti: 2.6.1 less: 4.1.3 lightningcss: 1.30.1 - sass: 1.87.0 - sass-embedded: 1.87.0 - terser: 5.43.1 - tsx: 4.20.5 + sass: 1.91.0 + sass-embedded: 1.91.0 + terser: 5.44.0 + tsx: 4.20.6 yaml: 2.8.1 - vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1): + vite@7.1.11(@types/node@24.8.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.46.3 - tinyglobby: 0.2.14 + rollup: 4.52.0 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.3.0 + '@types/node': 24.8.1 fsevents: 2.3.3 - jiti: 2.5.1 + jiti: 2.6.1 less: 4.1.3 lightningcss: 1.30.1 - sass: 1.87.0 - sass-embedded: 1.87.0 - terser: 5.43.1 - tsx: 4.20.5 + sass: 1.91.0 + sass-embedded: 1.91.0 + terser: 5.44.0 + tsx: 4.20.6 yaml: 2.8.1 - vitefu@1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)): - optionalDependencies: - vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.5.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.7)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(vite@7.0.0(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 chai: 5.2.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) expect-type: 1.2.1 - magic-string: 0.30.17 + magic-string: 0.30.18 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.0.0(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.18.0 - '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.0)(typescript@5.9.2))(playwright@1.55.0)(utf-8-validate@6.0.5)(vite@7.1.3(@types/node@22.18.0)(jiti@2.5.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.87.0)(sass@1.87.0)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@types/node': 22.18.12 + '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 3.2.4(vitest@3.2.4) - happy-dom: 18.0.1 + happy-dom: 20.0.7 jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - jiti @@ -33241,6 +30478,8 @@ snapshots: - tsx - yaml + void-elements@2.0.1: {} + void-elements@3.1.0: {} vscode-jsonrpc@8.2.0: {} @@ -33281,19 +30520,16 @@ snapshots: w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 + optional: true wait-port@1.1.0: dependencies: chalk: 4.1.2 commander: 9.5.0 - debug: 4.4.1(supports-color@6.0.0) + debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - warning@4.0.3: dependencies: loose-envify: 1.4.0 @@ -33315,15 +30551,15 @@ snapshots: web-streams-polyfill@3.3.3: {} - webdriver@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5): + webdriver@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.22 '@types/ws': 8.18.1 - '@wdio/config': 9.19.2 + '@wdio/config': 9.20.0 '@wdio/logger': 9.18.0 '@wdio/protocols': 9.16.2 - '@wdio/types': 9.19.2 - '@wdio/utils': 9.19.2 + '@wdio/types': 9.20.0 + '@wdio/utils': 9.20.0 deepmerge-ts: 7.1.5 https-proxy-agent: 7.0.6 undici: 6.21.3 @@ -33334,16 +30570,16 @@ snapshots: - supports-color - utf-8-validate - webdriverio@9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5): + webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: - '@types/node': 20.19.11 + '@types/node': 20.19.18 '@types/sinonjs__fake-timers': 8.1.5 - '@wdio/config': 9.19.2 + '@wdio/config': 9.20.0 '@wdio/logger': 9.18.0 '@wdio/protocols': 9.16.2 '@wdio/repl': 9.16.2 - '@wdio/types': 9.19.2 - '@wdio/utils': 9.19.2 + '@wdio/types': 9.20.0 + '@wdio/utils': 9.20.0 archiver: 7.0.1 aria-query: 5.3.2 cheerio: 1.1.2 @@ -33360,7 +30596,7 @@ snapshots: rgb2hex: 0.2.5 serialize-error: 12.0.0 urlpattern-polyfill: 10.1.0 - webdriver: 9.19.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + webdriver: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bare-buffer - bufferutil @@ -33373,27 +30609,28 @@ snapshots: webidl-conversions@6.1.0: {} - webidl-conversions@7.0.0: {} + webidl-conversions@7.0.0: + optional: true - webpack-dev-middleware@7.4.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + webpack-dev-middleware@7.4.3(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: colorette: 2.0.20 - memfs: 4.17.2 - mime-types: 2.1.35 + memfs: 4.42.0 + mime-types: 3.0.1 on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) - webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)): + webpack-dev-server@5.2.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.23 - '@types/express-serve-static-core': 5.0.7 + '@types/express-serve-static-core': 5.1.0 '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 + '@types/serve-static': 1.15.9 '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 @@ -33406,7 +30643,7 @@ snapshots: graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 - launch-editor: 2.10.0 + launch-editor: 2.11.1 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.2 @@ -33414,10 +30651,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + webpack-dev-middleware: 7.4.3(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) optionalDependencies: - webpack: 5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9) + webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11) transitivePeerDependencies: - bufferutil - debug @@ -33436,9 +30673,7 @@ snapshots: webpack-sources@3.3.3: {} - webpack-virtual-modules@0.6.2: {} - - webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9): + webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -33448,9 +30683,9 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.26.2 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.2 + enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -33461,8 +30696,40 @@ snapshots: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)(webpack@5.100.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.9)) + tapable: 2.2.3 + terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.11)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.101.3(esbuild@0.25.11): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.26.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.3 + terser-webpack-plugin: 5.3.14(esbuild@0.25.11)(webpack@5.101.3(esbuild@0.25.11)) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -33504,6 +30771,7 @@ snapshots: dependencies: tr46: 5.1.1 webidl-conversions: 7.0.0 + optional: true whatwg-url@5.0.0: dependencies: @@ -33569,6 +30837,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@3.0.1: + dependencies: + isexe: 2.0.0 + which@4.0.0: dependencies: isexe: 3.1.1 @@ -33593,7 +30865,7 @@ snapshots: word-wrap@1.2.5: {} - workerpool@9.3.3: {} + workerpool@9.3.4: {} wrap-ansi@5.1.0: dependencies: @@ -33606,7 +30878,6 @@ snapshots: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - optional: true wrap-ansi@7.0.0: dependencies: @@ -33616,15 +30887,15 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 - wrap-ansi@9.0.0: + wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} @@ -33654,7 +30925,8 @@ snapshots: xml-name-validator@3.0.0: {} - xml-name-validator@5.0.0: {} + xml-name-validator@5.0.0: + optional: true xml-parse-from-string@1.0.1: {} @@ -33692,8 +30964,6 @@ snapshots: yaml@2.0.0-1: {} - yaml@2.8.0: {} - yaml@2.8.1: {} yargs-parser@13.1.2: @@ -33701,8 +30971,7 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 - yargs-parser@20.2.9: - optional: true + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -33743,7 +31012,6 @@ snapshots: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - optional: true yargs@17.7.2: dependencies: @@ -33778,8 +31046,7 @@ snapshots: yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.3: - optional: true + yoctocolors-cjs@2.1.3: {} z-schema@5.0.5: dependencies: @@ -33789,14 +31056,16 @@ snapshots: optionalDependencies: commander: 9.5.0 - zimmerframe@1.1.2: {} - zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 compress-commons: 6.0.2 readable-stream: 4.7.0 + zod-validation-error@3.5.3(zod@3.24.4): + dependencies: + zod: 3.24.4 + zod@3.24.4: {} zustand@4.5.6(@types/react@19.1.7)(react@16.14.0): diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2c068ac8f..cf29be32e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,5 +2,4 @@ packages: - packages/* - apps/* -shamefullyHoist: true -nodeLinker: isolated +nodeLinker: hoisted diff --git a/requirements-docs.txt b/requirements-docs.txt new file mode 100644 index 000000000..a7fa25aec --- /dev/null +++ b/requirements-docs.txt @@ -0,0 +1,21 @@ +# MkDocs and Material theme requirements for Trilium documentation +mkdocs>=1.6.0 +mkdocs-material>=9.5.0 +mkdocs-material-extensions>=1.3.0 + +# Essential plugins +mkdocs-awesome-pages-plugin>=2.9.0 # Auto-generate navigation from folder structure +mkdocs-minify-plugin>=0.8.0 +mkdocs-git-revision-date-localized-plugin>=1.2.0 + +# Optional but recommended plugins +mkdocs-redirects>=1.2.0 +mkdocs-rss-plugin>=1.12.0 +mkdocs-glightbox>=0.3.0 + +# For advanced features +pillow>=10.0.0 # For social cards generation +cairosvg>=2.7.0 # For social cards with SVG support + +# Search enhancements +mkdocs-material[imaging]>=9.5.0 \ No newline at end of file diff --git a/scripts/build-utils.ts b/scripts/build-utils.ts new file mode 100644 index 000000000..6a08f112e --- /dev/null +++ b/scripts/build-utils.ts @@ -0,0 +1,101 @@ +import { execSync } from "child_process"; +import { build as esbuild } from "esbuild"; +import { cpSync, existsSync, rmSync, writeFileSync } from "fs"; +import { copySync, emptyDirSync, mkdirpSync } from "fs-extra"; +import { join } from "path"; + +export default class BuildHelper { + + private rootDir: string; + projectDir: string; + outDir: string; + + constructor(projectPath: string) { + this.rootDir = join(__dirname, ".."); + this.projectDir = join(this.rootDir, projectPath); + this.outDir = join(this.projectDir, "dist"); + + emptyDirSync(this.outDir); + } + + copy(projectDirPath: string, outDirPath: string) { + let sourcePath: string; + if (projectDirPath.startsWith("/")) { + sourcePath = join(this.rootDir, projectDirPath.substring(1)); + } else { + sourcePath = join(this.projectDir, projectDirPath); + } + + if (outDirPath.endsWith("/")) { + mkdirpSync(join(outDirPath)); + } + copySync(sourcePath, join(this.outDir, outDirPath), { dereference: true }); + } + + deleteFromOutput(path: string) { + rmSync(join(this.outDir, path), { recursive: true }); + } + + async buildBackend(entryPoints: string[]) { + const result = await esbuild({ + entryPoints: entryPoints.map(e => join(this.projectDir, e)), + tsconfig: join(this.projectDir, "tsconfig.app.json"), + platform: "node", + bundle: true, + outdir: this.outDir, + outExtension: { + ".js": ".cjs" + }, + format: "cjs", + external: [ + "electron", + "@electron/remote", + "better-sqlite3", + "./xhr-sync-worker.js", + "vite" + ], + metafile: true, + splitting: false, + loader: { + ".css": "text", + ".ejs": "text" + }, + define: { + "process.env.NODE_ENV": JSON.stringify("production"), + }, + minify: true + }); + writeFileSync(join(this.outDir, "meta.json"), JSON.stringify(result.metafile)); + } + + triggerBuildAndCopyTo(projectToBuild: string, destPath: string) { + const projectDir = join(this.rootDir, projectToBuild); + execSync("pnpm build", { cwd: projectDir, stdio: "inherit" }); + copySync(join(projectDir, "dist"), join(this.projectDir, "dist", destPath)); + } + + copyNodeModules(nodeModules: string[]) { + for (const moduleName of nodeModules) { + const sourceDir = tryPath([ + join(this.projectDir, "node_modules", moduleName), + join(this.rootDir, "node_modules", moduleName) + ]); + + const destDir = join(this.outDir, "node_modules", moduleName); + mkdirpSync(destDir); + cpSync(sourceDir, destDir, { recursive: true, dereference: true }); + } + } + +} + +function tryPath(paths: string[]) { + for (const path of paths) { + if (existsSync(path)) { + return path; + } + } + + console.error("Unable to find any of the paths:", paths); + process.exit(1); +} diff --git a/scripts/electron-rebuild.mts b/scripts/electron-rebuild.mts index 46ef21986..5e343a97c 100644 --- a/scripts/electron-rebuild.mts +++ b/scripts/electron-rebuild.mts @@ -1,89 +1,68 @@ -/** - * @module - * - * This script is used internally by the `rebuild-deps` target of the `desktop`. Normally we could use - * `electron-rebuild` CLI directly, but it would rebuild the monorepo-level dependencies and breaks - * the server build (and it doesn't expose a CLI option to override this). - * - * A side purpose is to generate a fake `package.json` file in the `dist` directory - * that contains only the native dependencies. This is used by `electron-forge`. - */ - import { join, resolve } from "path"; +import { cpSync, exists, existsSync, mkdirSync, readFileSync, rmSync } from "fs"; +import { execSync } from "child_process"; import { rebuild } from "@electron/rebuild" -import { readFileSync, rmSync, writeFileSync } from "fs"; +import { getElectronPath, isNixOS } from "./utils.mjs"; -const nativeDependencies = [ - "better-sqlite3" -]; +const workspaceRoot = join(import.meta.dirname, ".."); -function parsePackageJson(distDir: string) { - const packageJsonPath = join(distDir, "../package.json"); - const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); - let electronVersion: string; - - if (process.argv[3]) { - electronVersion = process.argv[3]; - } else { - electronVersion = packageJson?.devDependencies?.electron ?? packageJson?.dependencies?.electron; - if (!electronVersion) { - console.error(`Unable to retrieve Electron version in '${resolve(packageJsonPath)}'.`); - process.exit(3); - } - } +function copyNativeDependencies(projectRoot: string) { + const destPath = join(projectRoot, "node_modules/better-sqlite3"); - return { - electronVersion, - packageJson - }; + if (existsSync(destPath)) { + rmSync(destPath, { recursive: true }); + } + mkdirSync(destPath, { recursive: true }); + + const sourcePath = join(workspaceRoot, "node_modules/better-sqlite3"); + if (!existsSync(sourcePath)) { + console.warn("Nothing to rebuild as source path is missing:", sourcePath); + console.info("For CI builds with filtered package installs, this is normal. For normal development, it's not."); + process.exit(0); + } + cpSync(sourcePath, destPath, { recursive: true, dereference: true }); } -function createFakePackageJson(distPath: string, packageJson: any) { - const finalDependencies = {}; - for (const dep of nativeDependencies) { - finalDependencies[dep] = packageJson.dependencies[dep]; - } +async function rebuildNativeDependencies(projectRoot: string) { + const electronVersion = determineElectronVersion(projectRoot); - const fakePackageJson: any = { - name: "trilium", - version: packageJson.version, - main: packageJson.main, - author: packageJson.author, - license: packageJson.license, - description: packageJson.description, - dependencies: finalDependencies, - devDependencies: { - "electron": packageJson.devDependencies?.electron || packageJson.dependencies?.electron, - } - }; - if (packageJson?.config?.forge) { - fakePackageJson.config = { - forge: join("..", packageJson.config.forge) - }; - } - writeFileSync(distPath, JSON.stringify(fakePackageJson, null, 2), "utf-8"); -} - -function main() { - const distDir = resolve(process.argv[2]); - if (!distDir) { - console.error("Missing root dir as argument."); + if (!electronVersion) { + console.error("Unable to determine Electron version."); process.exit(1); } - const { electronVersion, packageJson } = parsePackageJson(distDir); - const packageJsonPath = join(distDir, "package.json"); - createFakePackageJson(packageJsonPath, packageJson); + const targetArch = process.env.TARGET_ARCH || process.arch; + console.log(`Rebuilding ${projectRoot} with ${electronVersion} for ${targetArch}...`); - console.log(`Rebuilding ${distDir} with version ${electronVersion}...`); - - rebuild({ - // We force the project root path to avoid electron-rebuild from rebuilding the monorepo-level dependency and breaking the server. - projectRootPath: distDir, - buildPath: distDir, - force: true, + const resolvedPath = resolve(projectRoot); + await rebuild({ + projectRootPath: resolvedPath, + buildPath: resolvedPath, electronVersion, + arch: targetArch, + force: true }); } -main(); +function determineElectronVersion(projectRoot: string) { + const packageJson = JSON.parse(readFileSync(join(projectRoot, "package.json"), "utf-8")); + + if (isNixOS()) { + console.log("Detected NixOS, reading Electron version from PATH"); + + try { + return execSync(`${getElectronPath()} --version`, { }).toString("utf-8"); + } catch (e) { + console.error("Got error while trying to read the Electron version from shell. Make sure that an Electron version is in the PATH (e.g. `nix-shell -p electron`)"); + process.exit(1); + } + } else { + console.log("Using Electron version from package.json"); + return packageJson.devDependencies.electron; + } +} + +for (const projectRoot of [ "apps/desktop", "apps/edit-docs" ]) { + copyNativeDependencies(projectRoot); + await rebuildNativeDependencies(projectRoot); +} diff --git a/scripts/electron-start.mts b/scripts/electron-start.mts new file mode 100644 index 000000000..92e85f9a8 --- /dev/null +++ b/scripts/electron-start.mts @@ -0,0 +1,17 @@ +import { execSync } from "child_process"; +import { getElectronPath, isNixOS } from "./utils.mjs"; + +const LD_LIBRARY_PATH = isNixOS() && execSync("nix eval --raw nixpkgs#gcc.cc.lib").toString("utf-8") + "/lib"; + +execSync(`${getElectronPath()} ${process.argv[2]}`, { + stdio: "inherit", + env: { + ...process.env, + NODE_OPTIONS: "--import tsx", + NODE_ENV: "development", + TRILIUM_ENV: "dev", + TRILIUM_RESOURCE_DIR: "../server/src", + BETTERSQLITE3_NATIVE_PATH: "node_modules/better-sqlite3/build/Release/better_sqlite3.node", + LD_LIBRARY_PATH + } +}); diff --git a/scripts/fix-html-links.ts b/scripts/fix-html-links.ts new file mode 100644 index 000000000..68f325b44 --- /dev/null +++ b/scripts/fix-html-links.ts @@ -0,0 +1,79 @@ +#!/usr/bin/env node +/** + * Post-process HTML files generated by MkDocs to remove .md extensions from links + */ + +import * as fs from 'fs'; +import * as path from 'path'; + +/** + * Process HTML content to remove .md extensions from links + */ +function fixHtmlLinks(content: string): string { + // Replace .md extensions in href attributes + // Handle both quoted and unquoted href attributes + + // First, handle quoted hrefs: href="...something.md" or href="...something.md#anchor" + content = content.replace(/href="([^"]*?)\.md(#[^"]*)?"/g, 'href="$1$2"'); + + // Then, handle unquoted hrefs: href=...something.md or href=...something.md#anchor + // This matches href= followed by a non-whitespace URL ending in .md + content = content.replace(/href=([^\s>]*?)\.md(#[^\s>]*)?(?=[\s>])/g, 'href=$1$2'); + + return content; +} + +/** + * Recursively process all HTML files in a directory + */ +function processDirectory(dir: string): number { + let filesProcessed = 0; + + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + if (entry.isDirectory()) { + // Recursively process subdirectories + filesProcessed += processDirectory(fullPath); + } else if (entry.isFile() && entry.name.endsWith('.html')) { + // Process HTML files + const content = fs.readFileSync(fullPath, 'utf-8'); + const fixedContent = fixHtmlLinks(content); + + if (content !== fixedContent) { + fs.writeFileSync(fullPath, fixedContent, 'utf-8'); + console.log(`Fixed: ${path.relative(process.cwd(), fullPath)}`); + filesProcessed++; + } + } + } + + return filesProcessed; +} + +function main(): number { + const args = process.argv.slice(2); + const siteDir = args[0] || 'site'; + + const fullPath = path.resolve(siteDir); + + if (!fs.existsSync(fullPath)) { + console.error(`Error: Directory '${fullPath}' does not exist`); + return 1; + } + + console.log(`Processing HTML files in: ${fullPath}`); + console.log('-'.repeat(50)); + + const filesProcessed = processDirectory(fullPath); + + console.log('-'.repeat(50)); + console.log(`Processed ${filesProcessed} HTML files`); + + return 0; +} + +// Run the main function +process.exit(main()); \ No newline at end of file diff --git a/scripts/fix-mkdocs-structure.ts b/scripts/fix-mkdocs-structure.ts new file mode 100644 index 000000000..2807801cc --- /dev/null +++ b/scripts/fix-mkdocs-structure.ts @@ -0,0 +1,342 @@ +#!/usr/bin/env node +/** + * Fix MkDocs structure by: + * 1. Syncing README.md to docs/index.md with necessary path adjustments + * 2. Moving overview pages to index.md inside their directories to prevent duplicate navigation entries + */ + +import * as fs from 'fs'; +import * as path from 'path'; + +interface FixResult { + message: string; +} + +/** + * Find markdown files that have a corresponding directory with the same name, + * and move them to index.md inside that directory. + */ +function fixDuplicateEntries(docsDir: string): FixResult[] { + const fixesMade: FixResult[] = []; + + function walkDir(dir: string): void { + let files: string[]; + try { + files = fs.readdirSync(dir); + } catch (err) { + console.warn(`Warning: Unable to read directory ${dir}: ${err.message}`); + return; + } + + for (const file of files) { + const filePath = path.join(dir, file); + let stat: fs.Stats; + + try { + stat = fs.statSync(filePath); + } catch (err) { + // File might have been moved already, skip it + continue; + } + + if (stat.isDirectory()) { + walkDir(filePath); + } else if (file.endsWith('.md')) { + const basename = file.slice(0, -3); // Remove .md extension + const dirPath = path.join(dir, basename); + + // Check if there's a directory with the same name + if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) { + const indexPath = path.join(dirPath, 'index.md'); + + // Check if index.md already exists in that directory + if (!fs.existsSync(indexPath)) { + // Move the file to index.md in the directory + fs.renameSync(filePath, indexPath); + fixesMade.push({ + message: `Moved ${path.relative(docsDir, filePath)} -> ${path.relative(docsDir, indexPath)}` + }); + + // Move associated images with pattern basename_* + try { + const dirFiles = fs.readdirSync(dir); + for (const imgFile of dirFiles) { + if (imgFile.startsWith(`${basename}_`)) { + const imgSrc = path.join(dir, imgFile); + try { + if (!fs.statSync(imgSrc).isDirectory()) { + const imgDest = path.join(dirPath, imgFile); + fs.renameSync(imgSrc, imgDest); + fixesMade.push({ + message: `Moved ${path.relative(docsDir, imgSrc)} -> ${path.relative(docsDir, imgDest)}` + }); + } + } catch (err) { + // File might have been moved already, skip it + } + } + } + } catch (err) { + // Directory might not exist anymore, skip it + } + + // Move exact match images + const imgExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.svg']; + for (const ext of imgExtensions) { + const imgFile = path.join(dir, `${basename}${ext}`); + if (fs.existsSync(imgFile)) { + const imgDest = path.join(dirPath, `${basename}${ext}`); + fs.renameSync(imgFile, imgDest); + fixesMade.push({ + message: `Moved ${path.relative(docsDir, imgFile)} -> ${path.relative(docsDir, imgDest)}` + }); + } + } + } + } + } + } + } + + walkDir(docsDir); + return fixesMade; +} + +/** + * Update references in markdown files to point to the new locations. + */ +function updateReferences(docsDir: string): FixResult[] { + const updatesMade: FixResult[] = []; + + function fixLink(match: string, text: string, link: string, currentDir: string, isIndex: boolean): string { + // Skip external links + if (link.startsWith('http')) { + return match; + } + + // Decode URL-encoded paths for processing + let decodedLink: string; + try { + decodedLink = decodeURIComponent(link); + } catch (err) { + // If decoding fails, use the original link + decodedLink = link; + } + + // Special case: if we're in index.md and the link starts with the parent directory name + // This happens when a file was converted to index.md and had links to siblings + if (isIndex && decodedLink.includes('/')) { + const pathParts = decodedLink.split('/'); + const parentDirName = path.basename(currentDir); + + // Check if first part matches the parent directory name + if (pathParts[0] === parentDirName) { + // This is a self-referential path, strip the first part + const fixedLink = pathParts.slice(1).join('/'); + // Re-encode spaces for URL compatibility before recursing + const fixedLinkEncoded = fixedLink.replace(/ /g, '%20'); + // Recursively process the fixed link + return fixLink(`[${text}](${fixedLinkEncoded})`, text, fixedLinkEncoded, currentDir, isIndex); + } + } + + // For any .md link, check if there's a directory with index.md + // that should be used instead + if (!decodedLink.startsWith('/')) { + // Resolve relative to current directory + const resolvedPath = path.resolve(currentDir, decodedLink); + + // Check if this points to a file that should be a directory + // Remove .md extension to get the potential directory name + if (resolvedPath.endsWith('.md')) { + const potentialDir = resolvedPath.slice(0, -3); + const potentialIndex = path.join(potentialDir, 'index.md'); + + // If a directory with index.md exists, update the link + if (fs.existsSync(potentialIndex)) { + // If we're in an index.md file and linking to a file that's now + // in a sibling directory, adjust the path + if (isIndex) { + // Check if they share the same parent directory + if (path.dirname(potentialDir) === path.dirname(currentDir)) { + // It's a sibling - just use directory name + const dirName = path.basename(potentialDir).replace(/ /g, '%20'); + return `[${text}](${dirName}/)`; + } + } + + // Calculate relative path from current file to the directory + const newPath = path.relative(currentDir, potentialDir).replace(/\\/g, '/').replace(/ /g, '%20'); + return `[${text}](${newPath}/)`; + } + } + } + + // Also handle local references (same directory) + if (!decodedLink.includes('/')) { + const basename = decodedLink.slice(0, -3); // Remove .md extension + const possibleDir = path.join(currentDir, basename); + + if (fs.existsSync(possibleDir) && fs.statSync(possibleDir).isDirectory()) { + // Re-encode spaces for URL compatibility + const encodedBasename = basename.replace(/ /g, '%20'); + return `[${text}](${encodedBasename}/)`; + } + } + + return match; + } + + function walkDir(dir: string): void { + let files: string[]; + try { + files = fs.readdirSync(dir); + } catch (err) { + console.warn(`Warning: Unable to read directory ${dir}: ${err.message}`); + return; + } + + for (const file of files) { + const filePath = path.join(dir, file); + let stat: fs.Stats; + + try { + stat = fs.statSync(filePath); + } catch (err) { + // File might have been moved already, skip it + continue; + } + + if (stat.isDirectory()) { + walkDir(filePath); + } else if (file.endsWith('.md')) { + let content = fs.readFileSync(filePath, 'utf-8'); + const originalContent = content; + + const isIndex = file === 'index.md'; + const currentDir = path.dirname(filePath); + + // Update markdown links: [text](path.md) + const pattern = /\[([^\]]*)\]\(([^)]+\.md)\)/g; + content = content.replace(pattern, (match, text, link) => { + return fixLink(match, text, link, currentDir, isIndex); + }); + + if (content !== originalContent) { + fs.writeFileSync(filePath, content, 'utf-8'); + updatesMade.push({ + message: `Updated references in ${path.relative(docsDir, filePath)}` + }); + } + } + } + } + + walkDir(docsDir); + return updatesMade; +} + +/** + * Sync README.md to docs/index.md with necessary path adjustments + */ +function syncReadmeToIndex(projectRoot: string, docsDir: string): FixResult[] { + const results: FixResult[] = []; + const readmePath = path.join(projectRoot, 'README.md'); + const indexPath = path.join(docsDir, 'index.md'); + + if (!fs.existsSync(readmePath)) { + console.warn('README.md not found in project root'); + return results; + } + + // Read README content + let content = fs.readFileSync(readmePath, 'utf-8'); + + // Fix image path (./docs/app.png -> app.png) + content = content.replace(/src="\.\/docs\/app\.png"/g, 'src="app.png"'); + + // Fix language links in header + content = content.replace(/\[English\]\(\.\/README\.md\)/g, '[English](./index.md)'); + content = content.replace(/\.\/docs\/README-ZH_CN\.md/g, './README-ZH_CN.md'); + content = content.replace(/\.\/docs\/README-ZH_TW\.md/g, './README-ZH_TW.md'); + content = content.replace(/\.\/docs\/README\.ru\.md/g, './README.ru.md'); + content = content.replace(/\.\/docs\/README\.ja\.md/g, './README.ja.md'); + content = content.replace(/\.\/docs\/README\.it\.md/g, './README.it.md'); + content = content.replace(/\.\/docs\/README\.es\.md/g, './README.es.md'); + + // Fix internal documentation links (./docs/User%20Guide -> ./User%20Guide) + content = content.replace(/\.\/docs\/User%20Guide/g, './User%20Guide'); + + // Write the adjusted content to docs/index.md + fs.writeFileSync(indexPath, content, 'utf-8'); + results.push({ + message: `Synced README.md to docs/index.md with path adjustments` + }); + + return results; +} + +function main(): number { + // Get the docs directory + const scriptDir = path.dirname(new URL(import.meta.url).pathname); + const projectRoot = path.dirname(scriptDir); + const docsDir = path.join(projectRoot, 'docs'); + + // Handle Windows paths (remove leading slash if on Windows) + const normalizedProjectRoot = process.platform === 'win32' && projectRoot.startsWith('/') + ? projectRoot.substring(1) + : projectRoot; + const normalizedDocsDir = process.platform === 'win32' && docsDir.startsWith('/') + ? docsDir.substring(1) + : docsDir; + + if (!fs.existsSync(normalizedDocsDir)) { + console.error(`Error: docs directory not found at ${normalizedDocsDir}`); + return 1; + } + + console.log(`Fixing MkDocs structure in ${normalizedDocsDir}`); + console.log('-'.repeat(50)); + + // Sync README.md to docs/index.md + const syncResults = syncReadmeToIndex(normalizedProjectRoot, normalizedDocsDir); + if (syncResults.length > 0) { + console.log('README sync:'); + for (const result of syncResults) { + console.log(` - ${result.message}`); + } + console.log(); + } + + // Fix duplicate entries + const fixes = fixDuplicateEntries(normalizedDocsDir); + if (fixes.length > 0) { + console.log('Files reorganized:'); + for (const fix of fixes) { + console.log(` - ${fix.message}`); + } + } else { + console.log('No duplicate entries found that need fixing'); + } + + console.log(); + + // Update references + const updates = updateReferences(normalizedDocsDir); + if (updates.length > 0) { + console.log('References updated:'); + for (const update of updates) { + console.log(` - ${update.message}`); + } + } else { + console.log('No references needed updating'); + } + + console.log('-'.repeat(50)); + console.log(`Structure fix complete: ${syncResults.length} README syncs, ${fixes.length} files moved, ${updates.length} files updated`); + + return 0; +} + +// Run the main function +process.exit(main()); \ No newline at end of file diff --git a/scripts/import-translations-from-weblate-csv.ts b/scripts/import-translations-from-weblate-csv.ts new file mode 100644 index 000000000..374f9ae67 --- /dev/null +++ b/scripts/import-translations-from-weblate-csv.ts @@ -0,0 +1,38 @@ +import { readFileSync, writeFileSync } from "fs"; +import { parseString } from '@fast-csv/parse'; + +const csvPath = process.argv[2]; +const translationPath = process.argv[3]; + +if (!csvPath || !translationPath) { + console.log("Usage: input.csv translation.json") + process.exit(1); +} + +const csvFile = readFileSync(csvPath, "utf-8"); +const translationFile = readFileSync(translationPath, "utf-8"); +const translation = JSON.parse(translationFile); + +parseString(csvFile, { headers: true }) + .on("error", error => { + console.error(error); + process.exit(2); + }) + .on("data", data => { + replaceTranslation(data.context, data.target); + }) + .on("end", () => { + writeFileSync(translationPath, JSON.stringify(translation, null, 2)); + }); + +function replaceTranslation(path: string, value: string) { + let cursor = translation; + const segments = path.split("."); + const lastSegment = segments.pop(); + for (const current of segments) { + if (!cursor[current]) cursor[current] = {}; + cursor = cursor[current]; + } + + cursor[lastSegment] = value; +} diff --git a/scripts/utils.mts b/scripts/utils.mts new file mode 100644 index 000000000..8490b50fd --- /dev/null +++ b/scripts/utils.mts @@ -0,0 +1,45 @@ +import { execSync } from "child_process"; +import { existsSync, readFileSync } from "fs"; +import { platform } from "os"; + +export function isNixOS() { + if (platform() !== "linux") return false; + + const osReleasePath = "/etc/os-release"; + if (existsSync(osReleasePath)) { + const osReleaseFile = readFileSync(osReleasePath, "utf-8"); + return osReleaseFile.includes("ID=nixos"); + } else { + return !!process.env.NIX_STORE; + } +} + +function resetPath() { + // On Unix-like systems, PATH is usually inherited from login shell + // but npm prepends node_modules/.bin. Let's remove it: + const origPath = process.env.PATH || ""; + + // npm usually adds something like ".../node_modules/.bin" + process.env.PATH = origPath + .split(":") + .filter(p => !p.includes("node_modules/.bin")) + .join(":"); +} + +export function getElectronPath() { + if (isNixOS()) { + resetPath(); + + try { + const path = execSync("which electron").toString("utf-8").trimEnd(); + return path; + } catch (e) { + // Nothing to do, since we have a fallback below. + } + + console.log("Using default since no Electron is available in path."); + return execSync("nix eval --raw nixpkgs#electron_37").toString("utf-8") + "/bin/electron"; + } else { + return "electron"; + } +} \ No newline at end of file diff --git a/tsconfig.base.json b/tsconfig.base.json index 76d2e73fc..22906a79f 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -5,7 +5,7 @@ "emitDeclarationOnly": true, "importHelpers": true, "isolatedModules": true, - "lib": ["ES2023"], + "lib": ["ES2023", "DOM", "DOM.Iterable"], "module": "nodenext", "moduleResolution": "nodenext", "noEmitOnError": true, diff --git a/tsconfig.json b/tsconfig.json index 481f2f1b5..f2e5a0b65 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,9 @@ { "path": "./apps/desktop" }, + { + "path": "./apps/website" + }, { "path": "./apps/dump-db" }, @@ -59,12 +62,6 @@ }, { "path": "./packages/share-theme" - }, - { - "path": "./apps/website" - }, - { - "path": "./apps/desktop-e2e" } ] }