Compare commits

..

1 Commits

Author SHA1 Message Date
Anthony LC
f1b41cc4c4 POC override 2025-11-21 14:28:31 +01:00
175 changed files with 5514 additions and 13621 deletions

View File

@@ -1,24 +0,0 @@
name: 'Free Disk Space'
description: 'Free up disk space by removing large preinstalled items and cleaning up Docker'
runs:
using: "composite"
steps:
- name: Free disk space (Linux only)
if: runner.os == 'Linux'
shell: bash
run: |
echo "Disk usage before cleanup:"
df -h
# Remove large preinstalled items that are not used on GitHub-hosted runners
sudo rm -rf /usr/share/dotnet || true
sudo rm -rf /opt/ghc || true
sudo rm -rf /usr/local/lib/android || true
# Clean up Docker
docker system prune -af || true
docker volume prune -f || true
echo "Disk usage after cleanup:"
df -h

View File

@@ -52,12 +52,6 @@ jobs:
push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }} push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }}
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
-
name: Cleanup Docker after build
if: always()
run: |
docker system prune -af
docker volume prune -f
build-and-push-frontend: build-and-push-frontend:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -65,6 +59,14 @@ jobs:
- -
name: Checkout repository name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Checkout custom code repository
uses: actions/checkout@v4
with:
repository: 'AntoLC/docs-customized'
ref: 'main'
path: docs-custom
- -
name: Docker meta name: Docker meta
id: meta id: meta
@@ -82,7 +84,7 @@ jobs:
name: Run trivy scan name: Run trivy scan
uses: numerique-gouv/action-trivy-cache@main uses: numerique-gouv/action-trivy-cache@main
with: with:
docker-build-args: '-f src/frontend/Dockerfile --target frontend-production' docker-build-args: '-f src/frontend/Dockerfile --target frontend-production --build-arg CUSTOM_CODE=docs-custom'
docker-image-name: 'docker.io/lasuite/impress-frontend:${{ github.sha }}' docker-image-name: 'docker.io/lasuite/impress-frontend:${{ github.sha }}'
- -
name: Build and push name: Build and push
@@ -93,16 +95,11 @@ jobs:
target: frontend-production target: frontend-production
build-args: | build-args: |
DOCKER_USER=${{ env.DOCKER_USER }}:-1000 DOCKER_USER=${{ env.DOCKER_USER }}:-1000
CUSTOM_CODE=docs-custom
PUBLISH_AS_MIT=false PUBLISH_AS_MIT=false
push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }} push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }}
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
-
name: Cleanup Docker after build
if: always()
run: |
docker system prune -af
docker volume prune -f
build-and-push-y-provider: build-and-push-y-provider:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -137,12 +134,6 @@ jobs:
push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }} push: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'preview') }}
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
-
name: Cleanup Docker after build
if: always()
run: |
docker system prune -af
docker volume prune -f
notify-argocd: notify-argocd:
needs: needs:

View File

@@ -85,9 +85,6 @@ jobs:
- name: Install Playwright Browsers - name: Install Playwright Browsers
run: cd src/frontend/apps/e2e && yarn install --frozen-lockfile && yarn install-playwright chromium run: cd src/frontend/apps/e2e && yarn install --frozen-lockfile && yarn install-playwright chromium
- name: Free disk space before Docker
uses: ./.github/actions/free-disk-space
- name: Start Docker services - name: Start Docker services
run: make bootstrap-e2e FLUSH_ARGS='--no-input' run: make bootstrap-e2e FLUSH_ARGS='--no-input'
@@ -127,9 +124,6 @@ jobs:
- name: Install Playwright Browsers - name: Install Playwright Browsers
run: cd src/frontend/apps/e2e && yarn install --frozen-lockfile && yarn install-playwright firefox webkit chromium run: cd src/frontend/apps/e2e && yarn install --frozen-lockfile && yarn install-playwright firefox webkit chromium
- name: Free disk space before Docker
uses: ./.github/actions/free-disk-space
- name: Start Docker services - name: Start Docker services
run: make bootstrap-e2e FLUSH_ARGS='--no-input' run: make bootstrap-e2e FLUSH_ARGS='--no-input'

View File

@@ -19,7 +19,7 @@ jobs:
if: github.event_name == 'pull_request' # Makes sense only for pull requests if: github.event_name == 'pull_request' # Makes sense only for pull requests
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v2
with: with:
fetch-depth: 0 fetch-depth: 0
- name: show - name: show
@@ -46,7 +46,7 @@ jobs:
github.event_name == 'pull_request' github.event_name == 'pull_request'
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v3
with: with:
fetch-depth: 50 fetch-depth: 50
- name: Check that the CHANGELOG has been modified in the current branch - name: Check that the CHANGELOG has been modified in the current branch
@@ -56,7 +56,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v2
- name: Check CHANGELOG max line length - name: Check CHANGELOG max line length
run: | run: |
max_line_length=$(cat CHANGELOG.md | grep -Ev "^\[.*\]: https://github.com" | wc -L) max_line_length=$(cat CHANGELOG.md | grep -Ev "^\[.*\]: https://github.com" | wc -L)
@@ -70,7 +70,7 @@ jobs:
if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v2
- name: Install codespell - name: Install codespell
run: pip install --user codespell run: pip install --user codespell
- name: Check for typos - name: Check for typos
@@ -92,7 +92,7 @@ jobs:
working-directory: src/backend working-directory: src/backend
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v4 uses: actions/checkout@v2
- name: Install Python - name: Install Python
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:

View File

@@ -6,28 +6,10 @@ and this project adheres to
## [Unreleased] ## [Unreleased]
## [4.0.0] - 2025-12-01
### Added
- ✨ Add comments feature to the editor #1330
- ✨(backend) Comments on text editor #1330
- ✨(frontend) link to create new doc #1574
### Changed
- ⚡️(sw) stop to cache external resources likes videos #1655
- 💥(frontend) upgrade to ui-kit v2 #1605
- ⚡️(frontend) improve perf on upload and table of contents #1662
- ♿(frontend) improve accessibility:
- ♿(frontend) improve share modal button accessibility #1626
- ♿(frontend) improve screen reader support in DocShare modal #1628
### Fixed ### Fixed
- 🐛(frontend) fix toolbar not activated when reader #1640 - (frontend) improve accessibility:
- 🐛(frontend) preserve left panel width on window resize #1588 - (frontend) improve share modal button accessibility #1626
- 🐛(frontend) prevent duplicate as first character in title #1595
## [3.10.0] - 2025-11-18 ## [3.10.0] - 2025-11-18
@@ -58,11 +40,13 @@ and this project adheres to
### Security ### Security
- mitigate role escalation in the ask_for_access viewset #1580 - mitigate role escalation in the ask_for_access viewset #1580
- 🐛(frontend) preserve left panel width on window resize #1588
### Removed ### Removed
- 🔥(backend) remove api managing templates - 🔥(backend) remove api managing templates
## [3.9.0] - 2025-11-10 ## [3.9.0] - 2025-11-10
### Added ### Added
@@ -70,6 +54,7 @@ and this project adheres to
- ✨(frontend) create skeleton component for DocEditor #1491 - ✨(frontend) create skeleton component for DocEditor #1491
- ✨(frontend) add an EmojiPicker in the document tree and title #1381 - ✨(frontend) add an EmojiPicker in the document tree and title #1381
- ✨(frontend) ajustable left panel #1456 - ✨(frontend) ajustable left panel #1456
- ✨ Add comments feature to the editor #1330
### Changed ### Changed
@@ -198,6 +183,7 @@ and this project adheres to
### Added ### Added
- ✨(backend) Comments on text editor #1309
- 👷(CI) add bundle size check job #1268 - 👷(CI) add bundle size check job #1268
- ✨(frontend) use title first emoji as doc icon in tree #1289 - ✨(frontend) use title first emoji as doc icon in tree #1289
@@ -900,8 +886,7 @@ and this project adheres to
- ✨(frontend) Coming Soon page (#67) - ✨(frontend) Coming Soon page (#67)
- 🚀 Impress, project to manage your documents easily and collaboratively. - 🚀 Impress, project to manage your documents easily and collaboratively.
[unreleased]: https://github.com/suitenumerique/docs/compare/v4.0.0...main [unreleased]: https://github.com/suitenumerique/docs/compare/v3.10.0...main
[v4.0.0]: https://github.com/suitenumerique/docs/releases/v4.0.0
[v3.10.0]: https://github.com/suitenumerique/docs/releases/v3.10.0 [v3.10.0]: https://github.com/suitenumerique/docs/releases/v3.10.0
[v3.9.0]: https://github.com/suitenumerique/docs/releases/v3.9.0 [v3.9.0]: https://github.com/suitenumerique/docs/releases/v3.9.0
[v3.8.2]: https://github.com/suitenumerique/docs/releases/v3.8.2 [v3.8.2]: https://github.com/suitenumerique/docs/releases/v3.8.2

View File

@@ -16,29 +16,6 @@ the following command inside your docker container:
## [Unreleased] ## [Unreleased]
## [4.0.0] - 2025-11-26
- ⚠️ We updated `@gouvfr-lasuite/ui-kit` to `0.18.0`, so if you are customizing Docs with a css layer or with a custom template, you need to update your customization to follow the new design system structure.
More information about the changes in the design system can be found here:
- https://suitenumerique.github.io/cunningham/storybook/?path=/docs/migrating-from-v3-to-v4--docs
- https://github.com/suitenumerique/docs/pull/1605
- https://github.com/suitenumerique/docs/blob/main/docs/theming.md
- If you were using the `THEME_CUSTOMIZATION_FILE_PATH` and have overridden the header logo, you need to update your customization file to follow the new structure of the header, it is now:
```json
{
...,
"header": {
"icon": {
"src": "your_logo_src",
"width": "your_logo_width",
"height": "your_logo_height"
}
}
}
```
## [3.3.0] - 2025-05-22 ## [3.3.0] - 2025-05-22
⚠️ For some advanced features (ex: Export as PDF) Docs relies on XL packages from BlockNote. These are licenced under AGPL-3.0 and are not MIT compatible. You can perfectly use Docs without these packages by setting the environment variable `PUBLISH_AS_MIT` to true. That way you'll build an image of the application without the features that are not MIT compatible. Read the [environment variables documentation](/docs/env.md) for more information. ⚠️ For some advanced features (ex: Export as PDF) Docs relies on XL packages from BlockNote. These are licenced under AGPL-3.0 and are not MIT compatible. You can perfectly use Docs without these packages by setting the environment variable `PUBLISH_AS_MIT` to true. That way you'll build an image of the application without the features that are not MIT compatible. Read the [environment variables documentation](/docs/env.md) for more information.

View File

@@ -32,9 +32,9 @@ Then, set the `FRONTEND_CSS_URL` environment variable to the URL of your custom
---- ----
# **Your Docs icon** 📝 # **Your logo** 📝
You can add your own Docs icon in the header from the theme customization file. You can add your own logo in the header from the theme customization file.
### Settings 🔧 ### Settings 🔧
@@ -44,9 +44,9 @@ THEME_CUSTOMIZATION_FILE_PATH=<path>
### Example of JSON ### Example of JSON
You can activate it with the `header.icon` configuration: https://github.com/suitenumerique/docs/blob/main/src/helm/env.d/dev/configuration/theme/demo.json You can activate it with the `header.logo` configuration: https://github.com/suitenumerique/docs/blob/main/src/helm/env.d/dev/configuration/theme/demo.json
This configuration is optional. If not set, the default icon will be used. This configuration is optional. If not set, the default logo will be used.
---- ----

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Breton\n" "Language-Team: Breton\n"
"Language: br_FR\n" "Language: br_FR\n"
@@ -50,72 +50,67 @@ msgstr "Kuzhet"
msgid "Favorite" msgid "Favorite"
msgstr "Sinedoù" msgstr "Sinedoù"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Ur restr nevez a zo bet krouet ganeoc'h!" msgstr "Ur restr nevez a zo bet krouet ganeoc'h!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "C'hwi zo bet disklaeriet perc'henn ur restr nevez:" msgstr "C'hwi zo bet disklaeriet perc'henn ur restr nevez:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "Ar vaezienn-mañ a zo rekis." msgstr "Ar vaezienn-mañ a zo rekis."
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Korf" msgstr "Korf"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Doare korf" msgstr "Doare korf"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Stumm" msgstr "Stumm"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "eilenn {title}" msgstr "eilenn {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Lenner" msgstr "Lenner"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Embanner" msgstr "Embanner"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Merour" msgstr "Merour"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Perc'henn" msgstr "Perc'henn"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Strishaet" msgstr "Strishaet"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Anavezet" msgstr "Anavezet"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Publik" msgstr "Publik"
@@ -239,8 +234,8 @@ msgstr "implijer"
msgid "users" msgid "users"
msgstr "implijerien" msgstr "implijerien"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "titl" msgstr "titl"
@@ -256,188 +251,155 @@ msgstr "Restr"
msgid "Documents" msgid "Documents"
msgstr "Restroù" msgstr "Restroù"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Restr hep titl" msgstr "Restr hep titl"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} en deus rannet ur restr ganeoc'h!" msgstr "{name} en deus rannet ur restr ganeoc'h!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} en deus pedet ac'hanoc'h gant ar rol \"{role}\" war ar restr da-heul:" msgstr "{name} en deus pedet ac'hanoc'h gant ar rol \"{role}\" war ar restr da-heul:"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} en deus rannet ur restr ganeoc'h: {title}" msgstr "{name} en deus rannet ur restr ganeoc'h: {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "Roud liamm ar restr/an implijer" msgstr "Roud liamm ar restr/an implijer"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "Roudoù liamm ar restr/an implijer" msgstr "Roudoù liamm ar restr/an implijer"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "Ur roud liamm a zo dija evit an restr/an implijer." msgstr "Ur roud liamm a zo dija evit an restr/an implijer."
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Restr muiañ-karet" msgstr "Restr muiañ-karet"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Restroù muiañ-karet" msgstr "Restroù muiañ-karet"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "Ar restr-mañ a zo ur restr muiañ karet gant an implijer-mañ." msgstr "Ar restr-mañ a zo ur restr muiañ karet gant an implijer-mañ."
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "Liamm restr/implijer" msgstr "Liamm restr/implijer"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "Liammoù restr/implijer" msgstr "Liammoù restr/implijer"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "An implijer-mañ a zo dija er restr-mañ." msgstr "An implijer-mañ a zo dija er restr-mañ."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Ar skipailh-mañ a zo dija en restr-mañ." msgstr "Ar skipailh-mañ a zo dija en restr-mañ."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "An implijer pe ar skipailh a rank bezañ termenet, ket an daou avat." msgstr "An implijer pe ar skipailh a rank bezañ termenet, ket an daou avat."
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "Goulenn tizhout ar restr" msgstr "Goulenn tizhout ar restr"
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "Goulennoù tizhout ar restr" msgstr "Goulennoù tizhout ar restr"
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "An implijer en deus goulennet tizhout ar restr-mañ." msgstr "An implijer en deus goulennet tizhout ar restr-mañ."
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "{name} en defe c'hoant da dizhout ar restr-mañ!" msgstr "{name} en defe c'hoant da dizhout ar restr-mañ!"
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "{name} en defe c'hoant da dizhout ar restr da-heul:" msgstr "{name} en defe c'hoant da dizhout ar restr da-heul:"
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "{name} en defe c'hoant da dizhout ar restr: {title}" msgstr "{name} en defe c'hoant da dizhout ar restr: {title}"
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "deskrivadur" msgstr "deskrivadur"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "kod" msgstr "kod"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "css" msgstr "css"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "publik" msgstr "publik"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "M'eo foran ar patrom-mañ hag implijus gant n'eus forzh piv." msgstr "M'eo foran ar patrom-mañ hag implijus gant n'eus forzh piv."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Patrom" msgstr "Patrom"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Patromoù" msgstr "Patromoù"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "Liamm patrom/implijer" msgstr "Liamm patrom/implijer"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "Liammoù patrom/implijer" msgstr "Liammoù patrom/implijer"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "An implijer-mañ a zo dija er patrom-mañ." msgstr "An implijer-mañ a zo dija er patrom-mañ."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Ar skipailh-mañ a zo dija er patrom-mañ." msgstr "Ar skipailh-mañ a zo dija er patrom-mañ."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "postel" msgstr "postel"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Pedadenn d'ur restr" msgstr "Pedadenn d'ur restr"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Pedadennoù d'ur restr" msgstr "Pedadennoù d'ur restr"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Ar postel-mañ a zo liammet ouzh un implijer enskrivet." msgstr "Ar postel-mañ a zo liammet ouzh un implijer enskrivet."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: German\n" "Language-Team: German\n"
"Language: de_DE\n" "Language: de_DE\n"
@@ -50,72 +50,67 @@ msgstr ""
msgid "Favorite" msgid "Favorite"
msgstr "Favorit" msgstr "Favorit"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Ein neues Dokument wurde in Ihrem Namen erstellt!" msgstr "Ein neues Dokument wurde in Ihrem Namen erstellt!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "Sie sind Besitzer eines neuen Dokuments:" msgstr "Sie sind Besitzer eines neuen Dokuments:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Inhalt" msgstr "Inhalt"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Typ" msgstr "Typ"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Format" msgstr "Format"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "Kopie von {title}" msgstr "Kopie von {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Lesen" msgstr "Lesen"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Bearbeiten" msgstr "Bearbeiten"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Besitzer" msgstr "Besitzer"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Beschränkt" msgstr "Beschränkt"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Authentifiziert" msgstr "Authentifiziert"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Öffentlich" msgstr "Öffentlich"
@@ -239,8 +234,8 @@ msgstr "Benutzer"
msgid "users" msgid "users"
msgstr "Benutzer" msgstr "Benutzer"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "Titel" msgstr "Titel"
@@ -256,188 +251,155 @@ msgstr "Dokument"
msgid "Documents" msgid "Documents"
msgstr "Dokumente" msgstr "Dokumente"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Unbenanntes Dokument" msgstr "Unbenanntes Dokument"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} hat ein Dokument mit Ihnen geteilt!" msgstr "{name} hat ein Dokument mit Ihnen geteilt!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} hat Sie mit der Rolle \"{role}\" zu folgendem Dokument eingeladen:" msgstr "{name} hat Sie mit der Rolle \"{role}\" zu folgendem Dokument eingeladen:"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} hat ein Dokument mit Ihnen geteilt: {title}" msgstr "{name} hat ein Dokument mit Ihnen geteilt: {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "Dokument/Benutzer Linkverfolgung" msgstr "Dokument/Benutzer Linkverfolgung"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "Dokument/Benutzer Linkverfolgung" msgstr "Dokument/Benutzer Linkverfolgung"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "Für dieses Dokument/ diesen Benutzer ist bereits eine Linkverfolgung vorhanden." msgstr "Für dieses Dokument/ diesen Benutzer ist bereits eine Linkverfolgung vorhanden."
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Dokumentenfavorit" msgstr "Dokumentenfavorit"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Dokumentfavoriten" msgstr "Dokumentfavoriten"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "Dieses Dokument ist bereits durch den gleichen Benutzer favorisiert worden." msgstr "Dieses Dokument ist bereits durch den gleichen Benutzer favorisiert worden."
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "Dokument/Benutzerbeziehung" msgstr "Dokument/Benutzerbeziehung"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "Dokument/Benutzerbeziehungen" msgstr "Dokument/Benutzerbeziehungen"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "Dieser Benutzer befindet sich bereits in diesem Dokument." msgstr "Dieser Benutzer befindet sich bereits in diesem Dokument."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Dieses Team befindet sich bereits in diesem Dokument." msgstr "Dieses Team befindet sich bereits in diesem Dokument."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "Benutzer oder Team müssen gesetzt werden, nicht beides." msgstr "Benutzer oder Team müssen gesetzt werden, nicht beides."
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "" msgstr ""
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "" msgstr ""
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "" msgstr ""
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "Beschreibung" msgstr "Beschreibung"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "Code" msgstr "Code"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "CSS" msgstr "CSS"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "öffentlich" msgstr "öffentlich"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "Ob diese Vorlage für jedermann öffentlich ist." msgstr "Ob diese Vorlage für jedermann öffentlich ist."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Vorlage" msgstr "Vorlage"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Vorlagen" msgstr "Vorlagen"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "Vorlage/Benutzer-Beziehung" msgstr "Vorlage/Benutzer-Beziehung"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "Vorlage/Benutzerbeziehungen" msgstr "Vorlage/Benutzerbeziehungen"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "Dieser Benutzer ist bereits in dieser Vorlage." msgstr "Dieser Benutzer ist bereits in dieser Vorlage."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Dieses Team ist bereits in diesem Template." msgstr "Dieses Team ist bereits in diesem Template."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "E-Mail-Adresse" msgstr "E-Mail-Adresse"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Einladung zum Dokument" msgstr "Einladung zum Dokument"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Dokumenteinladungen" msgstr "Dokumenteinladungen"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Diese E-Mail ist bereits einem registrierten Benutzer zugeordnet." msgstr "Diese E-Mail ist bereits einem registrierten Benutzer zugeordnet."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: English\n" "Language-Team: English\n"
"Language: en_US\n" "Language: en_US\n"
@@ -50,72 +50,67 @@ msgstr ""
msgid "Favorite" msgid "Favorite"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "" msgstr ""
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "" msgstr ""
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "" msgstr ""
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "" msgstr ""
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "" msgstr ""
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "" msgstr ""
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "" msgstr ""
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "" msgstr ""
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "" msgstr ""
@@ -239,8 +234,8 @@ msgstr ""
msgid "users" msgid "users"
msgstr "" msgstr ""
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "" msgstr ""
@@ -256,188 +251,155 @@ msgstr ""
msgid "Documents" msgid "Documents"
msgstr "" msgstr ""
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "" msgstr ""
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "" msgstr ""
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "" msgstr ""
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "" msgstr ""
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "" msgstr ""
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "" msgstr ""
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "" msgstr ""
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "" msgstr ""
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "" msgstr ""
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "" msgstr ""
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "" msgstr ""
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "" msgstr ""
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "" msgstr ""
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "" msgstr ""
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "" msgstr ""
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "" msgstr ""
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "" msgstr ""
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "" msgstr ""
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "" msgstr ""
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "" msgstr ""
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "" msgstr ""
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "" msgstr ""
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "" msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
"Language: es_ES\n" "Language: es_ES\n"
@@ -50,72 +50,67 @@ msgstr ""
msgid "Favorite" msgid "Favorite"
msgstr "Favorito" msgstr "Favorito"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "¡Un nuevo documento se ha creado por ti!" msgstr "¡Un nuevo documento se ha creado por ti!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "Se le ha concedido la propiedad de un nuevo documento :" msgstr "Se le ha concedido la propiedad de un nuevo documento :"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Cuerpo" msgstr "Cuerpo"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Tipo de Cuerpo" msgstr "Tipo de Cuerpo"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Formato" msgstr "Formato"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "copia de {title}" msgstr "copia de {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Lector" msgstr "Lector"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Editor" msgstr "Editor"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Propietario" msgstr "Propietario"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Restringido" msgstr "Restringido"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Autentificado" msgstr "Autentificado"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Público" msgstr "Público"
@@ -239,8 +234,8 @@ msgstr "usuario"
msgid "users" msgid "users"
msgstr "usuarios" msgstr "usuarios"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "título" msgstr "título"
@@ -256,188 +251,155 @@ msgstr "Documento"
msgid "Documents" msgid "Documents"
msgstr "Documentos" msgstr "Documentos"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Documento sin título" msgstr "Documento sin título"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "¡{name} ha compartido un documento contigo!" msgstr "¡{name} ha compartido un documento contigo!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "Te ha invitado {name} al siguiente documento con el rol \"{role}\" :" msgstr "Te ha invitado {name} al siguiente documento con el rol \"{role}\" :"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} ha compartido un documento contigo: {title}" msgstr "{name} ha compartido un documento contigo: {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "Traza del enlace de documento/usuario" msgstr "Traza del enlace de documento/usuario"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "Trazas del enlace de documento/usuario" msgstr "Trazas del enlace de documento/usuario"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "Ya existe una traza de enlace para este documento/usuario." msgstr "Ya existe una traza de enlace para este documento/usuario."
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Documento favorito" msgstr "Documento favorito"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Documentos favoritos" msgstr "Documentos favoritos"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "Este documento ya ha sido marcado como favorito por el usuario." msgstr "Este documento ya ha sido marcado como favorito por el usuario."
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "Relación documento/usuario" msgstr "Relación documento/usuario"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "Relaciones documento/usuario" msgstr "Relaciones documento/usuario"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "Este usuario ya forma parte del documento." msgstr "Este usuario ya forma parte del documento."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Este equipo ya forma parte del documento." msgstr "Este equipo ya forma parte del documento."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "Debe establecerse un usuario o un equipo, no ambos." msgstr "Debe establecerse un usuario o un equipo, no ambos."
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "Solicitud de acceso" msgstr "Solicitud de acceso"
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "Solicitud de accesos" msgstr "Solicitud de accesos"
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "Este usuario ya ha solicitado acceso a este documento." msgstr "Este usuario ya ha solicitado acceso a este documento."
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "¡{name} desea acceder a un documento!" msgstr "¡{name} desea acceder a un documento!"
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "{name} desea acceso al siguiente documento:" msgstr "{name} desea acceso al siguiente documento:"
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "{name} está pidiendo acceso al documento: {title}" msgstr "{name} está pidiendo acceso al documento: {title}"
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "descripción" msgstr "descripción"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "código" msgstr "código"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "css" msgstr "css"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "público" msgstr "público"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "Si esta plantilla es pública para que cualquiera la utilice." msgstr "Si esta plantilla es pública para que cualquiera la utilice."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Plantilla" msgstr "Plantilla"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Plantillas" msgstr "Plantillas"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "Relación plantilla/usuario" msgstr "Relación plantilla/usuario"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "Relaciones plantilla/usuario" msgstr "Relaciones plantilla/usuario"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "Este usuario ya forma parte de la plantilla." msgstr "Este usuario ya forma parte de la plantilla."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Este equipo ya se encuentra en esta plantilla." msgstr "Este equipo ya se encuentra en esta plantilla."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "dirección de correo electrónico" msgstr "dirección de correo electrónico"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Invitación al documento" msgstr "Invitación al documento"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Invitaciones a documentos" msgstr "Invitaciones a documentos"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Este correo electrónico está asociado a un usuario registrado." msgstr "Este correo electrónico está asociado a un usuario registrado."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: French\n" "Language-Team: French\n"
"Language: fr_FR\n" "Language: fr_FR\n"
@@ -50,72 +50,67 @@ msgstr "Masqué"
msgid "Favorite" msgid "Favorite"
msgstr "Favoris" msgstr "Favoris"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Un nouveau document a été créé pour vous !" msgstr "Un nouveau document a été créé pour vous !"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "Vous avez été déclaré propriétaire d'un nouveau document :" msgstr "Vous avez été déclaré propriétaire d'un nouveau document :"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est obligatoire." msgstr "Ce champ est obligatoire."
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "La portée du lien '%(link_reach)s' n'est pas autorisée en fonction de la configuration du document parent." msgstr "La portée du lien '%(link_reach)s' n'est pas autorisée en fonction de la configuration du document parent."
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Corps" msgstr "Corps"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Type de corps" msgstr "Type de corps"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Format" msgstr "Format"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "copie de {title}" msgstr "copie de {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Lecteur" msgstr "Lecteur"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr "Commentateur"
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Éditeur" msgstr "Éditeur"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Administrateur" msgstr "Administrateur"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Propriétaire" msgstr "Propriétaire"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Restreint" msgstr "Restreint"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Authentifié" msgstr "Authentifié"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Public" msgstr "Public"
@@ -239,8 +234,8 @@ msgstr "utilisateur"
msgid "users" msgid "users"
msgstr "utilisateurs" msgstr "utilisateurs"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "titre" msgstr "titre"
@@ -256,188 +251,155 @@ msgstr "Document"
msgid "Documents" msgid "Documents"
msgstr "Documents" msgstr "Documents"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Document sans titre" msgstr "Document sans titre"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} a partagé un document avec vous!" msgstr "{name} a partagé un document avec vous!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} vous a invité avec le rôle \"{role}\" sur le document suivant :" msgstr "{name} vous a invité avec le rôle \"{role}\" sur le document suivant :"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} a partagé un document avec vous : {title}" msgstr "{name} a partagé un document avec vous : {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "Trace du lien document/utilisateur" msgstr "Trace du lien document/utilisateur"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "Traces du lien document/utilisateur" msgstr "Traces du lien document/utilisateur"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "Une trace de lien existe déjà pour ce document/utilisateur." msgstr "Une trace de lien existe déjà pour ce document/utilisateur."
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Document favori" msgstr "Document favori"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Documents favoris" msgstr "Documents favoris"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "Ce document est déjà un favori de cet utilisateur." msgstr "Ce document est déjà un favori de cet utilisateur."
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "Relation document/utilisateur" msgstr "Relation document/utilisateur"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "Relations document/utilisateur" msgstr "Relations document/utilisateur"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "Cet utilisateur est déjà dans ce document." msgstr "Cet utilisateur est déjà dans ce document."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Cette équipe est déjà dans ce document." msgstr "Cette équipe est déjà dans ce document."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "L'utilisateur ou l'équipe doivent être définis, pas les deux." msgstr "L'utilisateur ou l'équipe doivent être définis, pas les deux."
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "Demande d'accès au document" msgstr "Demande d'accès au document"
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "Demande d'accès au document" msgstr "Demande d'accès au document"
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "Cet utilisateur a déjà demandé l'accès à ce document." msgstr "Cet utilisateur a déjà demandé l'accès à ce document."
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "{name} souhaiterait accéder au document suivant !" msgstr "{name} souhaiterait accéder au document suivant !"
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "{name} souhaiterait accéder au document suivant :" msgstr "{name} souhaiterait accéder au document suivant :"
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "{name} demande l'accès au document : {title}" msgstr "{name} demande l'accès au document : {title}"
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr "Conversation"
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr "Conversations"
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr "Anonyme"
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr "Commentaire"
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr "Commentaires"
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr "Cet émoji a déjà été réagi à ce commentaire."
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr "Réaction"
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr "Réactions"
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "description" msgstr "description"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "code" msgstr "code"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "CSS" msgstr "CSS"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "public" msgstr "public"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "Si ce modèle est public, utilisable par n'importe qui." msgstr "Si ce modèle est public, utilisable par n'importe qui."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Modèle" msgstr "Modèle"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Modèles" msgstr "Modèles"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "Relation modèle/utilisateur" msgstr "Relation modèle/utilisateur"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "Relations modèle/utilisateur" msgstr "Relations modèle/utilisateur"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "Cet utilisateur est déjà dans ce modèle." msgstr "Cet utilisateur est déjà dans ce modèle."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Cette équipe est déjà modèle." msgstr "Cette équipe est déjà modèle."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "adresse e-mail" msgstr "adresse e-mail"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Invitation à un document" msgstr "Invitation à un document"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Invitations à un document" msgstr "Invitations à un document"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Cette adresse email est déjà associée à un utilisateur inscrit." msgstr "Cette adresse email est déjà associée à un utilisateur inscrit."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Italian\n" "Language-Team: Italian\n"
"Language: it_IT\n" "Language: it_IT\n"
@@ -50,72 +50,67 @@ msgstr ""
msgid "Favorite" msgid "Favorite"
msgstr "Preferiti" msgstr "Preferiti"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Un nuovo documento è stato creato a tuo nome!" msgstr "Un nuovo documento è stato creato a tuo nome!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "Sei ora proprietario di un nuovo documento:" msgstr "Sei ora proprietario di un nuovo documento:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Corpo" msgstr "Corpo"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Formato" msgstr "Formato"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "copia di {title}" msgstr "copia di {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Lettore" msgstr "Lettore"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Editor" msgstr "Editor"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Amministratore" msgstr "Amministratore"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Proprietario" msgstr "Proprietario"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Limitato" msgstr "Limitato"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Autenticato" msgstr "Autenticato"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Pubblico" msgstr "Pubblico"
@@ -239,8 +234,8 @@ msgstr "utente"
msgid "users" msgid "users"
msgstr "utenti" msgstr "utenti"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "titolo" msgstr "titolo"
@@ -256,188 +251,155 @@ msgstr "Documento"
msgid "Documents" msgid "Documents"
msgstr "Documenti" msgstr "Documenti"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Documento senza titolo" msgstr "Documento senza titolo"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} ha condiviso un documento con te!" msgstr "{name} ha condiviso un documento con te!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} ti ha invitato con il ruolo \"{role}\" nel seguente documento:" msgstr "{name} ti ha invitato con il ruolo \"{role}\" nel seguente documento:"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} ha condiviso un documento con te: {title}" msgstr "{name} ha condiviso un documento con te: {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "" msgstr ""
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "" msgstr ""
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "" msgstr ""
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Documento preferito" msgstr "Documento preferito"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Documenti preferiti" msgstr "Documenti preferiti"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "" msgstr ""
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "Questo utente è già presente in questo documento." msgstr "Questo utente è già presente in questo documento."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Questo team è già presente in questo documento." msgstr "Questo team è già presente in questo documento."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "" msgstr ""
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "" msgstr ""
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "" msgstr ""
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "" msgstr ""
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "descrizione" msgstr "descrizione"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "code" msgstr "code"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "css" msgstr "css"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "pubblico" msgstr "pubblico"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "Indica se questo modello è pubblico per chiunque." msgstr "Indica se questo modello è pubblico per chiunque."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Modello" msgstr "Modello"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Modelli" msgstr "Modelli"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "Questo utente è già in questo modello." msgstr "Questo utente è già in questo modello."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Questo team è già in questo modello." msgstr "Questo team è già in questo modello."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "indirizzo e-mail" msgstr "indirizzo e-mail"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Invito al documento" msgstr "Invito al documento"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Inviti al documento" msgstr "Inviti al documento"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Questa email è già associata a un utente registrato." msgstr "Questa email è già associata a un utente registrato."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"Language: nl_NL\n" "Language: nl_NL\n"
@@ -50,72 +50,67 @@ msgstr "Gemaskeerd"
msgid "Favorite" msgid "Favorite"
msgstr "Favoriet" msgstr "Favoriet"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Een nieuw document is namens u gemaakt!" msgstr "Een nieuw document is namens u gemaakt!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "U heeft eigenaarschap van een nieuw document gekregen:" msgstr "U heeft eigenaarschap van een nieuw document gekregen:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "Dit veld is verplicht." msgstr "Dit veld is verplicht."
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "Link bereik '%(link_reach)s' is niet toegestaan op basis van bovenliggende documentconfiguratie." msgstr "Link bereik '%(link_reach)s' is niet toegestaan op basis van bovenliggende documentconfiguratie."
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Text" msgstr "Text"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Text type" msgstr "Text type"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Formaat" msgstr "Formaat"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "kopie van {title}" msgstr "kopie van {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Lezer" msgstr "Lezer"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr "Commentator"
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Redacteur" msgstr "Redacteur"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Beheerder" msgstr "Beheerder"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Eigenaar" msgstr "Eigenaar"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Beperkt" msgstr "Beperkt"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Geauthenticeerd" msgstr "Geauthenticeerd"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Publiek" msgstr "Publiek"
@@ -239,8 +234,8 @@ msgstr "gebruiker"
msgid "users" msgid "users"
msgstr "gebruikers" msgstr "gebruikers"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "titel" msgstr "titel"
@@ -256,188 +251,155 @@ msgstr "Document"
msgid "Documents" msgid "Documents"
msgstr "Documenten" msgstr "Documenten"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Naamloos Document" msgstr "Naamloos Document"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} heeft een document met u gedeeld!" msgstr "{name} heeft een document met u gedeeld!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} heeft u uitgenodigd met de rol \"{role}\" op het volgende document:" msgstr "{name} heeft u uitgenodigd met de rol \"{role}\" op het volgende document:"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} heeft een document met u gedeeld: {title}" msgstr "{name} heeft een document met u gedeeld: {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "Document/gebruiker link" msgstr "Document/gebruiker link"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "Document/gebruiker link" msgstr "Document/gebruiker link"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "Een link bestaat al voor dit document/deze gebruiker." msgstr "Een link bestaat al voor dit document/deze gebruiker."
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Document favoriet" msgstr "Document favoriet"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Document favorieten" msgstr "Document favorieten"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "Dit document is al in gebruik als favoriet door dezelfde gebruiker." msgstr "Dit document is al in gebruik als favoriet door dezelfde gebruiker."
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "Document/gebruiker relatie" msgstr "Document/gebruiker relatie"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "Document/gebruiker relaties" msgstr "Document/gebruiker relaties"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "De gebruiker bestaat al in dit document." msgstr "De gebruiker bestaat al in dit document."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Dit team bestaat al in dit document." msgstr "Dit team bestaat al in dit document."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "Een gebruiker of team moet gekozen worden, maar niet beide." msgstr "Een gebruiker of team moet gekozen worden, maar niet beide."
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "Document verzoekt om toegang" msgstr "Document verzoekt om toegang"
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "Document verzoekt om toegangen" msgstr "Document verzoekt om toegangen"
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "Deze gebruiker heeft al om toegang tot dit document gevraagd." msgstr "Deze gebruiker heeft al om toegang tot dit document gevraagd."
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "{name} verzoekt toegang tot een document!" msgstr "{name} verzoekt toegang tot een document!"
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "{name} verzoekt toegang tot het volgende document:" msgstr "{name} verzoekt toegang tot het volgende document:"
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "{name} verzoekt toegang tot het document: {title}" msgstr "{name} verzoekt toegang tot het document: {title}"
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr "Kanaal"
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr "Kanalen"
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr "Anoniem"
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr "Reactie"
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr "Reacties"
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr "Deze emoji is al op deze opmerking gereageerd."
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr "Reactie"
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr "Reacties"
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "omschrijving" msgstr "omschrijving"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "code" msgstr "code"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "css" msgstr "css"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "publiek" msgstr "publiek"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "Of dit sjabloon door iedereen publiekelijk te gebruiken is." msgstr "Of dit sjabloon door iedereen publiekelijk te gebruiken is."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Sjabloon" msgstr "Sjabloon"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Sjabloon" msgstr "Sjabloon"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "Sjabloon/gebruiker relatie" msgstr "Sjabloon/gebruiker relatie"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "Sjabloon/gebruiker relaties" msgstr "Sjabloon/gebruiker relaties"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "De gebruiker bestaat al in dit sjabloon." msgstr "De gebruiker bestaat al in dit sjabloon."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Het team bestaat al in dit sjabloon." msgstr "Het team bestaat al in dit sjabloon."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "e-mailadres" msgstr "e-mailadres"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Document uitnodiging" msgstr "Document uitnodiging"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Document uitnodigingen" msgstr "Document uitnodigingen"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Deze email is al geassocieerd met een geregistreerde gebruiker." msgstr "Deze email is al geassocieerd met een geregistreerde gebruiker."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Portuguese\n" "Language-Team: Portuguese\n"
"Language: pt_PT\n" "Language: pt_PT\n"
@@ -50,72 +50,67 @@ msgstr ""
msgid "Favorite" msgid "Favorite"
msgstr "Favorito" msgstr "Favorito"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Um novo documento foi criado em seu nome!" msgstr "Um novo documento foi criado em seu nome!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "A propriedade de um novo documento foi concedida a você:" msgstr "A propriedade de um novo documento foi concedida a você:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Corpo" msgstr "Corpo"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Tipo de corpo" msgstr "Tipo de corpo"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Formato" msgstr "Formato"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "cópia de {title}" msgstr "cópia de {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Leitor" msgstr "Leitor"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Editor" msgstr "Editor"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Dono" msgstr "Dono"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Restrito" msgstr "Restrito"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Autenticado" msgstr "Autenticado"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Público" msgstr "Público"
@@ -239,8 +234,8 @@ msgstr ""
msgid "users" msgid "users"
msgstr "" msgstr ""
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "" msgstr ""
@@ -256,188 +251,155 @@ msgstr ""
msgid "Documents" msgid "Documents"
msgstr "" msgstr ""
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "" msgstr ""
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "" msgstr ""
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "" msgstr ""
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "" msgstr ""
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "" msgstr ""
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "" msgstr ""
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "" msgstr ""
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "" msgstr ""
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "" msgstr ""
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "" msgstr ""
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "" msgstr ""
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "" msgstr ""
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "" msgstr ""
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "" msgstr ""
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "" msgstr ""
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "" msgstr ""
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "" msgstr ""
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "" msgstr ""
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "" msgstr ""
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "" msgstr ""
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "" msgstr ""
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "" msgstr ""
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "" msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"Language: ru_RU\n" "Language: ru_RU\n"
@@ -50,72 +50,67 @@ msgstr "Скрытый"
msgid "Favorite" msgid "Favorite"
msgstr "Избранное" msgstr "Избранное"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Новый документ был создан от вашего имени!" msgstr "Новый документ был создан от вашего имени!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "Вы назначены владельцем для нового документа:" msgstr "Вы назначены владельцем для нового документа:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "Это поле обязательное." msgstr "Это поле обязательное."
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "Доступ по ссылке '%(link_reach)s' запрещён в соответствии с настройками родительского документа." msgstr "Доступ по ссылке '%(link_reach)s' запрещён в соответствии с настройками родительского документа."
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Текст сообщения" msgstr "Текст сообщения"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Тип сообщения" msgstr "Тип сообщения"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Формат" msgstr "Формат"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "копия {title}" msgstr "копия {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Читатель" msgstr "Читатель"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr "Комментатор"
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Редактор" msgstr "Редактор"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Администратор" msgstr "Администратор"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Владелец" msgstr "Владелец"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Доступ ограничен" msgstr "Доступ ограничен"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Аутентификация выполнена" msgstr "Аутентификация выполнена"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Доступно всем" msgstr "Доступно всем"
@@ -239,8 +234,8 @@ msgstr "пользователь"
msgid "users" msgid "users"
msgstr "пользователи" msgstr "пользователи"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "заголовок" msgstr "заголовок"
@@ -256,188 +251,155 @@ msgstr "Документ"
msgid "Documents" msgid "Documents"
msgstr "Документы" msgstr "Документы"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Безымянный документ" msgstr "Безымянный документ"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} делится с вами документом!" msgstr "{name} делится с вами документом!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} приглашает вас присоединиться к следующему документу с ролью \"{role}\":" msgstr "{name} приглашает вас присоединиться к следующему документу с ролью \"{role}\":"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} делится с вами документом: {title}" msgstr "{name} делится с вами документом: {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "Трассировка связи документ/пользователь" msgstr "Трассировка связи документ/пользователь"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "Трассировка связей документ/пользователь" msgstr "Трассировка связей документ/пользователь"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "Для этого документа/пользователя уже существует трассировка ссылки." msgstr "Для этого документа/пользователя уже существует трассировка ссылки."
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Избранный документ" msgstr "Избранный документ"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Избранные документы" msgstr "Избранные документы"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "Этот документ уже помечен как избранный для этого пользователя." msgstr "Этот документ уже помечен как избранный для этого пользователя."
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "Отношение документ/пользователь" msgstr "Отношение документ/пользователь"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "Отношения документ/пользователь" msgstr "Отношения документ/пользователь"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "Этот пользователь уже имеет доступ к этому документу." msgstr "Этот пользователь уже имеет доступ к этому документу."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Эта команда уже имеет доступ к этому документу." msgstr "Эта команда уже имеет доступ к этому документу."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "Может быть выбран либо пользователь, либо команда, но не оба варианта сразу." msgstr "Может быть выбран либо пользователь, либо команда, но не оба варианта сразу."
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "Документ запрашивает доступ" msgstr "Документ запрашивает доступ"
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "Документ запрашивает доступы" msgstr "Документ запрашивает доступы"
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "Этот пользователь уже запросил доступ к этому документу." msgstr "Этот пользователь уже запросил доступ к этому документу."
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "{name} хочет получить доступ к документу!" msgstr "{name} хочет получить доступ к документу!"
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "{name} хочет получить доступ к следующему документу:" msgstr "{name} хочет получить доступ к следующему документу:"
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "{name} запрашивает доступ к документу: {title}" msgstr "{name} запрашивает доступ к документу: {title}"
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr "Обсуждение"
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr "Обсуждения"
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr "Аноним"
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr "Комментарий"
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr "Комментарии"
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr "Этот эмодзи уже использован в этом комментарии."
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr "Реакция"
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr "Реакции"
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "описание" msgstr "описание"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "код" msgstr "код"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "css" msgstr "css"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "доступно всем" msgstr "доступно всем"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "Этот шаблон доступен всем пользователям." msgstr "Этот шаблон доступен всем пользователям."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Шаблон" msgstr "Шаблон"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Шаблоны" msgstr "Шаблоны"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "Отношение шаблон/пользователь" msgstr "Отношение шаблон/пользователь"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "Отношения шаблон/пользователь" msgstr "Отношения шаблон/пользователь"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "Этот пользователь уже указан в этом шаблоне." msgstr "Этот пользователь уже указан в этом шаблоне."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Эта команда уже указана в этом шаблоне." msgstr "Эта команда уже указана в этом шаблоне."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "адрес электронной почты" msgstr "адрес электронной почты"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Приглашение для документа" msgstr "Приглашение для документа"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Приглашения для документов" msgstr "Приглашения для документов"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Этот адрес уже связан с зарегистрированным пользователем." msgstr "Этот адрес уже связан с зарегистрированным пользователем."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Slovenian\n" "Language-Team: Slovenian\n"
"Language: sl_SI\n" "Language: sl_SI\n"
@@ -50,72 +50,67 @@ msgstr ""
msgid "Favorite" msgid "Favorite"
msgstr "Priljubljena" msgstr "Priljubljena"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Nov dokument je bil ustvarjen v vašem imenu!" msgstr "Nov dokument je bil ustvarjen v vašem imenu!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "Dodeljeno vam je bilo lastništvo nad novim dokumentom:" msgstr "Dodeljeno vam je bilo lastništvo nad novim dokumentom:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Telo" msgstr "Telo"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Vrsta telesa" msgstr "Vrsta telesa"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Oblika" msgstr "Oblika"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "" msgstr ""
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Bralec" msgstr "Bralec"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Urednik" msgstr "Urednik"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Skrbnik" msgstr "Skrbnik"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Lastnik" msgstr "Lastnik"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Omejeno" msgstr "Omejeno"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Preverjeno" msgstr "Preverjeno"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Javno" msgstr "Javno"
@@ -239,8 +234,8 @@ msgstr "uporabnik"
msgid "users" msgid "users"
msgstr "uporabniki" msgstr "uporabniki"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "naslov" msgstr "naslov"
@@ -256,188 +251,155 @@ msgstr "Dokument"
msgid "Documents" msgid "Documents"
msgstr "Dokumenti" msgstr "Dokumenti"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Dokument brez naslova" msgstr "Dokument brez naslova"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} je delil dokument z vami!" msgstr "{name} je delil dokument z vami!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} vas je povabil z vlogo \"{role}\" na naslednjem dokumentu:" msgstr "{name} vas je povabil z vlogo \"{role}\" na naslednjem dokumentu:"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} je delil dokument z vami: {title}" msgstr "{name} je delil dokument z vami: {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "Dokument/sled povezave uporabnika" msgstr "Dokument/sled povezave uporabnika"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "Sledi povezav dokumenta/uporabnika" msgstr "Sledi povezav dokumenta/uporabnika"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "Za ta dokument/uporabnika že obstaja sled povezave." msgstr "Za ta dokument/uporabnika že obstaja sled povezave."
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Priljubljeni dokument" msgstr "Priljubljeni dokument"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Priljubljeni dokumenti" msgstr "Priljubljeni dokumenti"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "Ta dokument je že ciljno usmerjen s priljubljenim primerkom relacije za istega uporabnika." msgstr "Ta dokument je že ciljno usmerjen s priljubljenim primerkom relacije za istega uporabnika."
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "Odnos dokument/uporabnik" msgstr "Odnos dokument/uporabnik"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "Odnosi dokument/uporabnik" msgstr "Odnosi dokument/uporabnik"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "Ta uporabnik je že v tem dokumentu." msgstr "Ta uporabnik je že v tem dokumentu."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Ta ekipa je že v tem dokumentu." msgstr "Ta ekipa je že v tem dokumentu."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "Nastaviti je treba bodisi uporabnika ali ekipo, a ne obojega." msgstr "Nastaviti je treba bodisi uporabnika ali ekipo, a ne obojega."
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "" msgstr ""
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "" msgstr ""
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "" msgstr ""
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "opis" msgstr "opis"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "koda" msgstr "koda"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "css" msgstr "css"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "javno" msgstr "javno"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "Ali je ta predloga javna za uporabo." msgstr "Ali je ta predloga javna za uporabo."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Predloga" msgstr "Predloga"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Predloge" msgstr "Predloge"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "Odnos predloga/uporabnik" msgstr "Odnos predloga/uporabnik"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "Odnosi med predlogo in uporabnikom" msgstr "Odnosi med predlogo in uporabnikom"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "Ta uporabnik je že v tej predlogi." msgstr "Ta uporabnik je že v tej predlogi."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Ta ekipa je že v tej predlogi." msgstr "Ta ekipa je že v tej predlogi."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "elektronski naslov" msgstr "elektronski naslov"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Vabilo na dokument" msgstr "Vabilo na dokument"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Vabila na dokument" msgstr "Vabila na dokument"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Ta e-poštni naslov je že povezan z registriranim uporabnikom." msgstr "Ta e-poštni naslov je že povezan z registriranim uporabnikom."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Swedish\n" "Language-Team: Swedish\n"
"Language: sv_SE\n" "Language: sv_SE\n"
@@ -50,72 +50,67 @@ msgstr ""
msgid "Favorite" msgid "Favorite"
msgstr "Favoriter" msgstr "Favoriter"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Ett nytt dokument skapades åt dig!" msgstr "Ett nytt dokument skapades åt dig!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "Du har beviljats äganderätt till ett nytt dokument:" msgstr "Du har beviljats äganderätt till ett nytt dokument:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Format" msgstr "Format"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "" msgstr ""
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "" msgstr ""
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "" msgstr ""
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Administratör" msgstr "Administratör"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "" msgstr ""
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "" msgstr ""
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "" msgstr ""
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Publik" msgstr "Publik"
@@ -239,8 +234,8 @@ msgstr ""
msgid "users" msgid "users"
msgstr "" msgstr ""
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "" msgstr ""
@@ -256,188 +251,155 @@ msgstr ""
msgid "Documents" msgid "Documents"
msgstr "" msgstr ""
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "" msgstr ""
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "" msgstr ""
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "" msgstr ""
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "" msgstr ""
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "" msgstr ""
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "" msgstr ""
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "" msgstr ""
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "" msgstr ""
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "" msgstr ""
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "" msgstr ""
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "" msgstr ""
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "" msgstr ""
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "" msgstr ""
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "" msgstr ""
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "" msgstr ""
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "" msgstr ""
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "" msgstr ""
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "" msgstr ""
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "" msgstr ""
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "" msgstr ""
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "" msgstr ""
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "e-postadress" msgstr "e-postadress"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Bjud in dokument" msgstr "Bjud in dokument"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Inbjudningar dokument" msgstr "Inbjudningar dokument"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Denna e-postadress är redan associerad med en registrerad användare." msgstr "Denna e-postadress är redan associerad med en registrerad användare."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Turkish\n" "Language-Team: Turkish\n"
"Language: tr_TR\n" "Language: tr_TR\n"
@@ -50,72 +50,67 @@ msgstr ""
msgid "Favorite" msgid "Favorite"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "" msgstr ""
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "" msgstr ""
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "" msgstr ""
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "" msgstr ""
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "" msgstr ""
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "" msgstr ""
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "" msgstr ""
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "" msgstr ""
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "" msgstr ""
@@ -239,8 +234,8 @@ msgstr ""
msgid "users" msgid "users"
msgstr "" msgstr ""
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "" msgstr ""
@@ -256,188 +251,155 @@ msgstr ""
msgid "Documents" msgid "Documents"
msgstr "" msgstr ""
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "" msgstr ""
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "" msgstr ""
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "" msgstr ""
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "" msgstr ""
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "" msgstr ""
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "" msgstr ""
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "" msgstr ""
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "" msgstr ""
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "" msgstr ""
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "" msgstr ""
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "" msgstr ""
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "" msgstr ""
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "" msgstr ""
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "" msgstr ""
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "" msgstr ""
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "" msgstr ""
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "" msgstr ""
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "" msgstr ""
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "" msgstr ""
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "" msgstr ""
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "" msgstr ""
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "" msgstr ""
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "" msgstr ""
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "" msgstr ""
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "" msgstr ""
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "" msgstr ""
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "" msgstr ""
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "" msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Ukrainian\n" "Language-Team: Ukrainian\n"
"Language: uk_UA\n" "Language: uk_UA\n"
@@ -50,72 +50,67 @@ msgstr "Приховано"
msgid "Favorite" msgid "Favorite"
msgstr "Обране" msgstr "Обране"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "Новий документ був створений від вашого імені!" msgstr "Новий документ був створений від вашого імені!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "Ви тепер є власником нового документа:" msgstr "Ви тепер є власником нового документа:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "Це поле є обов’язковим." msgstr "Це поле є обов’язковим."
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "Доступ до посилання '%(link_reach)s' заборонено на основі конфігурації батьківського документа." msgstr "Доступ до посилання '%(link_reach)s' заборонено на основі конфігурації батьківського документа."
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "Вміст" msgstr "Вміст"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "Тип вмісту" msgstr "Тип вмісту"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "Формат" msgstr "Формат"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "копія {title}" msgstr "копія {title}"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "Читач" msgstr "Читач"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr "Комментар"
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "Редактор" msgstr "Редактор"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "Адміністратор" msgstr "Адміністратор"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "Власник" msgstr "Власник"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "Обмежено" msgstr "Обмежено"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "Підтверджено" msgstr "Підтверджено"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "Публічне" msgstr "Публічне"
@@ -239,8 +234,8 @@ msgstr "користувач"
msgid "users" msgid "users"
msgstr "користувачі" msgstr "користувачі"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "заголовок" msgstr "заголовок"
@@ -256,188 +251,155 @@ msgstr "Документ"
msgid "Documents" msgid "Documents"
msgstr "Документи" msgstr "Документи"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "Документ без назви" msgstr "Документ без назви"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} ділиться з вами документом!" msgstr "{name} ділиться з вами документом!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} запрошує вас для роботи з документом із роллю \"{role}\":" msgstr "{name} запрошує вас для роботи з документом із роллю \"{role}\":"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} ділиться з вами документом: {title}" msgstr "{name} ділиться з вами документом: {title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "Трасування посилання Документ/користувач" msgstr "Трасування посилання Документ/користувач"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "Трасування посилань Документ/користувач" msgstr "Трасування посилань Документ/користувач"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "Відстеження вже існуючих посилань для цього документа/користувача." msgstr "Відстеження вже існуючих посилань для цього документа/користувача."
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "Обраний документ" msgstr "Обраний документ"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "Обрані документи" msgstr "Обрані документи"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "Цей документ вже вказаний як обраний для одного користувача." msgstr "Цей документ вже вказаний як обраний для одного користувача."
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "Відносини документ/користувач" msgstr "Відносини документ/користувач"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "Відносини документ/користувач" msgstr "Відносини документ/користувач"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "Цей користувач вже має доступ до цього документу." msgstr "Цей користувач вже має доступ до цього документу."
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "Ця команда вже має доступ до цього документа." msgstr "Ця команда вже має доступ до цього документа."
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "Вкажіть користувача або команду, а не обох." msgstr "Вкажіть користувача або команду, а не обох."
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "Запит доступу до документа" msgstr "Запит доступу до документа"
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "Запит доступу для документа" msgstr "Запит доступу для документа"
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "Цей користувач вже попросив доступ до цього документа." msgstr "Цей користувач вже попросив доступ до цього документа."
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "{name} хоче отримати доступ до документа!" msgstr "{name} хоче отримати доступ до документа!"
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "{name} бажає отримати доступ до наступного документа:" msgstr "{name} бажає отримати доступ до наступного документа:"
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "{name} запитує доступ до документа: {title}" msgstr "{name} запитує доступ до документа: {title}"
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr "Обговорення"
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr "Обговорення"
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr "Анонім"
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr "Коментар"
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr "Коментарі"
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr "Цим емодзі вже відреагували на цей коментар."
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr "Реакція"
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr "Реакції"
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "опис" msgstr "опис"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "код" msgstr "код"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "css" msgstr "css"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "публічне" msgstr "публічне"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "Чи є цей шаблон публічним для будь-кого користувача." msgstr "Чи є цей шаблон публічним для будь-кого користувача."
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "Шаблон" msgstr "Шаблон"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "Шаблони" msgstr "Шаблони"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "Відношення шаблон/користувач" msgstr "Відношення шаблон/користувач"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "Відношення шаблон/користувач" msgstr "Відношення шаблон/користувач"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "Цей користувач вже має доступ до цього шаблону." msgstr "Цей користувач вже має доступ до цього шаблону."
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "Ця команда вже має доступ до цього шаблону." msgstr "Ця команда вже має доступ до цього шаблону."
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "електронна адреса" msgstr "електронна адреса"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "Запрошення до редагування документа" msgstr "Запрошення до редагування документа"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "Запрошення до редагування документів" msgstr "Запрошення до редагування документів"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "Ця електронна пошта вже пов'язана з зареєстрованим користувачем." msgstr "Ця електронна пошта вже пов'язана з зареєстрованим користувачем."

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: lasuite-docs\n" "Project-Id-Version: lasuite-docs\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 14:08+0000\n" "POT-Creation-Date: 2025-11-17 08:04+0000\n"
"PO-Revision-Date: 2025-11-26 13:33\n" "PO-Revision-Date: 2025-11-19 10:13\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Chinese Simplified\n" "Language-Team: Chinese Simplified\n"
"Language: zh_CN\n" "Language: zh_CN\n"
@@ -50,72 +50,67 @@ msgstr "已屏蔽"
msgid "Favorite" msgid "Favorite"
msgstr "收藏" msgstr "收藏"
#: build/lib/core/api/serializers.py:497 core/api/serializers.py:497 #: build/lib/core/api/serializers.py:496 core/api/serializers.py:496
msgid "A new document was created on your behalf!" msgid "A new document was created on your behalf!"
msgstr "已为您创建了一份新文档!" msgstr "已为您创建了一份新文档!"
#: build/lib/core/api/serializers.py:501 core/api/serializers.py:501 #: build/lib/core/api/serializers.py:500 core/api/serializers.py:500
msgid "You have been granted ownership of a new document:" msgid "You have been granted ownership of a new document:"
msgstr "您已被授予新文档的所有权:" msgstr "您已被授予新文档的所有权:"
#: build/lib/core/api/serializers.py:537 core/api/serializers.py:537 #: build/lib/core/api/serializers.py:536 core/api/serializers.py:536
msgid "This field is required." msgid "This field is required."
msgstr "必填字段。" msgstr "必填字段。"
#: build/lib/core/api/serializers.py:548 core/api/serializers.py:548 #: build/lib/core/api/serializers.py:547 core/api/serializers.py:547
#, python-format #, python-format
msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration." msgid "Link reach '%(link_reach)s' is not allowed based on parent document configuration."
msgstr "" msgstr ""
#: build/lib/core/api/serializers.py:694 core/api/serializers.py:694 #: build/lib/core/api/serializers.py:693 core/api/serializers.py:693
msgid "Body" msgid "Body"
msgstr "正文" msgstr "正文"
#: build/lib/core/api/serializers.py:697 core/api/serializers.py:697 #: build/lib/core/api/serializers.py:696 core/api/serializers.py:696
msgid "Body type" msgid "Body type"
msgstr "正文类型" msgstr "正文类型"
#: build/lib/core/api/serializers.py:703 core/api/serializers.py:703 #: build/lib/core/api/serializers.py:702 core/api/serializers.py:702
msgid "Format" msgid "Format"
msgstr "格式" msgstr "格式"
#: build/lib/core/api/viewsets.py:1004 core/api/viewsets.py:1004 #: build/lib/core/api/viewsets.py:1003 core/api/viewsets.py:1003
#, python-brace-format #, python-brace-format
msgid "copy of {title}" msgid "copy of {title}"
msgstr "{title} 的副本" msgstr "{title} 的副本"
#: build/lib/core/choices.py:35 build/lib/core/choices.py:43 core/choices.py:35 #: build/lib/core/choices.py:35 build/lib/core/choices.py:42 core/choices.py:35
#: core/choices.py:43 #: core/choices.py:42
msgid "Reader" msgid "Reader"
msgstr "阅读者" msgstr "阅读者"
#: build/lib/core/choices.py:36 build/lib/core/choices.py:44 core/choices.py:36 #: build/lib/core/choices.py:36 build/lib/core/choices.py:43 core/choices.py:36
#: core/choices.py:44 #: core/choices.py:43
msgid "Commenter"
msgstr ""
#: build/lib/core/choices.py:37 build/lib/core/choices.py:45 core/choices.py:37
#: core/choices.py:45
msgid "Editor" msgid "Editor"
msgstr "编辑者" msgstr "编辑者"
#: build/lib/core/choices.py:46 core/choices.py:46 #: build/lib/core/choices.py:44 core/choices.py:44
msgid "Administrator" msgid "Administrator"
msgstr "超级管理员" msgstr "超级管理员"
#: build/lib/core/choices.py:47 core/choices.py:47 #: build/lib/core/choices.py:45 core/choices.py:45
msgid "Owner" msgid "Owner"
msgstr "所有者" msgstr "所有者"
#: build/lib/core/choices.py:58 core/choices.py:58 #: build/lib/core/choices.py:56 core/choices.py:56
msgid "Restricted" msgid "Restricted"
msgstr "受限的" msgstr "受限的"
#: build/lib/core/choices.py:62 core/choices.py:62 #: build/lib/core/choices.py:60 core/choices.py:60
msgid "Authenticated" msgid "Authenticated"
msgstr "已验证" msgstr "已验证"
#: build/lib/core/choices.py:64 core/choices.py:64 #: build/lib/core/choices.py:62 core/choices.py:62
msgid "Public" msgid "Public"
msgstr "公开" msgstr "公开"
@@ -239,8 +234,8 @@ msgstr "用户"
msgid "users" msgid "users"
msgstr "个用户" msgstr "个用户"
#: build/lib/core/models.py:361 build/lib/core/models.py:1430 #: build/lib/core/models.py:361 build/lib/core/models.py:1276
#: core/models.py:361 core/models.py:1430 #: core/models.py:361 core/models.py:1276
msgid "title" msgid "title"
msgstr "标题" msgstr "标题"
@@ -256,188 +251,155 @@ msgstr "文档"
msgid "Documents" msgid "Documents"
msgstr "个文档" msgstr "个文档"
#: build/lib/core/models.py:424 build/lib/core/models.py:824 core/models.py:424 #: build/lib/core/models.py:424 build/lib/core/models.py:822 core/models.py:424
#: core/models.py:824 #: core/models.py:822
msgid "Untitled Document" msgid "Untitled Document"
msgstr "未命名文档" msgstr "未命名文档"
#: build/lib/core/models.py:859 core/models.py:859 #: build/lib/core/models.py:857 core/models.py:857
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you!" msgid "{name} shared a document with you!"
msgstr "{name} 与您共享了一个文档!" msgstr "{name} 与您共享了一个文档!"
#: build/lib/core/models.py:863 core/models.py:863 #: build/lib/core/models.py:861 core/models.py:861
#, python-brace-format #, python-brace-format
msgid "{name} invited you with the role \"{role}\" on the following document:" msgid "{name} invited you with the role \"{role}\" on the following document:"
msgstr "{name} 邀请您以“{role}”角色访问以下文档:" msgstr "{name} 邀请您以“{role}”角色访问以下文档:"
#: build/lib/core/models.py:869 core/models.py:869 #: build/lib/core/models.py:867 core/models.py:867
#, python-brace-format #, python-brace-format
msgid "{name} shared a document with you: {title}" msgid "{name} shared a document with you: {title}"
msgstr "{name} 与您共享了一个文档:{title}" msgstr "{name} 与您共享了一个文档:{title}"
#: build/lib/core/models.py:969 core/models.py:969 #: build/lib/core/models.py:967 core/models.py:967
msgid "Document/user link trace" msgid "Document/user link trace"
msgstr "文档/用户链接跟踪" msgstr "文档/用户链接跟踪"
#: build/lib/core/models.py:970 core/models.py:970 #: build/lib/core/models.py:968 core/models.py:968
msgid "Document/user link traces" msgid "Document/user link traces"
msgstr "个文档/用户链接跟踪" msgstr "个文档/用户链接跟踪"
#: build/lib/core/models.py:976 core/models.py:976 #: build/lib/core/models.py:974 core/models.py:974
msgid "A link trace already exists for this document/user." msgid "A link trace already exists for this document/user."
msgstr "此文档/用户的链接跟踪已存在。" msgstr "此文档/用户的链接跟踪已存在。"
#: build/lib/core/models.py:999 core/models.py:999 #: build/lib/core/models.py:997 core/models.py:997
msgid "Document favorite" msgid "Document favorite"
msgstr "文档收藏" msgstr "文档收藏"
#: build/lib/core/models.py:1000 core/models.py:1000 #: build/lib/core/models.py:998 core/models.py:998
msgid "Document favorites" msgid "Document favorites"
msgstr "文档收藏夹" msgstr "文档收藏夹"
#: build/lib/core/models.py:1006 core/models.py:1006 #: build/lib/core/models.py:1004 core/models.py:1004
msgid "This document is already targeted by a favorite relation instance for the same user." msgid "This document is already targeted by a favorite relation instance for the same user."
msgstr "该文档已被同一用户的收藏关系实例关联。" msgstr "该文档已被同一用户的收藏关系实例关联。"
#: build/lib/core/models.py:1028 core/models.py:1028 #: build/lib/core/models.py:1026 core/models.py:1026
msgid "Document/user relation" msgid "Document/user relation"
msgstr "文档/用户关系" msgstr "文档/用户关系"
#: build/lib/core/models.py:1029 core/models.py:1029 #: build/lib/core/models.py:1027 core/models.py:1027
msgid "Document/user relations" msgid "Document/user relations"
msgstr "文档/用户关系集" msgstr "文档/用户关系集"
#: build/lib/core/models.py:1035 core/models.py:1035 #: build/lib/core/models.py:1033 core/models.py:1033
msgid "This user is already in this document." msgid "This user is already in this document."
msgstr "该用户已在此文档中。" msgstr "该用户已在此文档中。"
#: build/lib/core/models.py:1041 core/models.py:1041 #: build/lib/core/models.py:1039 core/models.py:1039
msgid "This team is already in this document." msgid "This team is already in this document."
msgstr "该团队已在此文档中。" msgstr "该团队已在此文档中。"
#: build/lib/core/models.py:1047 build/lib/core/models.py:1516 #: build/lib/core/models.py:1045 build/lib/core/models.py:1362
#: core/models.py:1047 core/models.py:1516 #: core/models.py:1045 core/models.py:1362
msgid "Either user or team must be set, not both." msgid "Either user or team must be set, not both."
msgstr "必须设置用户或团队之一,不能同时设置两者。" msgstr "必须设置用户或团队之一,不能同时设置两者。"
#: build/lib/core/models.py:1198 core/models.py:1198 #: build/lib/core/models.py:1191 core/models.py:1191
msgid "Document ask for access" msgid "Document ask for access"
msgstr "文档需要访问权限" msgstr "文档需要访问权限"
#: build/lib/core/models.py:1199 core/models.py:1199 #: build/lib/core/models.py:1192 core/models.py:1192
msgid "Document ask for accesses" msgid "Document ask for accesses"
msgstr "文档需要访问权限" msgstr "文档需要访问权限"
#: build/lib/core/models.py:1205 core/models.py:1205 #: build/lib/core/models.py:1198 core/models.py:1198
msgid "This user has already asked for access to this document." msgid "This user has already asked for access to this document."
msgstr "用户已申请该文档的访问权限。" msgstr "用户已申请该文档的访问权限。"
#: build/lib/core/models.py:1262 core/models.py:1262 #: build/lib/core/models.py:1255 core/models.py:1255
#, python-brace-format #, python-brace-format
msgid "{name} would like access to a document!" msgid "{name} would like access to a document!"
msgstr "{name} 申请访问文档!" msgstr "{name} 申请访问文档!"
#: build/lib/core/models.py:1266 core/models.py:1266 #: build/lib/core/models.py:1259 core/models.py:1259
#, python-brace-format #, python-brace-format
msgid "{name} would like access to the following document:" msgid "{name} would like access to the following document:"
msgstr "{name} 申请访问以下文档:" msgstr "{name} 申请访问以下文档:"
#: build/lib/core/models.py:1272 core/models.py:1272 #: build/lib/core/models.py:1265 core/models.py:1265
#, python-brace-format #, python-brace-format
msgid "{name} is asking for access to the document: {title}" msgid "{name} is asking for access to the document: {title}"
msgstr "{name}申请文档:{title}的访问权限" msgstr "{name}申请文档:{title}的访问权限"
#: build/lib/core/models.py:1314 core/models.py:1314 #: build/lib/core/models.py:1277 core/models.py:1277
msgid "Thread"
msgstr ""
#: build/lib/core/models.py:1315 core/models.py:1315
msgid "Threads"
msgstr ""
#: build/lib/core/models.py:1318 build/lib/core/models.py:1370
#: core/models.py:1318 core/models.py:1370
msgid "Anonymous"
msgstr ""
#: build/lib/core/models.py:1365 core/models.py:1365
msgid "Comment"
msgstr ""
#: build/lib/core/models.py:1366 core/models.py:1366
msgid "Comments"
msgstr ""
#: build/lib/core/models.py:1415 core/models.py:1415
msgid "This emoji has already been reacted to this comment."
msgstr ""
#: build/lib/core/models.py:1419 core/models.py:1419
msgid "Reaction"
msgstr ""
#: build/lib/core/models.py:1420 core/models.py:1420
msgid "Reactions"
msgstr ""
#: build/lib/core/models.py:1431 core/models.py:1431
msgid "description" msgid "description"
msgstr "说明" msgstr "说明"
#: build/lib/core/models.py:1432 core/models.py:1432 #: build/lib/core/models.py:1278 core/models.py:1278
msgid "code" msgid "code"
msgstr "代码" msgstr "代码"
#: build/lib/core/models.py:1433 core/models.py:1433 #: build/lib/core/models.py:1279 core/models.py:1279
msgid "css" msgid "css"
msgstr "css" msgstr "css"
#: build/lib/core/models.py:1435 core/models.py:1435 #: build/lib/core/models.py:1281 core/models.py:1281
msgid "public" msgid "public"
msgstr "公开" msgstr "公开"
#: build/lib/core/models.py:1437 core/models.py:1437 #: build/lib/core/models.py:1283 core/models.py:1283
msgid "Whether this template is public for anyone to use." msgid "Whether this template is public for anyone to use."
msgstr "该模板是否公开供任何人使用。" msgstr "该模板是否公开供任何人使用。"
#: build/lib/core/models.py:1443 core/models.py:1443 #: build/lib/core/models.py:1289 core/models.py:1289
msgid "Template" msgid "Template"
msgstr "模板" msgstr "模板"
#: build/lib/core/models.py:1444 core/models.py:1444 #: build/lib/core/models.py:1290 core/models.py:1290
msgid "Templates" msgid "Templates"
msgstr "模板" msgstr "模板"
#: build/lib/core/models.py:1497 core/models.py:1497 #: build/lib/core/models.py:1343 core/models.py:1343
msgid "Template/user relation" msgid "Template/user relation"
msgstr "模板/用户关系" msgstr "模板/用户关系"
#: build/lib/core/models.py:1498 core/models.py:1498 #: build/lib/core/models.py:1344 core/models.py:1344
msgid "Template/user relations" msgid "Template/user relations"
msgstr "模板/用户关系集" msgstr "模板/用户关系集"
#: build/lib/core/models.py:1504 core/models.py:1504 #: build/lib/core/models.py:1350 core/models.py:1350
msgid "This user is already in this template." msgid "This user is already in this template."
msgstr "该用户已在此模板中。" msgstr "该用户已在此模板中。"
#: build/lib/core/models.py:1510 core/models.py:1510 #: build/lib/core/models.py:1356 core/models.py:1356
msgid "This team is already in this template." msgid "This team is already in this template."
msgstr "该团队已在此模板中。" msgstr "该团队已在此模板中。"
#: build/lib/core/models.py:1587 core/models.py:1587 #: build/lib/core/models.py:1433 core/models.py:1433
msgid "email address" msgid "email address"
msgstr "电子邮件地址" msgstr "电子邮件地址"
#: build/lib/core/models.py:1606 core/models.py:1606 #: build/lib/core/models.py:1452 core/models.py:1452
msgid "Document invitation" msgid "Document invitation"
msgstr "文档邀请" msgstr "文档邀请"
#: build/lib/core/models.py:1607 core/models.py:1607 #: build/lib/core/models.py:1453 core/models.py:1453
msgid "Document invitations" msgid "Document invitations"
msgstr "文档邀请" msgstr "文档邀请"
#: build/lib/core/models.py:1627 core/models.py:1627 #: build/lib/core/models.py:1473 core/models.py:1473
msgid "This email is already associated to a registered user." msgid "This email is already associated to a registered user."
msgstr "此电子邮件已经与现有注册用户关联。" msgstr "此电子邮件已经与现有注册用户关联。"

View File

@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "impress" name = "impress"
version = "4.0.0" version = "3.10.0"
authors = [{ "name" = "DINUM", "email" = "dev@mail.numerique.gouv.fr" }] authors = [{ "name" = "DINUM", "email" = "dev@mail.numerique.gouv.fr" }]
classifiers = [ classifiers = [
"Development Status :: 5 - Production/Stable", "Development Status :: 5 - Production/Stable",

View File

@@ -47,6 +47,15 @@ ENV NEXT_PUBLIC_SW_DEACTIVATED=${SW_DEACTIVATED}
ARG PUBLISH_AS_MIT ARG PUBLISH_AS_MIT
ENV NEXT_PUBLIC_PUBLISH_AS_MIT=${PUBLISH_AS_MIT} ENV NEXT_PUBLIC_PUBLISH_AS_MIT=${PUBLISH_AS_MIT}
ARG CUSTOM_CODE
COPY ./${CUSTOM_CODE} /tmp/custom_code
RUN if [ -n "$CUSTOM_CODE" ] && [ -d "/tmp/custom_code" ] && [ "$(ls -A /tmp/custom_code)" ]; then \
echo "Custom code provided. Replacing files from $CUSTOM_CODE..."; \
cp -Rv /tmp/custom_code/${CUSTOM_CODE}/* .; \
else \
echo "No custom code provided. Skipping replacement..."; \
fi
RUN yarn build RUN yarn build
# ---- Front-end image ---- # ---- Front-end image ----

View File

@@ -7,7 +7,6 @@ import {
randomName, randomName,
verifyDocName, verifyDocName,
} from './utils-common'; } from './utils-common';
import { connectOtherUserToDoc } from './utils-share';
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
await page.goto('/'); await page.goto('/');
@@ -74,82 +73,6 @@ test.describe('Doc Create', () => {
page.locator('.c__tree-view--row-content').getByText('Untitled document'), page.locator('.c__tree-view--row-content').getByText('Untitled document'),
).toBeVisible(); ).toBeVisible();
}); });
test('it creates a doc with link "/doc/new/', async ({
page,
browserName,
}) => {
test.slow();
// Private doc creation
await page.goto('/docs/new/?title=My+private+doc+from+url');
await verifyDocName(page, 'My private doc from url');
await page.getByRole('button', { name: 'Share' }).click();
await expect(
page.getByTestId('doc-visibility').getByText('Private').first(),
).toBeVisible();
// Public editing doc creation
await page.goto(
'/docs/new/?title=My+public+doc+from+url&link-reach=public&link-role=editor',
);
await verifyDocName(page, 'My public doc from url');
await page.getByRole('button', { name: 'Share' }).click();
await expect(
page.getByTestId('doc-visibility').getByText('Public').first(),
).toBeVisible();
await expect(
page.getByTestId('doc-access-mode').getByText('Editing').first(),
).toBeVisible();
// Authenticated reading doc creation
await page.goto(
'/docs/new/?title=My+authenticated+doc+from+url&link-reach=authenticated&link-role=reader',
);
await verifyDocName(page, 'My authenticated doc from url');
await page.getByRole('button', { name: 'Share' }).click();
await expect(
page.getByTestId('doc-visibility').getByText('Connected').first(),
).toBeVisible();
await expect(
page.getByTestId('doc-access-mode').getByText('Reading').first(),
).toBeVisible();
const { cleanup, otherPage, otherBrowserName } =
await connectOtherUserToDoc({
docUrl:
'/docs/new/?title=From+unlogged+doc+from+url&link-reach=authenticated&link-role=reader',
browserName,
withoutSignIn: true,
});
await keyCloakSignIn(otherPage, otherBrowserName, false);
await verifyDocName(otherPage, 'From unlogged doc from url');
await otherPage.getByRole('button', { name: 'Share' }).click();
await expect(
otherPage.getByTestId('doc-visibility').getByText('Connected').first(),
).toBeVisible();
await expect(
otherPage.getByTestId('doc-access-mode').getByText('Reading').first(),
).toBeVisible();
await cleanup();
});
}); });
test.describe('Doc Create: Not logged', () => { test.describe('Doc Create: Not logged', () => {

View File

@@ -24,13 +24,15 @@ test.beforeEach(async ({ page }) => {
}); });
test.describe('Doc Editor', () => { test.describe('Doc Editor', () => {
test('it checks toolbar buttons are displayed', async ({ test('it checks default toolbar buttons are displayed', async ({
page, page,
browserName, browserName,
}) => { }) => {
await createDoc(page, 'doc-toolbar', browserName, 1); await createDoc(page, 'doc-toolbar', browserName, 1);
const editor = await writeInEditor({ page, text: 'test content' }); const editor = page.locator('.ProseMirror');
await editor.click();
await editor.fill('test content');
await editor await editor
.getByText('test content', { .getByText('test content', {
@@ -39,9 +41,6 @@ test.describe('Doc Editor', () => {
.selectText(); .selectText();
const toolbar = page.locator('.bn-formatting-toolbar'); const toolbar = page.locator('.bn-formatting-toolbar');
await expect(
toolbar.locator('button[data-test="comment-toolbar-button"]'),
).toBeVisible();
await expect(toolbar.locator('button[data-test="bold"]')).toBeVisible(); await expect(toolbar.locator('button[data-test="bold"]')).toBeVisible();
await expect(toolbar.locator('button[data-test="italic"]')).toBeVisible(); await expect(toolbar.locator('button[data-test="italic"]')).toBeVisible();
await expect( await expect(
@@ -64,53 +63,6 @@ test.describe('Doc Editor', () => {
await expect( await expect(
toolbar.locator('button[data-test="createLink"]'), toolbar.locator('button[data-test="createLink"]'),
).toBeVisible(); ).toBeVisible();
await expect(
toolbar.locator('button[data-test="ai-actions"]'),
).toBeVisible();
await expect(
toolbar.locator('button[data-test="convertMarkdown"]'),
).toBeVisible();
await page.keyboard.press('Escape');
await page.locator('.bn-block-outer').last().click();
await page.keyboard.press('Enter');
const fileChooserPromise = page.waitForEvent('filechooser');
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Resizable image with caption').click();
await page.getByText('Upload image').click();
const fileChooser = await fileChooserPromise;
await fileChooser.setFiles(
path.join(__dirname, 'assets/logo-suite-numerique.png'),
);
const image = page
.locator('.--docs--editor-container img.bn-visual-media')
.first();
await expect(image).toHaveAttribute('role', 'presentation');
await image.dblclick();
await expect(
toolbar.locator('button[data-test="comment-toolbar-button"]'),
).toBeHidden();
await expect(
toolbar.locator('button[data-test="ai-actions"]'),
).toBeHidden();
await expect(
toolbar.locator('button[data-test="convertMarkdown"]'),
).toBeHidden();
await expect(
toolbar.locator('button[data-test="editcaption"]'),
).toBeVisible();
await expect(
toolbar.locator('button[data-test="downloadfile"]'),
).toBeVisible();
}); });
/** /**
@@ -289,66 +241,20 @@ test.describe('Doc Editor', () => {
await expect(editor.getByText('Hello World Doc persisted 2')).toBeVisible(); await expect(editor.getByText('Hello World Doc persisted 2')).toBeVisible();
}); });
test('it cannot edit if viewer but see and can get resources', async ({ test('it cannot edit if viewer', async ({ page }) => {
page, await mockedDocument(page, {
browserName, user_role: 'reader',
}) => {
const [docTitle] = await createDoc(page, 'doc-viewer', browserName, 1);
await verifyDocName(page, docTitle);
await writeInEditor({ page, text: 'Hello World' });
await page.getByRole('button', { name: 'Share' }).click();
await updateShareLink(page, 'Public', 'Reading');
// Close the modal
await page.getByRole('button', { name: 'close' }).first().click();
const { otherPage, cleanup } = await connectOtherUserToDoc({
browserName,
docUrl: page.url(),
withoutSignIn: true,
docTitle,
}); });
await expect( await goToGridDoc(page);
otherPage.getByLabel('It is the card information').getByText('Reader'),
).toBeVisible();
// Cannot edit const card = page.getByLabel('It is the card information');
const editor = otherPage.locator('.ProseMirror'); await expect(card).toBeVisible();
await expect(card.getByText('Reader')).toBeVisible();
const editor = page.locator('.ProseMirror');
await expect(editor).toHaveAttribute('contenteditable', 'false'); await expect(editor).toHaveAttribute('contenteditable', 'false');
// Owner add a image
const fileChooserPromise = page.waitForEvent('filechooser');
await page.locator('.bn-block-outer').last().fill('/');
await page.getByText('Resizable image with caption').click();
await page.getByText('Upload image').click();
const fileChooser = await fileChooserPromise;
await fileChooser.setFiles(
path.join(__dirname, 'assets/logo-suite-numerique.png'),
);
// Owner see the image
await expect(
page.locator('.--docs--editor-container img.bn-visual-media').first(),
).toBeVisible();
// Viewser see the image
const viewerImg = otherPage
.locator('.--docs--editor-container img.bn-visual-media')
.first();
await expect(viewerImg).toBeVisible();
// Viewer can download the image
await viewerImg.click();
const downloadPromise = otherPage.waitForEvent('download');
await otherPage.getByRole('button', { name: 'Download image' }).click();
const download = await downloadPromise;
expect(download.suggestedFilename()).toBe('logo-suite-numerique.png');
await cleanup();
}); });
test('it adds an image to the doc editor', async ({ page, browserName }) => { test('it adds an image to the doc editor', async ({ page, browserName }) => {

View File

@@ -208,7 +208,7 @@ test.describe('Doc Header', () => {
await expect( await expect(
invitationCard.getByText('test.test@invitation.test').first(), invitationCard.getByText('test.test@invitation.test').first(),
).toBeVisible(); ).toBeVisible();
const invitationRole = invitationCard.getByTestId('doc-role-dropdown'); const invitationRole = invitationCard.getByLabel('doc-role-dropdown');
await expect(invitationRole).toBeVisible(); await expect(invitationRole).toBeVisible();
await invitationRole.click(); await invitationRole.click();
@@ -217,7 +217,7 @@ test.describe('Doc Header', () => {
await expect(invitationCard).toBeHidden(); await expect(invitationCard).toBeHidden();
const memberCard = shareModal.getByLabel('List members card'); const memberCard = shareModal.getByLabel('List members card');
const roles = memberCard.getByTestId('doc-role-dropdown'); const roles = memberCard.getByLabel('doc-role-dropdown');
await expect(memberCard).toBeVisible(); await expect(memberCard).toBeVisible();
await expect( await expect(
memberCard.getByText('test.test@accesses.test').first(), memberCard.getByText('test.test@accesses.test').first(),
@@ -582,12 +582,8 @@ test.describe('Doc Header', () => {
await child.hover(); await child.hover();
await child.getByText(`more_horiz`).click(); await child.getByText(`more_horiz`).click();
const currentUrl = page.url();
await page.getByRole('menuitem', { name: 'Duplicate' }).click(); await page.getByRole('menuitem', { name: 'Duplicate' }).click();
await expect(page).not.toHaveURL(new RegExp(currentUrl));
await verifyDocName(page, duplicateTitle); await verifyDocName(page, duplicateTitle);
await expect( await expect(

View File

@@ -74,7 +74,7 @@ test.describe('Document create member', () => {
await expect(list.getByText(email)).toBeVisible(); await expect(list.getByText(email)).toBeVisible();
// Check roles are displayed // Check roles are displayed
await list.getByTestId('doc-role-dropdown').click(); await list.getByLabel('doc-role-dropdown').click();
await expect(page.getByRole('menuitem', { name: 'Reader' })).toBeVisible(); await expect(page.getByRole('menuitem', { name: 'Reader' })).toBeVisible();
await expect(page.getByRole('menuitem', { name: 'Editor' })).toBeVisible(); await expect(page.getByRole('menuitem', { name: 'Editor' })).toBeVisible();
await expect(page.getByRole('menuitem', { name: 'Owner' })).toBeVisible(); await expect(page.getByRole('menuitem', { name: 'Owner' })).toBeVisible();
@@ -84,7 +84,7 @@ test.describe('Document create member', () => {
// Validate // Validate
await page.getByRole('menuitem', { name: 'Administrator' }).click(); await page.getByRole('menuitem', { name: 'Administrator' }).click();
await page.getByTestId('doc-share-invite-button').click(); await page.getByRole('button', { name: /^Invite / }).click();
// Check invitation added // Check invitation added
await expect( await expect(
@@ -128,14 +128,14 @@ test.describe('Document create member', () => {
// Choose a role // Choose a role
const container = page.getByTestId('doc-share-add-member-list'); const container = page.getByTestId('doc-share-add-member-list');
await container.getByTestId('doc-role-dropdown').click(); await container.getByLabel('doc-role-dropdown').click();
await page.getByRole('menuitem', { name: 'Owner' }).click(); await page.getByRole('menuitem', { name: 'Owner' }).click();
const responsePromiseCreateInvitation = page.waitForResponse( const responsePromiseCreateInvitation = page.waitForResponse(
(response) => (response) =>
response.url().includes('/invitations/') && response.status() === 201, response.url().includes('/invitations/') && response.status() === 201,
); );
await page.getByTestId('doc-share-invite-button').click(); await page.getByRole('button', { name: /^Invite / }).click();
// Check invitation sent // Check invitation sent
@@ -146,7 +146,7 @@ test.describe('Document create member', () => {
await page.getByTestId(`search-user-row-${email}`).click(); await page.getByTestId(`search-user-row-${email}`).click();
// Choose a role // Choose a role
await container.getByTestId('doc-role-dropdown').click(); await container.getByLabel('doc-role-dropdown').click();
await page.getByRole('menuitem', { name: 'Owner' }).click(); await page.getByRole('menuitem', { name: 'Owner' }).click();
const responsePromiseCreateInvitationFail = page.waitForResponse( const responsePromiseCreateInvitationFail = page.waitForResponse(
@@ -154,7 +154,7 @@ test.describe('Document create member', () => {
response.url().includes('/invitations/') && response.status() === 400, response.url().includes('/invitations/') && response.status() === 400,
); );
await page.getByTestId('doc-share-invite-button').click(); await page.getByRole('button', { name: /^Invite / }).click();
await expect( await expect(
page.getByText(`"${email}" is already invited to the document.`), page.getByText(`"${email}" is already invited to the document.`),
).toBeVisible(); ).toBeVisible();
@@ -183,7 +183,7 @@ test.describe('Document create member', () => {
// Choose a role // Choose a role
const container = page.getByTestId('doc-share-add-member-list'); const container = page.getByTestId('doc-share-add-member-list');
await container.getByTestId('doc-role-dropdown').click(); await container.getByLabel('doc-role-dropdown').click();
await page.getByRole('menuitem', { name: 'Administrator' }).click(); await page.getByRole('menuitem', { name: 'Administrator' }).click();
const responsePromiseCreateInvitation = page.waitForResponse( const responsePromiseCreateInvitation = page.waitForResponse(
@@ -191,7 +191,7 @@ test.describe('Document create member', () => {
response.url().includes('/invitations/') && response.status() === 201, response.url().includes('/invitations/') && response.status() === 201,
); );
await page.getByTestId('doc-share-invite-button').click(); await page.getByRole('button', { name: /^Invite / }).click();
// Check invitation sent // Check invitation sent
const responseCreateInvitation = await responsePromiseCreateInvitation; const responseCreateInvitation = await responsePromiseCreateInvitation;
@@ -210,14 +210,18 @@ test.describe('Document create member', () => {
response.request().method() === 'PATCH', response.request().method() === 'PATCH',
); );
await userInvitation.getByTestId('doc-role-dropdown').click(); await userInvitation.getByLabel('doc-role-dropdown').click();
await page.getByRole('menuitem', { name: 'Reader' }).click(); await page.getByRole('menuitem', { name: 'Reader' }).click();
const responsePatchInvitation = await responsePromisePatchInvitation; const responsePatchInvitation = await responsePromisePatchInvitation;
expect(responsePatchInvitation.ok()).toBeTruthy(); expect(responsePatchInvitation.ok()).toBeTruthy();
await userInvitation.getByTestId('doc-role-dropdown').click(); const moreActions = userInvitation.getByRole('button', {
await page.getByRole('menuitem', { name: 'Remove access' }).click(); name: 'Open invitation actions menu',
});
await moreActions.click();
await page.getByRole('menuitem', { name: 'Delete' }).click();
await expect(userInvitation).toBeHidden(); await expect(userInvitation).toBeHidden();
}); });
@@ -268,7 +272,7 @@ test.describe('Document create member', () => {
const container = page.getByTestId( const container = page.getByTestId(
`doc-share-access-request-row-${emailRequest}`, `doc-share-access-request-row-${emailRequest}`,
); );
await container.getByTestId('doc-role-dropdown').click(); await container.getByLabel('doc-role-dropdown').click();
await page.getByRole('menuitem', { name: 'Administrator' }).click(); await page.getByRole('menuitem', { name: 'Administrator' }).click();
await container.getByRole('button', { name: 'Approve' }).click(); await container.getByRole('button', { name: 'Approve' }).click();

View File

@@ -152,7 +152,7 @@ test.describe('Document list members', () => {
const currentUser = list.getByTestId( const currentUser = list.getByTestId(
`doc-share-member-row-user.test@${browserName}.test`, `doc-share-member-row-user.test@${browserName}.test`,
); );
const currentUserRole = currentUser.getByTestId('doc-role-dropdown'); const currentUserRole = currentUser.getByLabel('doc-role-dropdown');
await expect(currentUser).toBeVisible(); await expect(currentUser).toBeVisible();
await expect(currentUserRole).toBeVisible(); await expect(currentUserRole).toBeVisible();
await currentUserRole.click(); await currentUserRole.click();
@@ -169,7 +169,7 @@ test.describe('Document list members', () => {
}); });
const newUserEmail = await addNewMember(page, 0, 'Owner'); const newUserEmail = await addNewMember(page, 0, 'Owner');
const newUser = list.getByTestId(`doc-share-member-row-${newUserEmail}`); const newUser = list.getByTestId(`doc-share-member-row-${newUserEmail}`);
const newUserRoles = newUser.getByTestId('doc-role-dropdown'); const newUserRoles = newUser.getByLabel('doc-role-dropdown');
await expect(newUser).toBeVisible(); await expect(newUser).toBeVisible();
@@ -214,7 +214,9 @@ test.describe('Document list members', () => {
const emailMyself = `user.test@${browserName}.test`; const emailMyself = `user.test@${browserName}.test`;
const mySelf = list.getByTestId(`doc-share-member-row-${emailMyself}`); const mySelf = list.getByTestId(`doc-share-member-row-${emailMyself}`);
const mySelfRole = mySelf.getByTestId('doc-role-dropdown'); const mySelfRole = mySelf.getByRole('button', {
name: 'doc-role-dropdown',
});
const userOwnerEmail = await addNewMember(page, 0, 'Owner'); const userOwnerEmail = await addNewMember(page, 0, 'Owner');
const userOwner = list.getByTestId( const userOwner = list.getByTestId(
@@ -229,7 +231,9 @@ test.describe('Document list members', () => {
const userReader = list.getByTestId( const userReader = list.getByTestId(
`doc-share-member-row-${userReaderEmail}`, `doc-share-member-row-${userReaderEmail}`,
); );
const userReaderRole = userReader.getByTestId('doc-role-dropdown'); const userReaderRole = userReader.getByRole('button', {
name: 'doc-role-dropdown',
});
await expect(mySelf).toBeVisible(); await expect(mySelf).toBeVisible();
await expect(userOwner).toBeVisible(); await expect(userOwner).toBeVisible();

View File

@@ -19,8 +19,6 @@ test.describe('Doc Table Content', () => {
await page.locator('.ProseMirror').click(); await page.locator('.ProseMirror').click();
await expect(page.getByRole('button', { name: 'Summary' })).toBeHidden();
await page.keyboard.type('# Level 1\n## Level 2\n### Level 3'); await page.keyboard.type('# Level 1\n## Level 2\n### Level 3');
const summaryContainer = page.locator('#summaryContainer'); const summaryContainer = page.locator('#summaryContainer');

View File

@@ -226,7 +226,7 @@ test.describe('Doc Tree', () => {
const currentUser = list.getByTestId( const currentUser = list.getByTestId(
`doc-share-member-row-user.test@${browserName}.test`, `doc-share-member-row-user.test@${browserName}.test`,
); );
const currentUserRole = currentUser.getByTestId('doc-role-dropdown'); const currentUserRole = currentUser.getByLabel('doc-role-dropdown');
await currentUserRole.click(); await currentUserRole.click();
await page.getByRole('menuitem', { name: 'Administrator' }).click(); await page.getByRole('menuitem', { name: 'Administrator' }).click();
await list.click(); await list.click();

View File

@@ -156,10 +156,9 @@ test.describe('Header: Override configuration', () => {
FRONTEND_THEME: 'dsfr', FRONTEND_THEME: 'dsfr',
theme_customization: { theme_customization: {
header: { header: {
icon: { logo: {
src: '/assets/logo-gouv.svg', src: '/assets/logo-gouv.svg',
width: '220px', width: '220px',
height: 'auto',
alt: '', alt: '',
}, },
}, },

View File

@@ -1,6 +1,6 @@
import { expect, test } from '@playwright/test'; import { expect, test } from '@playwright/test';
import { createDoc, goToGridDoc, verifyDocName } from './utils-common'; import { createDoc } from './utils-common';
test.describe('Left panel desktop', () => { test.describe('Left panel desktop', () => {
test.beforeEach(async ({ page }) => { test.beforeEach(async ({ page }) => {
@@ -10,12 +10,8 @@ test.describe('Left panel desktop', () => {
test('checks all the elements are visible', async ({ page }) => { test('checks all the elements are visible', async ({ page }) => {
await expect(page.getByTestId('left-panel-desktop')).toBeVisible(); await expect(page.getByTestId('left-panel-desktop')).toBeVisible();
await expect(page.getByTestId('left-panel-mobile')).toBeHidden(); await expect(page.getByTestId('left-panel-mobile')).toBeHidden();
await expect(page.getByTestId('home-button')).toBeHidden();
await expect(page.getByTestId('new-doc-button')).toBeVisible();
await goToGridDoc(page);
await expect(page.getByTestId('home-button')).toBeVisible(); await expect(page.getByTestId('home-button')).toBeVisible();
await expect(page.getByTestId('new-doc-button')).toBeVisible();
}); });
test('checks resize handle is present and functional on document page', async ({ test('checks resize handle is present and functional on document page', async ({
@@ -92,9 +88,6 @@ test.describe('Left panel mobile', () => {
await expect(languageButton).not.toBeInViewport(); await expect(languageButton).not.toBeInViewport();
await expect(logoutButton).not.toBeInViewport(); await expect(logoutButton).not.toBeInViewport();
const title = await goToGridDoc(page);
await verifyDocName(page, title);
await header.getByLabel('Open the header menu').click(); await header.getByLabel('Open the header menu').click();
await expect(page.getByTestId('left-panel-mobile')).toBeInViewport(); await expect(page.getByTestId('left-panel-mobile')).toBeInViewport();

View File

@@ -38,9 +38,9 @@ export const addNewMember = async (
await page.getByRole('option', { name: users[index].email }).click(); await page.getByRole('option', { name: users[index].email }).click();
// Choose a role // Choose a role
await page.getByTestId('doc-role-dropdown').click(); await page.getByLabel('doc-role-dropdown').click();
await page.getByRole('menuitem', { name: role }).click(); await page.getByRole('menuitem', { name: role }).click();
await page.getByTestId('doc-share-invite-button').click(); await page.getByRole('button', { name: /^Invite / }).click();
return users[index].email; return users[index].email;
}; };
@@ -74,7 +74,7 @@ export const updateRoleUser = async (
const list = page.getByTestId('doc-share-quick-search'); const list = page.getByTestId('doc-share-quick-search');
const currentUser = list.getByTestId(`doc-share-member-row-${email}`); const currentUser = list.getByTestId(`doc-share-member-row-${email}`);
const currentUserRole = currentUser.getByTestId('doc-role-dropdown'); const currentUserRole = currentUser.getByLabel('doc-role-dropdown');
await currentUserRole.click(); await currentUserRole.click();
await page.getByRole('menuitem', { name: role }).click(); await page.getByRole('menuitem', { name: role }).click();
await list.click(); await list.click();

View File

@@ -1,6 +1,6 @@
{ {
"name": "app-e2e", "name": "app-e2e",
"version": "4.0.0", "version": "3.10.0",
"repository": "https://github.com/suitenumerique/docs", "repository": "https://github.com/suitenumerique/docs",
"author": "DINUM", "author": "DINUM",
"license": "MIT", "license": "MIT",

View File

@@ -1,25 +1,57 @@
import { cunninghamConfig as tokens } from '@gouvfr-lasuite/ui-kit'; import { cunninghamConfig as tokens } from '@gouvfr-lasuite/ui-kit';
import { defaultTokens } from '@openfun/cunningham-react';
import merge from 'lodash/merge';
// Uikit does not provide the full list of tokens. const customColors = {
// To be able to override correctly, we need to merge with the default tokens. 'primary-action': '#1212FF',
let mergedColors = merge( 'primary-bg': '#FAFAFA',
defaultTokens.globals.colors, 'primary-focus': '#0A76F6',
tokens.themes.default.globals.colors, 'secondary-icon': 'var(--c--theme--colors--primary-text)',
); 'blue-400': '#7AB1E8',
'blue-500': '#417DC4',
mergedColors = { 'blue-600': '#3558A2',
...mergedColors, 'brown-400': '#E6BE92',
'logo-1': '#2845C1', 'brown-500': '#BD987A',
'brown-600': '#745B47',
'cyan-400': '#34BAB5',
'cyan-500': '#009099',
'cyan-600': '#006A6F',
'gold-400': '#FFCA00',
'gold-500': '#C3992A',
'gold-600': '#695240',
'green-400': '#34CB6A',
'green-500': '#00A95F',
'green-600': '#297254',
'olive-400': '#99C221',
'olive-500': '#68A532',
'olive-600': '#447049',
'orange-400': '#FF732C',
'orange-500': '#E4794A',
'orange-600': '#755348',
'pink-400': '#FFB7AE',
'pink-500': '#E18B76',
'pink-600': '#8D533E',
'purple-400': '#CE70CC',
'purple-500': '#A558A0',
'purple-600': '#6E445A',
'yellow-400': '#D8C634',
'yellow-500': '#B7A73F',
'yellow-600': '#66673D',
}; };
tokens.themes.default.globals = { tokens.themes.default.theme = {
...tokens.themes.default.globals, ...tokens.themes.default.theme,
...{ ...{
colors: mergedColors, logo: {
src: '',
alt: '',
widthHeader: '',
widthFooter: '',
},
colors: {
...tokens.themes.default.theme.colors,
...customColors,
},
font: { font: {
...tokens.themes.default.globals.font, ...tokens.themes.default.theme.font,
families: { families: {
base: 'sans-serif', base: 'sans-serif',
accent: 'sans-serif', accent: 'sans-serif',
@@ -31,29 +63,39 @@ tokens.themes.default.globals = {
tokens.themes.default.components = { tokens.themes.default.components = {
...tokens.themes.default.components, ...tokens.themes.default.components,
...{ ...{
logo: {
src: '',
alt: '',
widthHeader: '',
widthFooter: '',
},
'la-gaufre': false, 'la-gaufre': false,
'home-proconnect': false, 'home-proconnect': false,
icon: { 'image-system-filter': '',
src: '/assets/icon-docs.svg',
width: '32px',
height: 'auto',
},
favicon: { favicon: {
ico: '/assets/favicon-light.ico',
'png-light': '/assets/favicon-light.png', 'png-light': '/assets/favicon-light.png',
'png-dark': '/assets/favicon-dark.png', 'png-dark': '/assets/favicon-dark.png',
}, },
button: {
...tokens.themes.default.components.button,
primary: {
...tokens.themes.default.components.button.primary,
...{
'background--disabled': 'var(--c--theme--colors--greyscale-100)',
},
disabled: 'var(--c--theme--colors--greyscale-400)',
},
},
}, },
}; };
const dsfrTheme = { const dsfrTheme = {
dsfr: { dsfr: {
globals: { theme: {
colors: {
'secondary-icon': '#C9191E',
},
logo: {
src: '/assets/logo-gouv.svg',
widthHeader: '110px',
widthFooter: '220px',
alt: 'Gouvernement Logo',
},
font: { font: {
families: { families: {
base: 'Marianne, Inter, Roboto Flex Variable, sans-serif', base: 'Marianne, Inter, Roboto Flex Variable, sans-serif',
@@ -62,19 +104,8 @@ const dsfrTheme = {
}, },
}, },
components: { components: {
logo: {
src: '/assets/logo-gouv.svg',
widthHeader: '110px',
widthFooter: '220px',
alt: 'Gouvernement Logo',
},
'la-gaufre': true, 'la-gaufre': true,
'home-proconnect': true, 'home-proconnect': true,
icon: {
src: '/assets/icon-docs-dsfr.svg',
width: '32px',
height: 'auto',
},
favicon: { favicon: {
ico: '/assets/favicon-dsfr.ico', ico: '/assets/favicon-dsfr.ico',
'png-light': '/assets/favicon-dsfr.png', 'png-light': '/assets/favicon-dsfr.png',
@@ -86,296 +117,131 @@ const dsfrTheme = {
const genericTheme = { const genericTheme = {
generic: { generic: {
globals: { theme: {
colors: { colors: {
'brand-050': '#EEF1FA', 'primary-action': '#206EBD',
'brand-100': '#DDE2F5', 'primary-focus': '#1E64BF',
'brand-150': '#CED3F1', 'primary-text': '#2E2C28',
'brand-200': '#BEC5F0', 'primary-050': '#F8F8F7',
'brand-250': '#AFB5F1', 'primary-100': '#F0EFEC',
'brand-300': '#A0A5F6', 'primary-150': '#F4F4FD',
'brand-350': '#8F94FD', 'primary-200': '#E8E7E4',
'brand-400': '#8184FC', 'primary-300': '#CFCDC9',
'brand-450': '#7576EE', 'primary-400': '#979592',
'brand-500': '#6969DF', 'primary-500': '#82807D',
'brand-550': '#5E5CD0', 'primary-600': '#3F3D39',
'brand-600': '#534FC2', 'primary-700': '#2E2C28',
'brand-650': '#4844AD', 'primary-800': '#302E29',
'brand-700': '#3E3B98', 'primary-900': '#282622',
'brand-750': '#36347D', 'primary-950': '#201F1C',
'brand-800': '#2D2F5F', 'secondary-text': '#fff',
'brand-850': '#262848', 'secondary-50': '#F4F7FA',
'brand-900': '#1C1E32', 'secondary-100': '#D7E3EE',
'brand-950': '#11131F', 'secondary-200': '#B8CCE1',
'gray-000': '#FFFFFF', 'secondary-300': '#99B4D3',
'gray-025': '#F8F8F9', 'secondary-400': '#7595BE',
'gray-050': '#F0F0F3', 'secondary-500': '#5874A0',
'gray-100': '#E2E2EA', 'secondary-600': '#3A5383',
'gray-150': '#D3D4E0', 'secondary-700': '#1E3462',
'gray-200': '#C5C6D5', 'secondary-800': '#091B41',
'gray-250': '#B7B7CB', 'secondary-900': '#08183B',
'gray-300': '#A9A9BF', 'secondary-950': '#071636',
'gray-350': '#9C9CB2', 'greyscale-text': '#3C3B38',
'gray-400': '#8F8FA4', 'greyscale-000': '#fff',
'gray-450': '#828297', 'greyscale-050': '#F8F7F7',
'gray-500': '#75758A', 'greyscale-100': '#F3F3F2',
'gray-550': '#69697D', 'greyscale-200': '#ECEBEA',
'gray-600': '#5D5D70', 'greyscale-250': '#E4E3E2',
'gray-650': '#515164', 'greyscale-300': '#D3D2CF',
'gray-700': '#454558', 'greyscale-350': '#eee',
'gray-750': '#3A3A4C', 'greyscale-400': '#96948E',
'gray-800': '#2F303D', 'greyscale-500': '#817E77',
'gray-850': '#25252F', 'greyscale-600': '#6A6862',
'gray-900': '#1B1B23', 'greyscale-700': '#3C3B38',
'gray-950': '#111114', 'greyscale-750': '#383632',
'gray-1000': '#000000', 'greyscale-800': '#2D2B27',
'info-050': '#EAF2F9', 'greyscale-900': '#262522',
'info-100': '#D5E4F3', 'greyscale-950': '#201F1C',
'info-150': '#BFD7F0', 'greyscale-1000': '#181714',
'info-200': '#A7CAEE', 'success-text': '#234935',
'info-250': '#8DBDEF', 'success-50': '#F3FBF5',
'info-300': '#6EB0F2', 'success-100': '#E4F7EA',
'info-350': '#50A2F5', 'success-200': '#CAEED4',
'info-400': '#3593F4', 'success-300': '#A0E0B5',
'info-450': '#1185ED', 'success-400': '#6CC88C',
'info-500': '#0077DE', 'success-500': '#6CC88C',
'info-550': '#0069CF', 'success-600': '#358D5C',
'info-600': '#005BC0', 'success-700': '#2D704B',
'info-650': '#0D4EAA', 'success-800': '#28583F',
'info-700': '#124394', 'success-900': '#234935',
'info-750': '#163878', 'success-950': '#0F281B',
'info-800': '#192F5A', 'info-text': '#212445',
'info-850': '#192541', 'info-50': '#F2F6FB',
'info-900': '#141B2D', 'info-100': '#E2E9F5',
'info-950': '#0C111C', 'info-200': '#CCD8EE',
'success-050': '#E8F1EA', 'info-300': '#A9C0E3',
'success-100': '#CFE4D4', 'info-400': '#809DD4',
'success-150': '#BAD9C1', 'info-500': '#617BC7',
'success-200': '#A2CFAD', 'info-600': '#4A5CBF',
'success-250': '#86C597', 'info-700': '#3E49B2',
'success-300': '#6CBA83', 'info-800': '#353C8F',
'success-350': '#4FB070', 'info-900': '#303771',
'success-400': '#40A363', 'info-950': '#212445',
'success-450': '#309556', 'warning-text': '#D97C3A',
'success-500': '#1E884A', 'warning-50': '#FDF7F1',
'success-550': '#027B3E', 'warning-100': '#FBEDDC',
'success-600': '#016D31', 'warning-200': '#F5D9B9',
'success-650': '#006024', 'warning-300': '#EDBE8C',
'success-700': '#005317', 'warning-400': '#E2985C',
'success-750': '#0D4511', 'warning-500': '#D97C3A',
'success-800': '#11380E', 'warning-600': '#C96330',
'success-850': '#132A11', 'warning-700': '#A34B32',
'success-900': '#101E0F', 'warning-800': '#813B2C',
'success-950': '#091209', 'warning-900': '#693327',
'warning-050': '#F8F0E9', 'warning-950': '#381713',
'warning-100': '#F1E0D3', 'danger-action': '#C0182A',
'warning-150': '#ECD0BC', 'danger-text': '#FFF',
'warning-200': '#E8C0A4', 'danger-050': '#FDF5F4',
'warning-250': '#E8AE8A', 'danger-100': '#FBEBE8',
'warning-300': '#EB9970', 'danger-200': '#F9E0DC',
'warning-350': '#E98456', 'danger-300': '#F3C3BD',
'warning-400': '#E57036', 'danger-400': '#E26552',
'warning-450': '#DA5E18', 'danger-500': '#C91F00',
'warning-500': '#CB5000', 'danger-600': '#A71901',
'warning-550': '#BC4200', 'danger-700': '#562C2B',
'warning-600': '#AD3300', 'danger-800': '#392425',
'warning-650': '#9E2300', 'danger-900': '#311F20',
'warning-700': '#882011', 'danger-950': '#2A191A',
'warning-750': '#731E16', 'blue-400': '#8BAECC',
'warning-800': '#58201A', 'blue-500': '#567AA2',
'warning-850': '#401D18', 'blue-600': '#455784',
'warning-900': '#2E1714', 'brown-400': '#E4C090',
'warning-950': '#1D0F0D', 'brown-500': '#BA9977',
'error-050': '#F9EFEC', 'brown-600': '#735C45',
'error-100': '#F4DFD9', 'cyan-400': '#5CBEC9',
'error-150': '#F0CEC6', 'cyan-500': '#43A1B3',
'error-200': '#EEBCB2', 'cyan-600': '#39809B',
'error-250': '#EEA99D', 'gold-400': '#ECBF50',
'error-300': '#EF9486', 'gold-500': '#DFA038',
'error-350': '#F37C6E', 'gold-600': '#C17B31',
'error-400': '#F65F53', 'green-400': '#5DBD9A',
'error-450': '#F0463D', 'green-500': '#3AA183',
'error-500': '#E82322', 'green-600': '#2A816D',
'error-550': '#D7010E', 'olive-400': '#AFD662',
'error-600': '#C00100', 'olive-500': '#90BB4B',
'error-650': '#AA0000', 'olive-600': '#6E9441',
'error-700': '#910C06', 'orange-400': '#E2985C',
'error-750': '#731E16', 'orange-500': '#D97C3A',
'error-800': '#58201A', 'orange-600': '#C96330',
'error-850': '#401D18', 'pink-400': '#BE8FC8',
'error-900': '#2E1714', 'pink-500': '#A563B1',
'error-950': '#1D0F0D', 'pink-600': '#8B44A5',
'red-050': '#FAEFEE', 'purple-400': '#BE8FC8',
'red-100': '#F4DEDD', 'purple-500': '#A563B1',
'red-150': '#F1CDCB', 'purple-600': '#8B44A5',
'red-200': '#EFBBBA', 'yellow-400': '#EDC947',
'red-250': '#EEA8A8', 'yellow-500': '#DBB13A',
'red-300': '#F09394', 'yellow-600': '#B88A34',
'red-350': '#F37B7E',
'red-400': '#EF6569',
'red-450': '#E94A55',
'red-500': '#DA3B49',
'red-550': '#CA2A3C',
'red-600': '#BB1330',
'red-650': '#A90021',
'red-700': '#910A13',
'red-750': '#731E16',
'red-800': '#58201A',
'red-850': '#411D18',
'red-900': '#2E1714',
'red-950': '#1D0F0D',
'orange-050': '#F8F0E9',
'orange-100': '#F1E0D3',
'orange-150': '#ECD0BD',
'orange-200': '#EABFA6',
'orange-250': '#EBAC90',
'orange-300': '#EC9772',
'orange-350': '#E5845A',
'orange-400': '#D6774D',
'orange-450': '#C86A40',
'orange-500': '#B95D33',
'orange-550': '#AB5025',
'orange-600': '#9D4315',
'orange-650': '#8F3600',
'orange-700': '#812900',
'orange-750': '#6C2511',
'orange-800': '#572017',
'orange-850': '#401D18',
'orange-900': '#2E1714',
'orange-950': '#1D0F0D',
'brown-050': '#F6F0E8',
'brown-100': '#F1E0D3',
'brown-150': '#EBD0BA',
'brown-200': '#E2C0A6',
'brown-250': '#D4B398',
'brown-300': '#C6A58B',
'brown-350': '#B8987E',
'brown-400': '#AA8B71',
'brown-450': '#9D7E65',
'brown-500': '#8F7158',
'brown-550': '#82654C',
'brown-600': '#765841',
'brown-650': '#694C35',
'brown-700': '#5D412A',
'brown-750': '#51361E',
'brown-800': '#452A13',
'brown-850': '#392008',
'brown-900': '#29180A',
'brown-950': '#1B0F08',
'yellow-050': '#F3F0E7',
'yellow-100': '#E9E2CF',
'yellow-150': '#E1D4B7',
'yellow-200': '#D9C599',
'yellow-250': '#D2B677',
'yellow-300': '#CAA756',
'yellow-350': '#C2972E',
'yellow-400': '#B98900',
'yellow-450': '#AB7B00',
'yellow-500': '#9D6E00',
'yellow-550': '#916100',
'yellow-600': '#855400',
'yellow-650': '#784700',
'yellow-700': '#6C3A00',
'yellow-750': '#5F2E00',
'yellow-800': '#512302',
'yellow-850': '#3E1D10',
'yellow-900': '#2D1711',
'yellow-950': '#1D0F0D',
'green-050': '#E6F1E9',
'green-100': '#CFE4D5',
'green-150': '#B8D8C1',
'green-200': '#A0CFAE',
'green-250': '#84C59A',
'green-300': '#65BA86',
'green-350': '#45B173',
'green-400': '#23A562',
'green-450': '#029755',
'green-500': '#008948',
'green-550': '#017B3B',
'green-600': '#006E2E',
'green-650': '#006022',
'green-700': '#005314',
'green-750': '#0D4510',
'green-800': '#11380E',
'green-850': '#132A11',
'green-900': '#101E0F',
'green-950': '#091209',
'blue1-050': '#EBF1F9',
'blue1-100': '#D6E4F4',
'blue1-150': '#C1D7F0',
'blue1-200': '#AACAEF',
'blue1-250': '#8FBCEF',
'blue1-300': '#7CAFEB',
'blue1-350': '#68A1E4',
'blue1-400': '#5B94D6',
'blue1-450': '#4E86C7',
'blue1-500': '#4279B9',
'blue1-550': '#356CAC',
'blue1-600': '#28609E',
'blue1-650': '#1B5390',
'blue1-700': '#0B4783',
'blue1-750': '#0F3C6E',
'blue1-800': '#133059',
'blue1-850': '#152641',
'blue1-900': '#121C2D',
'blue1-950': '#0B111C',
'blue2-050': '#E7F3F4',
'blue2-100': '#CEE7E9',
'blue2-150': '#B2DCE0',
'blue2-200': '#91D1D7',
'blue2-250': '#68C7D0',
'blue2-300': '#43BBC5',
'blue2-350': '#00AFBA',
'blue2-400': '#01A0AA',
'blue2-450': '#00929D',
'blue2-500': '#00848F',
'blue2-550': '#007682',
'blue2-600': '#016874',
'blue2-650': '#005B67',
'blue2-700': '#004E5A',
'blue2-750': '#00424E',
'blue2-800': '#003642',
'blue2-850': '#002A38',
'blue2-900': '#061E28',
'blue2-950': '#071219',
'purple-050': '#F7F0F6',
'purple-100': '#EEE0EE',
'purple-150': '#E7D1E7',
'purple-200': '#DBBFE4',
'purple-250': '#D3AEE2',
'purple-300': '#CB99E1',
'purple-350': '#C188D9',
'purple-400': '#B47BCB',
'purple-450': '#A66EBD',
'purple-500': '#9961AF',
'purple-550': '#8B55A1',
'purple-600': '#7E4894',
'purple-650': '#723C87',
'purple-700': '#633376',
'purple-750': '#552A65',
'purple-800': '#452551',
'purple-850': '#35213D',
'purple-900': '#261A2C',
'purple-950': '#17111C',
'pink-050': '#F8EFF4',
'pink-100': '#F0DFEA',
'pink-150': '#EACEDF',
'pink-200': '#E9BBD1',
'pink-250': '#E9A7C2',
'pink-300': '#E095B4',
'pink-350': '#D685A8',
'pink-400': '#C7799B',
'pink-450': '#B86C8D',
'pink-500': '#AA5F80',
'pink-550': '#9C5374',
'pink-600': '#8E4767',
'pink-650': '#813B5B',
'pink-700': '#732E4F',
'pink-750': '#632643',
'pink-800': '#521F38',
'pink-850': '#3E1C2B',
'pink-900': '#2D171F',
'pink-950': '#1C0E12',
}, },
font: { font: {
families: { families: {
@@ -384,6 +250,18 @@ const genericTheme = {
}, },
}, },
}, },
components: {
button: {
primary: {
background: {
'color-hover': 'var(--c--theme--colors--primary-focus)',
'color-active': 'var(--c--theme--colors--primary-focus)',
'color-focus': 'var(--c--theme--colors--primary-focus)',
},
},
},
'image-system-filter': 'saturate(0.2)',
},
}, },
}; };

View File

@@ -1,6 +1,6 @@
{ {
"name": "app-impress", "name": "app-impress",
"version": "4.0.0", "version": "3.10.0",
"repository": "https://github.com/suitenumerique/docs", "repository": "https://github.com/suitenumerique/docs",
"author": "DINUM", "author": "DINUM",
"license": "MIT", "license": "MIT",
@@ -32,17 +32,17 @@
"@emoji-mart/data": "1.2.1", "@emoji-mart/data": "1.2.1",
"@emoji-mart/react": "1.1.1", "@emoji-mart/react": "1.1.1",
"@fontsource-variable/inter": "5.2.8", "@fontsource-variable/inter": "5.2.8",
"@fontsource-variable/material-symbols-outlined": "5.2.30", "@fontsource-variable/material-symbols-outlined": "5.2.28",
"@fontsource/material-icons": "5.2.7", "@fontsource/material-icons": "5.2.7",
"@gouvfr-lasuite/integration": "1.0.3", "@gouvfr-lasuite/integration": "1.0.3",
"@gouvfr-lasuite/ui-kit": "0.18.0", "@gouvfr-lasuite/ui-kit": "0.16.2",
"@hocuspocus/provider": "3.4.0", "@hocuspocus/provider": "3.4.0",
"@mantine/core": "8.3.9", "@mantine/core": "8.3.6",
"@mantine/hooks": "8.3.9", "@mantine/hooks": "8.3.6",
"@openfun/cunningham-react": "4.0.0", "@openfun/cunningham-react": "3.2.3",
"@react-pdf/renderer": "4.3.1", "@react-pdf/renderer": "4.3.1",
"@sentry/nextjs": "10.27.0", "@sentry/nextjs": "10.22.0",
"@tanstack/react-query": "5.90.10", "@tanstack/react-query": "5.90.6",
"@tiptap/extensions": "*", "@tiptap/extensions": "*",
"canvg": "4.0.3", "canvg": "4.0.3",
"clsx": "2.1.1", "clsx": "2.1.1",
@@ -52,17 +52,17 @@
"emoji-datasource-apple": "16.0.0", "emoji-datasource-apple": "16.0.0",
"emoji-mart": "5.6.0", "emoji-mart": "5.6.0",
"emoji-regex": "10.6.0", "emoji-regex": "10.6.0",
"i18next": "25.6.3", "i18next": "25.6.0",
"i18next-browser-languagedetector": "8.2.0", "i18next-browser-languagedetector": "8.2.0",
"idb": "8.0.3", "idb": "8.0.3",
"lodash": "4.17.21", "lodash": "4.17.21",
"luxon": "3.7.2", "luxon": "3.7.2",
"next": "15.5.4", "next": "15.5.4",
"posthog-js": "1.298.0", "posthog-js": "1.284.0",
"react": "*", "react": "*",
"react-aria-components": "1.13.0", "react-aria-components": "1.13.0",
"react-dom": "*", "react-dom": "*",
"react-i18next": "16.3.5", "react-i18next": "16.3.3",
"react-intersection-observer": "10.0.0", "react-intersection-observer": "10.0.0",
"react-resizable-panels": "3.0.6", "react-resizable-panels": "3.0.6",
"react-select": "5.10.2", "react-select": "5.10.2",
@@ -74,32 +74,32 @@
}, },
"devDependencies": { "devDependencies": {
"@svgr/webpack": "8.1.0", "@svgr/webpack": "8.1.0",
"@tanstack/react-query-devtools": "5.91.0", "@tanstack/react-query-devtools": "5.90.2",
"@testing-library/dom": "10.4.1", "@testing-library/dom": "10.4.1",
"@testing-library/jest-dom": "6.9.1", "@testing-library/jest-dom": "6.9.1",
"@testing-library/react": "16.3.0", "@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1", "@testing-library/user-event": "14.6.1",
"@types/lodash": "4.17.21", "@types/lodash": "4.17.20",
"@types/luxon": "3.7.1", "@types/luxon": "3.7.1",
"@types/node": "*", "@types/node": "*",
"@types/react": "*", "@types/react": "*",
"@types/react-dom": "*", "@types/react-dom": "*",
"@vitejs/plugin-react": "5.1.1", "@vitejs/plugin-react": "5.1.0",
"copy-webpack-plugin": "13.0.1", "copy-webpack-plugin": "13.0.1",
"cross-env": "10.1.0", "cross-env": "10.1.0",
"dotenv": "17.2.3", "dotenv": "17.2.3",
"eslint-plugin-docs": "*", "eslint-plugin-docs": "*",
"fetch-mock": "9.11.0", "fetch-mock": "9.11.0",
"jsdom": "27.2.0", "jsdom": "27.1.0",
"node-fetch": "2.7.0", "node-fetch": "2.7.0",
"prettier": "3.6.2", "prettier": "3.6.2",
"stylelint": "16.26.0", "stylelint": "16.25.0",
"stylelint-config-standard": "39.0.1", "stylelint-config-standard": "39.0.1",
"stylelint-prettier": "5.0.3", "stylelint-prettier": "5.0.3",
"typescript": "*", "typescript": "*",
"vite-tsconfig-paths": "5.1.4", "vite-tsconfig-paths": "5.1.4",
"vitest": "4.0.13", "vitest": "4.0.6",
"webpack": "5.103.0", "webpack": "5.102.1",
"workbox-webpack-plugin": "7.1.0" "workbox-webpack-plugin": "7.1.0"
}, },
"packageManager": "yarn@1.22.22" "packageManager": "yarn@1.22.22"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 932 B

After

Width:  |  Height:  |  Size: 992 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1,12 +0,0 @@
<svg viewBox="0 0 32 33" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M21.6305 29.5812C22.7983 29.2538 23.9166 28.6562 24.6505 27.6003C25.3749 26.5663 25.5789 25.2547 25.5789 23.9925V5.50099C25.5789 5.17358 25.5611 4.84557 25.5216 4.52148C26.1016 4.74961 26.5486 5.12658 26.8626 5.65239C27.2331 6.25024 27.4184 7.03757 27.4184 8.01435V26.7964C27.4184 28.1184 27.0942 29.1078 26.4458 29.7646C25.7974 30.4214 24.8207 30.7498 23.5155 30.7498H16.4209C16.5889 30.7204 16.7574 30.6901 16.9262 30.659C18.4067 30.3944 19.9713 30.0354 21.6185 29.5846L21.6305 29.5812Z"
fill="#C9191E"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M4.58203 26.405V7.5977C4.58203 6.45251 4.88938 5.58519 5.50408 4.99575C6.1272 4.40631 6.95242 4.08212 7.97972 4.02318C9.49542 3.93055 10.9311 3.80425 12.2868 3.64425C13.6425 3.47584 14.9393 3.28217 16.1771 3.06324C17.4234 2.8443 18.6359 2.60011 19.8148 2.33065C21.0274 2.04435 21.9578 2.1875 22.6062 2.7601C23.2546 3.33269 23.5788 4.24632 23.5788 5.50099V23.9925C23.5788 25.0956 23.3893 25.9166 23.0104 26.4555C22.6315 27.0029 21.9915 27.4028 21.0905 27.6554C19.4906 28.0933 17.9833 28.4386 16.5687 28.6912C15.154 28.9522 13.7731 29.1501 12.4258 29.2848C11.0785 29.4196 9.69751 29.5248 8.28286 29.6006C7.11241 29.668 6.20299 29.4238 5.5546 28.868C4.90622 28.3207 4.58203 27.4997 4.58203 26.405ZM9.20865 11.0124C11.0635 10.8944 12.7632 10.7131 14.3075 10.4683C14.6822 10.4072 15.0564 10.3436 15.4291 10.2776C15.8192 10.2085 16.1013 9.86859 16.1013 9.47337C16.1013 8.96154 15.638 8.57609 15.135 8.66189C14.846 8.71118 14.5555 8.75909 14.2635 8.80562C12.7346 9.04923 11.0452 9.22998 9.19523 9.3477C8.91819 9.36558 8.69776 9.45188 8.55608 9.62391C8.42209 9.78661 8.35645 9.98229 8.35645 10.2053C8.35645 10.4321 8.43296 10.6295 8.58568 10.7918L8.58783 10.7939C8.75336 10.9595 8.96369 11.0311 9.20865 11.0124ZM9.20801 15.206C11.0631 15.088 12.763 14.9066 14.3075 14.6619C15.8588 14.4089 17.3936 14.1138 18.9112 13.7766C19.2191 13.7081 19.4498 13.6003 19.5652 13.433C19.6786 13.2721 19.7347 13.0876 19.7347 12.8832C19.7347 12.6526 19.6469 12.454 19.476 12.2926C19.2921 12.1189 19.0348 12.0784 18.7304 12.1411L18.7285 12.1415C17.2823 12.4694 15.794 12.7553 14.2635 12.9992C12.7346 13.2428 11.0452 13.4235 9.19523 13.5413C8.91819 13.5591 8.69776 13.6454 8.55608 13.8175C8.42276 13.9794 8.35645 14.1705 8.35645 14.3863C8.35645 14.6203 8.43209 14.8223 8.58558 14.9854L8.59 14.9896C8.75499 15.1449 8.96316 15.2155 9.20551 15.2062L9.20801 15.206ZM9.20847 19.3994C11.0634 19.2729 12.7631 19.0874 14.3075 18.8427C15.8589 18.5982 17.3934 18.3073 18.9112 17.97C19.2199 17.9014 19.4508 17.7891 19.566 17.6127C19.6783 17.4529 19.7347 17.2733 19.7347 17.0766C19.7347 16.8461 19.6469 16.6474 19.476 16.4861C19.2921 16.3123 19.0348 16.2718 18.7304 16.3345L18.729 16.3348C17.2827 16.6543 15.7942 16.9361 14.2635 17.18C12.7345 17.4236 11.045 17.6086 9.19495 17.7347C8.91804 17.7526 8.69771 17.8389 8.55608 18.0109C8.42276 18.1728 8.35645 18.3639 8.35645 18.5797C8.35645 18.8137 8.43209 19.0158 8.58558 19.1789L8.59 19.183C8.75499 19.3383 8.96316 19.4089 9.20551 19.3996L9.20847 19.3994ZM14.3075 23.007C12.7632 23.2518 11.0635 23.4331 9.20867 23.5512C8.9637 23.5698 8.75337 23.4982 8.58783 23.3326L8.58572 23.3305C8.433 23.1682 8.35645 22.9708 8.35645 22.7441C8.35645 22.521 8.42209 22.3253 8.55608 22.1626C8.69776 21.9906 8.91827 21.9043 9.19531 21.8864C11.0453 21.7687 12.7346 21.588 14.2635 21.3443C14.5555 21.2978 14.846 21.2499 15.135 21.2006C15.638 21.1148 16.1013 21.5003 16.1013 22.0121C16.1013 22.4073 15.8192 22.7472 15.4291 22.8163C15.0564 22.8823 14.6822 22.9459 14.3075 23.007Z"
fill="#2845C1"
/>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -1,4 +1,12 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg viewBox="0 0 32 33" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M21.6305 28.8312C22.7983 28.5038 23.9166 27.9062 24.6505 26.8503C25.3749 25.8163 25.5789 24.5047 25.5789 23.2425V4.75099C25.5789 4.42358 25.5611 4.09557 25.5216 3.77148C26.1016 3.99961 26.5486 4.37658 26.8626 4.90239C27.2331 5.50024 27.4184 6.28757 27.4184 7.26435V26.0464C27.4184 27.3684 27.0942 28.3578 26.4458 29.0146C25.7974 29.6714 24.8207 29.9998 23.5155 29.9998H16.4209C16.5889 29.9704 16.7574 29.9401 16.9262 29.909C18.4067 29.6444 19.9713 29.2854 21.6185 28.8346L21.6305 28.8312Z" fill="#4747A3"/> <path
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.58203 25.655V6.8477C4.58203 5.70251 4.88938 4.83519 5.50408 4.24575C6.1272 3.65631 6.95242 3.33212 7.97972 3.27318C9.49542 3.18055 10.9311 3.05425 12.2868 2.89425C13.6425 2.72584 14.9393 2.53217 16.1771 2.31324C17.4234 2.0943 18.6359 1.85011 19.8148 1.58065C21.0274 1.29435 21.9578 1.4375 22.6062 2.0101C23.2546 2.58269 23.5788 3.49632 23.5788 4.75099V23.2425C23.5788 24.3456 23.3893 25.1666 23.0104 25.7055C22.6315 26.2529 21.9915 26.6528 21.0905 26.9054C19.4906 27.3433 17.9833 27.6886 16.5687 27.9412C15.154 28.2022 13.7731 28.4001 12.4258 28.5348C11.0785 28.6696 9.69751 28.7748 8.28286 28.8506C7.11241 28.918 6.20299 28.6738 5.5546 28.118C4.90622 27.5707 4.58203 26.7497 4.58203 25.655ZM9.20865 10.2624C11.0635 10.1444 12.7632 9.96305 14.3075 9.71831C14.6822 9.65722 15.0564 9.5936 15.4291 9.52759C15.8192 9.45851 16.1013 9.11859 16.1013 8.72337C16.1013 8.21154 15.638 7.82609 15.135 7.91189C14.846 7.96118 14.5555 8.00909 14.2635 8.05562C12.7346 8.29923 11.0452 8.47998 9.19523 8.5977C8.91819 8.61558 8.69776 8.70188 8.55608 8.87391C8.42209 9.03661 8.35645 9.23229 8.35645 9.45535C8.35645 9.68212 8.43296 9.87951 8.58568 10.0418L8.58783 10.0439C8.75336 10.2095 8.96369 10.2811 9.20865 10.2624ZM9.20801 14.456C11.0631 14.338 12.763 14.1566 14.3075 13.9119C15.8588 13.6589 17.3936 13.3638 18.9112 13.0266C19.2191 12.9581 19.4498 12.8503 19.5652 12.683C19.6786 12.5221 19.7347 12.3376 19.7347 12.1332C19.7347 11.9026 19.6469 11.704 19.476 11.5426C19.2921 11.3689 19.0348 11.3284 18.7304 11.3911L18.7285 11.3915C17.2823 11.7194 15.794 12.0053 14.2635 12.2492C12.7346 12.4928 11.0452 12.6735 9.19523 12.7913C8.91819 12.8091 8.69776 12.8954 8.55608 13.0675C8.42276 13.2294 8.35645 13.4205 8.35645 13.6363C8.35645 13.8703 8.43209 14.0723 8.58558 14.2354L8.59 14.2396C8.75499 14.3949 8.96316 14.4655 9.20551 14.4562L9.20801 14.456ZM9.20847 18.6494C11.0634 18.5229 12.7631 18.3374 14.3075 18.0927C15.8589 17.8482 17.3934 17.5573 18.9112 17.22C19.2199 17.1514 19.4508 17.0391 19.566 16.8627C19.6783 16.7029 19.7347 16.5233 19.7347 16.3266C19.7347 16.0961 19.6469 15.8974 19.476 15.7361C19.2921 15.5623 19.0348 15.5218 18.7304 15.5845L18.729 15.5848C17.2827 15.9043 15.7942 16.1861 14.2635 16.43C12.7345 16.6736 11.045 16.8586 9.19495 16.9847C8.91804 17.0026 8.69771 17.0889 8.55608 17.2609C8.42276 17.4228 8.35645 17.6139 8.35645 17.8297C8.35645 18.0637 8.43209 18.2658 8.58558 18.4289L8.59 18.433C8.75499 18.5883 8.96316 18.6589 9.20551 18.6496L9.20847 18.6494ZM14.3075 22.257C12.7632 22.5018 11.0635 22.6831 9.20867 22.8012C8.9637 22.8198 8.75337 22.7482 8.58783 22.5826L8.58572 22.5805C8.433 22.4182 8.35645 22.2208 8.35645 21.9941C8.35645 21.771 8.42209 21.5753 8.55608 21.4126C8.69776 21.2406 8.91827 21.1543 9.19531 21.1364C11.0453 21.0187 12.7346 20.838 14.2635 20.5943C14.5555 20.5478 14.846 20.4999 15.135 20.4506C15.638 20.3648 16.1013 20.7503 16.1013 21.2621C16.1013 21.6573 15.8192 21.9972 15.4291 22.0663C15.0564 22.1323 14.6822 22.1959 14.3075 22.257Z" fill="#4747A3"/> d="M21.6305 29.5812C22.7983 29.2538 23.9166 28.6562 24.6505 27.6003C25.3749 26.5663 25.5789 25.2547 25.5789 23.9925V5.50099C25.5789 5.17358 25.5611 4.84557 25.5216 4.52148C26.1016 4.74961 26.5486 5.12658 26.8626 5.65239C27.2331 6.25024 27.4184 7.03757 27.4184 8.01435V26.7964C27.4184 28.1184 27.0942 29.1078 26.4458 29.7646C25.7974 30.4214 24.8207 30.7498 23.5155 30.7498H16.4209C16.5889 30.7204 16.7574 30.6901 16.9262 30.659C18.4067 30.3944 19.9713 30.0354 21.6185 29.5846L21.6305 29.5812Z"
fill="#C9191E"
/>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M4.58203 26.405V7.5977C4.58203 6.45251 4.88938 5.58519 5.50408 4.99575C6.1272 4.40631 6.95242 4.08212 7.97972 4.02318C9.49542 3.93055 10.9311 3.80425 12.2868 3.64425C13.6425 3.47584 14.9393 3.28217 16.1771 3.06324C17.4234 2.8443 18.6359 2.60011 19.8148 2.33065C21.0274 2.04435 21.9578 2.1875 22.6062 2.7601C23.2546 3.33269 23.5788 4.24632 23.5788 5.50099V23.9925C23.5788 25.0956 23.3893 25.9166 23.0104 26.4555C22.6315 27.0029 21.9915 27.4028 21.0905 27.6554C19.4906 28.0933 17.9833 28.4386 16.5687 28.6912C15.154 28.9522 13.7731 29.1501 12.4258 29.2848C11.0785 29.4196 9.69751 29.5248 8.28286 29.6006C7.11241 29.668 6.20299 29.4238 5.5546 28.868C4.90622 28.3207 4.58203 27.4997 4.58203 26.405ZM9.20865 11.0124C11.0635 10.8944 12.7632 10.7131 14.3075 10.4683C14.6822 10.4072 15.0564 10.3436 15.4291 10.2776C15.8192 10.2085 16.1013 9.86859 16.1013 9.47337C16.1013 8.96154 15.638 8.57609 15.135 8.66189C14.846 8.71118 14.5555 8.75909 14.2635 8.80562C12.7346 9.04923 11.0452 9.22998 9.19523 9.3477C8.91819 9.36558 8.69776 9.45188 8.55608 9.62391C8.42209 9.78661 8.35645 9.98229 8.35645 10.2053C8.35645 10.4321 8.43296 10.6295 8.58568 10.7918L8.58783 10.7939C8.75336 10.9595 8.96369 11.0311 9.20865 11.0124ZM9.20801 15.206C11.0631 15.088 12.763 14.9066 14.3075 14.6619C15.8588 14.4089 17.3936 14.1138 18.9112 13.7766C19.2191 13.7081 19.4498 13.6003 19.5652 13.433C19.6786 13.2721 19.7347 13.0876 19.7347 12.8832C19.7347 12.6526 19.6469 12.454 19.476 12.2926C19.2921 12.1189 19.0348 12.0784 18.7304 12.1411L18.7285 12.1415C17.2823 12.4694 15.794 12.7553 14.2635 12.9992C12.7346 13.2428 11.0452 13.4235 9.19523 13.5413C8.91819 13.5591 8.69776 13.6454 8.55608 13.8175C8.42276 13.9794 8.35645 14.1705 8.35645 14.3863C8.35645 14.6203 8.43209 14.8223 8.58558 14.9854L8.59 14.9896C8.75499 15.1449 8.96316 15.2155 9.20551 15.2062L9.20801 15.206ZM9.20847 19.3994C11.0634 19.2729 12.7631 19.0874 14.3075 18.8427C15.8589 18.5982 17.3934 18.3073 18.9112 17.97C19.2199 17.9014 19.4508 17.7891 19.566 17.6127C19.6783 17.4529 19.7347 17.2733 19.7347 17.0766C19.7347 16.8461 19.6469 16.6474 19.476 16.4861C19.2921 16.3123 19.0348 16.2718 18.7304 16.3345L18.729 16.3348C17.2827 16.6543 15.7942 16.9361 14.2635 17.18C12.7345 17.4236 11.045 17.6086 9.19495 17.7347C8.91804 17.7526 8.69771 17.8389 8.55608 18.0109C8.42276 18.1728 8.35645 18.3639 8.35645 18.5797C8.35645 18.8137 8.43209 19.0158 8.58558 19.1789L8.59 19.183C8.75499 19.3383 8.96316 19.4089 9.20551 19.3996L9.20847 19.3994ZM14.3075 23.007C12.7632 23.2518 11.0635 23.4331 9.20867 23.5512C8.9637 23.5698 8.75337 23.4982 8.58783 23.3326L8.58572 23.3305C8.433 23.1682 8.35645 22.9708 8.35645 22.7441C8.35645 22.521 8.42209 22.3253 8.55608 22.1626C8.69776 21.9906 8.91827 21.9043 9.19531 21.8864C11.0453 21.7687 12.7346 21.588 14.2635 21.3443C14.5555 21.2978 14.846 21.2499 15.135 21.2006C15.638 21.1148 16.1013 21.5003 16.1013 22.0121C16.1013 22.4073 15.8192 22.7472 15.4291 22.8163C15.0564 22.8823 14.6822 22.9459 14.3075 23.007Z"
fill="#000091"
/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -1,7 +1,7 @@
<svg viewBox="0 0 32 33" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg viewBox="0 0 32 33" fill="none" xmlns="http://www.w3.org/2000/svg">
<path <path
d="M21.6305 29.5812C22.7983 29.2538 23.9166 28.6562 24.6505 27.6003C25.3749 26.5663 25.5789 25.2547 25.5789 23.9925V5.50099C25.5789 5.17358 25.5611 4.84557 25.5216 4.52148C26.1016 4.74961 26.5486 5.12658 26.8626 5.65239C27.2331 6.25024 27.4184 7.03757 27.4184 8.01435V26.7964C27.4184 28.1184 27.0942 29.1078 26.4458 29.7646C25.7974 30.4214 24.8207 30.7498 23.5155 30.7498H16.4209C16.5889 30.7204 16.7574 30.6901 16.9262 30.659C18.4067 30.3944 19.9713 30.0354 21.6185 29.5846L21.6305 29.5812Z" d="M21.6305 29.5812C22.7983 29.2538 23.9166 28.6562 24.6505 27.6003C25.3749 26.5663 25.5789 25.2547 25.5789 23.9925V5.50099C25.5789 5.17358 25.5611 4.84557 25.5216 4.52148C26.1016 4.74961 26.5486 5.12658 26.8626 5.65239C27.2331 6.25024 27.4184 7.03757 27.4184 8.01435V26.7964C27.4184 28.1184 27.0942 29.1078 26.4458 29.7646C25.7974 30.4214 24.8207 30.7498 23.5155 30.7498H16.4209C16.5889 30.7204 16.7574 30.6901 16.9262 30.659C18.4067 30.3944 19.9713 30.0354 21.6185 29.5846L21.6305 29.5812Z"
fill="var(--c--globals--colors--red-600)" fill="var(--c--theme--colors--secondary-icon)"
/> />
<path <path
fill-rule="evenodd" fill-rule="evenodd"

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -14,7 +14,6 @@ export interface BoxProps {
as?: HTMLElementType; as?: HTMLElementType;
$align?: CSSProperties['alignItems']; $align?: CSSProperties['alignItems'];
$background?: CSSProperties['background']; $background?: CSSProperties['background'];
$border?: CSSProperties['border'];
$color?: CSSProperties['color']; $color?: CSSProperties['color'];
$css?: string | RuleSet<object>; $css?: string | RuleSet<object>;
$cursor?: CSSProperties['cursor']; $cursor?: CSSProperties['cursor'];
@@ -37,34 +36,41 @@ export interface BoxProps {
$position?: CSSProperties['position']; $position?: CSSProperties['position'];
$radius?: CSSProperties['borderRadius']; $radius?: CSSProperties['borderRadius'];
$shrink?: CSSProperties['flexShrink']; $shrink?: CSSProperties['flexShrink'];
$transition?: CSSProperties['transition'];
$width?: CSSProperties['width'];
$zIndex?: CSSProperties['zIndex'];
$wrap?: CSSProperties['flexWrap'];
// Theming props
$layer?: 'background' | 'content' | 'border';
$theme?: $theme?:
| 'brand' | 'primary'
| 'error' | 'primary-text'
| 'gray' | 'secondary'
| 'secondary-text'
| 'info' | 'info'
| 'success' | 'success'
| 'warning' | 'warning'
| 'neutral' | 'danger'
| 'contextual' | 'greyscale';
| 'disabled' $transition?: CSSProperties['transition'];
| (string & {}); $variation?:
$scope?: 'surface' | 'semantic' | 'palette' | (string & {}); | 'text'
$variation?: 'primary' | 'secondary' | 'tertiary' | (string & {}); | '000'
$withThemeBG?: boolean; | '100'
$withThemeBorder?: boolean; | '200'
$withThemeInherited?: boolean; | '300'
| '400'
| '500'
| '600'
| '700'
| '800'
| '900'
| '1000';
$width?: CSSProperties['width'];
$wrap?: CSSProperties['flexWrap'];
$zIndex?: CSSProperties['zIndex'];
} }
export type BoxType = ComponentPropsWithRef<typeof Box>; export type BoxType = ComponentPropsWithRef<typeof Box>;
export const Box = styled('div')<BoxProps>` export const Box = styled('div')<BoxProps>`
${({ $align }) => $align && `align-items: ${$align};`} ${({ $align }) => $align && `align-items: ${$align};`}
${({ $background }) => $background && `background: ${$background};`}
${({ $color }) => $color && `color: ${$color};`}
${({ $cursor }) => $cursor && `cursor: ${$cursor};`} ${({ $cursor }) => $cursor && `cursor: ${$cursor};`}
${({ $direction }) => `flex-direction: ${$direction || 'column'};`} ${({ $direction }) => `flex-direction: ${$direction || 'column'};`}
${({ $display, as }) => ${({ $display, as }) =>
@@ -74,9 +80,9 @@ export const Box = styled('div')<BoxProps>`
${({ $height }) => $height && `height: ${$height};`} ${({ $height }) => $height && `height: ${$height};`}
${({ $hasTransition }) => ${({ $hasTransition }) =>
$hasTransition && $hasTransition === 'slow' $hasTransition && $hasTransition === 'slow'
? `transition: all 0.5s var(--c--globals--transitions--ease-out);` ? `transition: all 0.5s ease-in-out;`
: $hasTransition : $hasTransition
? `transition: all var(--c--globals--transitions--duration) var(--c--globals--transitions--ease-out);` ? `transition: all 0.3s ease-in-out;`
: ''} : ''}
${({ $justify }) => $justify && `justify-content: ${$justify};`} ${({ $justify }) => $justify && `justify-content: ${$justify};`}
${({ $margin }) => $margin && stylesMargin($margin)} ${({ $margin }) => $margin && stylesMargin($margin)}
@@ -90,85 +96,11 @@ export const Box = styled('div')<BoxProps>`
${({ $position }) => $position && `position: ${$position};`} ${({ $position }) => $position && `position: ${$position};`}
${({ $radius }) => $radius && `border-radius: ${$radius};`} ${({ $radius }) => $radius && `border-radius: ${$radius};`}
${({ $shrink }) => $shrink && `flex-shrink: ${$shrink};`} ${({ $shrink }) => $shrink && `flex-shrink: ${$shrink};`}
${({ ${({ $theme, $variation }) => {
$layer = 'border', if (!$theme || !$variation) {
$theme = 'brand',
$variation = 'primary',
$scope = 'semantic',
$border,
$withThemeBorder,
$withThemeInherited,
}) => {
if ($border) {
return `border: ${$border};`;
}
if (!$layer || !$scope || !$theme || !$withThemeBorder) {
return ''; return '';
} }
return `color: var(--c--theme--colors--${$theme}-${$variation});`;
if ($withThemeInherited) {
return `border: inherit;`;
}
return `border: 1px solid var(--c--contextuals--${$layer}--${$scope}${$theme ? `--${$theme}` : ''}${$variation ? `--${$variation}` : ''});`;
}}
${({
$layer = 'background',
$theme = 'brand',
$variation = 'primary',
$scope = 'semantic',
$background,
$withThemeBG,
$withThemeInherited,
}) => {
if ($background) {
return `background: ${$background};`;
}
if (!$layer || !$scope || !$theme || !$withThemeBG) {
return '';
}
if ($withThemeInherited) {
return `background: inherit;`;
}
return `background: var(--c--contextuals--${$layer}--${$scope}${$theme ? `--${$theme}` : ''}${$variation ? `--${$variation}` : ''});`;
}}
${({
$layer = 'content',
$theme = 'neutral',
$variation = 'primary',
$scope = 'semantic',
$color,
$withThemeBG,
$withThemeInherited,
}) => {
if ($color) {
return `color: ${$color};`;
}
if (!$layer || !$scope) {
return '';
}
// There is a special case when primary with background
if (
$withThemeBG &&
$layer === 'content' &&
$scope === 'semantic' &&
$variation === 'primary' &&
$theme
) {
$variation = `on-${$theme}`;
}
if ($withThemeInherited) {
return `color: inherit;`;
}
return `color: var(--c--contextuals--${$layer}--${$scope}${$theme ? `--${$theme}` : ''}${$variation ? `--${$variation}` : ''});`;
}} }}
${({ $transition }) => $transition && `transition: ${$transition};`} ${({ $transition }) => $transition && `transition: ${$transition};`}
${({ $width }) => $width && `width: ${$width};`} ${({ $width }) => $width && `width: ${$width};`}
@@ -189,7 +121,7 @@ export const Box = styled('div')<BoxProps>`
return ( return (
effect && effect &&
` `
transition: all var(--c--globals--transitions--duration) var(--c--globals--transitions--ease-out); transition: all 0.3s ease-in-out;
${effect} ${effect}
` `
); );

View File

@@ -24,8 +24,8 @@ export type BoxButtonType = BoxType & {
*/ */
const BoxButton = forwardRef<HTMLDivElement, BoxButtonType>( const BoxButton = forwardRef<HTMLDivElement, BoxButtonType>(
({ $css, ...props }, ref) => { ({ $css, ...props }, ref) => {
const theme = props.$theme || 'gray'; const theme = props.$theme || 'greyscale';
const variation = props.$variation || 'primary'; const variation = props.$variation || '400';
return ( return (
<Box <Box
@@ -40,14 +40,15 @@ const BoxButton = forwardRef<HTMLDivElement, BoxButtonType>(
border: none; border: none;
outline: none; outline: none;
font-family: inherit; font-family: inherit;
color: ${props.disabled && color: ${props.disabled
`var(--c--contextuals--content--semantic--disabled--primary)`}; ? `var(--c--theme--colors--${theme}-400) !important`
: `inherit`};
&:focus-visible { &:focus-visible {
transition: none; transition: none;
outline: 2px solid outline: 2px solid var(--c--theme--colors--${theme}-${variation});
var(--c--contextuals--content--semantic--${theme}--${variation});
border-radius: 1px; border-radius: 1px;
outline-offset: var(--c--globals--spacings--st); outline-offset: 4px;
} }
${$css || ''} ${$css || ''}
`} `}

View File

@@ -1,23 +1,27 @@
import { PropsWithChildren } from 'react'; import { PropsWithChildren } from 'react';
import { css } from 'styled-components';
import { useCunninghamTheme } from '@/cunningham';
import { Box, BoxType } from '.'; import { Box, BoxType } from '.';
export const Card = ({ export const Card = ({
children, children,
className, className,
$css,
...props ...props
}: PropsWithChildren<BoxType>) => { }: PropsWithChildren<BoxType>) => {
const { colorsTokens } = useCunninghamTheme();
return ( return (
<Box <Box
role="region"
$withThemeBG
$withThemeBorder
className={`--docs--card ${className || ''}`} className={`--docs--card ${className || ''}`}
$radius="var(--c--globals--spacings--st)" $background="white"
$padding={{ horizontal: 'xs', vertical: '3xs' }} $radius="4px"
$scope={props.$theme ? props.$scope || 'semantic' : 'surface'} $css={css`
$theme={props.$theme || 'primary'} border: 1px solid ${colorsTokens['greyscale-200']};
$variation={props.$theme ? props.$variation || 'tertiary' : ''} ${$css}
`}
{...props} {...props}
> >
{children} {children}

View File

@@ -14,11 +14,10 @@ import { BoxProps } from './Box';
const StyledPopover = styled(Popover)` const StyledPopover = styled(Popover)`
background-color: white; background-color: white;
border-radius: var(--c--globals--spacings--st); border-radius: 4px;
box-shadow: 0 0 6px 0 rgba(0, 0, 145, 0.1); box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
border: 1px solid var(--c--contextuals--border--surface--primary); border: 1px solid #dddddd;
transition: opacity var(--c--globals--transitions--duration) transition: opacity 0.2s ease-in-out;
var(--c--globals--transitions--ease-out);
`; `;
interface StyledButtonProps { interface StyledButtonProps {
@@ -29,22 +28,18 @@ const StyledButton = styled(Button)<StyledButtonProps>`
border: none; border: none;
background: none; background: none;
outline: none; outline: none;
font-weight: var(--c--components--button--font-weight); font-weight: 500;
font-size: var(--c--components--button--medium-font-size); font-size: 0.938rem;
padding: var(--c--globals--spacings--0); padding: 0;
border-radius: var(--c--globals--spacings--st); border-radius: 4px;
color: var(--c--contextuals--content--semantic--brand--tertiary);
&:hover { &:hover {
background-color: var( background-color: var(
--c--contextuals--background--semantic--contextual--primary --c--components--button--primary-text--background--color-hover
); );
} }
&:focus-visible { &:focus-visible {
box-shadow: 0 0 0 2px var(--c--globals--colors--brand-400); box-shadow: 0 0 0 2px var(--c--theme--colors--primary-400);
background-color: var( border-radius: 4px;
--c--contextuals--background--semantic--brand--tertiary-hover
);
border-radius: var(--c--globals--spacings--st);
} }
${({ $css }) => $css}; ${({ $css }) => $css};
`; `;

View File

@@ -13,7 +13,7 @@ export const Icon = ({
iconName, iconName,
disabled, disabled,
variant = 'outlined', variant = 'outlined',
$theme = 'neutral', $variation = 'text',
...textProps ...textProps
}: IconProps) => { }: IconProps) => {
const hasLabel = 'aria-label' in textProps || 'aria-labelledby' in textProps; const hasLabel = 'aria-label' in textProps || 'aria-labelledby' in textProps;
@@ -28,7 +28,7 @@ export const Icon = ({
'material-icons': variant === 'outlined', 'material-icons': variant === 'outlined',
'material-symbols-outlined': variant === 'symbols-outlined', 'material-symbols-outlined': variant === 'symbols-outlined',
})} })}
$theme={disabled ? 'disabled' : $theme} $variation={disabled ? '300' : $variation}
aria-disabled={disabled} aria-disabled={disabled}
{...textProps} {...textProps}
> >

View File

@@ -39,8 +39,7 @@ export const InfiniteScroll = ({
{!isLoading && hasMore && ( {!isLoading && hasMore && (
<Button <Button
onClick={() => void next()} onClick={() => void next()}
color="brand" color="primary-text"
variant="bordered"
icon={<Icon iconName="arrow_downward" />} icon={<Icon iconName="arrow_downward" />}
> >
{buttonLabel ?? t('Load more')} {buttonLabel ?? t('Load more')}

View File

@@ -24,12 +24,12 @@ export const LoadMoreText = ({
className="--docs--load-more" className="--docs--load-more"
> >
<Icon <Icon
$theme="brand" $theme="primary"
$variation="secondary" $variation="800"
iconName="arrow_downward" iconName="arrow_downward"
$size="md" $size="md"
/> />
<Text $theme="brand" $variation="secondary"> <Text $theme="primary" $variation="800">
{t('Load more')} {t('Load more')}
</Text> </Text>
</Box> </Box>

View File

@@ -5,7 +5,7 @@ import { tokens } from '@/cunningham';
import { Box, BoxProps } from './Box'; import { Box, BoxProps } from './Box';
const { sizes } = tokens.themes.default.globals.font; const { sizes } = tokens.themes.default.theme.font;
type TextSizes = keyof typeof sizes; type TextSizes = keyof typeof sizes;
export interface TextProps extends BoxProps { export interface TextProps extends BoxProps {
@@ -27,14 +27,24 @@ export const TextStyled = styled(Box)<TextProps>`
${({ $size }) => ${({ $size }) =>
$size && $size &&
`font-size: ${$size in sizes ? sizes[$size as TextSizes] : $size};`} `font-size: ${$size in sizes ? sizes[$size as TextSizes] : $size};`}
${({ $color }) => $color && `color: ${$color};`}
${({ $ellipsis }) => ${({ $ellipsis }) =>
$ellipsis && $ellipsis &&
`white-space: nowrap; overflow: hidden; text-overflow: ellipsis;`} `white-space: nowrap; overflow: hidden; text-overflow: ellipsis;`}
`; `;
const Text = forwardRef<HTMLElement, ComponentPropsWithRef<typeof TextStyled>>( const Text = forwardRef<HTMLElement, ComponentPropsWithRef<typeof TextStyled>>(
(props, ref) => { ({ className, ...props }, ref) => {
return <TextStyled ref={ref} as="span" {...props} />; return (
<TextStyled
ref={ref}
as="span"
$theme="greyscale"
$variation="text"
className={className}
{...props}
/>
);
}, },
); );

View File

@@ -7,7 +7,7 @@ import { Box, Text, TextType } from '@/components';
const AlertStyled = styled(Alert)` const AlertStyled = styled(Alert)`
& .c__button--tertiary:hover { & .c__button--tertiary:hover {
background-color: var(--c--globals--colors--gray-200); background-color: var(--c--theme--colors--greyscale-200);
} }
`; `;
@@ -54,7 +54,8 @@ export const TextOnlyErrors = ({
causes.map((cause, i) => ( causes.map((cause, i) => (
<Text <Text
key={`causes-${i}`} key={`causes-${i}`}
$theme="error" $theme="danger"
$variation="600"
$textAlign="center" $textAlign="center"
{...textProps} {...textProps}
> >
@@ -63,7 +64,12 @@ export const TextOnlyErrors = ({
))} ))}
{!causes && ( {!causes && (
<Text $theme="error" $textAlign="center" {...textProps}> <Text
$theme="danger"
$variation="600"
$textAlign="center"
{...textProps}
>
{defaultMessage || t('Something bad happens, please retry.')} {defaultMessage || t('Something bad happens, please retry.')}
</Text> </Text>
)} )}

View File

@@ -124,19 +124,18 @@ export const DropdownMenu = ({
> >
<Box>{children}</Box> <Box>{children}</Box>
<Icon <Icon
$variation="600"
$css={ $css={
arrowCss ?? arrowCss ??
css` css`
color: var(--c--globals--colors--brand-600); color: var(--c--theme--colors--primary-600);
` `
} }
iconName={isOpen ? 'arrow_drop_up' : 'arrow_drop_down'} iconName={isOpen ? 'arrow_drop_up' : 'arrow_drop_down'}
/> />
</Box> </Box>
) : ( ) : (
<Box ref={blockButtonRef} $color="inherit"> <Box ref={blockButtonRef}>{children}</Box>
{children}
</Box>
) )
} }
> >
@@ -148,6 +147,7 @@ export const DropdownMenu = ({
> >
{topMessage && ( {topMessage && (
<Text <Text
$variation="700"
$wrap="wrap" $wrap="wrap"
$size="xs" $size="xs"
$weight="bold" $weight="bold"
@@ -186,8 +186,8 @@ export const DropdownMenu = ({
key={option.label} key={option.label}
$align="center" $align="center"
$justify="space-between" $justify="space-between"
$background={colorsTokens['gray-000']} $background={colorsTokens['greyscale-000']}
$color={colorsTokens['brand-600']} $color={colorsTokens['primary-600']}
$padding={{ vertical: 'xs', horizontal: 'base' }} $padding={{ vertical: 'xs', horizontal: 'base' }}
$width="100%" $width="100%"
$gap={spacingsTokens['base']} $gap={spacingsTokens['base']}
@@ -200,39 +200,30 @@ export const DropdownMenu = ({
`} `}
${index === options.length - 1 && ${index === options.length - 1 &&
css` css`
border-bottom-left-radius: var(--c--globals--spacings--st); border-bottom-left-radius: 4px;
border-bottom-right-radius: var(--c--globals--spacings--st); border-bottom-right-radius: 4px;
`} `}
font-size: var(--c--globals--font--sizes--sm); font-size: var(--c--theme--font--sizes--sm);
color: var(--c--globals--colors--gray-1000); color: var(--c--theme--colors--greyscale-1000);
font-weight: var(--c--globals--font--weights--medium); font-weight: 500;
cursor: ${isDisabled ? 'not-allowed' : 'pointer'}; cursor: ${isDisabled ? 'not-allowed' : 'pointer'};
user-select: none; user-select: none;
&:hover { &:hover {
background-color: var( background-color: var(--c--theme--colors--greyscale-050);
--c--contextuals--background--semantic--contextual--primary
);
} }
&:focus-visible { &:focus-visible {
outline: 2px solid var(--c--globals--colors--brand-400); outline: 2px solid var(--c--theme--colors--primary-400);
outline-offset: -2px; outline-offset: -2px;
background-color: var( background-color: var(--c--theme--colors--greyscale-050);
--c--contextuals--background--semantic--contextual--primary
);
} }
/** ${isFocused &&
* TODO: This part seems to have a problem with DocToolBox
*/
/* ${isFocused &&
css` css`
outline-offset: -2px; outline-offset: -2px;
background-color: var( background-color: var(--c--theme--colors--greyscale-050);
--c--contextuals--background--semantic--contextual--primary `}
);
`} */
`} `}
> >
<Box <Box
@@ -243,8 +234,8 @@ export const DropdownMenu = ({
{option.icon && typeof option.icon === 'string' && ( {option.icon && typeof option.icon === 'string' && (
<Icon <Icon
$size="20px" $size="20px"
$theme="gray" $theme="greyscale"
$variation={isDisabled ? 'tertiary' : 'primary'} $variation={isDisabled ? '400' : '1000'}
iconName={option.icon} iconName={option.icon}
aria-hidden="true" aria-hidden="true"
/> />
@@ -252,7 +243,7 @@ export const DropdownMenu = ({
{option.icon && {option.icon &&
typeof option.icon !== 'string' && typeof option.icon !== 'string' &&
option.icon} option.icon}
<Text $variation={isDisabled ? 'tertiary' : 'primary'}> <Text $variation={isDisabled ? '400' : '1000'}>
{option.label} {option.label}
</Text> </Text>
</Box> </Box>
@@ -261,7 +252,7 @@ export const DropdownMenu = ({
<Icon <Icon
iconName="check" iconName="check"
$size="20px" $size="20px"
$theme="gray" $theme="greyscale"
aria-hidden="true" aria-hidden="true"
/> />
)} )}

View File

@@ -33,27 +33,32 @@ export const FilterDropdown = ({
<Box <Box
$css={css` $css={css`
border: 1px solid border: 1px solid
var(--c--contextuals--border--semantic--neutral--tertiary); ${selectedOption
border-radius: var(--c--globals--spacings--st); ? 'var(--c--theme--colors--primary-500)'
background-color: var( : 'var(--c--theme--colors--greyscale-250)'};
--c--contextuals--background--semantic--neutral--tertiary border-radius: 4px;
); background-color: ${selectedOption
gap: var(--c--globals--spacings--2xs); ? 'var(--c--theme--colors--primary-100)'
padding: var(--c--globals--spacings--2xs) : 'var(--c--theme--colors--greyscale-000)'};
var(--c--globals--spacings--xs); gap: var(--c--theme--spacings--2xs);
padding: var(--c--theme--spacings--2xs) var(--c--theme--spacings--xs);
`} `}
color="secondary" color="secondary"
$direction="row" $direction="row"
$align="center" $align="center"
> >
<Text $weight={400} $variation="tertiary" $theme="neutral"> <Text
$weight={400}
$variation={selectedOption ? '800' : '600'}
$theme={selectedOption ? 'primary' : 'greyscale'}
>
{selectedOption?.label ?? options[0].label} {selectedOption?.label ?? options[0].label}
</Text> </Text>
<Icon <Icon
$size="s" $size="16px"
iconName="keyboard_arrow_down" iconName="keyboard_arrow_down"
$variation="tertiary" $variation={selectedOption ? '800' : '600'}
$theme="neutral" $theme={selectedOption ? 'primary' : 'greyscale'}
/> />
</Box> </Box>
</DropdownMenu> </DropdownMenu>

View File

@@ -38,6 +38,7 @@ export const AlertModal = ({
$margin="0" $margin="0"
id="alert-modal-title" id="alert-modal-title"
$align="flex-start" $align="flex-start"
$variation="1000"
> >
{title} {title}
</Text> </Text>
@@ -46,7 +47,7 @@ export const AlertModal = ({
<> <>
<Button <Button
aria-label={`${t('Cancel')} - ${title}`} aria-label={`${t('Cancel')} - ${title}`}
variant="secondary" color="secondary"
fullWidth fullWidth
onClick={() => onClose()} onClick={() => onClose()}
> >
@@ -54,7 +55,7 @@ export const AlertModal = ({
</Button> </Button>
<Button <Button
aria-label={confirmLabel ?? t('Confirm')} aria-label={confirmLabel ?? t('Confirm')}
color="error" color="danger"
onClick={onConfirm} onClick={onConfirm}
> >
{confirmLabel ?? t('Confirm')} {confirmLabel ?? t('Confirm')}
@@ -64,7 +65,7 @@ export const AlertModal = ({
> >
<Box className="--docs--alert-modal"> <Box className="--docs--alert-modal">
<Box> <Box>
<Text $variation="secondary" as="p"> <Text $variation="600" as="p">
{description} {description}
</Text> </Text>
</Box> </Box>

View File

@@ -1,21 +1,18 @@
import { Button, type ButtonProps } from '@openfun/cunningham-react'; import { Button, type ButtonProps } from '@openfun/cunningham-react';
import React from 'react'; import React from 'react';
import { Icon } from '@/components'; import { Box } from '@/components';
export const ButtonCloseModal = (props: ButtonProps) => { export const ButtonCloseModal = (props: ButtonProps) => {
return ( return (
<Button <Button
type="button" type="button"
size="small" size="small"
color="brand" color="primary-text"
variant="tertiary"
icon={ icon={
<Icon <Box as="span" aria-hidden="true" className="material-icons-filled">
$withThemeInherited close
iconName="close" </Box>
className="material-icons-filled"
/>
} }
{...props} {...props}
/> />

View File

@@ -69,7 +69,7 @@ export const QuickSearch = ({
label={label} label={label}
shouldFilter={false} shouldFilter={false}
ref={ref} ref={ref}
tabIndex={-1} tabIndex={0}
value={selectedValue} value={selectedValue}
onValueChange={handleValueChange} onValueChange={handleValueChange}
> >

View File

@@ -59,7 +59,11 @@ export const QuickSearchGroup = <T,>({
); );
})} })}
{group.emptyString && group.elements.length === 0 && ( {group.emptyString && group.elements.length === 0 && (
<Text $margin={{ left: '2xs', bottom: '3xs' }} $size="sm"> <Text
$variation="500"
$margin={{ left: '2xs', bottom: '3xs' }}
$size="sm"
>
{group.emptyString} {group.emptyString}
</Text> </Text>
)} )}

View File

@@ -53,7 +53,7 @@ export const QuickSearchInput = ({
$padding={{ horizontal: 'base', vertical: 'sm' }} $padding={{ horizontal: 'base', vertical: 'sm' }}
> >
{!loading && ( {!loading && (
<Icon iconName="search" $variation="secondary" aria-hidden="true" /> <Icon iconName="search" $variation="600" aria-hidden="true" />
)} )}
{loading && ( {loading && (
<div> <div>

View File

@@ -19,25 +19,25 @@ export const QuickSearchStyle = createGlobalStyle`
border: none; border: none;
width: 100%; width: 100%;
font-size: 17px; font-size: 17px;
padding: var(--c--globals--spacings--xs); padding: 8px;
background: white; background: white;
outline: none; outline: none;
color: var(--c--globals--colors--gray-1000); color: var(--c--theme--colors--greyscale-1000);
border-radius: var(--c--globals--spacings--0); border-radius: 0;
&::placeholder { &::placeholder {
color: var(--c--globals--colors--gray-500); color: var(--c--theme--colors--greyscale-500);
} }
} }
[cmdk-item] { [cmdk-item] {
content-visibility: auto; content-visibility: auto;
cursor: pointer; cursor: pointer;
border-radius: var(--c--globals--spacings--xs); border-radius: var(--c--theme--spacings--xs);
font-size: var(--c--globals--font--sizes--sm); font-size: 14px;
display: flex; display: flex;
align-items: center; align-items: center;
gap: var(--c--globals--spacings--xs); gap: 8px;
user-select: none; user-select: none;
will-change: background, color; will-change: background, color;
transition: all 150ms ease; transition: all 150ms ease;
@@ -49,19 +49,19 @@ export const QuickSearchStyle = createGlobalStyle`
&:hover, &:hover,
&[data-selected='true'] { &[data-selected='true'] {
background: var(--c--contextuals--background--semantic--contextual--primary); background: var(--c--theme--colors--greyscale-100);
.show-right-on-focus { .show-right-on-focus {
opacity: 1; opacity: 1;
} }
} }
&[data-disabled='true'] { &[data-disabled='true'] {
color: var(--c--globals--colors--gray-500); color: var(--c--theme--colors--greyscale-500);
cursor: not-allowed; cursor: not-allowed;
} }
& + [cmdk-item] { & + [cmdk-item] {
margin-top: var(--c--globals--spacings--st); margin-top: 4px;
} }
} }
@@ -79,11 +79,11 @@ export const QuickSearchStyle = createGlobalStyle`
kbd { kbd {
font-size: 12px; font-size: 12px;
min-width: 20px; min-width: 20px;
padding: var(--c--globals--spacings--st); padding: 4px;
height: 20px; height: 20px;
border-radius: var(--c--globals--spacings--st); border-radius: 4px;
color: white; color: white;
background: var(--c--globals--colors--gray-500); background: var(--c--theme--colors--greyscale-500);
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -94,23 +94,23 @@ export const QuickSearchStyle = createGlobalStyle`
[cmdk-separator] { [cmdk-separator] {
height: 1px; height: 1px;
width: 100%; width: 100%;
background: var(--c--globals--colors--gray-500); background: var(--c--theme--colors--greyscale-500);
margin: var(--c--globals--spacings--st) 0; margin: 4px 0;
} }
*:not([hidden]) + [cmdk-group] { *:not([hidden]) + [cmdk-group] {
margin-top: var(--c--globals--spacings--xs); margin-top: 8px;
} }
[cmdk-group-heading] { [cmdk-group-heading] {
user-select: none; user-select: none;
font-size: var(--c--globals--font--sizes--sm); font-size: var(--c--theme--font--sizes--sm);
color: var(--c--globals--colors--gray-700); color: var(--c--theme--colors--greyscale-700);
font-weight: bold; font-weight: bold;
display: flex; display: flex;
align-items: center; align-items: center;
margin-bottom: var(--c--globals--spacings--xs); margin-bottom: var(--c--theme--spacings--xs);
} }
[cmdk-empty] { [cmdk-empty] {
@@ -128,9 +128,9 @@ export const QuickSearchStyle = createGlobalStyle`
} }
.c__modal__title { .c__modal__title {
font-size: var(--c--globals--font--sizes--xs); font-size: var(--c--theme--font--sizes--xs);
padding: var(--c--globals--spacings--base); padding: var(--c--theme--spacings--base);
margin-bottom: var(--c--globals--spacings--0); margin-bottom: 0;
} }
} }
`; `;

View File

@@ -1,16 +1,26 @@
import { useCunninghamTheme } from '@/cunningham';
import { Spacings } from '@/utils'; import { Spacings } from '@/utils';
import { Box } from '../Box'; import { Box } from '../Box';
export enum SeparatorVariant {
LIGHT = 'light',
DARK = 'dark',
}
type Props = { type Props = {
variant?: SeparatorVariant;
$withPadding?: boolean; $withPadding?: boolean;
customPadding?: Spacings; customPadding?: Spacings;
}; };
export const HorizontalSeparator = ({ export const HorizontalSeparator = ({
variant = SeparatorVariant.LIGHT,
$withPadding = true, $withPadding = true,
customPadding, customPadding,
}: Props) => { }: Props) => {
const { colorsTokens } = useCunninghamTheme();
const padding = $withPadding const padding = $withPadding
? (customPadding ?? 'base') ? (customPadding ?? 'base')
: ('none' as Spacings); : ('none' as Spacings);
@@ -20,7 +30,11 @@ export const HorizontalSeparator = ({
$height="1px" $height="1px"
$width="100%" $width="100%"
$margin={{ vertical: padding }} $margin={{ vertical: padding }}
$background="var(--c--contextuals--border--surface--primary)" $background={
variant === SeparatorVariant.DARK
? '#e5e5e533'
: colorsTokens['greyscale-100']
}
className="--docs--horizontal-separator" className="--docs--horizontal-separator"
/> />
); );

View File

@@ -13,8 +13,7 @@ export const SeparatedSection = ({
showSeparator = true, showSeparator = true,
children, children,
}: PropsWithChildren<Props>) => { }: PropsWithChildren<Props>) => {
const { spacingsTokens } = useCunninghamTheme(); const { colorsTokens, spacingsTokens } = useCunninghamTheme();
return ( return (
<Box <Box
$css={css` $css={css`
@@ -22,8 +21,7 @@ export const SeparatedSection = ({
padding: ${spacingsTokens['sm']} 0; padding: ${spacingsTokens['sm']} 0;
${showSeparator && ${showSeparator &&
css` css`
border-bottom: 1px solid border-bottom: 1px solid ${colorsTokens['greyscale-200']};
var(--c--contextuals--border--surface--primary);
`} `}
`} `}
> >

View File

@@ -2,13 +2,13 @@ import { useCunninghamTheme } from '../useCunninghamTheme';
describe('<useCunninghamTheme />', () => { describe('<useCunninghamTheme />', () => {
it('has the logo correctly set', () => { it('has the logo correctly set', () => {
expect(useCunninghamTheme.getState().componentTokens.logo?.src).toBe(''); expect(useCunninghamTheme.getState().themeTokens.logo?.src).toBe('');
// Change theme // Change theme
useCunninghamTheme.getState().setTheme('dsfr'); useCunninghamTheme.getState().setTheme('dsfr');
const { componentTokens } = useCunninghamTheme.getState(); const { themeTokens } = useCunninghamTheme.getState();
const logo = componentTokens.logo; const logo = themeTokens.logo;
expect(logo?.src).toBe('/assets/logo-gouv.svg'); expect(logo?.src).toBe('/assets/logo-gouv.svg');
expect(logo?.widthHeader).toBe('110px'); expect(logo?.widthHeader).toBe('110px');
expect(logo?.widthFooter).toBe('220px'); expect(logo?.widthFooter).toBe('220px');

View File

@@ -26,7 +26,7 @@
* Select * Select
**/ **/
--c--components--forms-select--value-color--disabled: var( --c--components--forms-select--value-color--disabled: var(
--c--globals--colors--gray-400 --c--theme--colors--greyscale-400
); );
/** /**
@@ -44,14 +44,6 @@
contain: content; contain: content;
} }
.c__button:disabled {
cursor: unset;
}
.c__button:focus-visible {
outline: none;
}
.c__button--medium { .c__button--medium {
min-height: var(--c--components--button--medium-height); min-height: var(--c--components--button--medium-height);
height: auto; height: auto;
@@ -68,11 +60,14 @@
* Tooltip * Tooltip
*/ */
.c__tooltip { .c__tooltip {
padding: var(--c--globals--font--sizes--sm) var(--c--globals--spacings--xxs); padding: 4px 6px;
} }
.c__tooltip .react-aria-OverlayArrow svg { /**
display: none; * Image System
*/
.c__image-system-filter {
filter: var(--c--components--image-system-filter);
} }
/** /**

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -5,23 +5,21 @@ import { tokens } from './cunningham-tokens';
type Tokens = typeof tokens.themes.default & type Tokens = typeof tokens.themes.default &
Partial<(typeof tokens.themes)[keyof typeof tokens.themes]>; Partial<(typeof tokens.themes)[keyof typeof tokens.themes]>;
type ColorsTokens = Tokens['globals']['colors']; type ColorsTokens = Tokens['theme']['colors'];
type FontSizesTokens = Tokens['globals']['font']['sizes']; type FontSizesTokens = Tokens['theme']['font']['sizes'];
type SpacingsTokens = Tokens['globals']['spacings']; type SpacingsTokens = Tokens['theme']['spacings'];
type ComponentTokens = Tokens['components']; type ComponentTokens = Tokens['components'];
type ContextualTokens = Tokens['contextuals'];
export type Theme = keyof typeof tokens.themes; export type Theme = keyof typeof tokens.themes;
interface ThemeStore { interface ThemeStore {
colorsTokens: Partial<ColorsTokens>; colorsTokens: Partial<ColorsTokens>;
componentTokens: ComponentTokens; componentTokens: ComponentTokens;
contextualTokens: ContextualTokens;
currentTokens: Partial<Tokens>; currentTokens: Partial<Tokens>;
fontSizesTokens: Partial<FontSizesTokens>; fontSizesTokens: Partial<FontSizesTokens>;
setTheme: (theme: Theme) => void; setTheme: (theme: Theme) => void;
spacingsTokens: Partial<SpacingsTokens>; spacingsTokens: Partial<SpacingsTokens>;
theme: Theme; theme: Theme;
themeTokens: Partial<Tokens['globals']>; themeTokens: Partial<Tokens['theme']>;
} }
const getMergedTokens = (theme: Theme) => { const getMergedTokens = (theme: Theme) => {
@@ -32,15 +30,14 @@ const DEFAULT_THEME: Theme = 'generic';
const defaultTokens = getMergedTokens(DEFAULT_THEME); const defaultTokens = getMergedTokens(DEFAULT_THEME);
const initialState: ThemeStore = { const initialState: ThemeStore = {
colorsTokens: defaultTokens.globals.colors, colorsTokens: defaultTokens.theme.colors,
componentTokens: defaultTokens.components, componentTokens: defaultTokens.components,
contextualTokens: defaultTokens.contextuals,
currentTokens: tokens.themes[DEFAULT_THEME] as Partial<Tokens>, currentTokens: tokens.themes[DEFAULT_THEME] as Partial<Tokens>,
fontSizesTokens: defaultTokens.globals.font.sizes, fontSizesTokens: defaultTokens.theme.font.sizes,
setTheme: () => {}, setTheme: () => {},
spacingsTokens: defaultTokens.globals.spacings, spacingsTokens: defaultTokens.theme.spacings,
theme: DEFAULT_THEME, theme: DEFAULT_THEME,
themeTokens: defaultTokens.globals, themeTokens: defaultTokens.theme,
}; };
export const useCunninghamTheme = create<ThemeStore>((set) => ({ export const useCunninghamTheme = create<ThemeStore>((set) => ({
@@ -49,14 +46,13 @@ export const useCunninghamTheme = create<ThemeStore>((set) => ({
const newTokens = getMergedTokens(theme); const newTokens = getMergedTokens(theme);
set({ set({
colorsTokens: newTokens.globals.colors, colorsTokens: newTokens.theme.colors,
componentTokens: newTokens.components, componentTokens: newTokens.components,
contextualTokens: newTokens.contextuals,
currentTokens: tokens.themes[theme] as Partial<Tokens>, currentTokens: tokens.themes[theme] as Partial<Tokens>,
fontSizesTokens: newTokens.globals.font.sizes, fontSizesTokens: newTokens.theme.font.sizes,
spacingsTokens: newTokens.globals.spacings, spacingsTokens: newTokens.theme.spacings,
theme, theme,
themeTokens: newTokens.globals, themeTokens: newTokens.theme,
}); });
}, },
})); }));

View File

@@ -18,8 +18,7 @@ export const ButtonLogin = () => {
return ( return (
<Button <Button
onClick={() => gotoLogin()} onClick={() => gotoLogin()}
color="brand" color="primary-text"
variant="tertiary"
aria-label={t('Login')} aria-label={t('Login')}
className="--docs--button-login" className="--docs--button-login"
> >
@@ -32,15 +31,14 @@ export const ButtonLogin = () => {
<Box <Box
$css={css` $css={css`
.--docs--button-logout:focus-visible { .--docs--button-logout:focus-visible {
box-shadow: 0 0 0 2px ${colorsTokens['brand-400']} !important; box-shadow: 0 0 0 2px ${colorsTokens['primary-400']} !important;
border-radius: var(--c--globals--spacings--st); border-radius: 4px;
} }
`} `}
> >
<Button <Button
onClick={gotoLogout} onClick={gotoLogout}
color="brand" color="primary-text"
variant="tertiary"
aria-label={t('Logout')} aria-label={t('Logout')}
className="--docs--button-logout" className="--docs--button-logout"
> >
@@ -58,13 +56,9 @@ export const ProConnectButton = () => {
onClick={() => gotoLogin()} onClick={() => gotoLogin()}
aria-label={t('Proconnect Login')} aria-label={t('Proconnect Login')}
$css={css` $css={css`
background-color: var( background-color: var(--c--theme--colors--primary-text);
--c--contextuals--background--semantic--brand--primary
);
&:hover { &:hover {
background-color: var( background-color: var(--c--theme--colors--primary-action);
--c--contextuals--background--semantic--brand--primary-hover
);
} }
`} `}
$radius="4px" $radius="4px"

View File

@@ -4,12 +4,15 @@ import { tokens } from '@/cunningham';
import { AvatarSvg } from './AvatarSvg'; import { AvatarSvg } from './AvatarSvg';
const colors = tokens.themes.default.globals.colors; const colors = tokens.themes.default.theme.colors;
const avatarsColors = [ const avatarsColors = [
colors['blue-1-500'], colors['blue-500'],
colors['brown-500'], colors['brown-500'],
colors['cyan-500'],
colors['gold-500'],
colors['green-500'], colors['green-500'],
colors['olive-500'],
colors['orange-500'], colors['orange-500'],
colors['pink-500'], colors['pink-500'],
colors['purple-500'], colors['purple-500'],

View File

@@ -27,7 +27,7 @@ export const setAuthUrl = () => {
window.location.pathname !== '/' && window.location.pathname !== '/' &&
window.location.pathname !== `${HOME_URL}/` window.location.pathname !== `${HOME_URL}/`
) { ) {
localStorage.setItem(PATH_AUTH_LOCAL_STORAGE, window.location.href); localStorage.setItem(PATH_AUTH_LOCAL_STORAGE, window.location.pathname);
} }
}; };

View File

@@ -289,13 +289,11 @@ export const BlockNoteReader = ({
editor={editor} editor={editor}
editable={false} editable={false}
theme="light" theme="light"
aria-label={t('Document viewer')} aria-label={t('Document version viewer')}
formattingToolbar={false} formattingToolbar={false}
slashMenu={false} slashMenu={false}
comments={false} comments={false}
> />
<BlockNoteToolbar />
</BlockNoteView>
</Box> </Box>
); );
}; };

View File

@@ -108,7 +108,7 @@ export function AIGroupButton() {
data-test="ai-actions" data-test="ai-actions"
label="AI" label="AI"
mainTooltip={t('AI Actions')} mainTooltip={t('AI Actions')}
icon={<Icon iconName="auto_awesome" $size="md" />} icon={<Icon iconName="auto_awesome" $size="l" />}
/> />
</Components.Generic.Menu.Trigger> </Components.Generic.Menu.Trigger>
<Components.Generic.Menu.Dropdown <Components.Generic.Menu.Dropdown

View File

@@ -91,10 +91,9 @@ export function MarkdownButton() {
<Text <Text
aria-hidden={true} aria-hidden={true}
$css={css` $css={css`
font-family: var(--c--globals--font--families--base); font-family: var(--c--theme--font--families--base);
`} `}
$weight="bold" $weight="bold"
$size="sm"
> >
M M
</Text> </Text>

View File

@@ -24,14 +24,14 @@ export const ModalConfirmDownloadUnsafe = ({
<> <>
<Button <Button
aria-label={t('Cancel the download')} aria-label={t('Cancel the download')}
variant="secondary" color="secondary"
onClick={() => onClose()} onClick={() => onClose()}
> >
{t('Cancel')} {t('Cancel')}
</Button> </Button>
<Button <Button
aria-label={t('Download')} aria-label={t('Download')}
color="error" color="danger"
data-testid="modal-download-unsafe-button" data-testid="modal-download-unsafe-button"
onClick={() => { onClick={() => {
if (onConfirm) { if (onConfirm) {
@@ -52,6 +52,7 @@ export const ModalConfirmDownloadUnsafe = ({
$gap="0.7rem" $gap="0.7rem"
$size="h6" $size="h6"
$align="flex-start" $align="flex-start"
$variation="1000"
$direction="row" $direction="row"
$margin="0" $margin="0"
> >
@@ -66,10 +67,8 @@ export const ModalConfirmDownloadUnsafe = ({
> >
<Box> <Box>
<Box $direction="column" $gap="0.35rem" $margin={{ top: 'sm' }}> <Box $direction="column" $gap="0.35rem" $margin={{ top: 'sm' }}>
<Text $variation="secondary"> <Text $variation="700">{t('This file is flagged as unsafe.')}</Text>
{t('This file is flagged as unsafe.')} <Text $variation="600">
</Text>
<Text $variation="secondary">
{t('Please download it only if it comes from a trusted source.')} {t('Please download it only if it comes from a trusted source.')}
</Text> </Text>
</Box> </Box>

View File

@@ -1,5 +1,6 @@
import clsx from 'clsx'; import clsx from 'clsx';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { css } from 'styled-components';
import { Box, Loading } from '@/components'; import { Box, Loading } from '@/components';
import { DocHeader } from '@/docs/doc-header/'; import { DocHeader } from '@/docs/doc-header/';
@@ -96,7 +97,18 @@ export const DocEditor = ({ doc }: DocEditorProps) => {
return ( return (
<> <>
{isDesktop && <TableContent />} {isDesktop && (
<Box
$height="100vh"
$position="absolute"
$css={css`
top: 72px;
right: 20px;
`}
>
<TableContent />
</Box>
)}
<DocEditorContainer <DocEditorContainer
docHeader={<DocHeader doc={doc} />} docHeader={<DocHeader doc={doc} />}
docEditor={ docEditor={

View File

@@ -1,9 +1,4 @@
import { import { useBlockNoteEditor, useComponentsContext } from '@blocknote/react';
useBlockNoteEditor,
useComponentsContext,
useSelectedBlocks,
} from '@blocknote/react';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { css } from 'styled-components'; import { css } from 'styled-components';
@@ -29,18 +24,7 @@ export const CommentToolbarButton = () => {
DocsStyleSchema DocsStyleSchema
>(); >();
const selectedBlocks = useSelectedBlocks(editor); if (!editor.isEditable || !Components || !currentDoc?.abilities.comment) {
const show = useMemo(() => {
return !!selectedBlocks.find((block) => block.content !== undefined);
}, [selectedBlocks]);
if (
!show ||
!editor.isEditable ||
!Components ||
!currentDoc?.abilities.comment
) {
return null; return null;
} }
@@ -50,10 +34,8 @@ export const CommentToolbarButton = () => {
className="bn-button" className="bn-button"
onClick={() => { onClick={() => {
editor.comments?.startPendingComment(); editor.comments?.startPendingComment();
editor.formattingToolbar.closeMenu();
}} }}
aria-haspopup="dialog" aria-haspopup="dialog"
data-test="comment-toolbar-button"
> >
<Box <Box
$direction="row" $direction="row"
@@ -64,18 +46,20 @@ export const CommentToolbarButton = () => {
<Icon <Icon
iconName="comment" iconName="comment"
className="--docs--icon-bg" className="--docs--icon-bg"
$theme="gray" $theme="greyscale"
$variation="600"
$padding="0.15rem" $padding="0.15rem"
$size="md" $size="16px"
$color={colorsTokens['greyscale-600']}
/> />
{t('Comment')} {t('Comment')}
</Box> </Box>
</Components.Generic.Toolbar.Button> </Components.Generic.Toolbar.Button>
<Box <Box
$background={colorsTokens['gray-100']} $background={colorsTokens['greyscale-100']}
$width="1px" $width="1px"
$height="70%" $height="70%"
$margin={{ left: 'var(--c--globals--spacings--4xs)' }} $margin={{ left: '2px' }}
$css={css` $css={css`
align-self: center; align-self: center;
`} `}

View File

@@ -11,7 +11,7 @@ export const cssComments = (
.bn-thread-mark:not([data-orphan='true']), .bn-thread-mark:not([data-orphan='true']),
.bn-thread-mark-selected:not([data-orphan='true']) { .bn-thread-mark-selected:not([data-orphan='true']) {
background: ${canSeeComment ? '#EDB40066' : 'transparent'}; background: ${canSeeComment ? '#EDB40066' : 'transparent'};
color: var(--c--globals--colors--gray-700); color: var(--c--theme--colors--greyscale-700);
} }
} }
@@ -31,7 +31,7 @@ export const cssComments = (
max-height: 500px; max-height: 500px;
.bn-default-styles { .bn-default-styles {
font-family: var(--c--globals--font--families--base); font-family: var(--c--theme--font--families--base);
} }
.bn-block { .bn-block {
@@ -52,22 +52,21 @@ export const cssComments = (
padding: 8px; padding: 8px;
& .bn-editor { & .bn-editor {
padding-left: var(--c--globals--spacings--lg); padding-left: 32px;
.bn-inline-content { .bn-inline-content {
color: var(--c--globals--colors--gray-700); color: var(--c--theme--colors--greyscale-700);
} }
} }
// Emoji // Emoji
& .bn-badge-group { & .bn-badge-group {
padding-left: var(--c--globals--spacings--lg); padding-left: 32px;
.bn-badge label { .bn-badge label {
padding: var(--c--globals--spacings--0) padding: 0 4px;
var(--c--globals--spacings--st);
background: none; background: none;
border: 1px solid var(--c--globals--colors--gray-300); border: 1px solid var(--c--theme--colors--greyscale-300);
border-radius: var(--c--globals--spacings--st); border-radius: 4px;
height: var(--c--globals--spacings--md); height: 24px;
} }
} }
@@ -103,17 +102,17 @@ export const cssComments = (
background-color: transparent; background-color: transparent;
&:hover { &:hover {
background-color: var(--c--globals--colors--gray-100); background-color: var(--c--theme--colors--greyscale-100);
} }
} }
button[role='menuitem'] svg { button[role='menuitem'] svg {
color: var(--c--globals--colors--gray-600); color: var(--c--theme--colors--greyscale-600);
} }
} }
& svg { & svg {
color: var(--c--globals--colors--info-600); color: var(--c--theme--colors--info-600);
} }
} }
@@ -126,19 +125,19 @@ export const cssComments = (
gap: 0.4rem !important; gap: 0.4rem !important;
& > button { & > button {
height: var(--c--globals--spacings--md); height: 24px;
padding-inline: var(--c--globals--spacings--st); padding-inline: 4px;
&[data-test='save'] { &[data-test='save'] {
border: 1px solid var(--c--globals--colors--info-600); border: 1px solid var(--c--theme--colors--info-600);
background: var(--c--globals--colors--info-600); background: var(--c--theme--colors--info-600);
color: white; color: white;
} }
&[data-test='cancel'] { &[data-test='cancel'] {
background: white; background: white;
border: 1px solid var(--c--globals--colors--gray-300); border: 1px solid var(--c--theme--colors--greyscale-300);
color: var(--c--globals--colors--info-600); color: var(--c--theme--colors--info-600);
} }
} }
} }
@@ -180,20 +179,19 @@ export const cssComments = (
button { button {
font-size: 0; font-size: 0;
background: var(--c--globals--colors--info-600); background: var(--c--theme--colors--info-600);
width: var(--c--globals--spacings--md); width: 24px;
height: var(--c--globals--spacings--md); height: 24px;
padding: var(--c--globals--spacings--0); padding: 0;
&:disabled { &:disabled {
background: var(--c--globals--colors--gray-300); background: var(--c--theme--colors--greyscale-300);
} }
& .mantine-Button-label::before { & .mantine-Button-label::before {
content: 'arrow_upward_alt'; content: '🡡';
font-family: 'Material Symbols Outlined Variable', sans-serif; font-size: 13px;
font-size: 18px; color: var(--c--theme--colors--greyscale-100);
color: var(--c--globals--colors--gray-100);
} }
} }
} }

View File

@@ -21,8 +21,8 @@ import emojidata from './initEmojiCallout';
const CalloutBlockStyle = createGlobalStyle` const CalloutBlockStyle = createGlobalStyle`
.bn-block-content[data-content-type="callout"][data-background-color] { .bn-block-content[data-content-type="callout"][data-background-color] {
padding: var(--c--globals--spacings--3xs) var(--c--globals--spacings--3xs); padding: var(--c--theme--spacings--3xs) var(--c--theme--spacings--3xs);
border-radius: var(--c--globals--spacings--3xs); border-radius: var(--c--theme--spacings--3xs);
} }
`; `;

View File

@@ -59,15 +59,9 @@ const UploadLoaderBlockComponent = ({
editor, editor,
}: UploadLoaderBlockComponentProps) => { }: UploadLoaderBlockComponentProps) => {
const mediaUrl = useMediaUrl(); const mediaUrl = useMediaUrl();
const isEditable = editor.isEditable;
useEffect(() => { useEffect(() => {
const shouldCheckStatus = if (!block.props.blockUploadUrl || block.props.type !== 'loading') {
block.props.blockUploadUrl &&
block.props.type === 'loading' &&
isEditable;
if (!shouldCheckStatus) {
return; return;
} }
@@ -75,31 +69,27 @@ const UploadLoaderBlockComponent = ({
loopCheckDocMediaStatus(url) loopCheckDocMediaStatus(url)
.then((response) => { .then((response) => {
// Add random delay to reduce collision probability during collaboration // Replace the loading block with the resource block (image, audio, video, pdf ...)
const randomDelay = Math.random() * 800; try {
setTimeout(() => { editor.replaceBlocks(
// Replace the loading block with the resource block (image, audio, video, pdf ...) [block.id],
try { [
editor.replaceBlocks( {
[block.id], type: block.props.blockUploadType,
[ props: {
{ url: `${mediaUrl}${response.file}`,
type: block.props.blockUploadType, showPreview: block.props.blockUploadShowPreview,
props: { name: block.props.blockUploadName,
url: `${mediaUrl}${response.file}`, caption: '',
showPreview: block.props.blockUploadShowPreview, backgroundColor: 'default',
name: block.props.blockUploadName, textAlignment: 'left',
caption: '', },
backgroundColor: 'default', } as never,
textAlignment: 'left', ],
}, );
} as never, } catch {
], /* During collaboration, another user might have updated the block */
); }
} catch {
/* During collaboration, another user might have updated the block */
}
}, randomDelay);
}) })
.catch((error) => { .catch((error) => {
console.error('Error analyzing file:', error); console.error('Error analyzing file:', error);
@@ -118,7 +108,7 @@ const UploadLoaderBlockComponent = ({
/* During collaboration, another user might have updated the block */ /* During collaboration, another user might have updated the block */
} }
}); });
}, [block, editor, mediaUrl, isEditable]); }, [block, editor, mediaUrl]);
return ( return (
<Box className="bn-visual-media-wrapper" $direction="row" $gap="0.5rem"> <Box className="bn-visual-media-wrapper" $direction="row" $gap="0.5rem">

View File

@@ -26,19 +26,14 @@ export const InterlinkingLinkInlineContent = createReactInlineContentSpec(
content: 'none', content: 'none',
}, },
{ {
render: ({ editor, inlineContent, updateInlineContent }) => { render: ({ inlineContent, updateInlineContent }) => {
const { data: doc } = useDoc({ id: inlineContent.props.docId }); const { data: doc } = useDoc({ id: inlineContent.props.docId });
const isEditable = editor.isEditable;
/** /**
* Update the content title if the referenced doc title changes * Update the content title if the referenced doc title changes
*/ */
useEffect(() => { useEffect(() => {
if ( if (doc?.title && doc.title !== inlineContent.props.title) {
isEditable &&
doc?.title &&
doc.title !== inlineContent.props.title
) {
updateInlineContent({ updateInlineContent({
type: 'interlinkingLinkInline', type: 'interlinkingLinkInline',
props: { props: {
@@ -55,7 +50,7 @@ export const InterlinkingLinkInlineContent = createReactInlineContentSpec(
* not when inlineContent.props.title changes. * not when inlineContent.props.title changes.
*/ */
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [doc?.title, isEditable]); }, [doc?.title]);
return <LinkSelected {...inlineContent.props} />; return <LinkSelected {...inlineContent.props} />;
}, },
@@ -91,10 +86,9 @@ const LinkSelected = ({ url, title }: LinkSelectedProps) => {
margin-right: 0.2rem; margin-right: 0.2rem;
} }
&:hover { &:hover {
background-color: ${colorsTokens['gray-100']}; background-color: ${colorsTokens['greyscale-100']};
} }
transition: background-color var(--c--globals--transitions--duration) transition: background-color 0.2s ease-in-out;
var(--c--globals--transitions--ease-out);
.--docs--doc-deleted & { .--docs--doc-deleted & {
pointer-events: none; pointer-events: none;
@@ -104,7 +98,7 @@ const LinkSelected = ({ url, title }: LinkSelectedProps) => {
{emoji ? ( {emoji ? (
<Text $size="16px">{emoji}</Text> <Text $size="16px">{emoji}</Text>
) : ( ) : (
<SelectedPageIcon width={11.5} color={colorsTokens['brand-400']} /> <SelectedPageIcon width={11.5} color={colorsTokens['primary-400']} />
)} )}
<Text <Text
$weight="500" $weight="500"

View File

@@ -35,11 +35,11 @@ import { DocSearchSubPageContent, DocSearchTarget } from '@/docs/doc-search';
import { useResponsiveStore } from '@/stores'; import { useResponsiveStore } from '@/stores';
const inputStyle = css` const inputStyle = css`
background-color: var(--c--globals--colors--gray-100); background-color: var(--c--theme--colors--greyscale-100);
border: none; border: none;
outline: none; outline: none;
color: var(--c--globals--colors--gray-700); color: var(--c--theme--colors--greyscale-700);
font-size: var(--c--globals--font--sizes--md); font-size: 16px;
width: 100%; width: 100%;
font-family: 'Inter'; font-family: 'Inter';
`; `;
@@ -86,7 +86,6 @@ export const SearchPage = ({
const [search, setSearch] = useState(''); const [search, setSearch] = useState('');
const { isDesktop } = useResponsiveStore(); const { isDesktop } = useResponsiveStore();
const { untitledDocument } = useTrans(); const { untitledDocument } = useTrans();
const isEditable = editor.isEditable;
/** /**
* createReactInlineContentSpec add automatically the focus after * createReactInlineContentSpec add automatically the focus after
@@ -102,10 +101,6 @@ export const SearchPage = ({
}, [inputRef]); }, [inputRef]);
const closeSearch = (insertContent: string) => { const closeSearch = (insertContent: string) => {
if (!isEditable) {
return;
}
updateInlineContent({ updateInlineContent({
type: 'interlinkingSearchInline', type: 'interlinkingSearchInline',
props: { props: {
@@ -159,8 +154,8 @@ export const SearchPage = ({
<Box <Box
as="span" as="span"
className="inline-content" className="inline-content"
$background={colorsTokens['gray-100']} $background={colorsTokens['greyscale-100']}
$color="var(--c--globals--colors--gray-700)" $color="var(--c--theme--colors--greyscale-700)"
$direction="row" $direction="row"
$radius="3px" $radius="3px"
$padding="1px" $padding="1px"
@@ -198,9 +193,9 @@ export const SearchPage = ({
<QuickSearch showInput={false}> <QuickSearch showInput={false}>
<Card <Card
$css={css` $css={css`
box-shadow: 0 0 3px 0px var(--c--globals--colors--gray-200); box-shadow: 0 0 3px 0px var(--c--theme--colors--greyscale-200);
& > div { & > div {
margin-top: var(--c--globals--spacings--0); margin-top: 0;
& [cmdk-group-heading] { & [cmdk-group-heading] {
padding: 0.4rem; padding: 0.4rem;
margin: 0; margin: 0;
@@ -228,10 +223,6 @@ export const SearchPage = ({
search={search} search={search}
filters={{ target: DocSearchTarget.CURRENT }} filters={{ target: DocSearchTarget.CURRENT }}
onSelect={(doc) => { onSelect={(doc) => {
if (!isEditable) {
return;
}
updateInlineContent({ updateInlineContent({
type: 'interlinkingSearchInline', type: 'interlinkingSearchInline',
props: { props: {
@@ -287,8 +278,8 @@ export const SearchPage = ({
</Box> </Box>
<Text <Text
$size="sm" $size="14px"
$color="var(--c--globals--colors--gray-1000)" $color="var(--c--theme--colors--greyscale-1000)"
spellCheck="false" spellCheck="false"
> >
{titleWithoutEmoji} {titleWithoutEmoji}
@@ -296,7 +287,11 @@ export const SearchPage = ({
</Box> </Box>
} }
right={ right={
<Icon iconName="keyboard_return" spellCheck="false" /> <Icon
iconName="keyboard_return"
$variation="600"
spellCheck="false"
/>
} }
/> />
); );
@@ -313,7 +308,7 @@ export const SearchPage = ({
<Box <Box
$css={css` $css={css`
border-top: 1px solid border-top: 1px solid
var(--c--globals--colors--gray-200); var(--c--theme--colors--greyscale-200);
`} `}
$width="100%" $width="100%"
> >
@@ -328,15 +323,15 @@ export const SearchPage = ({
$css={css` $css={css`
&:hover { &:hover {
background-color: var( background-color: var(
--c--globals--colors--gray-100 --c--theme--colors--greyscale-100
); );
} }
`} `}
> >
<AddPageIcon /> <AddPageIcon />
<Text <Text
$size="sm" $size="14px"
$color="var(--c--globals--colors--gray-1000)" $color="var(--c--theme--colors--greyscale-1000)"
contentEditable={false} contentEditable={false}
> >
{t('New sub-doc')} {t('New sub-doc')}

View File

@@ -9,33 +9,11 @@ export const useHeadings = (editor: DocsBlockNoteEditor) => {
useEffect(() => { useEffect(() => {
setHeadings(editor); setHeadings(editor);
let timeoutId: NodeJS.Timeout; const unsubscribe = editor?.onChange(() => {
const DEBOUNCE_DELAY = 500; setHeadings(editor);
const unsubscribe = editor?.onChange((_, context) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => {
const blocksChanges = context.getChanges();
if (!blocksChanges.length) {
return;
}
const blockChanges = blocksChanges[0];
if (
blockChanges.type !== 'update' ||
blockChanges.block.type !== 'heading'
) {
return;
}
setHeadings(editor);
}, DEBOUNCE_DELAY);
}); });
return () => { return () => {
clearTimeout(timeoutId);
resetHeadings(); resetHeadings();
unsubscribe(); unsubscribe();
}; };

View File

@@ -1,4 +1,3 @@
import { Block } from '@blocknote/core';
import { captureException } from '@sentry/nextjs'; import { captureException } from '@sentry/nextjs';
import { useCallback, useEffect } from 'react'; import { useCallback, useEffect } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@@ -37,93 +36,73 @@ export const useUploadFile = (docId: string) => {
}; };
}; };
/**
* When we upload a file it can takes some time to analyze it (e.g. virus scan).
* This hook listen to upload end and replace the uploaded block by a uploadLoader
* block to show analyzing status.
* The uploadLoader block will then handle the status display until the analysis is done
* then replaced by the final block (e.g. image, pdf, etc.).
* @param editor
*/
export const useUploadStatus = (editor: DocsBlockNoteEditor) => { export const useUploadStatus = (editor: DocsBlockNoteEditor) => {
const ANALYZE_URL = 'media-check'; const ANALYZE_URL = 'media-check';
const { t } = useTranslation(); const { t } = useTranslation();
/** useEffect(() => {
* Replace the resource block by a uploadLoader block to show analyzing status const unsubscribe = editor.onChange((_, context) => {
*/ const blocksChanges = context.getChanges();
const replaceBlockWithUploadLoader = useCallback(
(block: Block) => { if (!blocksChanges.length) {
return;
}
const blockChanges = blocksChanges[0];
if ( if (
!block || blockChanges.source.type !== 'local' ||
!('url' in block.props) || blockChanges.type !== 'update' ||
('url' in block.props && !block.props.url.includes(ANALYZE_URL)) !('url' in blockChanges.block.props) ||
('url' in blockChanges.block.props &&
!blockChanges.block.props.url.includes(ANALYZE_URL))
) { ) {
return; return;
} }
const blockUploadUrl = block.props.url; const blockUploadUrl = blockChanges.block.props.url;
const blockUploadType = block.type; const blockUploadType = blockChanges.block.type;
const blockUploadName = block.props.name; const blockUploadName = blockChanges.block.props.name;
const blockUploadShowPreview = const blockUploadShowPreview =
('showPreview' in block.props && block.props.showPreview) || false; ('showPreview' in blockChanges.block.props &&
blockChanges.block.props.showPreview) ||
false;
try { const timeoutId = setTimeout(() => {
editor.replaceBlocks( // Replace the resource block by a uploadLoader block
[block.id], // to show analyzing status
[ try {
{ editor.replaceBlocks(
type: 'uploadLoader', [blockChanges.block.id],
props: { [
information: t('Analyzing file...'), {
type: 'loading', type: 'uploadLoader',
blockUploadName, props: {
blockUploadType, information: t('Analyzing file...'),
blockUploadUrl, type: 'loading',
blockUploadShowPreview, blockUploadName,
blockUploadType,
blockUploadUrl,
blockUploadShowPreview,
},
}, },
}, ],
], );
); } catch (error) {
} catch (error) { captureException(error, {
captureException(error, { extra: { info: 'Error replacing block for upload loader' },
extra: { info: 'Error replacing block for upload loader' }, });
}); }
} }, 250);
},
[editor, t],
);
useEffect(() => {
const imagesBlocks = editor?.document.filter(
(block) =>
block.type === 'image' && block.props.url.includes(ANALYZE_URL),
);
imagesBlocks.forEach((block) => {
replaceBlockWithUploadLoader(block as Block);
});
}, [editor, replaceBlockWithUploadLoader]);
/**
* Handle upload end to replace the upload block by a uploadLoader
* block to show analyzing status
*/
useEffect(() => {
editor.onUploadEnd((blockId) => {
if (!blockId) {
return;
}
const innerTimeoutId = setTimeout(() => {
const block = editor.getBlock({ id: blockId });
replaceBlockWithUploadLoader(block as Block);
}, 300);
return () => { return () => {
clearTimeout(innerTimeoutId); clearTimeout(timeoutId);
unsubscribe();
}; };
}); });
}, [editor, replaceBlockWithUploadLoader]);
return () => {
unsubscribe();
};
}, [editor, t]);
}; };

View File

@@ -8,7 +8,7 @@ export const cssEditor = css`
} }
& .bn-editor { & .bn-editor {
color: var(--c--globals--colors--gray-700); color: var(--c--theme--colors--greyscale-700);
} }
/** /**
@@ -104,14 +104,14 @@ export const cssEditor = css`
* Callout, Paragraph and Heading blocks * Callout, Paragraph and Heading blocks
*/ */
.bn-block { .bn-block {
border-radius: var(--c--globals--spacings--3xs); border-radius: var(--c--theme--spacings--3xs);
} }
.bn-block-outer { .bn-block-outer {
border-radius: var(--c--globals--spacings--3xs); border-radius: var(--c--theme--spacings--3xs);
} }
.bn-block > .bn-block-content[data-background-color] { .bn-block > .bn-block-content[data-background-color] {
padding: var(--c--globals--spacings--3xs) var(--c--globals--spacings--3xs); padding: var(--c--theme--spacings--3xs) var(--c--theme--spacings--3xs);
border-radius: var(--c--globals--spacings--3xs); border-radius: var(--c--theme--spacings--3xs);
} }
.bn-block-content[data-content-type='checkListItem'][data-checked='true'] .bn-block-content[data-content-type='checkListItem'][data-checked='true']
.bn-inline-content { .bn-inline-content {
@@ -127,7 +127,7 @@ export const cssEditor = css`
font-size: 1.25rem; font-size: 1.25rem;
} }
a { a {
color: var(--c--globals--colors--gray-600); color: var(--c--theme--colors--greyscale-600);
cursor: pointer; cursor: pointer;
} }
.bn-block-group .bn-block-group
@@ -144,7 +144,7 @@ export const cssEditor = css`
* Quotes * Quotes
*/ */
blockquote { blockquote {
border-left: 4px solid var(--c--globals--colors--gray-300); border-left: 4px solid var(--c--theme--colors--greyscale-300);
font-style: italic; font-style: italic;
} }

View File

@@ -174,7 +174,7 @@ export const ModalExport = ({ onClose, doc }: ModalExportProps) => {
<> <>
<Button <Button
aria-label={t('Cancel the download')} aria-label={t('Cancel the download')}
variant="secondary" color="secondary"
fullWidth fullWidth
onClick={() => onClose()} onClick={() => onClose()}
> >
@@ -183,7 +183,7 @@ export const ModalExport = ({ onClose, doc }: ModalExportProps) => {
<Button <Button
data-testid="doc-export-download-button" data-testid="doc-export-download-button"
aria-label={t('Download')} aria-label={t('Download')}
variant="primary" color="primary"
fullWidth fullWidth
onClick={() => void onSubmit()} onClick={() => void onSubmit()}
disabled={isExporting} disabled={isExporting}
@@ -205,6 +205,7 @@ export const ModalExport = ({ onClose, doc }: ModalExportProps) => {
$margin="0" $margin="0"
id="modal-export-title" id="modal-export-title"
$size="h6" $size="h6"
$variation="1000"
$align="flex-start" $align="flex-start"
data-testid="modal-export-title" data-testid="modal-export-title"
> >
@@ -224,7 +225,7 @@ export const ModalExport = ({ onClose, doc }: ModalExportProps) => {
$gap="1rem" $gap="1rem"
className="--docs--modal-export-content" className="--docs--modal-export-content"
> >
<Text $variation="secondary" $size="sm" as="p"> <Text $variation="600" $size="sm" as="p">
{t('Download your document in a .docx, .odt or .pdf format.')} {t('Download your document in a .docx, .odt or .pdf format.')}
</Text> </Text>
<Select <Select

View File

@@ -2,37 +2,36 @@ import { Button, Modal, ModalSize } from '@openfun/cunningham-react';
import { t } from 'i18next'; import { t } from 'i18next';
import { useState } from 'react'; import { useState } from 'react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { css } from 'styled-components';
import { Box, BoxButton, Card, Icon, Text } from '@/components'; import { Box, BoxButton, Icon, Text } from '@/components';
import { useCunninghamTheme } from '@/cunningham'; import { useCunninghamTheme } from '@/cunningham';
export const AlertNetwork = () => { export const AlertNetwork = () => {
const { t } = useTranslation(); const { t } = useTranslation();
const { spacingsTokens } = useCunninghamTheme(); const { colorsTokens, spacingsTokens } = useCunninghamTheme();
const [isModalOpen, setIsModalOpen] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false);
return ( return (
<> <>
<Box> <Box>
<Card <Box
$direction="row" $direction="row"
$justify="space-between" $justify="space-between"
$width="100%" $width="100%"
$background={colorsTokens['warning-100']}
$radius={spacingsTokens['3xs']} $radius={spacingsTokens['3xs']}
$padding="xs" $padding="xs"
$flex={1} $flex={1}
$align="center" $align="center"
$gap={spacingsTokens['2xs']} $gap={spacingsTokens['2xs']}
$theme="warning" $css={css`
border: 1px solid var(--c--theme--colors--warning-300);
`}
> >
<Box <Box $direction="row" $gap={spacingsTokens['2xs']} $align="center">
$direction="row" <Icon iconName="mobiledata_off" $theme="warning" $variation="600" />
$gap={spacingsTokens['2xs']} <Text $theme="warning" $variation="600" $weight={500}>
$align="center"
$withThemeInherited
>
<Icon iconName="mobiledata_off" $withThemeInherited />
<Text $withThemeInherited $weight={500}>
{t('Others are editing. Your network prevent changes.')} {t('Others are editing. Your network prevent changes.')}
</Text> </Text>
</Box> </Box>
@@ -41,20 +40,20 @@ export const AlertNetwork = () => {
$gap={spacingsTokens['3xs']} $gap={spacingsTokens['3xs']}
$align="center" $align="center"
onClick={() => setIsModalOpen(true)} onClick={() => setIsModalOpen(true)}
$withThemeInherited
> >
<Icon <Icon
iconName="info" iconName="info"
$withThemeInherited $theme="warning"
$size="md" $variation="600"
$size="16px"
$weight="500" $weight="500"
$margin={{ top: 'auto' }} $margin={{ top: 'auto' }}
/> />
<Text $withThemeInherited $weight="500" $size="xs"> <Text $theme="warning" $variation="600" $weight="500" $size="xs">
{t('Learn more')} {t('Learn more')}
</Text> </Text>
</BoxButton> </BoxButton>
</Card> </Box>
</Box> </Box>
{isModalOpen && ( {isModalOpen && (
<AlertNetworkModal onClose={() => setIsModalOpen(false)} /> <AlertNetworkModal onClose={() => setIsModalOpen(false)} />
@@ -75,14 +74,20 @@ export const AlertNetworkModal = ({ onClose }: AlertNetworkModalProps) => {
onClose={() => onClose()} onClose={() => onClose()}
rightActions={ rightActions={
<> <>
<Button aria-label={t('OK')} onClick={onClose} color="error"> <Button aria-label={t('OK')} onClick={onClose} color="danger">
{t('I understand')} {t('I understand')}
</Button> </Button>
</> </>
} }
size={ModalSize.MEDIUM} size={ModalSize.MEDIUM}
title={ title={
<Text $size="h6" as="h6" $margin={{ all: '0' }} $align="flex-start"> <Text
$size="h6"
as="h6"
$margin={{ all: '0' }}
$align="flex-start"
$variation="1000"
>
{t("Why you can't edit the document?")} {t("Why you can't edit the document?")}
</Text> </Text>
} }
@@ -92,14 +97,14 @@ export const AlertNetworkModal = ({ onClose }: AlertNetworkModalProps) => {
className="--docs--modal-alert-network" className="--docs--modal-alert-network"
$margin={{ top: 'md' }} $margin={{ top: 'md' }}
> >
<Text $size="sm" $variation="secondary"> <Text $size="sm" $variation="600">
{t( {t(
'Others are editing this document. Unfortunately your network blocks WebSockets, the technology enabling real-time co-editing.', 'Others are editing this document. Unfortunately your network blocks WebSockets, the technology enabling real-time co-editing.',
)} )}
</Text> </Text>
<Text <Text
$size="sm" $size="sm"
$variation="secondary" $variation="600"
$margin={{ top: 'xs' }} $margin={{ top: 'xs' }}
$weight="bold" $weight="bold"
$display="inline" $display="inline"
@@ -107,7 +112,7 @@ export const AlertNetworkModal = ({ onClose }: AlertNetworkModalProps) => {
{t("This means you can't edit until others leave.")}{' '} {t("This means you can't edit until others leave.")}{' '}
<Text <Text
$size="sm" $size="sm"
$variation="secondary" $variation="600"
$margin={{ top: 'xs' }} $margin={{ top: 'xs' }}
$weight="normal" $weight="normal"
$display="inline" $display="inline"

View File

@@ -1,33 +1,39 @@
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { css } from 'styled-components';
import { Card, Icon, Text } from '@/components'; import { Box, Icon, Text } from '@/components';
import { useCunninghamTheme } from '@/cunningham'; import { useCunninghamTheme } from '@/cunningham';
export const AlertPublic = ({ isPublicDoc }: { isPublicDoc: boolean }) => { export const AlertPublic = ({ isPublicDoc }: { isPublicDoc: boolean }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { spacingsTokens } = useCunninghamTheme(); const { colorsTokens, spacingsTokens } = useCunninghamTheme();
return ( return (
<Card <Box
aria-label={t('Public document')} aria-label={t('Public document')}
$color={colorsTokens['primary-800']}
$background={colorsTokens['primary-050']}
$radius={spacingsTokens['3xs']} $radius={spacingsTokens['3xs']}
$direction="row" $direction="row"
$padding="xs" $padding="xs"
$flex={1} $flex={1}
$align="center" $align="center"
$gap={spacingsTokens['2xs']} $gap={spacingsTokens['2xs']}
$theme="brand" $css={css`
border: 1px solid var(--c--theme--colors--primary-300, #e3e3fd);
`}
> >
<Icon <Icon
$withThemeInherited $theme="primary"
$variation="800"
data-testid="public-icon" data-testid="public-icon"
iconName={isPublicDoc ? 'public' : 'vpn_lock'} iconName={isPublicDoc ? 'public' : 'vpn_lock'}
/> />
<Text $withThemeInherited $weight="500"> <Text $theme="primary" $variation="800" $weight="500">
{isPublicDoc {isPublicDoc
? t('Public document') ? t('Public document')
: t('Document accessible to any connected person')} : t('Document accessible to any connected person')}
</Text> </Text>
</Card> </Box>
); );
}; };

View File

@@ -1,12 +1,9 @@
import { useTreeContext } from '@gouvfr-lasuite/ui-kit'; import { useTreeContext } from '@gouvfr-lasuite/ui-kit';
import { import { VariantType, useToastProvider } from '@openfun/cunningham-react';
Button,
VariantType,
useToastProvider,
} from '@openfun/cunningham-react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { css } from 'styled-components';
import { Box, Card, Icon } from '@/components'; import { Box, BoxButton, Icon, Text } from '@/components';
import { useCunninghamTheme } from '@/cunningham'; import { useCunninghamTheme } from '@/cunningham';
import { import {
Doc, Doc,
@@ -20,7 +17,7 @@ export const AlertRestore = ({ doc }: { doc: Doc }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { toast } = useToastProvider(); const { toast } = useToastProvider();
const treeContext = useTreeContext<Doc>(); const treeContext = useTreeContext<Doc>();
const { spacingsTokens } = useCunninghamTheme(); const { colorsTokens, spacingsTokens } = useCunninghamTheme();
const { mutate: restoreDoc, error } = useRestoreDoc({ const { mutate: restoreDoc, error } = useRestoreDoc({
listInvalidQueries: [KEY_LIST_DOC, KEY_LIST_DOC_TRASHBIN, KEY_DOC], listInvalidQueries: [KEY_LIST_DOC, KEY_LIST_DOC_TRASHBIN, KEY_DOC],
options: { options: {
@@ -47,52 +44,57 @@ export const AlertRestore = ({ doc }: { doc: Doc }) => {
}); });
return ( return (
<Card <Box
className="--docs--alert-restore" className="--docs--alert-restore"
aria-label={t('Alert deleted document')} aria-label={t('Alert deleted document')}
$color={colorsTokens['danger-800']}
$background={colorsTokens['danger-100']}
$radius={spacingsTokens['3xs']} $radius={spacingsTokens['3xs']}
$direction="row" $direction="row"
$padding="xs" $padding="xs"
$flex={1} $flex={1}
$align="center" $align="center"
$gap={spacingsTokens['3xs']} $gap={spacingsTokens['3xs']}
$css={css`
border: 1px solid var(--c--theme--colors--danger-300, #e3e3fd);
`}
$justify="space-between" $justify="space-between"
$theme="error"
> >
<Box <Box $direction="row" $align="center" $gap={spacingsTokens['2xs']}>
$withThemeInherited
$direction="row"
$align="center"
$gap={spacingsTokens['2xs']}
>
<Icon <Icon
$withThemeInherited $theme="danger"
$variation="700"
data-testid="public-icon" data-testid="public-icon"
iconName="delete" iconName="delete"
variant="symbols-outlined" variant="symbols-outlined"
/> />
{t('Document deleted')} <Text $theme="danger" $variation="700" $weight="500">
{t('Document deleted')}
</Text>
</Box> </Box>
<Button <BoxButton
onClick={() => onClick={() =>
restoreDoc({ restoreDoc({
docId: doc.id, docId: doc.id,
}) })
} }
color="error" $direction="row"
variant="tertiary" $gap="0.2rem"
size="nano" $theme="danger"
icon={ $variation="600"
<Icon $align="center"
iconName="undo"
$withThemeInherited
$size="18px"
variant="symbols-outlined"
/>
}
> >
Restore <Icon
</Button> iconName="undo"
</Card> $theme="danger"
$variation="600"
$size="18px"
variant="symbols-outlined"
/>
<Text $theme="danger" $variation="600" $size="s" $css="line-height:1;">
{t('Restore')}
</Text>
</BoxButton>
</Box>
); );
}; };

View File

@@ -46,19 +46,20 @@ export const BoutonShare = ({
<Box <Box
$css={css` $css={css`
.c__button--medium { .c__button--medium {
height: var(--c--globals--spacings--lg); height: 32px;
padding: 10px var(--c--globals--spacings--xs); padding: 10px var(--c--theme--spacings--xs);
gap: 7px; gap: 7px;
} }
`} `}
> >
<Button <Button
color="tertiary"
aria-label={t('Share button')} aria-label={t('Share button')}
variant="secondary"
icon={ icon={
<Icon <Icon
iconName="group" iconName="group"
$color="inherit" $theme="primary"
$variation="800"
variant="filled" variant="filled"
disabled={isDisabled} disabled={isDisabled}
/> />
@@ -75,8 +76,7 @@ export const BoutonShare = ({
return ( return (
<Button <Button
color="brand" color="primary-text"
variant="tertiary"
onClick={open} onClick={open}
size="medium" size="medium"
disabled={isDisabled} disabled={isDisabled}

View File

@@ -47,15 +47,15 @@ export const DocHeaderInfo = ({ doc }: DocHeaderInfoProps) => {
return ( return (
<> <>
<Text <Text
$variation="tertiary" $variation="600"
$size="s" $size="s"
$weight="bold" $weight="bold"
$theme={isEditable ? 'gray' : 'warning'} $theme={isEditable ? 'greyscale' : 'warning'}
> >
{transRole(isEditable ? doc.user_role || doc.link_role : Role.READER)} {transRole(isEditable ? doc.user_role || doc.link_role : Role.READER)}
&nbsp;·&nbsp; &nbsp;·&nbsp;
</Text> </Text>
<Text $variation="tertiary" $size="s"> <Text $variation="600" $size="s">
{dateToDisplay} {dateToDisplay}
</Text> </Text>
</> </>
@@ -64,11 +64,11 @@ export const DocHeaderInfo = ({ doc }: DocHeaderInfoProps) => {
return ( return (
<> <>
<Text $variation="tertiary" $size="s"> <Text $variation="400" $size="s">
{hasChildren ? relativeOnly : dateToDisplay} {hasChildren ? relativeOnly : dateToDisplay}
</Text> </Text>
{hasChildren && ( {hasChildren && (
<Text $variation="tertiary" $size="s"> <Text $variation="400" $size="s">
&nbsp;&nbsp; &nbsp;&nbsp;
{t('Contains {{count}} sub-documents', { {t('Contains {{count}} sub-documents', {
count: childrenCount, count: childrenCount,

View File

@@ -43,6 +43,7 @@ export const DocTitleText = () => {
as="h2" as="h2"
$margin={{ all: 'none', left: 'none' }} $margin={{ all: 'none', left: 'none' }}
$size={isMobile ? 'h4' : 'h2'} $size={isMobile ? 'h4' : 'h2'}
$variation="1000"
> >
{currentDoc?.title || untitledDocument} {currentDoc?.title || untitledDocument}
</Text> </Text>
@@ -70,11 +71,10 @@ const DocTitleEmojiPicker = ({ doc }: DocTitleProps) => {
padding-top: 3px; padding-top: 3px;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
background-color: ${colorsTokens['gray-100']}; background-color: ${colorsTokens['greyscale-100']};
border-radius: var(--c--globals--spacings--st); border-radius: 4px;
} }
transition: background-color var(--c--globals--transitions--duration) transition: background-color 0.2s ease-in-out;
var(--c--globals--transitions--ease-out);
`} `}
> >
<DocIcon <DocIcon
@@ -95,7 +95,7 @@ const DocTitleEmojiPicker = ({ doc }: DocTitleProps) => {
height="25px" height="25px"
aria-hidden="true" aria-hidden="true"
aria-label={t('Simple document icon')} aria-label={t('Simple document icon')}
color={colorsTokens['brand-500']} color={colorsTokens['primary-500']}
/> />
} }
/> />
@@ -107,6 +107,7 @@ const DocTitleEmojiPicker = ({ doc }: DocTitleProps) => {
const DocTitleInput = ({ doc }: DocTitleProps) => { const DocTitleInput = ({ doc }: DocTitleProps) => {
const { isDesktop } = useResponsiveStore(); const { isDesktop } = useResponsiveStore();
const { t } = useTranslation(); const { t } = useTranslation();
const { colorsTokens } = useCunninghamTheme();
const { isTopRoot } = useDocUtils(doc); const { isTopRoot } = useDocUtils(doc);
const { untitledDocument } = useTrans(); const { untitledDocument } = useTrans();
const { emoji, titleWithoutEmoji } = getEmojiAndTitle(doc.title ?? ''); const { emoji, titleWithoutEmoji } = getEmojiAndTitle(doc.title ?? '');
@@ -121,17 +122,11 @@ const DocTitleInput = ({ doc }: DocTitleProps) => {
if (isTopRoot) { if (isTopRoot) {
const sanitizedTitle = updateDocTitle(doc, inputText); const sanitizedTitle = updateDocTitle(doc, inputText);
setTitleDisplay(sanitizedTitle); setTitleDisplay(sanitizedTitle);
return sanitizedTitle;
} else { } else {
const { emoji: pastedEmoji } = getEmojiAndTitle(inputText); const sanitizedTitle = updateDocTitle(
const textPreservingPastedEmoji = pastedEmoji doc,
? `\u200B${inputText}` emoji ? `${emoji} ${inputText}` : inputText,
: inputText; );
const finalTitle = emoji
? `${emoji} ${textPreservingPastedEmoji}`
: textPreservingPastedEmoji;
const sanitizedTitle = updateDocTitle(doc, finalTitle);
const { titleWithoutEmoji: sanitizedTitleWithoutEmoji } = const { titleWithoutEmoji: sanitizedTitleWithoutEmoji } =
getEmojiAndTitle(sanitizedTitle); getEmojiAndTitle(sanitizedTitle);
@@ -176,19 +171,18 @@ const DocTitleInput = ({ doc }: DocTitleProps) => {
onBlurCapture={(event) => onBlurCapture={(event) =>
handleTitleSubmit(event.target.textContent || '') handleTitleSubmit(event.target.textContent || '')
} }
$color={colorsTokens['greyscale-1000']}
$padding={{ right: 'big' }} $padding={{ right: 'big' }}
$css={css` $css={css`
&[contenteditable='true']:empty:not(:focus):before { &[contenteditable='true']:empty:not(:focus):before {
content: '${untitledDocument}'; content: '${untitledDocument}';
color: var( color: grey;
--c--contextuals--content--semantic--neutral--tertiary
);
pointer-events: none; pointer-events: none;
font-style: italic; font-style: italic;
} }
font-size: ${isDesktop font-size: ${isDesktop
? css`var(--c--globals--font--sizes--h2)` ? css`var(--c--theme--font--sizes--h2)`
: css`var(--c--globals--font--sizes--sm)`}; : css`var(--c--theme--font--sizes--sm)`};
font-weight: 700; font-weight: 700;
outline: none; outline: none;
`} `}

View File

@@ -215,9 +215,14 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => {
{!isSmallMobile && ModalExport && ( {!isSmallMobile && ModalExport && (
<Button <Button
data-testid="doc-open-modal-download-button" data-testid="doc-open-modal-download-button"
variant="tertiary" color="tertiary-text"
icon={ icon={
<Icon iconName="download" $color="inherit" aria-hidden={true} /> <Icon
iconName="download"
$theme="primary"
$variation="800"
aria-hidden={true}
/>
} }
onClick={() => { onClick={() => {
setIsModalExportOpen(true); setIsModalExportOpen(true);
@@ -231,14 +236,17 @@ export const DocToolBox = ({ doc }: DocToolBoxProps) => {
label={t('Open the document options')} label={t('Open the document options')}
buttonCss={css` buttonCss={css`
padding: ${spacingsTokens['xs']}; padding: ${spacingsTokens['xs']};
&:hover {
background-color: ${colorsTokens['greyscale-100']};
}
${isSmallMobile ${isSmallMobile
? css` ? css`
border: 1px solid ${colorsTokens['gray-300']}; border: 1px solid ${colorsTokens['greyscale-300']};
` `
: ''} : ''}
`} `}
> >
<IconOptions aria-hidden="true" isHorizontal $color="inherit" /> <IconOptions aria-hidden="true" isHorizontal $theme="primary" />
</DropdownMenu> </DropdownMenu>
</Box> </Box>

View File

@@ -1,8 +1,4 @@
import { import { useMutation, useQueryClient } from '@tanstack/react-query';
UseMutationOptions,
useMutation,
useQueryClient,
} from '@tanstack/react-query';
import { APIError, errorCauses, fetchAPI } from '@/api'; import { APIError, errorCauses, fetchAPI } from '@/api';
@@ -10,14 +6,9 @@ import { Doc } from '../types';
import { KEY_LIST_DOC } from './useDocs'; import { KEY_LIST_DOC } from './useDocs';
type CreateDocParams = { export const createDoc = async (): Promise<Doc> => {
title?: string;
} | void;
export const createDoc = async (params: CreateDocParams): Promise<Doc> => {
const response = await fetchAPI(`documents/`, { const response = await fetchAPI(`documents/`, {
method: 'POST', method: 'POST',
body: JSON.stringify({ title: params?.title }),
}); });
if (!response.ok) { if (!response.ok) {
@@ -27,17 +18,23 @@ export const createDoc = async (params: CreateDocParams): Promise<Doc> => {
return response.json() as Promise<Doc>; return response.json() as Promise<Doc>;
}; };
type UseCreateDocOptions = UseMutationOptions<Doc, APIError, CreateDocParams>; interface CreateDocProps {
onSuccess: (data: Doc) => void;
onError?: (error: APIError) => void;
}
export function useCreateDoc(options?: UseCreateDocOptions) { export function useCreateDoc({ onSuccess, onError }: CreateDocProps) {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation<Doc, APIError, CreateDocParams>({ return useMutation<Doc, APIError>({
mutationFn: createDoc, mutationFn: createDoc,
onSuccess: (data, variables, onMutateResult, context) => { onSuccess: (data) => {
void queryClient.resetQueries({ void queryClient.resetQueries({
queryKey: [KEY_LIST_DOC], queryKey: [KEY_LIST_DOC],
}); });
options?.onSuccess?.(data, variables, onMutateResult, context); onSuccess(data);
},
onError: (error) => {
onError?.(error);
}, },
}); });
} }

View File

@@ -21,7 +21,7 @@ export const DocIcon = ({
emoji, emoji,
defaultIcon, defaultIcon,
$size = 'sm', $size = 'sm',
$variation = 'secondary', $variation = '1000',
$weight = '400', $weight = '400',
docId, docId,
title, title,

View File

@@ -65,6 +65,7 @@ export const DocPage403 = ({ id }: DocProps) => {
$padding={{ bottom: '2rem' }} $padding={{ bottom: '2rem' }}
> >
<Image <Image
className="c__image-system-filter"
src={img403} src={img403}
alt={t('Image 403')} alt={t('Image 403')}
width={300} width={300}
@@ -76,7 +77,7 @@ export const DocPage403 = ({ id }: DocProps) => {
/> />
<Box $align="center" $gap="0.8rem"> <Box $align="center" $gap="0.8rem">
<Text as="p" $textAlign="center" $maxWidth="350px" $theme="brand"> <Text as="p" $textAlign="center" $maxWidth="350px" $theme="primary">
{hasRequested {hasRequested
? t('Your access request for this document is pending.') ? t('Your access request for this document is pending.')
: t('Insufficient access rights to view the document.')} : t('Insufficient access rights to view the document.')}
@@ -87,6 +88,7 @@ export const DocPage403 = ({ id }: DocProps) => {
as="p" as="p"
$maxWidth="320px" $maxWidth="320px"
$textAlign="center" $textAlign="center"
$variation="600"
$size="sm" $size="sm"
$margin={{ top: '0' }} $margin={{ top: '0' }}
> >
@@ -99,9 +101,8 @@ export const DocPage403 = ({ id }: DocProps) => {
<Box $direction="row" $gap="0.7rem"> <Box $direction="row" $gap="0.7rem">
<StyledLink href="/"> <StyledLink href="/">
<StyledButton <StyledButton
icon={<Icon iconName="house" $withThemeInherited />} icon={<Icon iconName="house" $theme="primary" />}
color="brand" color="tertiary"
variant="secondary"
> >
{t('Home')} {t('Home')}
</StyledButton> </StyledButton>

View File

@@ -98,7 +98,7 @@ export const ModalRemoveDoc = ({
<Button <Button
ref={cancelButtonRef} ref={cancelButtonRef}
aria-label={t('Cancel the deletion')} aria-label={t('Cancel the deletion')}
variant="secondary" color="secondary"
fullWidth fullWidth
onClick={handleClose} onClick={handleClose}
onKeyDown={handleCloseKeyDown} onKeyDown={handleCloseKeyDown}
@@ -107,7 +107,7 @@ export const ModalRemoveDoc = ({
</Button> </Button>
<Button <Button
aria-label={t('Delete document')} aria-label={t('Delete document')}
color="error" color="danger"
fullWidth fullWidth
onClick={handleDelete} onClick={handleDelete}
onKeyDown={handleDeleteKeyDown} onKeyDown={handleDeleteKeyDown}
@@ -130,6 +130,7 @@ export const ModalRemoveDoc = ({
id="modal-remove-doc-title" id="modal-remove-doc-title"
$margin="0" $margin="0"
$align="flex-start" $align="flex-start"
$variation="1000"
> >
{t('Delete a doc')} {t('Delete a doc')}
</Text> </Text>
@@ -143,12 +144,7 @@ export const ModalRemoveDoc = ({
> >
<Box className="--docs--modal-remove-doc"> <Box className="--docs--modal-remove-doc">
{!isError && ( {!isError && (
<Text <Text $size="sm" $variation="600" $display="inline-block" as="p">
$size="sm"
$variation="secondary"
$display="inline-block"
as="p"
>
{hasChildren ? ( {hasChildren ? (
<Trans t={t}> <Trans t={t}>
This document and <strong>any sub-documents</strong> will be This document and <strong>any sub-documents</strong> will be

View File

@@ -33,7 +33,7 @@ export const SimpleDocItem = ({
showAccesses = false, showAccesses = false,
}: SimpleDocItemProps) => { }: SimpleDocItemProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { spacingsTokens } = useCunninghamTheme(); const { spacingsTokens, colorsTokens } = useCunninghamTheme();
const { isDesktop } = useResponsiveStore(); const { isDesktop } = useResponsiveStore();
const { untitledDocument } = useTrans(); const { untitledDocument } = useTrans();
const { isChild } = useDocUtils(doc); const { isChild } = useDocUtils(doc);
@@ -63,13 +63,13 @@ export const SimpleDocItem = ({
<PinnedDocumentIcon <PinnedDocumentIcon
aria-hidden="true" aria-hidden="true"
data-testid="doc-pinned-icon" data-testid="doc-pinned-icon"
color="var(--c--contextuals--content--semantic--info--tertiary)" color={colorsTokens['primary-500']}
/> />
) : isChild ? ( ) : isChild ? (
<ChildDocument <ChildDocument
aria-hidden="true" aria-hidden="true"
data-testid="doc-child-icon" data-testid="doc-child-icon"
color="var(--c--contextuals--content--semantic--info--tertiary)" color={colorsTokens['primary-500']}
/> />
) : ( ) : (
<SimpleFileIcon <SimpleFileIcon
@@ -77,13 +77,14 @@ export const SimpleDocItem = ({
height="32px" height="32px"
aria-hidden="true" aria-hidden="true"
data-testid="doc-simple-icon" data-testid="doc-simple-icon"
color="var(--c--contextuals--content--semantic--info--tertiary)" color={colorsTokens['primary-500']}
/> />
)} )}
</Box> </Box>
<Box $justify="center" $overflow="auto"> <Box $justify="center" $overflow="auto">
<Text <Text
$size="sm" $size="sm"
$variation="1000"
$weight="500" $weight="500"
$css={ItemTextCss} $css={ItemTextCss}
data-testid="doc-title" data-testid="doc-title"
@@ -98,7 +99,7 @@ export const SimpleDocItem = ({
$margin={{ top: '-2px' }} $margin={{ top: '-2px' }}
aria-hidden="true" aria-hidden="true"
> >
<Text $size="xs" $variation="tertiary"> <Text $variation="600" $size="xs">
{DateTime.fromISO(doc.updated_at).toRelative()} {DateTime.fromISO(doc.updated_at).toRelative()}
</Text> </Text>
</Box> </Box>

View File

@@ -26,13 +26,12 @@ export const getEmojiAndTitle = (title: string) => {
// Use emoji-regex library for comprehensive emoji detection compatible with ES5 // Use emoji-regex library for comprehensive emoji detection compatible with ES5
const regex = emojiRegex(); const regex = emojiRegex();
// Ignore leading spaces when checking for a leading emoji // Check if the title starts with an emoji
const trimmedTitle = title.trimStart(); const match = title.match(regex);
const match = trimmedTitle.match(regex);
if (match && trimmedTitle.startsWith(match[0])) { if (match && title.startsWith(match[0])) {
const emoji = match[0]; const emoji = match[0];
const titleWithoutEmoji = trimmedTitle.substring(emoji.length).trim(); const titleWithoutEmoji = title.substring(emoji.length).trim();
return { emoji, titleWithoutEmoji }; return { emoji, titleWithoutEmoji };
} }

View File

@@ -58,7 +58,7 @@ export const DocSearchFilters = ({
/> />
</Box> </Box>
{hasFilters && ( {hasFilters && (
<Button color="brand" variant="tertiary" size="small" onClick={onReset}> <Button color="primary-text" size="small" onClick={onReset}>
{t('Reset')} {t('Reset')}
</Button> </Button>
)} )}

View File

@@ -24,11 +24,7 @@ export const DocSearchItem = ({ doc }: DocSearchItemProps) => {
</Box> </Box>
} }
right={ right={
<Icon <Icon iconName="keyboard_return" $theme="primary" $variation="800" />
iconName="keyboard_return"
$theme="brand"
$variation="secondary"
/>
} }
/> />
</Box> </Box>

Some files were not shown because too many files have changed in this diff Show More