Merge branch 'main' into migration-version

pull/4094/head
RoccoSmit 6 months ago
commit 1f8da374cb

@ -3,8 +3,9 @@ name: build-and-push-stable-image
on:
push:
tags:
# Run on pushing tags like 'v1.0.0'
# Match stable and rc versions, such as 'v1.0.0' or 'v0.23.0-rc.0'
- "v*.*.*"
- "v*.*.*-rc.*"
jobs:
build-and-push-stable-image:
@ -19,9 +20,13 @@ jobs:
uses: docker/setup-qemu-action@v3
- name: Extract build args
# Extract version from tag name
# Example: tag name `v1.0.0` sets up env.VERSION=1.0.0
# Extract version number and check if it's an rc version
run: |
if [[ "${GITHUB_REF_NAME}" =~ -rc ]]; then
echo "PRE_RELEASE=true" >> $GITHUB_ENV
else
echo "PRE_RELEASE=false" >> $GITHUB_ENV
fi
echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
- name: Login to Docker Hub
@ -44,8 +49,10 @@ jobs:
install: true
version: v0.9.1
- name: Docker meta
id: meta
# Metadata for stable versions
- name: Docker meta for stable
id: meta-stable
if: env.PRE_RELEASE == 'false'
uses: docker/metadata-action@v5
with:
images: |
@ -60,6 +67,20 @@ jobs:
labels: |
org.opencontainers.image.version=${{ env.VERSION }}
# Metadata for rc versions
- name: Docker meta for rc
id: meta-rc
if: env.PRE_RELEASE == 'true'
uses: docker/metadata-action@v5
with:
images: |
neosmemo/memos
ghcr.io/usememos/memos
tags: |
type=raw,value=${{ env.VERSION }}
labels: |
org.opencontainers.image.version=${{ env.VERSION }}
- name: Build and Push
id: docker_build
uses: docker/build-push-action@v6
@ -68,5 +89,5 @@ jobs:
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ steps.meta-stable.outputs.tags || steps.meta-rc.outputs.tags }}
labels: ${{ steps.meta-stable.outputs.labels || steps.meta-rc.outputs.labels }}

@ -3,11 +3,11 @@ module github.com/usememos/memos
go 1.23
require (
github.com/aws/aws-sdk-go-v2 v1.31.0
github.com/aws/aws-sdk-go-v2/config v1.27.39
github.com/aws/aws-sdk-go-v2/credentials v1.17.37
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25
github.com/aws/aws-sdk-go-v2/service/s3 v1.63.3
github.com/aws/aws-sdk-go-v2 v1.32.3
github.com/aws/aws-sdk-go-v2/config v1.28.1
github.com/aws/aws-sdk-go-v2/credentials v1.17.42
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2
github.com/go-sql-driver/mysql v1.8.1
github.com/google/cel-go v0.21.0
github.com/google/uuid v1.6.0
@ -24,10 +24,10 @@ require (
github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.9.0
github.com/usememos/gomark v0.0.0-20240928134159-9aca881d9121
golang.org/x/crypto v0.27.0
golang.org/x/crypto v0.28.0
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
golang.org/x/mod v0.21.0
golang.org/x/net v0.29.0
golang.org/x/net v0.30.0
golang.org/x/oauth2 v0.23.0
google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1
google.golang.org/grpc v1.67.1
@ -71,20 +71,20 @@ require (
)
require (
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 // indirect
github.com/aws/smithy-go v1.21.0 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect
github.com/aws/smithy-go v1.22.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/disintegration/imaging v1.6.2
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
@ -98,8 +98,8 @@ require (
github.com/spf13/pflag v1.0.5 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/text v0.18.0 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/text v0.19.0 // indirect
golang.org/x/time v0.6.0 // indirect
google.golang.org/protobuf v1.34.2
gopkg.in/yaml.v3 v3.0.1 // indirect

@ -26,44 +26,44 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l
github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
github.com/aws/aws-sdk-go-v2 v1.31.0 h1:3V05LbxTSItI5kUqNwhJrrrY1BAXxXt0sN0l72QmG5U=
github.com/aws/aws-sdk-go-v2 v1.31.0/go.mod h1:ztolYtaEUtdpf9Wftr31CJfLVjOnD/CVRkKOOYgF8hA=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 h1:xDAuZTn4IMm8o1LnBZvmrL8JA1io4o3YWNXgohbf20g=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5/go.mod h1:wYSv6iDS621sEFLfKvpPE2ugjTuGlAG7iROg0hLOkfc=
github.com/aws/aws-sdk-go-v2/config v1.27.39 h1:FCylu78eTGzW1ynHcongXK9YHtoXD5AiiUqq3YfJYjU=
github.com/aws/aws-sdk-go-v2/config v1.27.39/go.mod h1:wczj2hbyskP4LjMKBEZwPRO1shXY+GsQleab+ZXT2ik=
github.com/aws/aws-sdk-go-v2/credentials v1.17.37 h1:G2aOH01yW8X373JK419THj5QVqu9vKEwxSEsGxihoW0=
github.com/aws/aws-sdk-go-v2/credentials v1.17.37/go.mod h1:0ecCjlb7htYCptRD45lXJ6aJDQac6D2NlKGpZqyTG6A=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 h1:C/d03NAmh8C4BZXhuRNboF/DqhBkBCeDiJDcaqIT5pA=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14/go.mod h1:7I0Ju7p9mCIdlrfS+JCgqcYD0VXz/N4yozsox+0o078=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25 h1:HkpHeZMM39sGtMHVYG1buAg93vhj5d7F81y6G0OAbGc=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25/go.mod h1:j3Vz04ZjaWA6kygOsZRpmWe4CyGqfqq2u3unDTU0QGA=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 h1:kYQ3H1u0ANr9KEKlGs/jTLrBFPo8P8NaH/w7A01NeeM=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18/go.mod h1:r506HmK5JDUh9+Mw4CfGJGSSoqIiLCndAuqXuhbv67Y=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 h1:Z7IdFUONvTcvS7YuhtVxN99v2cCoHRXOS4mTr0B/pUc=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18/go.mod h1:DkKMmksZVVyat+Y+r1dEOgJEfUeA7UngIHWeKsi0yNc=
github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk=
github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA=
github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw=
github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI=
github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM=
github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 h1:ihPPdcCVSN0IvBByXwqVp28/l4VosBZ6sDulcvU2J7w=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35/go.mod h1:JkgEhs3SVF51Dj3m1Bj+yL8IznpxzkwlA3jLg3x7Kls=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 h1:OWYvKL53l1rbsUmW7bQyJVsYU/Ii3bbAAQIIFNbM0Tk=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18/go.mod h1:CUx0G1v3wG6l01tUB+j7Y8kclA8NSqK4ef0YG79a4cg=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 h1:QFASJGfT8wMXtuP3D5CRmMjARHv9ZmzFUMJznHDOY3w=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5/go.mod h1:QdZ3OmoIjSX+8D1OPAzPxDfjXASbBMDsz9qvtyIhtik=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 h1:rTWjG6AvWekO2B1LHeM3ktU7MqyX9rzWQ7hgzneZW7E=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20/go.mod h1:RGW2DDpVc8hu6Y6yG8G5CHVmVOAn1oV8rNKOHRJyswg=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 h1:Xbwbmk44URTiHNx6PNo0ujDE6ERlsCKJD3u1zfnzAPg=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20/go.mod h1:oAfOFzUB14ltPZj1rWwRc3d/6OgD76R8KlvU3EqM9Fg=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 h1:eb+tFOIl9ZsUe2259/BKPeniKuz4/02zZFH/i4Nf8Rg=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18/go.mod h1:GVCC2IJNJTmdlyEsSmofEy7EfJncP7DNnXDzRjJ5Keg=
github.com/aws/aws-sdk-go-v2/service/s3 v1.63.3 h1:3zt8qqznMuAZWDTDpcwv9Xr11M/lVj2FsRR7oYBt0OA=
github.com/aws/aws-sdk-go-v2/service/s3 v1.63.3/go.mod h1:NLTqRLe3pUNu3nTEHI6XlHLKYmc8fbHUdMxAB6+s41Q=
github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 h1:rs4JCczF805+FDv2tRhZ1NU0RB2H6ryAvsWPanAr72Y=
github.com/aws/aws-sdk-go-v2/service/sso v1.23.3/go.mod h1:XRlMvmad0ZNL+75C5FYdMvbbLkd6qiqz6foR1nA1PXY=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 h1:S7EPdMVZod8BGKQQPTBK+FcX9g7bKR7c4+HxWqHP7Vg=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3/go.mod h1:FnvDM4sfa+isJ3kDXIzAB9GAwVSzFzSy97uZ3IsHo4E=
github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 h1:VzudTFrDCIDakXtemR7l6Qzt2+JYsVqo2MxBPt5k8T8=
github.com/aws/aws-sdk-go-v2/service/sts v1.31.3/go.mod h1:yMWe0F+XG0DkRZK5ODZhG7BEFYhLXi2dqGsv6tX0cgI=
github.com/aws/smithy-go v1.21.0 h1:H7L8dtDRk0P1Qm6y0ji7MCYMQObJ5R9CRpyPhRUkLYA=
github.com/aws/smithy-go v1.21.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY=
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U=
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58=
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs=
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE=
github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM=
github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
@ -473,8 +473,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
@ -520,8 +520,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
@ -566,15 +566,15 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=

@ -311,16 +311,12 @@ paths:
type: integer
format: int32
- name: pageToken
description: |-
A page token, received from a previous `ListMemos` call.
Provide this to retrieve the subsequent page.
description: "A page token, received from a previous `ListMemos` call.\r\nProvide this to retrieve the subsequent page."
in: query
required: false
type: string
- name: filter
description: |-
Filter is used to filter memos returned in the list.
Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']"
description: "Filter is used to filter memos returned in the list.\r\nFormat: \"creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']\""
in: query
required: false
type: string
@ -509,9 +505,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: filter
description: |-
Filter is used to filter users returned in the list.
Format: "username == 'frank'"
description: "Filter is used to filter users returned in the list.\r\nFormat: \"username == 'frank'\""
in: query
required: false
type: string
@ -672,9 +666,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The resource name of the workspace setting.
Format: settings/{setting}
description: "The resource name of the workspace setting.\r\nFormat: settings/{setting}"
in: path
required: true
type: string
@ -696,9 +688,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: setting.name
description: |-
name is the name of the setting.
Format: settings/{setting}
description: "name is the name of the setting.\r\nFormat: settings/{setting}"
in: path
required: true
type: string
@ -734,9 +724,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: identityProvider.name
description: |-
The name of the identityProvider.
Format: identityProviders/{id}
description: "The name of the identityProvider.\r\nFormat: identityProviders/{id}"
in: path
required: true
type: string
@ -774,9 +762,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: inbox.name
description: |-
The name of the inbox.
Format: inboxes/{id}
description: "The name of the inbox.\r\nFormat: inboxes/{id}"
in: path
required: true
type: string
@ -820,10 +806,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: memo.name
description: |-
The name of the memo.
Format: memos/{id}
id is the system generated id.
description: "The name of the memo.\r\nFormat: memos/{id}\r\nid is the system generated id."
in: path
required: true
type: string
@ -841,9 +824,7 @@ paths:
$ref: '#/definitions/v1RowStatus'
creator:
type: string
title: |-
The name of the creator.
Format: users/{id}
title: "The name of the creator.\r\nFormat: users/{id}"
createTime:
type: string
format: date-time
@ -890,9 +871,7 @@ paths:
readOnly: true
parent:
type: string
title: |-
The name of the parent memo.
Format: memos/{id}
title: "The name of the parent memo.\r\nFormat: memos/{id}"
readOnly: true
snippet:
type: string
@ -918,9 +897,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_1
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -942,9 +919,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_1
description: |-
The name of the identityProvider to delete.
Format: identityProviders/{id}
description: "The name of the identityProvider to delete.\r\nFormat: identityProviders/{id}"
in: path
required: true
type: string
@ -966,9 +941,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_2
description: |-
The name of the identityProvider to get.
Format: identityProviders/{id}
description: "The name of the identityProvider to get.\r\nFormat: identityProviders/{id}"
in: path
required: true
type: string
@ -990,9 +963,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_2
description: |-
The name of the inbox to delete.
Format: inboxes/{id}
description: "The name of the inbox to delete.\r\nFormat: inboxes/{id}"
in: path
required: true
type: string
@ -1014,10 +985,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_3
description: |-
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier."
in: path
required: true
type: string
@ -1039,10 +1007,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_3
description: |-
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier."
in: path
required: true
type: string
@ -1064,9 +1029,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_4
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1088,9 +1051,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_4
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1112,9 +1073,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the activity.
Format: activities/{id}
description: "The name of the activity.\r\nFormat: activities/{id}"
in: path
required: true
type: string
@ -1136,9 +1095,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -1160,9 +1117,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -1183,9 +1138,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -1213,9 +1166,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -1242,9 +1193,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1265,9 +1214,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1294,9 +1241,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1317,9 +1262,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1346,9 +1289,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1370,9 +1311,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1399,9 +1338,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1423,9 +1360,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the memo.
Format: memos/{id}
description: "The name of the memo.\r\nFormat: memos/{id}"
in: path
required: true
type: string
@ -1452,9 +1387,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -1477,9 +1410,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: parent
description: |-
The parent, who owns the tags.
Format: memos/{id}. Use "memos/-" to delete all tags.
description: "The parent, who owns the tags.\r\nFormat: memos/{id}. Use \"memos/-\" to delete all tags."
in: path
required: true
type: string
@ -1510,9 +1441,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: parent
description: |-
The parent, who owns the tags.
Format: memos/{id}. Use "memos/-" to rename all tags.
description: "The parent, who owns the tags.\r\nFormat: memos/{id}. Use \"memos/-\" to rename all tags."
in: path
required: true
type: string
@ -1539,10 +1468,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: resource.name
description: |-
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier."
in: path
required: true
type: string
@ -1574,9 +1500,7 @@ paths:
format: int64
memo:
type: string
title: |-
The related memo.
Format: memos/{id}
title: "The related memo.\r\nFormat: memos/{id}"
tags:
- ResourceService
/api/v1/{setting.name}:
@ -1594,9 +1518,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: setting.name
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -1633,9 +1555,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: user.name
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -1689,9 +1609,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the user.
Format: users/{id}
description: "The name of the user.\r\nFormat: users/{id}"
in: path
required: true
type: string
@ -1724,10 +1642,7 @@ paths:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name
description: |-
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier."
in: path
required: true
type: string
@ -1920,9 +1835,7 @@ definitions:
properties:
name:
type: string
title: |-
The name of the identityProvider.
Format: identityProviders/{id}
title: "The name of the identityProvider.\r\nFormat: identityProviders/{id}"
type:
$ref: '#/definitions/apiv1IdentityProviderType'
title:
@ -1958,10 +1871,7 @@ definitions:
properties:
name:
type: string
description: |-
The name of the memo.
Format: memos/{id}
id is the system generated id.
description: "The name of the memo.\r\nFormat: memos/{id}\r\nid is the system generated id."
uid:
type: string
description: The user defined id of the memo.
@ -1969,9 +1879,7 @@ definitions:
$ref: '#/definitions/v1RowStatus'
creator:
type: string
title: |-
The name of the creator.
Format: users/{id}
title: "The name of the creator.\r\nFormat: users/{id}"
createTime:
type: string
format: date-time
@ -2018,9 +1926,7 @@ definitions:
readOnly: true
parent:
type: string
title: |-
The name of the parent memo.
Format: memos/{id}
title: "The name of the parent memo.\r\nFormat: memos/{id}"
readOnly: true
snippet:
type: string
@ -2053,9 +1959,7 @@ definitions:
properties:
name:
type: string
title: |-
The name of the user.
Format: users/{id}
title: "The name of the user.\r\nFormat: users/{id}"
locale:
type: string
description: The preferred locale of the user.
@ -2099,10 +2003,7 @@ definitions:
weekStartDayOffset:
type: integer
format: int32
description: |-
week_start_day_offset is the week start day offset from Sunday.
0: Sunday, 1: Monday, 2: Tuesday, 3: Wednesday, 4: Thursday, 5: Friday, 6: Saturday
Default is Sunday.
description: "week_start_day_offset is the week start day offset from Sunday.\r\n0: Sunday, 1: Monday, 2: Tuesday, 3: Wednesday, 4: Thursday, 5: Friday, 6: Saturday\r\nDefault is Sunday."
disallowChangeUsername:
type: boolean
description: disallow_change_username disallows changing username.
@ -2153,9 +2054,7 @@ definitions:
properties:
name:
type: string
title: |-
name is the name of the setting.
Format: settings/{setting}
title: "name is the name of the setting.\r\nFormat: settings/{setting}"
generalSetting:
$ref: '#/definitions/apiv1WorkspaceGeneralSetting'
storageSetting:
@ -2170,9 +2069,7 @@ definitions:
description: storage_type is the storage type.
filepathTemplate:
type: string
title: |-
The template of file path.
e.g. assets/{timestamp}_{filename}
title: "The template of file path.\r\ne.g. assets/{timestamp}_{filename}"
uploadSizeLimitMb:
type: string
format: int64
@ -2331,9 +2228,7 @@ definitions:
properties:
name:
type: string
title: |-
The name of the activity.
Format: activities/{id}
title: "The name of the activity.\r\nFormat: activities/{id}"
creatorId:
type: integer
format: int32
@ -2476,9 +2371,7 @@ definitions:
properties:
name:
type: string
title: |-
The name of the inbox.
Format: inboxes/{id}
title: "The name of the inbox.\r\nFormat: inboxes/{id}"
sender:
type: string
title: 'Format: users/{id}'
@ -2552,9 +2445,7 @@ definitions:
$ref: '#/definitions/v1Inbox'
nextPageToken:
type: string
description: |-
A token, which can be sent as `page_token` to retrieve the next page.
If this field is omitted, there are no subsequent pages.
description: "A token, which can be sent as `page_token` to retrieve the next page.\r\nIf this field is omitted, there are no subsequent pages."
v1ListMemoCommentsResponse:
type: object
properties:
@ -2597,9 +2488,7 @@ definitions:
$ref: '#/definitions/apiv1Memo'
nextPageToken:
type: string
description: |-
A token, which can be sent as `page_token` to retrieve the next page.
If this field is omitted, there are no subsequent pages.
description: "A token, which can be sent as `page_token` to retrieve the next page.\r\nIf this field is omitted, there are no subsequent pages."
v1ListNode:
type: object
properties:
@ -2675,14 +2564,10 @@ definitions:
properties:
memo:
$ref: '#/definitions/v1MemoRelationMemo'
title: |-
The name of memo.
Format: "memos/{uid}"
title: "The name of memo.\r\nFormat: \"memos/{uid}\""
relatedMemo:
$ref: '#/definitions/v1MemoRelationMemo'
title: |-
The name of related memo.
Format: "memos/{uid}"
title: "The name of related memo.\r\nFormat: \"memos/{uid}\""
type:
$ref: '#/definitions/v1MemoRelationType'
v1MemoRelationMemo:
@ -2690,9 +2575,7 @@ definitions:
properties:
name:
type: string
title: |-
The name of the memo.
Format: memos/{id}
title: "The name of the memo.\r\nFormat: memos/{id}"
uid:
type: string
snippet:
@ -2866,9 +2749,7 @@ definitions:
format: int32
creator:
type: string
title: |-
The name of the creator.
Format: users/{id}
title: "The name of the creator.\r\nFormat: users/{id}"
contentId:
type: string
reactionType:
@ -2885,10 +2766,7 @@ definitions:
properties:
name:
type: string
description: |-
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
description: "The name of the resource.\r\nFormat: resources/{id}\r\nid is the system generated unique identifier."
uid:
type: string
description: The user defined id of the resource.
@ -2910,9 +2788,7 @@ definitions:
format: int64
memo:
type: string
title: |-
The related memo.
Format: memos/{id}
title: "The related memo.\r\nFormat: memos/{id}"
v1RestoreMarkdownNodesRequest:
type: object
properties:
@ -3034,9 +2910,7 @@ definitions:
properties:
name:
type: string
title: |-
The name of the user.
Format: users/{id}
title: "The name of the user.\r\nFormat: users/{id}"
id:
type: integer
format: int32
@ -3110,9 +2984,7 @@ definitions:
properties:
owner:
type: string
title: |-
The name of instance owner.
Format: "users/{id}"
title: "The name of instance owner.\r\nFormat: \"users/{id}\""
version:
type: string
title: version is the current version of instance

@ -19,7 +19,7 @@
"@mui/joy": "5.0.0-beta.48",
"@radix-ui/react-popover": "^1.1.2",
"@reduxjs/toolkit": "^2.3.0",
"@usememos/mui": "0.0.1-alpha.14",
"@usememos/mui": "0.0.1-alpha.24",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"copy-to-clipboard": "^3.3.3",
@ -47,19 +47,19 @@
"tailwindcss": "^3.4.14",
"tailwindcss-animate": "^1.0.7",
"textarea-caret": "^3.1.0",
"uuid": "^10.0.0",
"zustand": "^4.5.5"
"uuid": "^11.0.2",
"zustand": "^5.0.1"
},
"devDependencies": {
"@bufbuild/buf": "^1.45.0",
"@bufbuild/protobuf": "^2.2.0",
"@bufbuild/buf": "^1.46.0",
"@bufbuild/protobuf": "^2.2.2",
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
"@types/d3": "^7.4.3",
"@types/dompurify": "^3.0.5",
"@types/katex": "^0.16.7",
"@types/leaflet": "^1.9.14",
"@types/lodash-es": "^4.17.12",
"@types/node": "^22.8.0",
"@types/node": "^22.8.6",
"@types/qs": "^6.9.16",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",

@ -39,8 +39,8 @@ importers:
specifier: ^2.3.0
version: 2.3.0(react-redux@9.1.2(@types/react@18.3.12)(react@18.3.1)(redux@5.0.1))(react@18.3.1)
'@usememos/mui':
specifier: 0.0.1-alpha.14
version: 0.0.1-alpha.14(lucide-react@0.453.0(react@18.3.1))(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss@3.4.14)
specifier: 0.0.1-alpha.24
version: 0.0.1-alpha.24(lucide-react@0.453.0(react@18.3.1))(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss@3.4.14)
class-variance-authority:
specifier: ^0.7.0
version: 0.7.0
@ -123,18 +123,18 @@ importers:
specifier: ^3.1.0
version: 3.1.0
uuid:
specifier: ^10.0.0
version: 10.0.0
specifier: ^11.0.2
version: 11.0.2
zustand:
specifier: ^4.5.5
version: 4.5.5(@types/react@18.3.12)(immer@10.1.1)(react@18.3.1)
specifier: ^5.0.1
version: 5.0.1(@types/react@18.3.12)(immer@10.1.1)(react@18.3.1)(use-sync-external-store@1.2.2(react@18.3.1))
devDependencies:
'@bufbuild/buf':
specifier: ^1.45.0
version: 1.45.0
specifier: ^1.46.0
version: 1.46.0
'@bufbuild/protobuf':
specifier: ^2.2.0
version: 2.2.0
specifier: ^2.2.2
version: 2.2.2
'@trivago/prettier-plugin-sort-imports':
specifier: ^4.3.0
version: 4.3.0(prettier@3.3.3)
@ -154,8 +154,8 @@ importers:
specifier: ^4.17.12
version: 4.17.12
'@types/node':
specifier: ^22.8.0
version: 22.8.0
specifier: ^22.8.6
version: 22.8.6
'@types/qs':
specifier: ^6.9.16
version: 6.9.16
@ -179,7 +179,7 @@ importers:
version: 7.18.0(eslint@8.57.1)(typescript@5.6.3)
'@vitejs/plugin-react':
specifier: ^4.3.3
version: 4.3.3(vite@5.4.10(@types/node@22.8.0)(less@4.2.0))
version: 4.3.3(vite@5.4.10(@types/node@22.8.6)(less@4.2.0))
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.47)
@ -218,7 +218,7 @@ importers:
version: 5.6.3
vite:
specifier: ^5.4.10
version: 5.4.10(@types/node@22.8.0)(less@4.2.0)
version: 5.4.10(@types/node@22.8.6)(less@4.2.0)
packages:
@ -350,49 +350,49 @@ packages:
'@braintree/sanitize-url@7.1.0':
resolution: {integrity: sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==}
'@bufbuild/buf-darwin-arm64@1.45.0':
resolution: {integrity: sha512-yl0+fSnEAtGPUjvyC9a5UmzSc0izqeiL8il2ml1LmX3YbmOAQZ1Wn0TceCtDVFCuO/jtiZBj8/zYm3VAovwQqQ==}
'@bufbuild/buf-darwin-arm64@1.46.0':
resolution: {integrity: sha512-lSmTKyRhg+71acXp9QeX/wm+vjkf0J3n38wph7KOwMfCEeK4A2AkqsGOkoXSiaIvidA2pRU9RJRQYfryzCA9Pg==}
engines: {node: '>=12'}
cpu: [arm64]
os: [darwin]
'@bufbuild/buf-darwin-x64@1.45.0':
resolution: {integrity: sha512-T4yNFZrOhxRkpSn8RgW2S6JPcmD58JYb7OqU+BNVpqK3zy3Zm2C3gIyIpVB5GWkyohhyZANLj3M4Xet9HW4cqA==}
'@bufbuild/buf-darwin-x64@1.46.0':
resolution: {integrity: sha512-Oa9XTLJshsEjzowyt2mH9XrXW38DRFdz7ml+IYKXVQPotNLr04ix7QES7A1eOBJtxLwuTiri4ScXuBLQGNX8+A==}
engines: {node: '>=12'}
cpu: [x64]
os: [darwin]
'@bufbuild/buf-linux-aarch64@1.45.0':
resolution: {integrity: sha512-n3PkFXp6MiHmxMBMq60t38Ca7hyk0Yo1Un3Xg4PxljSrDNHZSoxT8+NY3eOI+jHnAwKebrAT72XAh/vkeKrC5g==}
'@bufbuild/buf-linux-aarch64@1.46.0':
resolution: {integrity: sha512-CbxbLH5sQCRjEKVEcWJySvCKyAPAUhX0vCTifT/eQyZ70FUsqCJKJ6+dKl6Ajk0CgUHqf8jkU/wX/+aQFYXyaA==}
engines: {node: '>=12'}
cpu: [arm64]
os: [linux]
'@bufbuild/buf-linux-x64@1.45.0':
resolution: {integrity: sha512-Bm5Zgv4CgJ8rursPLejhvfELMxtuFxMLR1ZXY2G6T7jLi5mxa/4CWmqEmQ67zyOoEXw7FvND2yBivGO+464wtw==}
'@bufbuild/buf-linux-x64@1.46.0':
resolution: {integrity: sha512-bMqp+Q+16KPbuwX34/OLDeiimnwt5sfvHqyeMeRz4LLwLshbmM3m+8dGCSHZRo3Lr+4gW1PfunrfaEmcGqPHLQ==}
engines: {node: '>=12'}
cpu: [x64]
os: [linux]
'@bufbuild/buf-win32-arm64@1.45.0':
resolution: {integrity: sha512-tuW+vaYaCQpl9y3dk4uuVSAyqs7opydejxJmqoQdt4AOswvKORasVkD5s9two+eScU165kSzkI2BN3Hd6r+P0g==}
'@bufbuild/buf-win32-arm64@1.46.0':
resolution: {integrity: sha512-geVYXp1PWJiAAFpwhgP8Cnct0+Rdr89BF/WZoIh5WwFGYITGiu5Hb1Ui9DTrEYwDzahPCyPxgIVwzzW6kPWSag==}
engines: {node: '>=12'}
cpu: [arm64]
os: [win32]
'@bufbuild/buf-win32-x64@1.45.0':
resolution: {integrity: sha512-ifTHY7pKrKd+8ogMksHmvVYJrHLm/OveyLXsMT1ts00nb1pPJzuCDKrEhg5T7k0oJhGBhpejlpizZ3It0pLmsg==}
'@bufbuild/buf-win32-x64@1.46.0':
resolution: {integrity: sha512-6nsxkzj5a1L41NOJFKjli8j6GB/NkPHLIr0T/b27Y3GfprVYQawOComYD5HfojvBLuAiE2cD/kEQIWKK1YRcng==}
engines: {node: '>=12'}
cpu: [x64]
os: [win32]
'@bufbuild/buf@1.45.0':
resolution: {integrity: sha512-6VgwZDwBXWWrA8e8B0efKs3px6rbJRZVBpFt7wBAHU+SgcXONF2rVNA60S8F6/ixaW1EHkUhkIeVyCHs+wV1Bw==}
'@bufbuild/buf@1.46.0':
resolution: {integrity: sha512-uN3NKuAKvcQcZc1hn9+njSCusL7NAILqQI7mlkDDa4kRy7cTsiw53ggddfAs0YXbQ8zZnmudwwWjKRDIUaRqXQ==}
engines: {node: '>=12'}
hasBin: true
'@bufbuild/protobuf@2.2.0':
resolution: {integrity: sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==}
'@bufbuild/protobuf@2.2.2':
resolution: {integrity: sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==}
'@chevrotain/cst-dts-gen@11.0.3':
resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==}
@ -1318,8 +1318,8 @@ packages:
'@types/lodash@4.17.12':
resolution: {integrity: sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==}
'@types/node@22.8.0':
resolution: {integrity: sha512-84rafSBHC/z1i1E3p0cJwKA+CfYDNSXX9WSZBRopjIzLET8oNt6ht2tei4C7izwDeEiLLfdeSVBv1egOH916hg==}
'@types/node@22.8.6':
resolution: {integrity: sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==}
'@types/parse-json@4.0.2':
resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
@ -1409,8 +1409,8 @@ packages:
'@ungap/structured-clone@1.2.0':
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
'@usememos/mui@0.0.1-alpha.14':
resolution: {integrity: sha512-KzLIWkTPVisukxfa6j9LtCmlJpO3QxOe9JFwUDV6AkIqw4QKkVK6Rl+DZu8N9uKSoAiNbg6gbu9vj+Ox3crmug==}
'@usememos/mui@0.0.1-alpha.24':
resolution: {integrity: sha512-4UAlapAs7UfgG3OkdvolgNBo1BCcaXhs3TeWw1UvEA7pwj6txzbIjqN8c6IHl+gYeMzoXBO2Ou7gnYD9OOtj5Q==}
peerDependencies:
lucide-react: ^0.453.0
postcss: ^8.4.47
@ -3330,8 +3330,8 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
uuid@10.0.0:
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
uuid@11.0.2:
resolution: {integrity: sha512-14FfcOJmqdjbBPdDjFQyk/SdT4NySW4eM0zcG+HqbHP5jzuH56xO3J1DGhgs/cEMCfwYi3HQI1gnTO62iaG+tQ==}
hasBin: true
uuid@9.0.1:
@ -3456,13 +3456,14 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
zustand@4.5.5:
resolution: {integrity: sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==}
engines: {node: '>=12.7.0'}
zustand@5.0.1:
resolution: {integrity: sha512-pRET7Lao2z+n5R/HduXMio35TncTlSW68WsYBq2Lg1ASspsNGjpwLAsij3RpouyV6+kHMwwwzP0bZPD70/Jx/w==}
engines: {node: '>=12.20.0'}
peerDependencies:
'@types/react': '>=16.8'
'@types/react': '>=18.0.0'
immer: '>=9.0.6'
react: '>=16.8'
react: '>=18.0.0'
use-sync-external-store: '>=1.2.0'
peerDependenciesMeta:
'@types/react':
optional: true
@ -3470,6 +3471,8 @@ packages:
optional: true
react:
optional: true
use-sync-external-store:
optional: true
snapshots:
@ -3646,34 +3649,34 @@ snapshots:
'@braintree/sanitize-url@7.1.0': {}
'@bufbuild/buf-darwin-arm64@1.45.0':
'@bufbuild/buf-darwin-arm64@1.46.0':
optional: true
'@bufbuild/buf-darwin-x64@1.45.0':
'@bufbuild/buf-darwin-x64@1.46.0':
optional: true
'@bufbuild/buf-linux-aarch64@1.45.0':
'@bufbuild/buf-linux-aarch64@1.46.0':
optional: true
'@bufbuild/buf-linux-x64@1.45.0':
'@bufbuild/buf-linux-x64@1.46.0':
optional: true
'@bufbuild/buf-win32-arm64@1.45.0':
'@bufbuild/buf-win32-arm64@1.46.0':
optional: true
'@bufbuild/buf-win32-x64@1.45.0':
'@bufbuild/buf-win32-x64@1.46.0':
optional: true
'@bufbuild/buf@1.45.0':
'@bufbuild/buf@1.46.0':
optionalDependencies:
'@bufbuild/buf-darwin-arm64': 1.45.0
'@bufbuild/buf-darwin-x64': 1.45.0
'@bufbuild/buf-linux-aarch64': 1.45.0
'@bufbuild/buf-linux-x64': 1.45.0
'@bufbuild/buf-win32-arm64': 1.45.0
'@bufbuild/buf-win32-x64': 1.45.0
'@bufbuild/buf-darwin-arm64': 1.46.0
'@bufbuild/buf-darwin-x64': 1.46.0
'@bufbuild/buf-linux-aarch64': 1.46.0
'@bufbuild/buf-linux-x64': 1.46.0
'@bufbuild/buf-win32-arm64': 1.46.0
'@bufbuild/buf-win32-x64': 1.46.0
'@bufbuild/protobuf@2.2.0': {}
'@bufbuild/protobuf@2.2.2': {}
'@chevrotain/cst-dts-gen@11.0.3':
dependencies:
@ -4532,7 +4535,7 @@ snapshots:
'@types/lodash@4.17.12': {}
'@types/node@22.8.0':
'@types/node@22.8.6':
dependencies:
undici-types: 6.19.8
@ -4642,7 +4645,7 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
'@usememos/mui@0.0.1-alpha.14(lucide-react@0.453.0(react@18.3.1))(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss@3.4.14)':
'@usememos/mui@0.0.1-alpha.24(lucide-react@0.453.0(react@18.3.1))(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwind-merge@2.5.4)(tailwindcss@3.4.14)':
dependencies:
lucide-react: 0.453.0(react@18.3.1)
postcss: 8.4.47
@ -4651,14 +4654,14 @@ snapshots:
tailwind-merge: 2.5.4
tailwindcss: 3.4.14
'@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@22.8.0)(less@4.2.0))':
'@vitejs/plugin-react@4.3.3(vite@5.4.10(@types/node@22.8.6)(less@4.2.0))':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
vite: 5.4.10(@types/node@22.8.0)(less@4.2.0)
vite: 5.4.10(@types/node@22.8.6)(less@4.2.0)
transitivePeerDependencies:
- supports-color
@ -6231,7 +6234,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 22.8.0
'@types/node': 22.8.6
long: 5.2.3
prr@1.0.1:
@ -6808,17 +6811,17 @@ snapshots:
util-deprecate@1.0.2: {}
uuid@10.0.0: {}
uuid@11.0.2: {}
uuid@9.0.1: {}
vite@5.4.10(@types/node@22.8.0)(less@4.2.0):
vite@5.4.10(@types/node@22.8.6)(less@4.2.0):
dependencies:
esbuild: 0.21.5
postcss: 8.4.47
rollup: 4.24.0
optionalDependencies:
'@types/node': 22.8.0
'@types/node': 22.8.6
fsevents: 2.3.3
less: 4.2.0
@ -6909,10 +6912,9 @@ snapshots:
yocto-queue@0.1.0: {}
zustand@4.5.5(@types/react@18.3.12)(immer@10.1.1)(react@18.3.1):
dependencies:
use-sync-external-store: 1.2.2(react@18.3.1)
zustand@5.0.1(@types/react@18.3.12)(immer@10.1.1)(react@18.3.1)(use-sync-external-store@1.2.2(react@18.3.1)):
optionalDependencies:
'@types/react': 18.3.12
immer: 10.1.1
react: 18.3.1
use-sync-external-store: 1.2.2(react@18.3.1)

@ -1,5 +1,4 @@
import { Input } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Button, Input } from "@usememos/mui";
import { XIcon } from "lucide-react";
import { useEffect, useState } from "react";
import { toast } from "react-hot-toast";

@ -1,5 +1,5 @@
import { Input, Radio, RadioGroup } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Radio, RadioGroup } from "@mui/joy";
import { Button, Input } from "@usememos/mui";
import { XIcon } from "lucide-react";
import React, { useState } from "react";
import { toast } from "react-hot-toast";

@ -1,5 +1,5 @@
import { Divider, Input, Option, Select, Typography } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Divider, Option, Select, Typography } from "@mui/joy";
import { Button, Input } from "@usememos/mui";
import { XIcon } from "lucide-react";
import { useEffect, useState } from "react";
import { toast } from "react-hot-toast";

@ -1,5 +1,4 @@
import { Input } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Button, Input } from "@usememos/mui";
import { XIcon } from "lucide-react";
import React, { useEffect, useState } from "react";
import { toast } from "react-hot-toast";

@ -129,9 +129,9 @@ const AddMemoRelationPopover = (props: Props) => {
return (
<Popover open={popoverOpen} onOpenChange={setPopoverOpen}>
<PopoverTrigger>
<Button size="sm" variant="plain">
<LinkIcon className="w-5 h-5 mx-auto" />
<PopoverTrigger className="w-9">
<Button className="flex items-center justify-center" size="sm" variant="plain" asChild>
<LinkIcon className="w-5 h-5 mx-auto p-0" />
</Button>
</PopoverTrigger>
<PopoverContent align="center">

@ -1,5 +1,4 @@
import { Input } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Button, Input } from "@usememos/mui";
import { LatLng } from "leaflet";
import { MapPinIcon, XIcon } from "lucide-react";
import { useEffect, useState } from "react";
@ -94,8 +93,8 @@ const LocationSelector = (props: Props) => {
return (
<Popover open={popoverOpen} onOpenChange={setPopoverOpen}>
<PopoverTrigger>
<Button className="group" size="sm" variant="plain">
<PopoverTrigger asChild>
<Button className="flex items-center justify-center" size="sm" variant="plain">
<MapPinIcon className="w-5 h-5 mx-auto shrink-0" />
{props.location && (
<>
@ -111,19 +110,19 @@ const LocationSelector = (props: Props) => {
<div className="min-w-80 sm:w-128 flex flex-col justify-start items-start">
<LeafletMap key={JSON.stringify(state.initilized)} latlng={state.position} onChange={onPositionChanged} />
<div className="mt-2 w-full flex flex-row justify-between items-center gap-2">
<Input
placeholder="Choose a position first."
value={state.placeholder}
disabled={!state.position}
startDecorator={
state.position ? (
<span>
[{state.position.lat.toFixed(3)}, {state.position.lng.toFixed(3)}]
</span>
) : null
}
onChange={(e) => setState((state) => ({ ...state, placeholder: e.target.value }))}
/>
<div className="flex flex-row items-center justify-start gap-2">
{state.position && (
<span className="text-sm">
[{state.position.lat.toFixed(2)}, {state.position.lng.toFixed(2)}]
</span>
)}
<Input
placeholder="Choose a position first."
value={state.placeholder}
disabled={!state.position}
onChange={(e) => setState((state) => ({ ...state, placeholder: e.target.value }))}
/>
</div>
<Button
className="shrink-0"
color="primary"

@ -1,6 +1,7 @@
import { Dropdown, Menu, MenuButton, MenuItem, Link } from "@mui/joy";
import { Button } from "@usememos/mui";
import { CheckSquareIcon, Code2Icon, SquareSlashIcon } from "lucide-react";
import { useTranslate } from "@/utils/i18n";
import { EditorRefActions } from "../Editor";
interface Props {
@ -8,6 +9,8 @@ interface Props {
}
const MarkdownMenu = (props: Props) => {
const t = useTranslate();
const { editorRef } = props;
const handleCodeBlockClick = () => {
@ -59,29 +62,23 @@ const MarkdownMenu = (props: Props) => {
return (
<Dropdown>
<MenuButton
slots={{ root: Button }}
slotProps={{
root: {
size: "sm",
variant: "plain",
},
}}
>
<SquareSlashIcon className="w-5 h-5 mx-auto" />
<MenuButton slots={{ root: "div" }}>
<Button size="sm" variant="plain">
<SquareSlashIcon className="w-5 h-5 mx-auto" />
</Button>
</MenuButton>
<Menu className="text-sm" size="sm" placement="bottom-start">
<MenuItem onClick={handleCodeBlockClick}>
<Code2Icon className="w-4 h-auto" />
<span>Code block</span>
<span>{t("markdown.code-block")}</span>
</MenuItem>
<MenuItem onClick={handleCheckboxClick}>
<CheckSquareIcon className="w-4 h-auto" />
<span>Checkbox</span>
<span>{t("markdown.checkbox")}</span>
</MenuItem>
<div className="-mt-0.5 pl-2">
<Link fontSize={12} href="https://www.usememos.com/docs/getting-started/content-syntax" target="_blank">
Content syntax
{t("markdown.content-syntax")}
</Link>
</div>
</Menu>

@ -41,16 +41,10 @@ const TagSelector = (props: Props) => {
return (
<Dropdown open={open} onOpenChange={(_, isOpen) => setOpen(isOpen)}>
<MenuButton
slots={{ root: Button }}
slotProps={{
root: {
size: "sm",
variant: "plain",
},
}}
>
<HashIcon className="w-5 h-5 mx-auto" />
<MenuButton slots={{ root: "div" }}>
<Button size="sm" variant="plain">
<HashIcon className="w-5 h-5 mx-auto" />
</Button>
</MenuButton>
<Menu className="relative text-sm" component="div" size="sm" placement="bottom-start">
<div ref={containerRef}>

@ -462,7 +462,7 @@ const MemoEditor = (props: Props) => {
</div>
</div>
<Divider className="!mt-2 opacity-40" />
<div className="w-full flex flex-row justify-between items-center py-3 dark:border-t-zinc-500">
<div className="w-full flex flex-row justify-between items-center py-3 gap-2 overflow-auto dark:border-t-zinc-500">
<div className="relative flex flex-row justify-start items-center" onFocus={(e) => e.stopPropagation()}>
<Select
className="!text-sm"

@ -1,5 +1,4 @@
import { Input } from "@mui/joy";
import { Button, Checkbox } from "@usememos/mui";
import { Button, Checkbox, Input } from "@usememos/mui";
import { LoaderIcon } from "lucide-react";
import { ClientError } from "nice-grpc-web";
import { useEffect, useState } from "react";

@ -1,5 +1,5 @@
import { Input, List, ListItem } from "@mui/joy";
import { Button } from "@usememos/mui";
import { List, ListItem } from "@mui/joy";
import { Button, Input } from "@usememos/mui";
import { XIcon } from "lucide-react";
import React, { useState } from "react";
import { toast } from "react-hot-toast";
@ -63,18 +63,11 @@ const RenameTagDialog: React.FC<Props> = (props: Props) => {
<div className="w-full flex flex-col justify-start items-start mb-3">
<div className="relative w-full mb-2 flex flex-row justify-start items-center space-x-2">
<span className="w-20 text-sm whitespace-nowrap shrink-0 text-right">Old Name</span>
<Input className="w-full" readOnly disabled type="text" placeholder="A new tag name" size="md" value={tag} />
<Input className="w-full" readOnly disabled type="text" placeholder="A new tag name" value={tag} />
</div>
<div className="relative w-full mb-2 flex flex-row justify-start items-center space-x-2">
<span className="w-20 text-sm whitespace-nowrap shrink-0 text-right">New Name</span>
<Input
className="w-full"
type="text"
placeholder="A new tag name"
size="md"
value={newName}
onChange={handleTagNameInputChange}
/>
<Input className="w-full" type="text" placeholder="A new tag name" value={newName} onChange={handleTagNameInputChange} />
</div>
<List size="sm" marker="disc">
<ListItem>

@ -56,10 +56,10 @@ const AccessTokenSection = () => {
<div className="sm:flex sm:items-center sm:justify-between">
<div className="sm:flex-auto space-y-1">
<p className="flex flex-row justify-start items-center font-medium text-gray-700 dark:text-gray-400">
Access Tokens
{t("setting.access-token-section.title")}
<LearnMore className="ml-2" url="https://usememos.com/docs/security/access-tokens" />
</p>
<p className="text-sm text-gray-700 dark:text-gray-500">A list of all access tokens for your account.</p>
<p className="text-sm text-gray-700 dark:text-gray-500">{t("setting.access-token-section.description")}</p>
</div>
<div className="mt-4 sm:mt-0">
<Button
@ -79,16 +79,16 @@ const AccessTokenSection = () => {
<thead>
<tr>
<th scope="col" className="px-3 py-2 text-left text-sm font-semibold text-gray-900 dark:text-gray-400">
Token
{t("setting.access-token-section.token")}
</th>
<th scope="col" className="py-2 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 dark:text-gray-400">
Description
{t("common.description")}
</th>
<th scope="col" className="px-3 py-2 text-left text-sm font-semibold text-gray-900 dark:text-gray-400">
Created At
{t("setting.access-token-section.created-at")}
</th>
<th scope="col" className="px-3 py-2 text-left text-sm font-semibold text-gray-900 dark:text-gray-400">
Expires At
{t("setting.access-token-section.expires-at")}
</th>
<th scope="col" className="relative py-3.5 pl-3 pr-4">
<span className="sr-only">{t("common.delete")}</span>

@ -1,5 +1,5 @@
import { Dropdown, Input, Menu, MenuButton, MenuItem, Radio, RadioGroup } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Dropdown, Menu, MenuButton, MenuItem, Radio, RadioGroup } from "@mui/joy";
import { Button, Input } from "@usememos/mui";
import { sortBy } from "lodash-es";
import { MoreVerticalIcon } from "lucide-react";
import React, { useEffect, useState } from "react";

@ -1,5 +1,5 @@
import { Input, Switch, Select, Option, Chip, ChipDelete } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Switch, Select, Option, Chip, ChipDelete } from "@mui/joy";
import { Button, Input } from "@usememos/mui";
import { isEqual, uniq } from "lodash-es";
import { CheckIcon } from "lucide-react";
import { useState } from "react";
@ -59,7 +59,7 @@ const MemoRelatedSettings = () => {
return (
<div className="w-full flex flex-col gap-2 pt-2 pb-4">
<p className="font-medium text-gray-700 dark:text-gray-500">Memo related settings</p>
<p className="font-medium text-gray-700 dark:text-gray-500">{t("setting.memo-related-settings.title")}</p>
<div className="w-full flex flex-row justify-between items-center">
<span>{t("setting.system-section.disable-public-memos")}</span>
<Switch
@ -82,21 +82,21 @@ const MemoRelatedSettings = () => {
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span>Enable link preview</span>
<span>{t("setting.memo-related-settings.enable-link-preview")}</span>
<Switch
checked={memoRelatedSetting.enableLinkPreview}
onChange={(event) => updatePartialSetting({ enableLinkPreview: event.target.checked })}
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span>Enable memo comments</span>
<span>{t("setting.memo-related-settings.enable-memo-comments")}</span>
<Switch
checked={memoRelatedSetting.enableComment}
onChange={(event) => updatePartialSetting({ enableComment: event.target.checked })}
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span>Enable memo location</span>
<span>{t("setting.memo-related-settings.enable-memo-location")}</span>
<Switch
checked={memoRelatedSetting.enableLocation}
onChange={(event) => updatePartialSetting({ enableLocation: event.target.checked })}
@ -117,7 +117,7 @@ const MemoRelatedSettings = () => {
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span>Content length limit(Byte)</span>
<span>{t("setting.memo-related-settings.content-lenght-limit")}</span>
<Input
className="w-24"
type="number"
@ -145,7 +145,7 @@ const MemoRelatedSettings = () => {
</Select>
</div>
<div className="w-full">
<span className="truncate">Reactions</span>
<span className="truncate">{t("setting.memo-related-settings.reactions")}</span>
<div className="mt-2 w-full flex flex-row flex-wrap gap-1">
{memoRelatedSetting.reactions.map((reactionType) => {
return (

@ -76,7 +76,7 @@ const SSOSection = () => {
))}
{identityProviderList.length === 0 && (
<div className="w-full mt-2 text-sm dark:border-zinc-700 opacity-60 flex flex-row items-center justify-between">
<p className="">No SSO found.</p>
<p className="">{t("setting.sso-section.no-sso-found")}</p>
</div>
)}
@ -89,7 +89,7 @@ const SSOSection = () => {
to="https://www.usememos.com/docs/advanced-settings/keycloak"
target="_blank"
>
Configuring Keycloak for Authentication
{t("setting.sso-section.configuring-keycloak-for-authentication")}
</Link>
</ListItem>
</List>

@ -1,5 +1,5 @@
import { Divider, Input, List, ListItem, Radio, RadioGroup, Tooltip } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Divider, List, ListItem, Radio, RadioGroup, Tooltip } from "@mui/joy";
import { Button, Input } from "@usememos/mui";
import { isEqual } from "lodash-es";
import { HelpCircleIcon } from "lucide-react";
import { useMemo, useState } from "react";
@ -136,14 +136,7 @@ const StorageSection = () => {
<HelpCircleIcon className="w-4 h-auto" />
</Tooltip>
</div>
<Input
className="w-16"
sx={{
fontFamily: "monospace",
}}
value={workspaceStorageSetting.uploadSizeLimitMb}
onChange={handleMaxUploadSizeChanged}
/>
<Input className="w-16 font-mono" value={workspaceStorageSetting.uploadSizeLimitMb} onChange={handleMaxUploadSizeChanged} />
</div>
{workspaceStorageSetting.storageType !== WorkspaceStorageSetting_StorageType.DATABASE && (
<div className="w-full flex flex-row justify-between items-center">

@ -43,7 +43,9 @@ const WebhookSection = () => {
<div className="w-full flex flex-col justify-start items-start">
<div className="w-full flex justify-between items-center">
<div className="flex-auto space-y-1">
<p className="flex flex-row justify-start items-center font-medium text-gray-700 dark:text-gray-400">Webhooks</p>
<p className="flex flex-row justify-start items-center font-medium text-gray-700 dark:text-gray-400">
{t("setting.webhook-section.title")}
</p>
</div>
<div>
<Button
@ -63,10 +65,10 @@ const WebhookSection = () => {
<thead>
<tr>
<th scope="col" className="px-3 py-2 text-left text-sm font-semibold text-gray-900 dark:text-gray-400">
Name
{t("common.name")}
</th>
<th scope="col" className="px-3 py-2 text-left text-sm font-semibold text-gray-900 dark:text-gray-400">
Url
{t("setting.webhook-section.url")}
</th>
<th scope="col" className="relative px-3 py-2 pr-4">
<span className="sr-only">{t("common.delete")}</span>
@ -95,7 +97,7 @@ const WebhookSection = () => {
{webhooks.length === 0 && (
<tr>
<td className="whitespace-nowrap px-3 py-2 text-sm text-gray-900 dark:text-gray-400" colSpan={3}>
No webhooks found.
{t("setting.webhook-section.no-webhooks-found")}
</td>
</tr>
)}

@ -106,35 +106,35 @@ const WorkspaceSection = () => {
</Link>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span>Disallow user registration</span>
<span>{t("setting.workspace-section.disallow-user-registration")}</span>
<Switch
checked={workspaceGeneralSetting.disallowUserRegistration}
onChange={(event) => updatePartialSetting({ disallowUserRegistration: event.target.checked })}
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span>Disallow password auth</span>
<span>{t("setting.workspace-section.disallow-password-auth")}</span>
<Switch
checked={workspaceGeneralSetting.disallowPasswordAuth}
onChange={(event) => updatePartialSetting({ disallowPasswordAuth: event.target.checked })}
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span>Disallow Change Username</span>
<span>{t("setting.workspace-section.disallow-change-username")}</span>
<Switch
checked={workspaceGeneralSetting.disallowChangeUsername}
onChange={(event) => updatePartialSetting({ disallowChangeUsername: event.target.checked })}
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span>Disallow Change Nickname</span>
<span>{t("setting.workspace-section.disallow-change-nickname")}</span>
<Switch
checked={workspaceGeneralSetting.disallowChangeNickname}
onChange={(event) => updatePartialSetting({ disallowChangeNickname: event.target.checked })}
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<span className="truncate">Week start day</span>
<span className="truncate">{t("setting.workspace-section.week-start-day")}</span>
<Select
className="!min-w-fit"
value={workspaceGeneralSetting.weekStartDayOffset}
@ -142,9 +142,9 @@ const WorkspaceSection = () => {
updatePartialSetting({ weekStartDayOffset: weekStartDayOffset || 0 });
}}
>
<Option value={-1}>Saturday</Option>
<Option value={0}>Sunday</Option>
<Option value={1}>Monday</Option>
<Option value={-1}>{t("setting.workspace-section.saturday")}</Option>
<Option value={0}>{t("setting.workspace-section.sunday")}</Option>
<Option value={1}>{t("setting.workspace-section.monday")}</Option>
</Select>
</div>
<div className="mt-2 w-full flex justify-end">

@ -1,5 +1,5 @@
import { Input, Textarea } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Textarea } from "@mui/joy";
import { Button, Input } from "@usememos/mui";
import { isEqual } from "lodash-es";
import { XIcon } from "lucide-react";
import { useState } from "react";
@ -193,7 +193,7 @@ const UpdateAccountDialog: React.FC<Props> = ({ destroy }: Props) => {
{t("common.email")}
<span className="text-sm text-gray-400 ml-1">({t("setting.account-section.email-note")})</span>
</p>
<Input className="w-full" type="email" value={state.email} onChange={handleEmailChanged} />
<Input fullWidth type="email" value={state.email} onChange={handleEmailChanged} />
<p className="text-sm">{t("common.description")}</p>
<Textarea
className="w-full"

@ -1,6 +1,5 @@
import { Input } from "@mui/joy";
import Textarea from "@mui/joy/Textarea/Textarea";
import { Button } from "@usememos/mui";
import { Button, Input } from "@usememos/mui";
import { XIcon } from "lucide-react";
import { useState } from "react";
import { toast } from "react-hot-toast";

@ -19,6 +19,7 @@ export const locales = [
"mr",
"nl",
"pl",
"pt-PT",
"pt-BR",
"ru",
"sl",

@ -235,7 +235,9 @@
"template": "Template",
"token-endpoint": "Token endpoint",
"update-sso": "Update SSO",
"user-endpoint": "User endpoint"
"user-endpoint": "User endpoint",
"no-sso-found": "No SSO found.",
"configuring-keycloak-for-authentication": "Configuring Keycloak for Authentication"
},
"storage": "Storage",
"storage-section": {
@ -299,7 +301,38 @@
"max-upload-size-hint": "Recommended value is 32 MiB.",
"server-name": "Server Name"
},
"memo-related": "Memo"
"memo-related": "Memo",
"access-token-section":{
"title": "Access Tokens",
"description": "A list of all access tokens for your account.",
"created-at": "Created At",
"expires-at": "Expires At",
"token": "Token"
},
"webhook-section": {
"title": "Webhooks",
"url": "Url",
"no-webhooks-found": "No webhooks found."
},
"workspace-section": {
"disallow-user-registration": "Disallow user registration",
"disallow-password-auth": "Disallow password auth",
"disallow-change-username": "Disallow Change Username",
"disallow-change-nickname": "Disallow Change Nickname",
"week-start-day": "Week start day",
"saturday": "Saturday",
"sunday": "Sunday",
"monday": "Monday"
},
"memo-related-settings": {
"title": "Memo related settings",
"enable-link-preview": "Enable link preview",
"enable-memo-comments": "Enable memo comments",
"enable-memo-location": "Enable memo location",
"content-lenght-limit": "Content length limit(Byte)",
"reactions": "Reactions"
},
"version": "Version"
},
"tag": {
"all-tags": "All Tags",
@ -308,5 +341,10 @@
"delete-confirm": "Are you sure to delete this tag? All related memos will be archived.",
"delete-tag": "Delete Tag",
"no-tag-found": "No tag found"
},
"markdown": {
"code-block": "Code block",
"checkbox": "Checkbox",
"content-syntax": "Content syntax"
}
}

@ -0,0 +1,350 @@
{
"auth": {
"create-your-account": "Crie a sua conta",
"host-tip": "Está a registar-se como o Anfitrião do Site.",
"new-password": "Nova palavra-passe",
"repeat-new-password": "Repita a nova palavra-passe",
"sign-in-tip": "Já tem uma conta?",
"sign-up-tip": "Ainda não tem uma conta?"
},
"common": {
"about": "Sobre",
"add": "Adicionar",
"admin": "Administrador",
"archive": "Arquivar",
"archived": "Arquivado",
"avatar": "Avatar",
"basic": "Básico",
"beta": "Beta",
"cancel": "Cancelar",
"change": "Alterar",
"clear": "Limpar",
"close": "Fechar",
"confirm": "Confirmar",
"collapse": "Recolher",
"create": "Criar",
"database": "Base de dados",
"days": "Dias",
"delete": "Eliminar",
"description": "Descrição",
"edit": "Editar",
"email": "Email",
"expand": "Expandir",
"explore": "Explorar",
"file": "Ficheiro",
"filter": "Filtrar",
"home": "Início",
"image": "Imagem",
"inbox": "Notificações",
"language": "Idioma",
"learn-more": "Saiba mais",
"link": "Link",
"mark": "Marcar",
"memos": "Memos",
"name": "Nome",
"new": "Novo",
"nickname": "Apelido",
"null": "Nulo",
"or": "ou",
"password": "Palavra-passe",
"pin": "Afixar",
"pinned": "Afixado",
"preview": "Pré-visualizar",
"profile": "Perfil",
"remember-me": "Lembrar-me",
"rename": "Renomear",
"reset": "Reiniciar",
"resources": "Recursos",
"restore": "Restaurar",
"role": "Função",
"save": "Guardar",
"search": "Pesquisar",
"select": "Selecionar",
"settings": "Definições",
"share": "Partilhar",
"sign-in": "Iniciar sessão",
"sign-in-with": "Iniciar sessão com {{provider}}",
"sign-out": "Terminar sessão",
"sign-up": "Registar-se",
"statistics": "Estatísticas",
"tags": "Etiquetas",
"title": "Título",
"type": "Tipo",
"unpin": "Desafixar",
"update": "Atualizar",
"upload": "Carregar",
"username": "Nome de utilizador",
"version": "Versão",
"visibility": "Visibilidade",
"yourself": "Você próprio"
},
"days": {
"fri": "Sex",
"mon": "Seg",
"sat": "Sáb",
"sun": "Dom",
"thu": "Qui",
"tue": "Ter",
"wed": "Qua"
},
"editor": {
"add-your-comment-here": "Adicione o seu comentário aqui...",
"any-thoughts": "Alguma ideia…",
"save": "Guardar"
},
"inbox": {
"memo-comment": "{{user}} deixou um comentário no seu {{memo}}.",
"version-update": "A nova versão {{version}} está agora disponível!"
},
"memo": {
"archived-at": "Arquivado em",
"comment": {
"self": "Comentários",
"write-a-comment": "Escreva um comentário"
},
"copy-link": "Copiar link",
"count-memos-in-date": "{{count}} memos em {{date}}",
"delete-confirm": "Tem a certeza de que quer eliminar este memo? ESTA AÇÃO É IRREVERSÍVEL",
"load-more": "Carregar mais",
"no-archived-memos": "Não existem memos arquivados.",
"search-placeholder": "Pesquisar memos",
"show-more": "Mostrar mais",
"view-detail": "Ver detalhes",
"visibility": {
"disabled": "Memos públicos estão desativados",
"private": "Privado",
"protected": "Protegido",
"public": "Público"
},
"links": "Links",
"to-do": "Tarefas",
"code": "Código"
},
"message": {
"archived-successfully": "Arquivado com sucesso",
"change-memo-created-time": "Alterar a data de criação do memo",
"copied": "Copiado",
"deleted-successfully": "Eliminado com sucesso",
"fill-all": "Por favor, preencha todos os campos.",
"maximum-upload-size-is": "O tamanho máximo permitido para carregamento é {{size}} MiB",
"memo-not-found": "Memo não encontrado.",
"new-password-not-match": "As novas palavras-passe não coincidem.",
"no-data": "Nenhum dado encontrado.",
"password-changed": "Palavra-passe alterada",
"password-not-match": "As palavras-passe não coincidem.",
"restored-successfully": "Restaurado com sucesso",
"succeed-copy-link": "Link copiado com sucesso.",
"update-succeed": "Atualização bem-sucedida",
"user-not-found": "Utilizador não encontrado"
},
"reference": {
"add-references": "Adicionar referências",
"embedded-usage": "Usar como conteúdo incorporado",
"no-memos-found": "Não foram encontrados memos",
"search-placeholder": "Pesquisar conteúdo"
},
"resource": {
"clear": "Limpar",
"copy-link": "Copiar link",
"create-dialog": {
"external-link": {
"file-name": "Nome do ficheiro",
"file-name-placeholder": "Nome do ficheiro",
"link": "Link",
"link-placeholder": "https://o.link.para/o/seu/recurso",
"option": "Link externo",
"type": "Tipo",
"type-placeholder": "Tipo de ficheiro"
},
"local-file": {
"choose": "Escolha um ficheiro…",
"option": "Ficheiro local"
},
"title": "Criar Recurso",
"upload-method": "Método de carregamento"
},
"delete-resource": "Eliminar Recurso",
"delete-selected-resources": "Eliminar Recursos Selecionados",
"fetching-data": "A obter dados…",
"file-drag-drop-prompt": "Arraste e largue o seu ficheiro aqui para carregar",
"linked-amount": "Quantidade associada",
"no-files-selected": "Nenhum ficheiro selecionado",
"no-resources": "Sem recursos.",
"no-unused-resources": "Sem recursos não utilizados",
"reset-link": "Reiniciar Link",
"reset-link-prompt": "Tem a certeza de que deseja reiniciar o link? Isto irá quebrar todos os usos atuais. ESTA AÇÃO É IRREVERSÍVEL",
"reset-resource-link": "Reiniciar Link do Recurso"
},
"router": {
"back-to-top": "Voltar ao Topo",
"go-to-home": "Ir para a Página Inicial"
},
"setting": {
"account-section": {
"change-password": "Alterar palavra-passe",
"email-note": "Opcional",
"export-memos": "Exportar Memos",
"nickname-note": "Exibido no banner",
"openapi-reset": "Reiniciar Chave OpenAPI",
"openapi-sample-post": "Olá #memos de {{url}}",
"openapi-title": "OpenAPI",
"reset-api": "Reiniciar API",
"title": "Informações da Conta",
"update-information": "Atualizar Informações",
"username-note": "Usado para iniciar sessão"
},
"appearance-option": {
"dark": "Sempre escuro",
"light": "Sempre claro",
"system": "Seguir sistema"
},
"member": "Membro",
"member-list": "Lista de membros",
"member-section": {
"archive-member": "Arquivar membro",
"archive-warning": "Tem a certeza de que deseja arquivar {{username}}?",
"create-a-member": "Criar um membro",
"delete-member": "Eliminar Membro",
"delete-warning": "Tem a certeza de que deseja eliminar {{username}}? ESTA AÇÃO É IRREVERSÍVEL"
},
"my-account": "A Minha Conta",
"preference": "Preferências",
"preference-section": {
"default-memo-sort-option": "Ordenação padrão dos memos",
"default-memo-visibility": "Visibilidade padrão dos memos",
"theme": "Tema"
},
"sso": "SSO",
"sso-section": {
"authorization-endpoint": "Ponto de Autorização",
"client-id": "ID do Cliente",
"client-secret": "Segredo do Cliente",
"confirm-delete": "Tem a certeza de que deseja eliminar a configuração \"{{name}}\" do SSO? ESTA AÇÃO É IRREVERSÍVEL",
"create-sso": "Criar SSO",
"custom": "Personalizado",
"delete-sso": "Confirmar eliminação",
"disabled-password-login-warning": "O login por palavra-passe está desativado, tenha cuidado ao remover provedores de identidade",
"display-name": "Nome de Exibição",
"identifier": "Identificador",
"identifier-filter": "Filtro de Identificador",
"redirect-url": "URL de Redirecionamento",
"scopes": "Âmbitos",
"sso-created": "SSO {{name}} criado",
"sso-list": "Lista de SSO",
"sso-updated": "SSO {{name}} atualizado",
"template": "Modelo",
"token-endpoint": "Ponto de Token",
"update-sso": "Atualizar SSO",
"user-endpoint": "Ponto do Utilizador",
"no-sso-found": "Nenhum SSO encontrado.",
"configuring-keycloak-for-authentication": "A configurar o Keycloak para autenticação."
},
"storage": "Armazenamento",
"storage-section": {
"accesskey": "Chave de Acesso",
"accesskey-placeholder": "Chave de Acesso / ID de Acesso",
"bucket": "Bucket",
"bucket-placeholder": "Nome do Bucket",
"create-a-service": "Criar um serviço",
"create-storage": "Criar Armazenamento",
"current-storage": "Armazenamento de objetos atual",
"delete-storage": "Eliminar Armazenamento",
"endpoint": "Ponto Final",
"local-storage-path": "Caminho do Armazenamento Local",
"path": "Caminho do Armazenamento",
"path-description": "Pode usar variáveis dinâmicas como {filename}",
"path-placeholder": "caminho/personalizado",
"presign-placeholder": "URL de pré-assinatura, opcional",
"region": "Região",
"region-placeholder": "Nome da Região",
"s3-compatible-url": "URL compatível com S3",
"secretkey": "Chave Secreta",
"secretkey-placeholder": "Chave Secreta / Chave de Acesso",
"storage-services": "Serviços de Armazenamento",
"type-database": "Base de Dados",
"type-local": "Sistema de ficheiros local",
"update-a-service": "Atualizar um serviço",
"update-local-path": "Atualizar Caminho do Armazenamento Local",
"update-local-path-description": "O caminho do armazenamento local é relativo ao seu ficheiro de base de dados",
"update-storage": "Atualizar Armazenamento",
"url-prefix": "Prefixo de URL",
"url-prefix-placeholder": "Prefixo de URL personalizado, opcional",
"url-suffix": "Sufixo de URL",
"url-suffix-placeholder": "Sufixo de URL personalizado, opcional",
"warning-text": "Tem a certeza de que deseja eliminar o serviço de armazenamento \"{{name}}\"? ESTA AÇÃO É IRREVERSÍVEL"
},
"system": "Sistema",
"system-section": {
"additional-script": "Script adicional",
"additional-script-placeholder": "Código JavaScript adicional",
"additional-style": "Estilo adicional",
"additional-style-placeholder": "Código CSS adicional",
"allow-user-signup": "Permitir registo de utilizadores",
"customize-server": {
"appearance": "Aparência do Servidor",
"description": "Descrição",
"icon-url": "URL do Ícone",
"locale": "Localização do Servidor",
"title": "Personalizar Servidor"
},
"disable-password-login": "Desativar login por palavra-passe",
"disable-password-login-final-warning": "Escreva \"CONFIRM\" se tiver a certeza.",
"disable-password-login-warning": "Isto desativará o login para todos. Deve ter cuidado ao remover um provedor de identidade",
"disable-public-memos": "Desativar memos públicos",
"disable-markdown-shortcuts-in-editor": "Desativar atalhos Markdown",
"display-with-updated-time": "Exibir com hora atualizada",
"enable-auto-compact": "Ativar compactação automática",
"enable-double-click-to-edit": "Ativar duplo clique para editar",
"enable-password-login": "Ativar login por palavra-passe",
"enable-password-login-warning": "Isto permitirá login por palavra-passe e SSO",
"max-upload-size": "Tamanho máximo (MiB)",
"max-upload-size-hint": "32 MiB é recomendado.",
"server-name": "Nome do Servidor"
},
"memo-related": "Memo",
"access-token-section": {
"title": "Tokens de Acesso",
"description": "Uma lista de todos os tokens de acesso para a sua conta.",
"created-at": "Criado Em",
"expires-at": "Expira Em",
"token": "Token"
},
"webhook-section": {
"title": "Webhooks",
"url": "Url",
"no-webhooks-found": "Nenhum webhook encontrado."
},
"workspace-section": {
"disallow-user-registration": "Desativar registo de utilizadores",
"disallow-password-auth": "Desativar autenticação por palavra-passe",
"disallow-change-username": "Desativar alteração de nome de utilizador",
"disallow-change-nickname": "Desativar alteração de nome ou apelido",
"week-start-day": "Dia de início da semana",
"saturday": "Sábado",
"sunday": "Domingo",
"monday": "Segunda-feira"
},
"memo-related-settings": {
"title": "Definições relacionadas com memos",
"enable-link-preview": "Ativar pré-visualização de links",
"enable-memo-comments": "Ativar comentários em memos",
"enable-memo-location": "Ativar localização em memos",
"content-lenght-limit": "Limite de comprimento do conteúdo (Bytes)",
"reactions": "Reações"
},
"version": "Versão"
},
"tag": {
"all-tags": "Todas as Etiquetas",
"create-tag": "Criar Etiqueta",
"create-tags-guide": "Pode criar etiquetas digitando `#etiqueta`.",
"delete-confirm": "Tem a certeza que quer eliminar esta etiqueta? Memos associados serão arquivados.",
"delete-tag": "Eliminar Etiqueta",
"no-tag-found": "Nenhuma etiqueta encontrada"
},
"markdown": {
"code-block": "Bloco de código",
"checkbox": "Caixa de seleção",
"content-syntax": "Sintaxe de conteúdo"
}
}

@ -1,5 +1,5 @@
import { Divider, Input, Tooltip } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Divider, Tooltip } from "@mui/joy";
import { Button, Input } from "@usememos/mui";
import dayjs from "dayjs";
import { includes } from "lodash-es";
import { PaperclipIcon, SearchIcon, TrashIcon } from "lucide-react";

@ -114,7 +114,9 @@ const Setting = () => {
onClick={() => handleSectionSelectorItemClick(item)}
/>
))}
<span className="px-3 mt-2 opacity-70 text-sm">Version: v{commonContext.profile.version}</span>
<span className="px-3 mt-2 opacity-70 text-sm">
{t("setting.version")}: v{commonContext.profile.version}
</span>
</div>
</>
) : null}

@ -1,5 +1,4 @@
import { Input } from "@mui/joy";
import { Button } from "@usememos/mui";
import { Button, Input } from "@usememos/mui";
import { LoaderIcon } from "lucide-react";
import { ClientError } from "nice-grpc-web";
import { useState } from "react";

Loading…
Cancel
Save