Compare commits

..

4 Commits

Author SHA1 Message Date
Henry
44566f4838 fix: enable scroll on card page 2025-07-02 14:37:56 +01:00
Henry
30b3332d1f fix: prevent zooming on ios 2025-07-02 14:18:32 +01:00
Henry
24e418a239 fix: display theme background and set dynamic viewport height 2025-07-02 14:07:09 +01:00
Henry
4045ccbfd8 fix: add min width to dashboard 2025-07-02 13:56:35 +01:00
91 changed files with 1559 additions and 2722 deletions

View File

@@ -21,7 +21,6 @@ S3_REGION=
S3_ENDPOINT=
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_FORCE_PATH_STYLE=
NEXT_PUBLIC_STORAGE_URL=
NEXT_PUBLIC_AVATAR_BUCKET_NAME=
NEXT_PUBLIC_STORAGE_DOMAIN=

4
.vscode/launch.json vendored
View File

@@ -6,7 +6,7 @@
"type": "node-terminal",
"request": "launch",
"command": "pnpm dev",
"cwd": "${workspaceFolder}/apps/web",
"cwd": "${workspaceFolder}/apps/nextjs",
"skipFiles": ["<node_internals>/**"],
"sourceMaps": true,
"sourceMapPathOverrides": {
@@ -14,4 +14,4 @@
}
}
]
}
}

View File

@@ -5,43 +5,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased](https://github.com/kanbn/kan/compare/v0.2.4...HEAD)
## [0.2.4](https://github.com/kanbn/kan/compare/v0.2.3...v0.2.4) - 2025-01-14
### Added
- Button to view and update board public URL directly from board page
- Redirect from root to login page for self-hosted instances
### Changed
- Updated all label router endpoints to return consistent structure
- Added verbose error logging to magic link invitation process
### Fixed
- Updated tRPC dependencies and added OpenAPI meta to providers endpoint
## [0.2.3](https://github.com/kanbn/kan/compare/v0.2.2...v0.2.3) - 2025-07-07
### Added
- Mobile support with responsive navigation and layout
- Template selection when creating new boards with predefined lists and labels
- S3_FORCE_PATH_STYLE configuration for MinIO compatibility
### Changed
- Improved mobile UI styling and layout containers
- Enhanced iOS mobile support with viewport fixes and zoom prevention
- Improved card view layout for mobile devices
### Fixed
- Mobile dashboard min-width issues
- Dynamic viewport height on mobile devices
- Scroll functionality on card pages
## [Unreleased](https://github.com/kanbn/kan/compare/v0.2.2...HEAD)
## [0.2.2](https://github.com/kanbn/kan/compare/v0.2.1...v0.2.2) - 2025-06-28

View File

@@ -162,7 +162,6 @@ pnpm dev
| `S3_ENDPOINT` | S3 endpoint URL | For file uploads | `https://xxx.r2.cloudflarestorage.com` |
| `S3_ACCESS_KEY_ID` | S3 access key | For file uploads | `xxx` |
| `S3_SECRET_ACCESS_KEY` | S3 secret key | For file uploads | `xxx` |
| `S3_FORCE_PATH_STYLE` | Use path-style URLs for S3 | For file uploads | `true` |
| `NEXT_PUBLIC_STORAGE_URL` | Storage service URL | For file uploads | `https://storage.kanbn.com` |
| `NEXT_PUBLIC_STORAGE_DOMAIN` | Storage domain name | For file uploads | `kanbn.com` |
| `NEXT_PUBLIC_AVATAR_BUCKET_NAME` | S3 bucket name for avatars | For file uploads | `avatars` |

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 433 KiB

View File

@@ -6,6 +6,7 @@ checksums:
"%7B0%7D%20%7C%20%7B1%7D/singular": 4628f9c6ec13c2dc2984a6ab80e19f8b
"%7B0%7D%20labels/singular": 785f92bedf786ff3e285adfc07c69d18
"%7BboardCount%2C%20plural%2C%20one%20%7BImport%20board%20(1)%7D%20other%20%7BImport%20boards%20(%7BboardCount%7D)%7D%7D/singular": 72358c550bd1a99fcb6e8952f0f947ef
"%231%20Hacker%20News/singular": de271b412c6c022d5c427d29fc70e0ba
1%20user/singular: 3b547431ab12f0fba84307e6a81109d8
A%20powerful%2C%20flexible%20kanban%20app%20that%20helps%20you%20organise%20work%2C%20track%20progress%2C%20and%20deliver%20results%E2%80%94all%20in%20one%20place./singular: d405b83b0d631cb72f4347c10bcbb643
Account%20deleted/singular: a25da96a1579c4491be0a95669ef18a4
@@ -32,7 +33,6 @@ checksums:
Are%20you%20sure%20you%20want%20to%20delete%20the%20workspace%20%7B0%7D%3F/singular: 27ba2854202dd77c51e78c64e5c93946
Are%20you%20sure%20you%20want%20to%20delete%20this%20card%3F/singular: 131a5a7cccca7be8b32c987d9fa0b0c0
Are%20you%20sure%20you%20want%20to%20delete%20this%20comment%3F/singular: 55fe6f1b52b71b91b2a079cfda3cc7fe
Are%20you%20sure%20you%20want%20to%20delete%20this%20label%3F/singular: 037fbaf1d04356937e6afb574714f51f
Are%20you%20sure%20you%20want%20to%20delete%20your%20account%3F/singular: 428b74d781063224c3e63980e1094ec3
assigned%20%3C0%3E%7BmemberName%7D%3C%2F0%3E%20to%20the%20card/singular: 4fb1c419a78a0f010a3e5790801551fc
Awaiting%20Customer/singular: 122c108794f321c10e05a08f09b11457
@@ -119,7 +119,6 @@ checksums:
Edit%20board%20URL/singular: d8276dfc0189f371ec7d80a2047c07aa
Edit%20comment/singular: 7e4b46525fcb6b47b71798e31c46e374
Edit%20label/singular: 0309e0be1512b1e0b0ceb87c69a53d03
Edit%20workspace%20URL/singular: bbae5f2f8a442947d33099979bbbe899
Editing/singular: 3449a7988cd69207b7c6929af1f4abf1
email/singular: f31eb214738e037d58e26149797739df
Email/singular: e7f34943a0c2fb849db1839ff6ef5cb5
@@ -128,10 +127,8 @@ checksums:
Enter%20your%20name/singular: cd95fbdd0533f2c2e8edf9d9bd9aa8df
Enter%20your%20password/singular: ea4fdd034522dead21bae0c0abb52eae
Error%20deleting%20account/singular: d42965a9bc9e5ec4ed57890268924643
Error%20deleting%20label/singular: 94387e3a45ec768ae7715701ae00136e
Error%20deleting%20workspace/singular: 0aec9bd8170bc84f5ea5c9a47c52ed26
Error%20disconnecting%20Trello/singular: a8766853864eddc480113778a708871b
Error%20inviting%20member/singular: 91553b606a6ebed3534cd2e5635ce004
Error%20updating%20display%20name/singular: 0d7979a25d290123ed8b8906bf468f1a
Error%20updating%20profile%20image/singular: 462a56a6e574abc9e13cb48f1266adad
Error%20updating%20workspace%20description/singular: 7a9fd7c69b90ab848ee1f1d4a4995381
@@ -188,9 +185,7 @@ checksums:
Individuals/singular: 83bfc81f20e60556c44ec80c7d0603ec
Integrations/singular: 0ccce343287704cd90150c32e2fcad36
Interviewing/singular: 4ccdcdc784547e925077c3297bddee95
Invalid%20email%20address/singular: b2d9f25626f2d15c7c63e0281bccc247
Invite/singular: 181884cea804cbde665f160811ee7ad0
Invite%20another/singular: acb543563dab7edbcf46060a53ade3a3
Invite%20member/singular: ade922db1be6b26bc979565ce5de2bc7
Junior/singular: ed1bd2c59a824fdcdd56fc8a0660fe9f
Kanban%20is%20better%20with%20a%20team.%20Perfect%20for%20small%20and%20growing%20teams%20looking%20to%20collaborate./singular: a77bee43046b260797c8936ad23e9223
@@ -285,7 +280,7 @@ checksums:
Self%20Host/singular: 43fbce2027548b712002e489a20a621a
Self%20host%20with%20Github/singular: 972155419bcc9f8f9bad9f5ad3538774
self-assigned%20the%20card/singular: 24a8d97bcd747643772ebe883be69698
Send%20feedback/singular: 9631cc08d49da04475b30a0d320ce97c
Send/singular: 76a8497d7b546628b03bb81d5c1ce995
Senior/singular: 3fff865dc00435f82896fc302ea45630
Settings/singular: 8df6777277469c1fd88cc18dde2f1cc3
Settings%20%7C%20%7B0%7D/singular: b8fc73080bc9c8f4f1403b2a69bd1ac5
@@ -300,7 +295,6 @@ checksums:
Software%20Development/singular: 67659097ef6bcb194839858b2c4f3a3c
Star%20on%20Github/singular: e5cb0428f1ac6485688f120d78742875
Success/singular: c43827becada6750f7a25890905f38b9
Support/singular: 55aab5fd0f31a9cb055a2edeeedfaf63
Support%20the%20development%20of%20the%20project/singular: c63bab228ab2b1be4370c668a99cd278
System/singular: 803281c327a02a2feba182f4a2b38311
Teams/singular: b63448c05270497973ac4407047dae02
@@ -313,7 +307,6 @@ checksums:
Theme/singular: 21fe00b7a518089576fb83c08631107a
They%20won't%20be%20able%20to%20access%20this%20workspace./singular: 93b740350fe3430319fbca85349e41d9
This%20action%20can't%20be%20undone./singular: cb222ff89715d8c971e8c25d121e1dbd
This%20board%20is%20private%20or%20does%20not%20exist/singular: a217ff3f04463b4df8c86adb6f83c6bc
This%20board%20URL%20has%20already%20been%20taken/singular: 1d8b40332a031b5b77a3658e48dd51ca
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20this%20workspace./singular: a31141558af793635c1ddd2fa0a33499
This%20will%20result%20in%20the%20permanent%20deletion%20of%20all%20data%20associated%20with%20your%20account./singular: b49224632bd6c3b7f5e462912aeb1081
@@ -359,14 +352,11 @@ checksums:
URL%20must%20be%20at%20least%203%20characters%20long/singular: 1b74ac9ec61fd34b16530ed599009ed1
Use%20template/singular: 33f0ca0aa8f4b0de99aad267a61a094d
User/singular: 61073457a5c3901084b557d065f876be
User%20is%20already%20a%20member%20of%20this%20workspace/singular: bc246386f0975f750f2133222bb4735e
Video/singular: 8050c90e4289b105a0780f0fdda6ff66
View%20and%20manage%20your%20API%20keys./singular: 88e23ee79056846dd9ce63ceee690549
View%20and%20manage%20your%20billing%20and%20subscription./singular: 7469502543aac6f02149813546d1cb38
View%20docs/singular: 43ce54f27bb1e3f1880b56e03ab38871
View%20only/singular: 21f5f7ba3b49050c4f406113479d6a7a
View%20our%20roadmap./singular: 1dd7ec80e1635951b1c90d592d1d07dc
View%20workspace/singular: c9e4b789330b08c18ca8db7044409e5f
Visibility/singular: 1ff412f8fcde0f460acbf11153649646
We%20are%20using%20the%20%3C0%3EAGPL-3.0%20license%3C%2F0%3E./singular: 08c5ddd938a2a70f61d684e41e18697a
We're%20just%20getting%20started.%20/singular: 2dfa121e0ff1914e08068308a81973c0

View File

@@ -31,12 +31,9 @@ const config = {
images: {
remotePatterns: [
{
protocol: "https",
hostname: process.env.S3_FORCE_PATH_STYLE === "true"
? `${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`
: `*.${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`,
hostname: `*.${env("NEXT_PUBLIC_STORAGE_DOMAIN")}`,
},
{
protocol: "http",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 433 KiB

View File

@@ -259,7 +259,6 @@ export function Auth({ setIsMagicLinkSent, isSignUp }: AuthProps) {
}
return (
<Button
key={key}
onClick={() => handleLoginWithProvider(key as SocialProvider)}
isLoading={isLoginWithProviderPending === key}
iconLeft={<provider.icon />}

View File

@@ -86,10 +86,8 @@ export default function CheckboxDropdown({
</label>
{handleEdit && (
<button
type="button"
className="invisible ml-auto group-hover:visible"
onClick={(event) => {
event.preventDefault();
event.stopPropagation();
handleEdit(item.key);
}}
@@ -102,12 +100,8 @@ export default function CheckboxDropdown({
))}
{handleCreate && (
<button
type="button"
className="flex w-full items-center rounded-[5px] p-2 px-2 text-[12px] text-dark-900 hover:bg-light-200 dark:hover:bg-dark-300"
onClick={(e) => {
e.preventDefault();
handleCreate();
}}
onClick={() => handleCreate()}
>
<HiMiniPlus size={20} className="pr-1.5" />
{createNewItemLabel}

View File

@@ -1,3 +1,4 @@
import Link from "next/link";
import { useRef, useState } from "react";
import {
TbLayoutSidebarLeftCollapse,
@@ -9,11 +10,8 @@ import {
import { authClient } from "@kan/auth/client";
import { useClickOutside } from "~/hooks/useClickOutside";
import { useModal } from "~/providers/modal";
import { useTheme } from "~/providers/theme";
import { WorkspaceProvider } from "~/providers/workspace";
import FeedbackModal from "./FeedbackModal";
import Modal from "./modal";
import FeedbackButton from "./FeedbackButton";
import SideNavigation from "./SideNavigation";
interface DashboardProps {
@@ -22,30 +20,14 @@ interface DashboardProps {
hasRightPanel?: boolean;
}
export function getDashboardLayout(
page: React.ReactElement,
rightPanel?: React.ReactNode,
hasRightPanel = false,
) {
return (
<WorkspaceProvider>
<Dashboard rightPanel={rightPanel} hasRightPanel={hasRightPanel}>
{page}
</Dashboard>
</WorkspaceProvider>
);
}
export default function Dashboard({
children,
rightPanel,
hasRightPanel = false,
}: DashboardProps) {
const theme = useTheme();
const { modalContentType } = useModal();
const { data: session, isPending: sessionLoading } = authClient.useSession();
const [isSideNavOpen, setIsSideNavOpen] = useState(false);
const [isRightPanelOpen, setIsRightPanelOpen] = useState(false);
@@ -61,10 +43,6 @@ export default function Dashboard({
}
};
const closeSideNav = () => {
setIsSideNavOpen(false);
};
const toggleRightPanel = () => {
setIsRightPanelOpen(!isRightPanelOpen);
if (!isRightPanelOpen) {
@@ -99,84 +77,93 @@ export default function Dashboard({
height: 100vh;
overflow: hidden;
min-width: 320px;
background-color: ${!isDarkMode ? "hsl(0deg 0% 97.3%)" : "#1c1c1c"};
background-color: ${!isDarkMode ? "hsl(0deg 0% 97.3%)" : "#161616"};
}
`}</style>
<div className="relative flex h-screen flex-col bg-light-50 dark:bg-dark-50 md:bg-light-100 md:p-3 md:dark:bg-dark-100">
{/* Mobile Header */}
<div className="flex h-12 items-center justify-between border-b border-light-300 bg-light-50 px-3 dark:border-dark-300 dark:bg-dark-50 md:hidden">
<button
ref={sideNavButtonRef}
onClick={toggleSideNav}
className="rounded p-1.5 transition-all hover:bg-light-200 dark:hover:bg-dark-100"
>
{isSideNavOpen ? (
<TbLayoutSidebarLeftCollapse
size={20}
className="text-light-900 dark:text-dark-900"
/>
) : (
<TbLayoutSidebarLeftExpand
size={20}
className="text-light-900 dark:text-dark-900"
/>
)}
</button>
{hasRightPanel && (
<div className="flex h-screen flex-col items-center bg-light-100 dark:bg-dark-50 md:min-w-[800px]">
<div className="flex h-12 min-h-12 w-full justify-between border-b border-light-600 px-5 py-2 align-middle dark:border-dark-400 md:h-16 md:min-h-16">
<div className="my-auto flex w-full items-center justify-between">
<button
ref={rightPanelButtonRef}
onClick={toggleRightPanel}
className="rounded p-1.5 transition-all hover:bg-light-200 dark:hover:bg-dark-100"
ref={sideNavButtonRef}
onClick={toggleSideNav}
className="text-neutral-900 dark:text-dark-1000 md:hidden"
>
{isRightPanelOpen ? (
<TbLayoutSidebarRightCollapse
{isSideNavOpen ? (
<TbLayoutSidebarLeftCollapse
size={20}
className="text-light-900 dark:text-dark-900"
/>
) : (
<TbLayoutSidebarRightExpand
<TbLayoutSidebarLeftExpand
size={20}
className="text-light-900 dark:text-dark-900"
/>
)}
</button>
)}
<Link href="/" className="hidden md:block">
<h1 className="text-lg font-bold tracking-tight text-neutral-900 dark:text-dark-1000">
kan.bn
</h1>
</Link>
<div className="flex items-center gap-2">
{hasRightPanel && (
<button
ref={rightPanelButtonRef}
onClick={toggleRightPanel}
className="text-neutral-900 dark:text-dark-1000 md:hidden"
>
{isRightPanelOpen ? (
<TbLayoutSidebarRightCollapse
size={20}
className="text-light-900 dark:text-dark-900"
/>
) : (
<TbLayoutSidebarRightExpand
size={20}
className="text-light-900 dark:text-dark-900"
/>
)}
</button>
)}
<div className="hidden md:block">
<FeedbackButton />
</div>
</div>
</div>
</div>
<div className="flex h-[calc(100dvh-4.5rem)] min-h-0 w-full md:h-[calc(100dvh-1.5rem)]">
<div className="flex h-full min-h-0 w-full">
<div
ref={sideNavRef}
className={`fixed top-12 z-40 h-[calc(100dvh-3rem)] w-[calc(100vw-1.5rem)] transform transition-transform duration-300 ease-in-out md:relative md:top-0 md:h-full md:w-auto md:translate-x-0 ${isSideNavOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"} `}
className={`fixed left-0 top-12 z-50 h-[calc(100dvh-3rem)] transform transition-transform duration-300 ease-in-out md:relative md:top-0 md:h-full md:translate-x-0 ${isSideNavOpen ? "translate-x-0" : "-translate-x-full md:translate-x-0"} `}
>
<SideNavigation
user={{ email: session?.user.email, image: session?.user.image }}
isLoading={sessionLoading}
onCloseSideNav={closeSideNav}
/>
</div>
<div className="relative h-full min-h-0 w-full overflow-hidden md:rounded-lg md:border md:border-light-300 md:bg-light-50 md:dark:border-dark-300 md:dark:bg-dark-50">
<div className="relative flex h-full min-h-0 w-full overflow-hidden">
<div className="h-full w-full overflow-y-auto">{children}</div>
<div className="relative flex min-h-0 w-full overflow-hidden">
<div className="h-full w-full overflow-y-auto">{children}</div>
{/* Mobile Right Panel */}
{hasRightPanel && rightPanel && (
<div
ref={rightPanelRef}
className={`fixed right-0 top-12 z-40 h-[calc(100dvh-3rem)] w-80 transform border-l border-light-300 bg-light-200 transition-transform duration-300 ease-in-out dark:border-dark-300 dark:bg-dark-100 md:hidden ${
isRightPanelOpen ? "translate-x-0" : "translate-x-full"
}`}
>
<div className="h-full">{rightPanel}</div>
</div>
)}
{/* Mobile Right Panel */}
{hasRightPanel && rightPanel && (
<div
ref={rightPanelRef}
className={`fixed right-0 top-12 z-50 h-[calc(100dvh-3rem)] w-80 transform bg-light-200 transition-transform duration-300 ease-in-out dark:bg-dark-100 md:hidden ${
isRightPanelOpen ? "translate-x-0" : "translate-x-full"
}`}
>
<div className="h-full overflow-y-auto">{rightPanel}</div>
</div>
)}
{/* Desktop Right Panel */}
{hasRightPanel && rightPanel && (
<div className="hidden md:block">{rightPanel}</div>
)}
</div>
{/* Desktop Right Panel */}
{hasRightPanel && rightPanel && (
<div className="hidden md:block">{rightPanel}</div>
)}
</div>
</div>
</div>

View File

@@ -1,5 +1,3 @@
import { t } from "@lingui/core/macro";
import Button from "~/components/Button";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
@@ -19,8 +17,8 @@ export function DeleteLabelConfirmation({
onSuccess: () => refetch(),
onError: () =>
showPopup({
header: t`Error deleting label`,
message: t`Please try again later, or contact customer support.`,
header: "Error deleting label",
message: "Please try again later, or contact customer support.",
icon: "error",
}),
});
@@ -36,17 +34,17 @@ export function DeleteLabelConfirmation({
<div className="p-5">
<div className="flex w-full flex-col justify-between pb-4">
<h2 className="text-md pb-4 font-medium text-neutral-900 dark:text-dark-1000">
{t`Are you sure you want to delete this label?`}
Are you sure you want to delete this label?
</h2>
<p className="text-sm font-medium text-light-900 dark:text-dark-900">
{t`This action can't be undone.`}
{"This action can't be undone."}
</p>
</div>
<div className="mt-5 flex justify-end space-x-2 sm:mt-6">
<Button variant="secondary" onClick={() => closeModal()}>
{t`Cancel`}
Cancel
</Button>
<Button onClick={handleDeleteLabel}>{t`Delete`}</Button>
<Button onClick={handleDeleteLabel}>Delete</Button>
</div>
</div>
);

View File

@@ -15,7 +15,6 @@ import {
ReactRenderer,
useEditor,
} from "@tiptap/react";
import { useEffect } from "react";
import StarterKit from "@tiptap/starter-kit";
import Suggestion from "@tiptap/suggestion";
import { forwardRef, useImperativeHandle, useRef, useState } from "react";
@@ -344,23 +343,14 @@ export default function Editor({
editable: !readOnly,
injectCSS: false,
},
[], // creating the editor only once
[content],
);
// this will sync external content changes without re-creating the editor instance
useEffect(() => {
if (!editor) return;
const currentHTML = editor.getHTML();
const safeContent = content ?? "";
if (safeContent !== currentHTML) {
editor.commands.setContent(safeContent, false);
}
}, [content, editor]);
return (
<div ref={containerRef}>
<style jsx global>{`
.tiptap p.is-empty::before {
color: #adb5bd;
content: attr(data-placeholder);
float: left;
height: 0;
@@ -373,7 +363,7 @@ export default function Editor({
{!readOnly && editor && <EditorBubbleMenu editor={editor} />}
<EditorContent
editor={editor}
className="prose dark:prose-invert prose-sm max-w-none overflow-y-auto [&_blockquote]:!text-xs [&_h1]:!text-lg [&_h2]:!text-base [&_h3]:!text-sm [&_ol]:!text-xs [&_p.is-empty::before]:text-light-900 [&_p.is-empty::before]:dark:text-dark-800 [&_p]:!text-sm [&_p]:text-black [&_p]:dark:text-white [&_ul]:!text-xs"
className="prose dark:prose-invert prose-sm max-w-none overflow-y-auto [&_blockquote]:!text-xs [&_h1]:!text-lg [&_h2]:!text-base [&_h3]:!text-sm [&_ol]:!text-xs [&_p.is-empty::before]:text-dark-800 [&_p.is-empty::before]:dark:text-dark-800 [&_p]:!text-sm [&_p]:text-black [&_p]:dark:text-white [&_ul]:!text-xs"
/>
</div>
);

View File

@@ -0,0 +1,149 @@
import Link from "next/link";
import { Menu, Transition } from "@headlessui/react";
import { t } from "@lingui/core/macro";
import { Fragment, useRef, useState } from "react";
import { useForm } from "react-hook-form";
import chatIconDark from "~/assets/chat-dark.json";
import chatIconLight from "~/assets/chat-light.json";
import Button from "~/components/Button";
import Input from "~/components/Input";
import LottieIcon from "~/components/LottieIcon";
import { usePopup } from "~/providers/popup";
import { useTheme } from "~/providers/theme";
import { api } from "~/utils/api";
interface NewFeedbackFormInput {
feedback: string;
}
const FeedbackButton: React.FC = () => {
const outsideRef = useRef<HTMLDivElement>(null);
const { activeTheme } = useTheme();
const { showPopup } = usePopup();
const [isHovered, setIsHovered] = useState(false);
const [index, setIndex] = useState(0);
const { handleSubmit, setValue, watch, reset } =
useForm<NewFeedbackFormInput>({
defaultValues: {
feedback: "",
},
});
const createFeedback = api.feedback.create.useMutation({
onSuccess: async () => {
reset();
showPopup({
header: t`Feedback sent`,
message: t`Thank you for your feedback!`,
icon: "success",
});
},
onError: async () => {
showPopup({
header: t`Unable to send feedback`,
message: t`Please try again later, or contact customer support.`,
icon: "error",
});
},
});
const handleMouseEnter = () => {
setIsHovered(true);
setIndex((index) => index + 1);
};
const onSubmit = (values: NewFeedbackFormInput) => {
createFeedback.mutate({
feedback: values.feedback,
url: window.location.href,
});
};
return (
<>
<div ref={outsideRef} />
<Menu as="div" className="relative inline-block text-left">
<div>
<Menu.Button
onMouseEnter={handleMouseEnter}
className="flex items-center rounded-md border-[1px] border-light-600 bg-light-50 px-2.5 py-1.5 text-sm font-normal text-neutral-900 shadow-sm dark:border-dark-400 dark:bg-dark-50 dark:text-dark-1000"
>
<LottieIcon
index={index}
json={activeTheme === "dark" ? chatIconDark : chatIconLight}
isPlaying={isHovered}
/>
<span className="ml-1">{t`Feedback`}</span>
</Menu.Button>
</div>
<Transition
as={Fragment}
enter="transition ease-out duration-100"
enterFrom="transform opacity-0 scale-95"
enterTo="transform opacity-100 scale-100"
leave="transition ease-in duration-75"
leaveFrom="transform opacity-100 scale-100"
leaveTo="transform opacity-0 scale-95"
>
<Menu.Items
as="div"
static
className="absolute right-0 z-30 mt-2 w-[350px] origin-top-right rounded-md border border-light-200 bg-light-50 p-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-400 dark:bg-dark-300"
>
<form onSubmit={handleSubmit(onSubmit)} className="p-1">
<Input
placeholder={t`Ideas to improve this page...`}
onChange={(e) => {
setValue("feedback", e.target.value);
}}
value={watch("feedback")}
contentEditable
className="max-h-[300px] min-h-[100px]"
onKeyDown={async (e) => {
e.stopPropagation();
if (e.key === "Enter" && e.shiftKey) {
e.preventDefault();
await handleSubmit(onSubmit)();
}
}}
/>
<div className="flex flex-row items-center justify-between pt-2">
<div>
<p className="ml-2 text-xs text-neutral-900 dark:text-dark-1000">
{t`Need help?`}{" "}
<Link
href="mailto:support@kan.bn"
className="text-blue-600 underline dark:text-blue-300"
>
{t`Contact us`}
</Link>
{t`, or see our`}{" "}
<Link
href="https://docs.kan.bn"
target="_blank"
rel="noreferrer"
className="text-blue-600 underline dark:text-blue-300"
>
{t`docs`}
</Link>
.
</p>
</div>
<div className="justify-end">
<Button size="sm" isLoading={createFeedback.isPending}>
{t`Send`}
</Button>
</div>
</div>
</form>
</Menu.Items>
</Transition>
</Menu>
</>
);
};
export default FeedbackButton;

View File

@@ -1,122 +0,0 @@
import Link from "next/link";
import { t } from "@lingui/core/macro";
import { useEffect } from "react";
import { useForm } from "react-hook-form";
import { HiXMark } from "react-icons/hi2";
import Button from "~/components/Button";
import Input from "~/components/Input";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
interface NewFeedbackFormInput {
feedback: string;
}
export default function FeedbackModal() {
const { closeModal } = useModal();
const { showPopup } = usePopup();
const { handleSubmit, setValue, watch, reset } =
useForm<NewFeedbackFormInput>({
defaultValues: {
feedback: "",
},
});
const createFeedback = api.feedback.create.useMutation({
onSuccess: async () => {
reset();
closeModal();
showPopup({
header: t`Feedback sent`,
message: t`Thank you for your feedback!`,
icon: "success",
});
},
onError: async () => {
showPopup({
header: t`Unable to send feedback`,
message: t`Please try again later, or contact customer support.`,
icon: "error",
});
},
});
const onSubmit = (values: NewFeedbackFormInput) => {
createFeedback.mutate({
feedback: values.feedback,
url: window.location.href,
});
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<div className="px-5 pt-5">
<div className="flex w-full items-center justify-between pb-4">
<h2 className="text-sm font-bold text-neutral-900 dark:text-dark-1000">
{t`Feedback`}
</h2>
<button
type="button"
className="rounded p-1 hover:bg-light-200 focus:outline-none dark:hover:bg-dark-300"
onClick={(e) => {
e.preventDefault();
closeModal();
}}
>
<HiXMark size={18} className="text-light-900 dark:text-dark-900" />
</button>
</div>
<Input
id="feedback"
placeholder={t`Ideas to improve this page...`}
onChange={(e) => setValue("feedback", e.target.value)}
contentEditable
value={watch("feedback")}
className="min-h-[120px]"
onKeyDown={async (e) => {
e.stopPropagation();
if (e.key === "Enter" && e.shiftKey) {
e.preventDefault();
await handleSubmit(onSubmit)();
}
if (e.key === "Escape") {
closeModal();
}
}}
/>
</div>
<div className="mt-6 flex items-center justify-between border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<div className="text-xs text-neutral-600 dark:text-dark-800">
<p>
{t`Need help?`}{" "}
<Link
href="mailto:support@kan.bn"
className="text-blue-600 underline dark:text-blue-300"
>
{t`Contact us`}
</Link>
{t`, or see our`}{" "}
<Link
href="https://docs.kan.bn"
target="_blank"
rel="noreferrer"
className="text-blue-600 underline dark:text-blue-300"
>
{t`docs`}
</Link>
.
</p>
</div>
<div>
<Button type="submit" isLoading={createFeedback.isPending}>
{t`Send feedback`}
</Button>
</div>
</div>
</form>
);
}

View File

@@ -63,16 +63,12 @@ export function LabelForm({
);
try {
refetch();
if (!isCreateAnotherEnabled) {
closeModal();
} else {
const newFormState = {
name: "",
colour: colours[(currentColourIndex + 1) % colours.length],
isCreateAnotherEnabled,
};
reset(newFormState);
}
if (!isCreateAnotherEnabled) closeModal();
reset({
name: "",
colour: colours[(currentColourIndex + 1) % colours.length],
isCreateAnotherEnabled,
});
} catch (e) {
console.log(e);
}
@@ -83,6 +79,10 @@ export function LabelForm({
onSuccess: () => {
refetch();
closeModal();
reset({
name: "",
colour: colours[0],
});
},
});
@@ -229,9 +229,6 @@ export function LabelForm({
<Button
type="submit"
isLoading={updateLabel.isPending || createLabel.isPending}
disabled={
!watch("name")
}
>
{isEdit ? t`Update label` : t`Create label`}
</Button>

View File

@@ -2,11 +2,11 @@ import dynamic from "next/dynamic";
const Lottie = dynamic(() => import("react-lottie-player"), { ssr: false });
interface IconProps {
type IconProps = {
isPlaying: boolean;
index: number;
json: object;
}
};
const Icon: React.FC<IconProps> = ({ isPlaying, index, json }) => {
return (
@@ -15,7 +15,7 @@ const Icon: React.FC<IconProps> = ({ isPlaying, index, json }) => {
animationData={json}
play={isPlaying}
loop={false}
style={{ width: 18, height: 18, fill: "white" }}
style={{ width: 20, height: 20, fill: "white" }}
rendererSettings={{ preserveAspectRatio: "xMidYMid slice" }}
/>
);

View File

@@ -3,8 +3,8 @@ const PatternedBackground = () => (
<svg className="h-full w-full">
<pattern
id="pattern"
x="10"
y="10"
x="0.034759358288862785"
y="3.335370511841166"
width="14.423223834988539"
height="14.423223834988539"
patternUnits="userSpaceOnUse"

View File

@@ -1,51 +1,37 @@
import Link from "next/link";
import { useState } from "react";
import { twMerge } from "tailwind-merge";
import LottieIcon from "~/components/LottieIcon";
import { useIsMobile } from "~/hooks/useMediaQuery";
function classNames(...classes: string[]): string {
return classes.filter(Boolean).join(" ");
}
const Button: React.FC<{
href: string;
current: boolean;
name: string;
json: object;
isCollapsed?: boolean;
onCloseSideNav?: () => void;
}> = ({ href, current, name, json, isCollapsed = false, onCloseSideNav }) => {
}> = ({ href, current, name, json }) => {
const [isHovered, setIsHovered] = useState(false);
const [index, setIndex] = useState(0);
const isMobile = useIsMobile();
const handleMouseEnter = () => {
setIsHovered(true);
setIndex((index) => index + 1);
};
const handleClick = () => {
if (onCloseSideNav && isMobile) {
onCloseSideNav();
}
};
return (
<Link
href={href}
onMouseEnter={handleMouseEnter}
onClick={handleClick}
className={twMerge(
"group flex h-[34px] items-center rounded-md p-1.5 text-sm font-normal leading-6 hover:bg-light-200 hover:text-light-1000 dark:hover:bg-dark-200 dark:hover:text-dark-1000",
current
? "bg-light-200 text-light-1000 dark:bg-dark-200 dark:text-dark-1000"
: "text-neutral-600 dark:bg-dark-100 dark:text-dark-900",
isCollapsed
? "justify-start gap-x-3 md:justify-center md:gap-x-0"
: "gap-x-3",
className={classNames(
current ? "bg-light-200 dark:bg-dark-200" : "dark:bg-dark-50",
"group flex items-center gap-x-3 rounded-md p-1.5 text-sm font-normal leading-6 text-neutral-900 hover:bg-light-200 dark:text-dark-1000 dark:hover:bg-dark-200",
)}
title={isCollapsed ? name : undefined}
>
<LottieIcon index={index} json={json} isPlaying={isHovered} />
<span className={twMerge(isCollapsed && "md:hidden")}>{name}</span>
{name}
</Link>
);
};

View File

@@ -1,13 +1,5 @@
import Link from "next/link";
import { useRouter } from "next/router";
import { Button } from "@headlessui/react";
import { t } from "@lingui/core/macro";
import { useEffect, useState } from "react";
import {
TbLayoutSidebarLeftCollapse,
TbLayoutSidebarLeftExpand,
} from "react-icons/tb";
import { twMerge } from "tailwind-merge";
import boardsIconDark from "~/assets/boards-dark.json";
import boardsIconLight from "~/assets/boards-light.json";
@@ -23,7 +15,6 @@ import { useTheme } from "~/providers/theme";
interface SideNavigationProps {
user: UserType;
isLoading: boolean;
onCloseSideNav?: () => void;
}
interface UserType {
@@ -34,28 +25,8 @@ interface UserType {
export default function SideNavigation({
user,
isLoading,
onCloseSideNav,
}: SideNavigationProps) {
const router = useRouter();
const [isCollapsed, setIsCollapsed] = useState(false);
const [isInitialised, setIsInitialised] = useState(false);
useEffect(() => {
const savedState = localStorage.getItem("kan_sidebar-collapsed");
if (savedState !== null) {
setIsCollapsed(JSON.parse(savedState));
}
setIsInitialised(true);
}, []);
useEffect(() => {
if (isInitialised) {
localStorage.setItem(
"kan_sidebar-collapsed",
JSON.stringify(isCollapsed),
);
}
}, [isCollapsed, isInitialised]);
const { pathname } = router;
@@ -81,50 +52,11 @@ export default function SideNavigation({
},
];
const toggleCollapse = () => {
setIsCollapsed(!isCollapsed);
};
return (
<>
<nav
className={twMerge(
"flex h-full w-64 flex-col justify-between border-r border-light-300 bg-light-100 p-3 dark:border-dark-300 dark:bg-dark-100 md:border-r-0 md:py-0 md:pl-0",
isCollapsed && "md:w-auto",
)}
>
<nav className="flex h-full w-64 flex-col justify-between border-r border-light-600 bg-light-50 px-3 pb-3 pt-5 dark:border-dark-400 dark:bg-dark-50">
<div>
<div className="hidden h-14 items-center justify-between pb-[18px] pt-1.5 md:flex">
{!isCollapsed && (
<Link href="/" className="block">
<h1 className="pl-2 text-lg font-bold tracking-tight text-neutral-900 dark:text-dark-1000">
kan.bn
</h1>
</Link>
)}
<Button
onClick={toggleCollapse}
className={twMerge(
"flex h-8 items-center justify-center rounded-md hover:bg-light-200 dark:hover:bg-dark-200",
isCollapsed ? "w-full" : "w-8",
)}
>
{isCollapsed ? (
<TbLayoutSidebarLeftExpand
size={18}
className="text-light-900 dark:text-dark-900"
/>
) : (
<TbLayoutSidebarLeftCollapse
size={18}
className="text-light-900 dark:text-dark-900"
/>
)}
</Button>
</div>
<div className="mx-1 mb-4 hidden w-auto border-b border-light-300 dark:border-dark-400 md:block" />
<WorkspaceMenu isCollapsed={isCollapsed} />
<WorkspaceMenu />
<ul role="list" className="space-y-1">
{navigation.map((item) => (
<li key={item.name}>
@@ -133,23 +65,16 @@ export default function SideNavigation({
current={pathname.includes(item.href)}
name={item.name}
json={item.icon}
isCollapsed={isCollapsed}
onCloseSideNav={onCloseSideNav}
/>
</li>
))}
</ul>
</div>
<div className="space-y-3">
<UserMenu
email={user.email ?? ""}
imageUrl={user.image ?? undefined}
isLoading={isLoading}
isCollapsed={isCollapsed}
onCloseSideNav={onCloseSideNav}
/>
</div>
<UserMenu
email={user.email ?? ""}
imageUrl={user.image ?? undefined}
isLoading={isLoading}
/>
</nav>
</>
);

View File

@@ -1,15 +1,11 @@
import Image from "next/image";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { Menu, Transition } from "@headlessui/react";
import { t } from "@lingui/core/macro";
import { Fragment } from "react";
import { twMerge } from "tailwind-merge";
import { authClient } from "@kan/auth/client";
import { useIsMobile } from "~/hooks/useMediaQuery";
import { useModal } from "~/providers/modal";
import { useTheme } from "~/providers/theme";
import { getAvatarUrl } from "~/utils/helpers";
@@ -17,63 +13,38 @@ interface UserMenuProps {
imageUrl: string | undefined;
email: string;
isLoading: boolean;
isCollapsed?: boolean;
onCloseSideNav?: () => void;
}
function classNames(...classes: string[]): string {
return classes.filter(Boolean).join(" ");
}
export default function UserMenu({
imageUrl,
email,
isLoading,
isCollapsed = false,
onCloseSideNav,
}: UserMenuProps) {
const router = useRouter();
const { themePreference, switchTheme } = useTheme();
const { openModal } = useModal();
const isMobile = useIsMobile();
const handleLogout = async () => {
if (onCloseSideNav && isMobile) {
onCloseSideNav();
}
await authClient.signOut();
router.push("/login");
};
const handleLinkClick = () => {
if (onCloseSideNav && isMobile) {
onCloseSideNav();
}
};
const handleModalOpen = (modalType: string) => {
if (onCloseSideNav && isMobile) {
onCloseSideNav();
}
openModal(modalType);
};
const avatarUrl = imageUrl ? getAvatarUrl(imageUrl) : null;
return (
<Menu as="div" className="relative inline-block w-full text-left">
<div>
{isLoading ? (
<div className={twMerge(!isCollapsed && "flex")}>
<div className="flex">
<div className="h-[30px] w-[30px] animate-pulse rounded-full bg-light-200 dark:bg-dark-200" />
<div
className={twMerge(
"mx-2 h-[30px] w-[175px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200",
isCollapsed && "md:hidden",
)}
/>
<div className="mx-2 h-[30px] w-[175px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200" />
</div>
) : (
<Menu.Button
className="flex w-full items-center rounded-md p-1.5 text-neutral-900 hover:bg-light-200 dark:text-dark-900 dark:hover:bg-dark-200 dark:hover:text-dark-1000"
title={isCollapsed ? email : undefined}
>
<Menu.Button className="flex w-full items-center rounded-md p-1.5 text-neutral-900 hover:bg-light-200 dark:text-dark-900 dark:hover:bg-dark-200 dark:hover:text-dark-1000">
{avatarUrl ? (
<Image
src={avatarUrl}
@@ -93,14 +64,7 @@ export default function UserMenu({
</svg>
</span>
)}
<span
className={twMerge(
"mx-2 truncate text-sm",
isCollapsed && "md:hidden",
)}
>
{email}
</span>
<span className="mx-2 truncate text-sm">{email}</span>
</Menu.Button>
)}
</div>
@@ -114,12 +78,7 @@ export default function UserMenu({
leaveFrom="transform opacity-100 scale-100"
leaveTo="transform opacity-0 scale-95"
>
<Menu.Items
className={twMerge(
"absolute bottom-[40px] z-10 mt-2 origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300",
isCollapsed ? "left-0 w-48" : "left-0 w-full",
)}
>
<Menu.Items className="absolute bottom-[40px] left-0 z-10 mt-2 w-full origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300">
<div className="flex flex-col text-neutral-900 dark:text-dark-1000">
<div className="p-1">
<div className="flex w-full items-center px-3 py-2 text-left text-xs">
@@ -131,7 +90,7 @@ export default function UserMenu({
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
<span
className={twMerge(
className={classNames(
themePreference === "system" ? "visible" : "invisible",
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
)}
@@ -145,7 +104,7 @@ export default function UserMenu({
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
<span
className={twMerge(
className={classNames(
themePreference === "dark" ? "visible" : "invisible",
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
)}
@@ -159,7 +118,7 @@ export default function UserMenu({
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
<span
className={twMerge(
className={classNames(
themePreference === "light" ? "visible" : "invisible",
"mr-4 h-[6px] w-[6px] rounded-full bg-light-900 dark:bg-dark-900",
)}
@@ -168,38 +127,6 @@ export default function UserMenu({
</button>
</Menu.Item>
</div>
<div className="light-border-600 border-t-[1px] p-1 dark:border-dark-600">
<Menu.Item>
<Link
href="mailto:support@kan.bn"
target="_blank"
rel="noreferrer"
onClick={handleLinkClick}
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
{t`Support`}
</Link>
</Menu.Item>
<Menu.Item>
<Link
href="https://docs.kan.bn"
target="_blank"
rel="noreferrer"
onClick={handleLinkClick}
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
{t`Documentation`}
</Link>
</Menu.Item>
<Menu.Item>
<button
onClick={() => handleModalOpen("NEW_FEEDBACK")}
className="flex w-full items-center rounded-[5px] px-3 py-2 text-left text-xs hover:bg-light-200 dark:hover:bg-dark-400"
>
{t`Feedback`}
</button>
</Menu.Item>
</div>
<div className="light-border-600 border-t-[1px] p-1 dark:border-dark-600">
<Menu.Item>
<button

View File

@@ -2,16 +2,11 @@ import { Menu, Transition } from "@headlessui/react";
import { t } from "@lingui/core/macro";
import { Fragment } from "react";
import { HiCheck } from "react-icons/hi2";
import { twMerge } from "tailwind-merge";
import { useModal } from "~/providers/modal";
import { useWorkspace } from "~/providers/workspace";
export default function WorkspaceMenu({
isCollapsed = false,
}: {
isCollapsed?: boolean;
}) {
export default function WorkspaceMenu() {
const { workspace, isLoading, availableWorkspaces, switchWorkspace } =
useWorkspace();
const { openModal } = useModal();
@@ -20,43 +15,22 @@ export default function WorkspaceMenu({
<Menu as="div" className="relative inline-block w-full pb-3 text-left">
<div>
{isLoading ? (
<div className={twMerge("mb-1", isCollapsed && "md:flex md:p-1.5")}>
<div className="h-6 w-6 animate-pulse rounded-md bg-light-200 dark:bg-dark-200" />
<div
className={twMerge(
"ml-2 h-6 w-[150px] animate-pulse rounded-md bg-light-200 dark:bg-dark-200",
isCollapsed && "hidden md:block",
)}
/>
<div className="mb-1 flex p-1.5">
<div className="h-6 w-6 animate-pulse rounded-[5px] bg-light-200 dark:bg-dark-200" />
<div className="ml-2 h-6 w-[150px] animate-pulse rounded-[5px] bg-light-200 dark:bg-dark-200" />
</div>
) : (
<Menu.Button
className={twMerge(
"mb-1 flex h-[34px] w-full items-center rounded-md p-1.5 hover:bg-light-200 dark:hover:bg-dark-200",
isCollapsed && "md:mb-1.5 md:h-9 md:p-1",
)}
title={isCollapsed ? workspace.name : undefined}
>
<span className="inline-flex h-6 w-6 items-center justify-center rounded-md bg-indigo-700">
<Menu.Button className="mb-1 flex w-full items-center rounded-[5px] p-1.5 hover:bg-light-200 dark:hover:bg-dark-200">
<span className="inline-flex h-6 w-6 items-center justify-center rounded-[5px] bg-indigo-700">
<span className="text-xs font-bold leading-none text-white">
{workspace.name.charAt(0).toUpperCase()}
</span>
</span>
<span
className={twMerge(
"ml-2 text-sm font-bold text-neutral-900 dark:text-dark-1000",
isCollapsed && "md:hidden",
)}
>
<span className="ml-2 text-sm font-bold text-neutral-900 dark:text-dark-1000">
{workspace.name}
</span>
{workspace.plan === "pro" && (
<span
className={twMerge(
"ml-2 inline-flex items-center rounded-md bg-indigo-100 px-2 py-1 text-[10px] font-medium text-indigo-700",
isCollapsed && "md:hidden",
)}
>
<span className="ml-2 inline-flex items-center rounded-md bg-indigo-100 px-2 py-1 text-[10px] font-medium text-indigo-700">
Pro
</span>
)}
@@ -73,12 +47,7 @@ export default function WorkspaceMenu({
leaveFrom="transform opacity-100 scale-100"
leaveTo="transform opacity-0 scale-95"
>
<Menu.Items
className={twMerge(
"absolute left-0 z-10 origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300",
isCollapsed ? "w-48" : "w-full",
)}
>
<Menu.Items className="absolute left-0 z-10 w-full origin-top-left rounded-md border border-light-600 bg-light-50 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-dark-600 dark:bg-dark-300">
<div className="p-1">
{availableWorkspaces.map((availableWorkspace) => (
<div key={availableWorkspace.publicId} className="flex">

View File

@@ -7,19 +7,15 @@ interface Props {
children: React.ReactNode;
modalSize?: "sm" | "md" | "lg";
positionFromTop?: "sm" | "md" | "lg";
isVisible?: boolean;
}
const Modal: React.FC<Props> = ({
children,
modalSize = "sm",
positionFromTop = "md",
isVisible,
}) => {
const { isOpen, closeModal } = useModal();
const shouldShow = isVisible !== undefined ? isVisible : isOpen;
const modalSizeMap = {
sm: "max-w-[400px]",
md: "max-w-[550px]",
@@ -33,7 +29,7 @@ const Modal: React.FC<Props> = ({
};
return (
<Transition.Root show={shouldShow} as={Fragment}>
<Transition.Root show={isOpen} as={Fragment}>
<Dialog as="div" className="relative z-10" onClose={closeModal}>
<Transition.Child
as={Fragment}

View File

@@ -69,7 +69,6 @@ export const env = createEnv({
S3_SECRET_ACCESS_KEY: z.string().optional(),
S3_REGION: z.string().optional(),
S3_ENDPOINT: z.string().optional(),
S3_FORCE_PATH_STYLE: z.string().optional(),
EMAIL_FROM: z.string().optional(),
},

View File

@@ -1,23 +0,0 @@
import { useEffect, useState } from "react";
export function useMediaQuery(query: string): boolean {
const [matches, setMatches] = useState(false);
useEffect(() => {
const media = window.matchMedia(query);
setMatches(media.matches);
const listener = (event: MediaQueryListEvent) => {
setMatches(event.matches);
};
media.addEventListener("change", listener);
return () => media.removeEventListener("change", listener);
}, [query]);
return matches;
}
export function useIsMobile(): boolean {
return useMediaQuery("(max-width: 767px)");
}

View File

@@ -1,48 +0,0 @@
import { useEffect } from "react";
import { useModal } from "~/providers/modal";
interface UseModalFormStateOptions<T> {
modalType: string;
initialValues: T;
resetOnClose?: boolean;
}
export function useModalFormState<T extends Record<string, any>>({
modalType,
initialValues,
resetOnClose = false,
}: UseModalFormStateOptions<T>) {
const { modalContentType, isOpen, getModalState, setModalState, clearModalState } = useModal();
const isCurrentModal = modalContentType === modalType;
const savedState = getModalState(modalType) as T | undefined;
// get current form state (using the saved values if available, otherwise the initial values)
const formState = savedState || initialValues;
const saveFormState = (state: Partial<T>) => {
if (!isCurrentModal) return;
const currentState = getModalState(modalType) || initialValues;
const newState = { ...currentState, ...state };
setModalState(modalType, newState);
};
const clearFormState = () => {
clearModalState(modalType);
};
useEffect(() => {
if (resetOnClose && !isOpen && savedState) {
clearModalState(modalType);
}
}, [isOpen, resetOnClose, savedState, modalType, clearModalState]);
return {
formState,
saveFormState,
clearFormState,
isCurrentModal,
hasSavedState: !!savedState,
};
}

View File

@@ -13,22 +13,22 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:123
#: src/views/card/components/Comment.tsx:121
msgid " (edited)"
msgstr " (bearbeitet)"
#: src/components/FeedbackModal.tsx:102
#: src/components/FeedbackButton.tsx:123
msgid ", or see our"
msgstr ", oder besuche unsere"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:189
#: src/views/card/index.tsx:148
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:392
#: src/views/board/components/NewCardForm.tsx:365
msgid "{0} labels"
msgstr "{0} Labels"
@@ -36,6 +36,10 @@ msgstr "{0} Labels"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Board importieren (1)} other {Boards importieren ({boardCount})}}"
#: src/views/home/index.tsx:51
msgid "#1 Hacker News"
msgstr "#1 Hacker News"
#: src/views/home/components/Pricing.tsx:36
msgid "1 user"
msgstr "1 Benutzer"
@@ -48,8 +52,8 @@ msgstr "Eine leistungsstarke, flexible Kanban-App, die dir hilft, Arbeit zu orga
msgid "Account deleted"
msgstr "Konto gelöscht"
#: src/views/public/board/CardModal.tsx:128
#: src/views/card/index.tsx:256
#: src/views/public/board/CardModal.tsx:104
#: src/views/card/index.tsx:215
msgid "Activity"
msgstr "Aktivität"
@@ -62,11 +66,11 @@ msgid "Add a card"
msgstr "Karte hinzufügen"
#: src/views/card/components/NewCommentForm.tsx:57
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/Comment.tsx:144
msgid "Add a comment..."
msgstr "Kommentar hinzufügen..."
#: src/components/Editor.tsx:303
#: src/components/Editor.tsx:302
msgid "Add description... (type '/' to open commands)"
msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen)"
@@ -75,7 +79,7 @@ msgstr "Beschreibung hinzufügen... (tippe '/' um Befehle zu öffnen)"
msgid "Add label"
msgstr "Label hinzufügen"
#: src/views/members/components/InviteMemberForm.tsx:85
#: src/views/members/components/InviteMemberForm.tsx:50
#: src/views/card/components/MemberSelector.tsx:130
msgid "Add member"
msgstr "Mitglied hinzufügen"
@@ -108,11 +112,11 @@ msgstr "Alle Systeme funktionieren"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Du hast bereits ein Konto? <0><1>Anmelden</1></0>"
#: src/views/settings/index.tsx:100
#: src/views/settings/index.tsx:77
msgid "An error occurred while disconnecting your Trello account."
msgstr "Beim Trennen deines Trello-Kontos ist ein Fehler aufgetreten."
#: src/views/settings/index.tsx:257
#: src/views/settings/index.tsx:229
msgid "API keys"
msgstr "API-Schlüssel"
@@ -145,10 +149,6 @@ msgstr "Bist du sicher, dass du diese Karte löschen möchtest?"
msgid "Are you sure you want to delete this comment?"
msgstr "Bist du sicher, dass du diesen Kommentar löschen möchtest?"
#: src/components/DeleteLabelConfirmation.tsx:39
msgid "Are you sure you want to delete this label?"
msgstr "Sind Sie sicher, dass Sie dieses Label löschen möchten?"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
msgid "Are you sure you want to delete your account?"
msgstr "Bist du sicher, dass du dein Konto löschen möchtest?"
@@ -169,12 +169,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Einfaches Kanban"
#: src/views/settings/index.tsx:196
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Abrechnung"
#: src/views/settings/index.tsx:206
#: src/views/settings/index.tsx:178
msgid "Billing portal"
msgstr "Abrechnungsportal"
@@ -182,7 +182,7 @@ msgstr "Abrechnungsportal"
msgid "Blog Post"
msgstr "Blogbeitrag"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Board"
@@ -194,8 +194,7 @@ msgstr "Der Name des Boards darf 100 Zeichen nicht überschreiten"
msgid "Board name is required"
msgstr "Boardname ist erforderlich"
#: src/views/public/board/index.tsx:143
#: src/views/board/index.tsx:358
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Board nicht gefunden"
@@ -207,7 +206,7 @@ msgstr "Board-URL darf nur Buchstaben, Zahlen und Bindestriche enthalten"
msgid "Board URL cannot exceed 60 characters"
msgstr "Board-URL darf 60 Zeichen nicht überschreiten"
#: src/views/public/board/index.tsx:59
#: src/views/public/board/index.tsx:53
msgid "Board URL copied to clipboard"
msgstr "Board-URL in die Zwischenablage kopiert"
@@ -223,13 +222,13 @@ msgstr "Board-Sichtbarkeit"
msgid "Board visibility updated"
msgstr "Board-Sichtbarkeit aktualisiert"
#: src/views/boards/index.tsx:27
#: src/components/SideNavigation.tsx:68
#: src/views/boards/index.tsx:25
#: src/components/SideNavigation.tsx:39
msgid "Boards"
msgstr "Boards"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/boards/index.tsx:23
#: src/views/boards/index.tsx:21
msgid "Boards | {0}"
msgstr "Boards | {0}"
@@ -251,20 +250,19 @@ msgstr "Fehlerbericht"
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/Comment.tsx:158
#: src/components/DeleteLabelConfirmation.tsx:47
#: src/views/card/components/Comment.tsx:156
msgid "Cancel"
msgstr "Abbrechen"
#: src/views/card/index.tsx:234
#: src/views/card/index.tsx:193
msgid "Card not found"
msgstr "Karte nicht gefunden"
#: src/views/board/components/NewCardForm.tsx:278
#: src/views/board/components/NewCardForm.tsx:254
msgid "Card title"
msgstr "Kartentitel"
#: src/views/settings/index.tsx:188
#: src/views/settings/index.tsx:160
msgid "Change the language of the app."
msgstr "Ändere die Sprache der App."
@@ -314,7 +312,7 @@ msgstr "Vollständige Kontrolle und Eigentum:"
msgid "Confirm URL change"
msgstr "URL-Änderung bestätigen"
#: src/views/settings/index.tsx:233
#: src/views/settings/index.tsx:205
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Trello verbinden"
@@ -323,7 +321,7 @@ msgstr "Trello verbinden"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Verbinde deine Lieblingstools, um deinen Arbeitsablauf zu optimieren."
#: src/views/settings/index.tsx:220
#: src/views/settings/index.tsx:192
msgid "Connect your Trello account to import boards."
msgstr "Verbinde dein Trello-Konto, um Boards zu importieren."
@@ -331,7 +329,7 @@ msgstr "Verbinde dein Trello-Konto, um Boards zu importieren."
msgid "Contact"
msgstr "Kontakt"
#: src/components/FeedbackModal.tsx:100
#: src/components/FeedbackButton.tsx:121
msgid "Contact us"
msgstr "Kontaktiere uns"
@@ -339,12 +337,12 @@ msgstr "Kontaktiere uns"
msgid "Content Creation"
msgstr "Content-Erstellung"
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Fortfahren mit "
#. placeholder {0}: provider.name
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:268
msgid "Continue with {0}"
msgstr "Fortfahren mit {0}"
@@ -353,7 +351,7 @@ msgid "Control who can view and edit your boards."
msgstr "Kontrolliere, wer deine Boards ansehen und bearbeiten kann."
#: src/views/board/components/NewListForm.tsx:140
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/board/components/NewCardForm.tsx:391
#: src/components/LabelForm.tsx:212
msgid "Create another"
msgstr "Weitere erstellen"
@@ -362,15 +360,15 @@ msgstr "Weitere erstellen"
msgid "Create board"
msgstr "Board erstellen"
#: src/views/board/components/NewCardForm.tsx:428
#: src/views/board/components/NewCardForm.tsx:401
msgid "Create card"
msgstr "Karte erstellen"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Create label"
msgstr "Label erstellen"
#: src/views/board/components/NewListForm.tsx:152
#: src/views/board/components/NewListForm.tsx:148
msgid "Create list"
msgstr "Liste erstellen"
@@ -383,16 +381,16 @@ msgid "Create new key"
msgstr "Neuen Schlüssel erstellen"
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:354
#: src/views/board/components/NewCardForm.tsx:327
msgid "Create new label"
msgstr "Neues Label erstellen"
#: src/views/board/index.tsx:426
#: src/views/board/index.tsx:327
msgid "Create new list"
msgstr "Neue Liste erstellen"
#: src/components/WorkspaceMenu.tsx:116
#: src/components/NewWorkspaceForm.tsx:93
#: src/components/WorkspaceMenu.tsx:85
#: src/components/NewWorkspaceForm.tsx:91
msgid "Create workspace"
msgstr "Arbeitsbereich erstellen"
@@ -416,19 +414,18 @@ msgstr "Benutzerdefinierte URLs sind eine Premium-Funktion. Du wirst zur Aktuali
msgid "Customer Support"
msgstr "Kundensupport"
#: src/components/UserMenu.tsx:153
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Dunkel"
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/components/LabelForm.tsx:226
#: src/components/DeleteLabelConfirmation.tsx:49
msgid "Delete"
msgstr "Löschen"
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:270
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Konto löschen"
@@ -441,7 +438,7 @@ msgstr "Board löschen"
msgid "Delete card"
msgstr "Karte löschen"
#: src/views/card/components/Comment.tsx:91
#: src/views/card/components/Comment.tsx:89
msgid "Delete comment"
msgstr "Kommentar löschen"
@@ -449,8 +446,8 @@ msgstr "Kommentar löschen"
msgid "Delete list"
msgstr "Liste löschen"
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:253
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Workspace löschen"
@@ -459,7 +456,7 @@ msgstr "Workspace löschen"
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:248
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Trello trennen"
@@ -467,7 +464,7 @@ msgstr "Trello trennen"
msgid "Discuss and collaborate on cards."
msgstr "Diskutiere und arbeite gemeinsam an Karten."
#: src/views/settings/index.tsx:149
#: src/views/settings/index.tsx:123
msgid "Display name"
msgstr "Anzeigename"
@@ -487,7 +484,7 @@ msgstr "Anzeigename aktualisiert"
msgid "Do you offer a free plan?"
msgstr "Bietet ihr einen kostenlosen Plan an?"
#: src/components/FeedbackModal.tsx:109
#: src/components/FeedbackButton.tsx:130
msgid "docs"
msgstr "Dokumente"
@@ -497,7 +494,6 @@ msgstr "Dokumente"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
#: src/components/UserMenu.tsx:191
msgid "Documentation"
msgstr "Dokumentation"
@@ -517,7 +513,7 @@ msgstr "Erledigt"
msgid "Edit board URL"
msgstr "Board-URL bearbeiten"
#: src/views/card/components/Comment.tsx:82
#: src/views/card/components/Comment.tsx:80
msgid "Edit comment"
msgstr "Kommentar bearbeiten"
@@ -525,19 +521,15 @@ msgstr "Kommentar bearbeiten"
msgid "Edit label"
msgstr "Label bearbeiten"
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
msgid "Edit workspace URL"
msgstr "Workspace-URL bearbeiten"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Bearbeitung"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "E-Mail"
#: src/views/members/components/InviteMemberForm.tsx:99
#: src/views/members/components/InviteMemberForm.tsx:64
msgid "Email"
msgstr "E-Mail"
@@ -545,15 +537,15 @@ msgstr "E-Mail"
msgid "Enhancement"
msgstr "Verbesserung"
#: src/components/AuthForm.tsx:302
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Gib deine E-Mail-Adresse ein"
#: src/components/AuthForm.tsx:290
#: src/components/AuthForm.tsx:289
msgid "Enter your name"
msgstr "Gib deinen Namen ein"
#: src/components/AuthForm.tsx:315
#: src/components/AuthForm.tsx:314
msgid "Enter your password"
msgstr "Gib dein Passwort ein"
@@ -561,28 +553,19 @@ msgstr "Gib dein Passwort ein"
msgid "Error deleting account"
msgstr "Fehler beim Löschen des Kontos"
#: src/components/DeleteLabelConfirmation.tsx:22
msgid "Error deleting label"
msgstr "Fehler beim Löschen des Labels"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
msgid "Error deleting workspace"
msgstr "Fehler beim Löschen des Arbeitsbereichs"
#: src/views/settings/index.tsx:99
#: src/views/settings/index.tsx:76
msgid "Error disconnecting Trello"
msgstr "Fehler beim Trennen von Trello"
#: src/views/members/components/InviteMemberForm.tsx:57
#: src/views/members/components/InviteMemberForm.tsx:63
msgid "Error inviting member"
msgstr "Fehler beim Einladen des Mitglieds"
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
msgid "Error updating display name"
msgstr "Fehler beim Aktualisieren des Anzeigenamens"
#: src/views/settings/components/Avatar.tsx:39
#: src/views/settings/components/Avatar.tsx:37
msgid "Error updating profile image"
msgstr "Fehler beim Aktualisieren des Profilbilds"
@@ -598,8 +581,8 @@ msgstr "Fehler beim Aktualisieren des Arbeitsbereichsnamens"
msgid "Error updating workspace URL"
msgstr "Fehler beim Aktualisieren der Workspace-URL"
#: src/views/settings/components/Avatar.tsx:56
#: src/views/settings/components/Avatar.tsx:97
#: src/views/settings/components/Avatar.tsx:54
#: src/views/settings/components/Avatar.tsx:95
msgid "Error uploading profile image"
msgstr "Fehler beim Hochladen des Profilbilds"
@@ -639,12 +622,11 @@ msgstr "Feature-Anfrage"
msgid "Features"
msgstr "Features"
#: src/components/UserMenu.tsx:199
#: src/components/FeedbackModal.tsx:59
#: src/components/FeedbackButton.tsx:78
msgid "Feedback"
msgstr "Feedback"
#: src/components/FeedbackModal.tsx:33
#: src/components/FeedbackButton.tsx:38
msgid "Feedback sent"
msgstr "Feedback gesendet"
@@ -692,7 +674,7 @@ msgstr "Loslegen"
msgid "Get started by creating a new board"
msgstr "Beginne, indem du ein neues Board erstellst"
#: src/views/board/index.tsx:418
#: src/views/board/index.tsx:319
msgid "Get started by creating a new list"
msgstr "Beginne mit dem Erstellen einer neuen Liste"
@@ -765,11 +747,11 @@ msgstr "Ich bestätige, dass alle Daten des Arbeitsbereichs dauerhaft gelöscht
msgid "Ideas"
msgstr "Ideen"
#: src/components/FeedbackModal.tsx:75
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Ideen zur Verbesserung dieser Seite..."
#: src/views/boards/index.tsx:38
#: src/views/boards/index.tsx:39
msgid "Import"
msgstr "Importieren"
@@ -815,19 +797,11 @@ msgstr "Integrationen"
msgid "Interviewing"
msgstr "Vorstellungsgespräch"
#: src/views/members/components/InviteMemberForm.tsx:26
msgid "Invalid email address"
msgstr "Ungültige E-Mail-Adresse"
#: src/views/members/index.tsx:169
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Einladen"
#: src/views/members/components/InviteMemberForm.tsx:113
msgid "Invite another"
msgstr "Weitere Person einladen"
#: src/views/members/components/InviteMemberForm.tsx:123
#: src/views/members/components/InviteMemberForm.tsx:82
#: src/views/card/components/MemberSelector.tsx:112
msgid "Invite member"
msgstr "Mitglied einladen"
@@ -849,8 +823,8 @@ msgstr "Kanban neu gedacht"
msgid "Keep in mind that this action is irreversible."
msgstr "Beachten Sie, dass diese Aktion nicht rückgängig gemacht werden kann."
#: src/views/card/index.tsx:113
#: src/views/board/components/NewCardForm.tsx:358
#: src/views/card/index.tsx:243
#: src/views/board/components/NewCardForm.tsx:331
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
msgstr "Labels"
@@ -859,7 +833,7 @@ msgstr "Labels"
msgid "Labels & Filters"
msgstr "Labels & Filter"
#: src/views/settings/index.tsx:185
#: src/views/settings/index.tsx:157
msgid "Language"
msgstr "Sprache"
@@ -875,15 +849,15 @@ msgstr "Rechtliches"
msgid "License"
msgstr "Lizenz"
#: src/components/UserMenu.tsx:167
#: src/components/UserMenu.tsx:126
msgid "Light"
msgstr "Hell"
#: src/views/public/board/index.tsx:57
#: src/views/public/board/index.tsx:51
msgid "Link copied"
msgstr "Link kopiert"
#: src/views/card/index.tsx:105
#: src/views/card/index.tsx:235
msgid "List"
msgstr "Liste"
@@ -895,7 +869,7 @@ msgstr "Listenname"
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
#: src/components/UserMenu.tsx:209
#: src/components/UserMenu.tsx:136
msgid "Logout"
msgstr "Abmelden"
@@ -907,7 +881,7 @@ msgstr "Langfristig"
msgid "Low Priority"
msgstr "Niedrige Priorität"
#: src/components/AuthForm.tsx:338
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "Magic Link"
@@ -915,16 +889,16 @@ msgstr "Magic Link"
msgid "Medium Priority"
msgstr "Mittlere Priorität"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:121
#: src/views/board/components/NewCardForm.tsx:317
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
#: src/components/SideNavigation.tsx:44
msgid "Members"
msgstr "Mitglieder"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:157
#: src/views/members/index.tsx:144
msgid "Members | {0}"
msgstr "Mitglieder | {0}"
@@ -945,11 +919,11 @@ msgstr "hat die Karte in eine andere Liste verschoben"
msgid "Name"
msgstr "Name"
#: src/components/FeedbackModal.tsx:95
#: src/components/FeedbackButton.tsx:116
msgid "Need help?"
msgstr "Brauchst du Hilfe?"
#: src/views/boards/index.tsx:48
#: src/views/boards/index.tsx:52
msgid "New"
msgstr "Neu"
@@ -957,7 +931,7 @@ msgstr "Neu"
msgid "New board"
msgstr "Neues Board"
#: src/views/board/components/NewCardForm.tsx:261
#: src/views/board/components/NewCardForm.tsx:237
msgid "New card"
msgstr "Neue Karte"
@@ -969,7 +943,7 @@ msgstr "Neuer Import"
msgid "New label"
msgstr "Neues Label"
#: src/views/board/index.tsx:395
#: src/views/board/index.tsx:296
#: src/views/board/components/NewListForm.tsx:112
msgid "New list"
msgstr "Neue Liste"
@@ -978,7 +952,7 @@ msgstr "Neue Liste"
msgid "New Ticket"
msgstr "Neues Ticket"
#: src/components/NewWorkspaceForm.tsx:64
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Neuer Workspace"
@@ -1002,7 +976,7 @@ msgstr "Keine Boards gefunden"
msgid "No credit card required"
msgstr "Keine Kreditkarte erforderlich"
#: src/views/board/index.tsx:415
#: src/views/board/index.tsx:316
msgid "No lists"
msgstr "Keine Listen"
@@ -1014,15 +988,15 @@ msgstr "Angebot"
msgid "Onboarding"
msgstr "Einarbeitung"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Sobald Sie Ihr Konto löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
#: src/views/settings/index.tsx:273
#: src/views/settings/index.tsx:245
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Sobald Sie Ihren Arbeitsbereich löschen, gibt es kein Zurück mehr. Diese Aktion kann nicht rückgängig gemacht werden."
#: src/components/AuthForm.tsx:280
#: src/components/AuthForm.tsx:279
msgid "or"
msgstr "oder"
@@ -1042,7 +1016,7 @@ msgstr "Teilzeit"
msgid "Payment frequency"
msgstr "Zahlungshäufigkeit"
#: src/views/members/index.tsx:118
#: src/views/members/index.tsx:107
msgid "Pending"
msgstr "Ausstehend"
@@ -1059,19 +1033,19 @@ msgstr "Persönliches Projekt"
msgid "Planning"
msgstr "Planung"
#: src/components/AuthForm.tsx:306
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Bitte gib eine gültige E-Mail-Adresse ein"
#: src/components/AuthForm.tsx:294
#: src/components/AuthForm.tsx:293
msgid "Please enter a valid name"
msgstr "Bitte gib einen gültigen Namen ein"
#: src/components/AuthForm.tsx:319
#: src/components/AuthForm.tsx:318
msgid "Please enter a valid password"
msgstr "Bitte gib ein gültiges Passwort ein"
#: src/views/settings/components/Avatar.tsx:57
#: src/views/settings/components/Avatar.tsx:55
msgid "Please select a file to upload."
msgstr "Bitte wähle eine Datei zum Hochladen aus."
@@ -1081,28 +1055,26 @@ msgstr "Bitte wähle eine Datei zum Hochladen aus."
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/Avatar.tsx:40
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/settings/components/Avatar.tsx:38
#: src/views/settings/components/Avatar.tsx:96
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:159
#: src/views/card/index.tsx:116
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:62
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/board/index.tsx:135
#: src/views/board/index.tsx:191
#: src/views/board/index.tsx:133
#: src/views/board/index.tsx:189
#: src/views/board/components/VisibilityButton.tsx:53
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
#: src/views/board/components/NewListForm.tsx:78
#: src/views/board/components/NewCardForm.tsx:145
#: src/components/NewWorkspaceForm.tsx:41
#: src/components/FeedbackModal.tsx:41
#: src/components/DeleteLabelConfirmation.tsx:23
#: src/views/board/components/NewCardForm.tsx:128
#: src/components/NewWorkspaceForm.tsx:39
#: src/components/FeedbackButton.tsx:46
msgid "Please try again later, or contact customer support."
msgstr "Bitte versuche es später noch einmal oder kontaktiere den Kundensupport."
@@ -1124,11 +1096,11 @@ msgstr "Datenschutzrichtlinie"
msgid "Private"
msgstr "Privat"
#: src/views/settings/components/Avatar.tsx:26
#: src/views/settings/components/Avatar.tsx:24
msgid "Profile image updated"
msgstr "Profilbild aktualisiert"
#: src/views/settings/index.tsx:144
#: src/views/settings/index.tsx:118
msgid "Profile picture"
msgstr "Profilbild"
@@ -1164,7 +1136,7 @@ msgstr "Remote"
msgid "Remove"
msgstr "Entfernen"
#: src/views/members/index.tsx:132
#: src/views/members/index.tsx:120
msgid "Remove member"
msgstr "Mitglied entfernen"
@@ -1205,7 +1177,7 @@ msgstr "Widerrufen"
msgid "Roadmap"
msgstr "Roadmap"
#: src/views/members/index.tsx:191
#: src/views/members/index.tsx:178
msgid "Role"
msgstr "Rolle"
@@ -1213,7 +1185,7 @@ msgstr "Rolle"
msgid "Run on your own infrastructure"
msgstr "Auf eigener Infrastruktur betreiben"
#: src/views/card/components/Comment.tsx:165
#: src/views/card/components/Comment.tsx:163
msgid "Save"
msgstr "Speichern"
@@ -1245,21 +1217,21 @@ msgstr "Selbst hosten mit Github"
msgid "self-assigned the card"
msgstr "hat sich selbst die Karte zugewiesen"
#: src/components/FeedbackModal.tsx:116
msgid "Send feedback"
msgstr "Feedback senden"
#: src/components/FeedbackButton.tsx:137
msgid "Send"
msgstr "Senden"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
msgstr "Einstellungen"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:134
#: src/views/settings/index.tsx:108
msgid "Settings | {0}"
msgstr "Einstellungen | {0}"
@@ -1281,7 +1253,7 @@ msgstr "Registrierung deaktiviert"
msgid "Sign up is currently disabled. Please try again later."
msgstr "Die Registrierung ist derzeit deaktiviert. Bitte versuche es später erneut."
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Sign up with "
msgstr "Registrieren mit "
@@ -1310,15 +1282,11 @@ msgstr "Stern auf Github"
msgid "Success"
msgstr "Erfolg"
#: src/components/UserMenu.tsx:180
msgid "Support"
msgstr "Support"
#: src/views/home/components/Pricing.tsx:57
msgid "Support the development of the project"
msgstr "Unterstütze die Entwicklung des Projekts"
#: src/components/UserMenu.tsx:139
#: src/components/UserMenu.tsx:98
msgid "System"
msgstr "System"
@@ -1334,7 +1302,7 @@ msgstr "Vorlagen"
msgid "Terms of service"
msgstr "Nutzungsbedingungen"
#: src/components/FeedbackModal.tsx:34
#: src/components/FeedbackButton.tsx:39
msgid "Thank you for your feedback!"
msgstr "Vielen Dank für dein Feedback!"
@@ -1351,7 +1319,7 @@ msgstr "Die open source <0/> alternative zu Trello"
msgid "The visibility of your board has been set to {0}."
msgstr "Die Sichtbarkeit deines Boards wurde auf {0} gesetzt."
#: src/components/UserMenu.tsx:126
#: src/components/UserMenu.tsx:85
msgid "Theme"
msgstr "Design"
@@ -1361,14 +1329,9 @@ msgstr "Sie werden keinen Zugriff mehr auf diesen Workspace haben."
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/components/DeleteLabelConfirmation.tsx:42
msgid "This action can't be undone."
msgstr "Diese Aktion kann nicht rückgängig gemacht werden."
#: src/views/public/board/index.tsx:146
msgid "This board is private or does not exist"
msgstr "Dieses Board ist privat oder existiert nicht"
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
msgid "This board URL has already been taken"
msgstr "Diese Board-URL ist bereits vergeben"
@@ -1398,7 +1361,7 @@ msgstr "Menü umschalten"
msgid "Track all card changes with detailed activity history."
msgstr "Verfolge alle kartenänderungen mit detaillierter aktivitätshistorie."
#: src/views/settings/index.tsx:92
#: src/views/settings/index.tsx:69
msgid "Trello disconnected"
msgstr "Trello getrennt"
@@ -1414,7 +1377,7 @@ msgstr "Priorisierung"
msgid "Unable to add comment"
msgstr "Kommentar konnte nicht hinzugefügt werden"
#: src/views/board/components/NewCardForm.tsx:142
#: src/views/board/components/NewCardForm.tsx:125
msgid "Unable to create card"
msgstr "Karte konnte nicht erstellt werden"
@@ -1422,7 +1385,7 @@ msgstr "Karte konnte nicht erstellt werden"
msgid "Unable to create list"
msgstr "Liste konnte nicht erstellt werden"
#: src/components/NewWorkspaceForm.tsx:40
#: src/components/NewWorkspaceForm.tsx:38
msgid "Unable to create workspace"
msgstr "Workspace konnte nicht erstellt werden"
@@ -1438,7 +1401,7 @@ msgstr "Kommentar konnte nicht gelöscht werden"
msgid "Unable to remove member"
msgstr "Mitglied konnte nicht entfernt werden"
#: src/components/FeedbackModal.tsx:40
#: src/components/FeedbackButton.tsx:45
msgid "Unable to send feedback"
msgstr "Feedback konnte nicht gesendet werden"
@@ -1450,12 +1413,12 @@ msgstr "Board-URL kann nicht aktualisiert werden"
msgid "Unable to update board visibility"
msgstr "Board-Sichtbarkeit konnte nicht aktualisiert werden"
#: src/views/card/index.tsx:158
#: src/views/board/index.tsx:190
#: src/views/card/index.tsx:115
#: src/views/board/index.tsx:188
msgid "Unable to update card"
msgstr "Karte konnte nicht aktualisiert werden"
#: src/views/card/components/Comment.tsx:63
#: src/views/card/components/Comment.tsx:61
msgid "Unable to update comment"
msgstr "Kommentar konnte nicht aktualisiert werden"
@@ -1464,7 +1427,7 @@ msgid "Unable to update labels"
msgstr "Labels konnten nicht aktualisiert werden"
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:134
#: src/views/board/index.tsx:132
msgid "Unable to update list"
msgstr "Liste konnte nicht aktualisiert werden"
@@ -1508,11 +1471,11 @@ msgstr "Unbegrenzte listen"
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
msgid "Update"
msgstr "Aktualisieren"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Update label"
msgstr "Label aktualisieren"
@@ -1553,23 +1516,19 @@ msgstr "URL muss mindestens 3 Zeichen lang sein"
msgid "Use template"
msgstr "Vorlage verwenden"
#: src/views/members/index.tsx:185
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Benutzer"
#: src/views/members/components/InviteMemberForm.tsx:58
msgid "User is already a member of this workspace"
msgstr "Benutzer ist bereits Mitglied dieses Arbeitsbereichs"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "API-Schlüssel anzeigen und verwalten."
#: src/views/settings/index.tsx:199
#: src/views/settings/index.tsx:171
msgid "View and manage your billing and subscription."
msgstr "Verwalte deine Abrechnung und dein Abonnement."
@@ -1577,18 +1536,10 @@ msgstr "Verwalte deine Abrechnung und dein Abonnement."
msgid "View docs"
msgstr "Dokumentation ansehen"
#: src/views/public/board/index.tsx:120
msgid "View only"
msgstr "Nur ansehen"
#: src/views/home/components/Features.tsx:147
msgid "View our roadmap."
msgstr "Sieh dir unsere roadmap an."
#: src/views/public/board/index.tsx:149
msgid "View workspace"
msgstr "Workspace anzeigen"
#: src/views/board/components/VisibilityButton.tsx:91
msgid "Visibility"
msgstr "Sichtbarkeit"
@@ -1621,7 +1572,7 @@ msgstr "Als Trello 2011 auf den markt kam, beeindruckte es alle mit seiner sorgf
msgid "Why make an open source Trello?"
msgstr "Warum ein open source Trello entwickeln?"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Workspace"
msgstr "Arbeitsbereich"
@@ -1629,7 +1580,7 @@ msgstr "Arbeitsbereich"
msgid "Workspace deleted"
msgstr "Workspace gelöscht"
#: src/views/settings/index.tsx:175
#: src/views/settings/index.tsx:147
msgid "Workspace description"
msgstr "Workspace-Beschreibung"
@@ -1650,8 +1601,8 @@ msgstr "Workspace-Beschreibung aktualisiert"
msgid "Workspace members"
msgstr "Workspace-mitglieder"
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
#: src/views/settings/index.tsx:130
#: src/components/NewWorkspaceForm.tsx:78
msgid "Workspace name"
msgstr "Name des Workspaces"
@@ -1671,7 +1622,7 @@ msgstr "Workspace-Name aktualisiert"
msgid "Workspace slug updated"
msgstr "Workspace-Slug aktualisiert"
#: src/views/settings/index.tsx:165
#: src/views/settings/index.tsx:138
msgid "Workspace URL"
msgstr "Workspace-URL"
@@ -1719,15 +1670,15 @@ msgstr "Deine Boards wurden importiert."
msgid "Your display name has been updated."
msgstr "Dein Anzeigename wurde aktualisiert."
#: src/views/settings/components/Avatar.tsx:27
#: src/views/settings/components/Avatar.tsx:25
msgid "Your profile image has been updated."
msgstr "Dein Profilbild wurde aktualisiert."
#: src/views/settings/index.tsx:93
#: src/views/settings/index.tsx:70
msgid "Your Trello account has been disconnected."
msgstr "Dein Trello-Konto wurde getrennt."
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:214
msgid "Your Trello account is connected."
msgstr "Dein Trello-Konto ist verbunden."

File diff suppressed because one or more lines are too long

View File

@@ -13,22 +13,22 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:123
#: src/views/card/components/Comment.tsx:121
msgid " (edited)"
msgstr " (edited)"
#: src/components/FeedbackModal.tsx:102
#: src/components/FeedbackButton.tsx:123
msgid ", or see our"
msgstr ", or see our"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:189
#: src/views/card/index.tsx:148
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:392
#: src/views/board/components/NewCardForm.tsx:365
msgid "{0} labels"
msgstr "{0} labels"
@@ -37,8 +37,8 @@ msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardC
msgstr "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
#: src/views/home/index.tsx:51
#~ msgid "#1 Hacker News"
#~ msgstr "#1 Hacker News"
msgid "#1 Hacker News"
msgstr "#1 Hacker News"
#: src/views/home/components/Pricing.tsx:36
msgid "1 user"
@@ -60,8 +60,8 @@ msgstr "A powerful, flexible kanban app that helps you organise work, track prog
msgid "Account deleted"
msgstr "Account deleted"
#: src/views/public/board/CardModal.tsx:128
#: src/views/card/index.tsx:256
#: src/views/public/board/CardModal.tsx:104
#: src/views/card/index.tsx:215
msgid "Activity"
msgstr "Activity"
@@ -74,11 +74,11 @@ msgid "Add a card"
msgstr "Add a card"
#: src/views/card/components/NewCommentForm.tsx:57
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/Comment.tsx:144
msgid "Add a comment..."
msgstr "Add a comment..."
#: src/components/Editor.tsx:303
#: src/components/Editor.tsx:302
msgid "Add description... (type '/' to open commands)"
msgstr "Add description... (type '/' to open commands)"
@@ -87,7 +87,7 @@ msgstr "Add description... (type '/' to open commands)"
msgid "Add label"
msgstr "Add label"
#: src/views/members/components/InviteMemberForm.tsx:85
#: src/views/members/components/InviteMemberForm.tsx:50
#: src/views/card/components/MemberSelector.tsx:130
msgid "Add member"
msgstr "Add member"
@@ -120,11 +120,11 @@ msgstr "All systems operational"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Already have an account? <0><1>Sign in</1></0>"
#: src/views/settings/index.tsx:100
#: src/views/settings/index.tsx:77
msgid "An error occurred while disconnecting your Trello account."
msgstr "An error occurred while disconnecting your Trello account."
#: src/views/settings/index.tsx:257
#: src/views/settings/index.tsx:229
msgid "API keys"
msgstr "API keys"
@@ -161,10 +161,6 @@ msgstr "Are you sure you want to delete this card?"
msgid "Are you sure you want to delete this comment?"
msgstr "Are you sure you want to delete this comment?"
#: src/components/DeleteLabelConfirmation.tsx:39
msgid "Are you sure you want to delete this label?"
msgstr "Are you sure you want to delete this label?"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
msgid "Are you sure you want to delete your account?"
msgstr "Are you sure you want to delete your account?"
@@ -189,12 +185,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Basic Kanban"
#: src/views/settings/index.tsx:196
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Billing"
#: src/views/settings/index.tsx:206
#: src/views/settings/index.tsx:178
msgid "Billing portal"
msgstr "Billing portal"
@@ -202,7 +198,7 @@ msgstr "Billing portal"
msgid "Blog Post"
msgstr "Blog Post"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Board"
@@ -218,8 +214,7 @@ msgstr "Board name cannot exceed 100 characters"
msgid "Board name is required"
msgstr "Board name is required"
#: src/views/public/board/index.tsx:143
#: src/views/board/index.tsx:358
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Board not found"
@@ -231,7 +226,7 @@ msgstr "Board URL can only contain letters, numbers, and hyphens"
msgid "Board URL cannot exceed 60 characters"
msgstr "Board URL cannot exceed 60 characters"
#: src/views/public/board/index.tsx:59
#: src/views/public/board/index.tsx:53
msgid "Board URL copied to clipboard"
msgstr "Board URL copied to clipboard"
@@ -247,13 +242,13 @@ msgstr "Board visibility"
msgid "Board visibility updated"
msgstr "Board visibility updated"
#: src/views/boards/index.tsx:27
#: src/components/SideNavigation.tsx:68
#: src/views/boards/index.tsx:25
#: src/components/SideNavigation.tsx:39
msgid "Boards"
msgstr "Boards"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/boards/index.tsx:23
#: src/views/boards/index.tsx:21
msgid "Boards | {0}"
msgstr "Boards | {0}"
@@ -279,20 +274,19 @@ msgstr "Bug Report"
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/Comment.tsx:158
#: src/components/DeleteLabelConfirmation.tsx:47
#: src/views/card/components/Comment.tsx:156
msgid "Cancel"
msgstr "Cancel"
#: src/views/card/index.tsx:234
#: src/views/card/index.tsx:193
msgid "Card not found"
msgstr "Card not found"
#: src/views/board/components/NewCardForm.tsx:278
#: src/views/board/components/NewCardForm.tsx:254
msgid "Card title"
msgstr "Card title"
#: src/views/settings/index.tsx:188
#: src/views/settings/index.tsx:160
msgid "Change the language of the app."
msgstr "Change the language of the app."
@@ -342,7 +336,7 @@ msgstr "Complete control and ownership:"
msgid "Confirm URL change"
msgstr "Confirm URL change"
#: src/views/settings/index.tsx:233
#: src/views/settings/index.tsx:205
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Connect Trello"
@@ -351,7 +345,7 @@ msgstr "Connect Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Connect your favorite tools to streamline your workflow."
#: src/views/settings/index.tsx:220
#: src/views/settings/index.tsx:192
msgid "Connect your Trello account to import boards."
msgstr "Connect your Trello account to import boards."
@@ -359,7 +353,7 @@ msgstr "Connect your Trello account to import boards."
msgid "Contact"
msgstr "Contact"
#: src/components/FeedbackModal.tsx:100
#: src/components/FeedbackButton.tsx:121
msgid "Contact us"
msgstr "Contact us"
@@ -367,12 +361,12 @@ msgstr "Contact us"
msgid "Content Creation"
msgstr "Content Creation"
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Continue with "
#. placeholder {0}: provider.name
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:268
msgid "Continue with {0}"
msgstr "Continue with {0}"
@@ -381,7 +375,7 @@ msgid "Control who can view and edit your boards."
msgstr "Control who can view and edit your boards."
#: src/views/board/components/NewListForm.tsx:140
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/board/components/NewCardForm.tsx:391
#: src/components/LabelForm.tsx:212
msgid "Create another"
msgstr "Create another"
@@ -398,15 +392,15 @@ msgstr "Create another"
msgid "Create board"
msgstr "Create board"
#: src/views/board/components/NewCardForm.tsx:428
#: src/views/board/components/NewCardForm.tsx:401
msgid "Create card"
msgstr "Create card"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Create label"
msgstr "Create label"
#: src/views/board/components/NewListForm.tsx:152
#: src/views/board/components/NewListForm.tsx:148
msgid "Create list"
msgstr "Create list"
@@ -419,16 +413,16 @@ msgid "Create new key"
msgstr "Create new key"
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:354
#: src/views/board/components/NewCardForm.tsx:327
msgid "Create new label"
msgstr "Create new label"
#: src/views/board/index.tsx:426
#: src/views/board/index.tsx:327
msgid "Create new list"
msgstr "Create new list"
#: src/components/WorkspaceMenu.tsx:116
#: src/components/NewWorkspaceForm.tsx:93
#: src/components/WorkspaceMenu.tsx:85
#: src/components/NewWorkspaceForm.tsx:91
msgid "Create workspace"
msgstr "Create workspace"
@@ -452,19 +446,18 @@ msgstr "Custom URLs are a premium feature. You'll be directed to upgrade your ac
msgid "Customer Support"
msgstr "Customer Support"
#: src/components/UserMenu.tsx:153
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Dark"
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/components/LabelForm.tsx:226
#: src/components/DeleteLabelConfirmation.tsx:49
msgid "Delete"
msgstr "Delete"
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:270
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Delete account"
@@ -477,7 +470,7 @@ msgstr "Delete board"
msgid "Delete card"
msgstr "Delete card"
#: src/views/card/components/Comment.tsx:91
#: src/views/card/components/Comment.tsx:89
msgid "Delete comment"
msgstr "Delete comment"
@@ -485,8 +478,8 @@ msgstr "Delete comment"
msgid "Delete list"
msgstr "Delete list"
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:253
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Delete workspace"
@@ -495,7 +488,7 @@ msgstr "Delete workspace"
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:248
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Disconnect Trello"
@@ -503,7 +496,7 @@ msgstr "Disconnect Trello"
msgid "Discuss and collaborate on cards."
msgstr "Discuss and collaborate on cards."
#: src/views/settings/index.tsx:149
#: src/views/settings/index.tsx:123
msgid "Display name"
msgstr "Display name"
@@ -523,7 +516,7 @@ msgstr "Display name updated"
msgid "Do you offer a free plan?"
msgstr "Do you offer a free plan?"
#: src/components/FeedbackModal.tsx:109
#: src/components/FeedbackButton.tsx:130
msgid "docs"
msgstr "docs"
@@ -533,7 +526,6 @@ msgstr "Docs"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
#: src/components/UserMenu.tsx:191
msgid "Documentation"
msgstr "Documentation"
@@ -553,7 +545,7 @@ msgstr "Done"
msgid "Edit board URL"
msgstr "Edit board URL"
#: src/views/card/components/Comment.tsx:82
#: src/views/card/components/Comment.tsx:80
msgid "Edit comment"
msgstr "Edit comment"
@@ -561,19 +553,15 @@ msgstr "Edit comment"
msgid "Edit label"
msgstr "Edit label"
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
msgid "Edit workspace URL"
msgstr "Edit workspace URL"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Editing"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "email"
#: src/views/members/components/InviteMemberForm.tsx:99
#: src/views/members/components/InviteMemberForm.tsx:64
msgid "Email"
msgstr "Email"
@@ -581,15 +569,15 @@ msgstr "Email"
msgid "Enhancement"
msgstr "Enhancement"
#: src/components/AuthForm.tsx:302
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Enter your email address"
#: src/components/AuthForm.tsx:290
#: src/components/AuthForm.tsx:289
msgid "Enter your name"
msgstr "Enter your name"
#: src/components/AuthForm.tsx:315
#: src/components/AuthForm.tsx:314
msgid "Enter your password"
msgstr "Enter your password"
@@ -597,28 +585,19 @@ msgstr "Enter your password"
msgid "Error deleting account"
msgstr "Error deleting account"
#: src/components/DeleteLabelConfirmation.tsx:22
msgid "Error deleting label"
msgstr "Error deleting label"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
msgid "Error deleting workspace"
msgstr "Error deleting workspace"
#: src/views/settings/index.tsx:99
#: src/views/settings/index.tsx:76
msgid "Error disconnecting Trello"
msgstr "Error disconnecting Trello"
#: src/views/members/components/InviteMemberForm.tsx:57
#: src/views/members/components/InviteMemberForm.tsx:63
msgid "Error inviting member"
msgstr "Error inviting member"
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
msgid "Error updating display name"
msgstr "Error updating display name"
#: src/views/settings/components/Avatar.tsx:39
#: src/views/settings/components/Avatar.tsx:37
msgid "Error updating profile image"
msgstr "Error updating profile image"
@@ -634,8 +613,8 @@ msgstr "Error updating workspace name"
msgid "Error updating workspace URL"
msgstr "Error updating workspace URL"
#: src/views/settings/components/Avatar.tsx:56
#: src/views/settings/components/Avatar.tsx:97
#: src/views/settings/components/Avatar.tsx:54
#: src/views/settings/components/Avatar.tsx:95
msgid "Error uploading profile image"
msgstr "Error uploading profile image"
@@ -675,12 +654,11 @@ msgstr "Feature Request"
msgid "Features"
msgstr "Features"
#: src/components/UserMenu.tsx:199
#: src/components/FeedbackModal.tsx:59
#: src/components/FeedbackButton.tsx:78
msgid "Feedback"
msgstr "Feedback"
#: src/components/FeedbackModal.tsx:33
#: src/components/FeedbackButton.tsx:38
msgid "Feedback sent"
msgstr "Feedback sent"
@@ -729,7 +707,7 @@ msgstr "Get Started"
msgid "Get started by creating a new board"
msgstr "Get started by creating a new board"
#: src/views/board/index.tsx:418
#: src/views/board/index.tsx:319
msgid "Get started by creating a new list"
msgstr "Get started by creating a new list"
@@ -802,7 +780,7 @@ msgstr "I acknowledge that all of the workspace data will be permanently deleted
msgid "Ideas"
msgstr "Ideas"
#: src/components/FeedbackModal.tsx:75
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Ideas to improve this page..."
@@ -810,7 +788,7 @@ msgstr "Ideas to improve this page..."
#~ msgid "Ideas, Research, Planning, Execution, Review, Next Steps, Complete"
#~ msgstr "Ideas, Research, Planning, Execution, Review, Next Steps, Complete"
#: src/views/boards/index.tsx:38
#: src/views/boards/index.tsx:39
msgid "Import"
msgstr "Import"
@@ -856,19 +834,11 @@ msgstr "Integrations"
msgid "Interviewing"
msgstr "Interviewing"
#: src/views/members/components/InviteMemberForm.tsx:26
msgid "Invalid email address"
msgstr "Invalid email address"
#: src/views/members/index.tsx:169
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Invite"
#: src/views/members/components/InviteMemberForm.tsx:113
msgid "Invite another"
msgstr "Invite another"
#: src/views/members/components/InviteMemberForm.tsx:123
#: src/views/members/components/InviteMemberForm.tsx:82
#: src/views/card/components/MemberSelector.tsx:112
msgid "Invite member"
msgstr "Invite member"
@@ -890,8 +860,8 @@ msgstr "Kanban reimagined"
msgid "Keep in mind that this action is irreversible."
msgstr "Keep in mind that this action is irreversible."
#: src/views/card/index.tsx:113
#: src/views/board/components/NewCardForm.tsx:358
#: src/views/card/index.tsx:243
#: src/views/board/components/NewCardForm.tsx:331
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
msgstr "Labels"
@@ -900,7 +870,7 @@ msgstr "Labels"
msgid "Labels & Filters"
msgstr "Labels & Filters"
#: src/views/settings/index.tsx:185
#: src/views/settings/index.tsx:157
msgid "Language"
msgstr "Language"
@@ -916,15 +886,15 @@ msgstr "Legal"
msgid "License"
msgstr "License"
#: src/components/UserMenu.tsx:167
#: src/components/UserMenu.tsx:126
msgid "Light"
msgstr "Light"
#: src/views/public/board/index.tsx:57
#: src/views/public/board/index.tsx:51
msgid "Link copied"
msgstr "Link copied"
#: src/views/card/index.tsx:105
#: src/views/card/index.tsx:235
msgid "List"
msgstr "List"
@@ -936,7 +906,7 @@ msgstr "List name"
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
#: src/components/UserMenu.tsx:209
#: src/components/UserMenu.tsx:136
msgid "Logout"
msgstr "Logout"
@@ -948,7 +918,7 @@ msgstr "Long-term"
msgid "Low Priority"
msgstr "Low Priority"
#: src/components/AuthForm.tsx:338
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "magic link"
@@ -956,16 +926,16 @@ msgstr "magic link"
msgid "Medium Priority"
msgstr "Medium Priority"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:121
#: src/views/board/components/NewCardForm.tsx:317
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
#: src/components/SideNavigation.tsx:44
msgid "Members"
msgstr "Members"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:157
#: src/views/members/index.tsx:144
msgid "Members | {0}"
msgstr "Members | {0}"
@@ -986,11 +956,11 @@ msgstr "moved the card to another list"
msgid "Name"
msgstr "Name"
#: src/components/FeedbackModal.tsx:95
#: src/components/FeedbackButton.tsx:116
msgid "Need help?"
msgstr "Need help?"
#: src/views/boards/index.tsx:48
#: src/views/boards/index.tsx:52
msgid "New"
msgstr "New"
@@ -998,7 +968,7 @@ msgstr "New"
msgid "New board"
msgstr "New board"
#: src/views/board/components/NewCardForm.tsx:261
#: src/views/board/components/NewCardForm.tsx:237
msgid "New card"
msgstr "New card"
@@ -1010,7 +980,7 @@ msgstr "New import"
msgid "New label"
msgstr "New label"
#: src/views/board/index.tsx:395
#: src/views/board/index.tsx:296
#: src/views/board/components/NewListForm.tsx:112
msgid "New list"
msgstr "New list"
@@ -1023,7 +993,7 @@ msgstr "New Ticket"
#~ msgid "New Ticket, Triaging, In Progress, Awaiting Customer, Resolution, Done"
#~ msgstr "New Ticket, Triaging, In Progress, Awaiting Customer, Resolution, Done"
#: src/components/NewWorkspaceForm.tsx:64
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "New workspace"
@@ -1047,7 +1017,7 @@ msgstr "No boards found"
msgid "No credit card required"
msgstr "No credit card required"
#: src/views/board/index.tsx:415
#: src/views/board/index.tsx:316
msgid "No lists"
msgstr "No lists"
@@ -1059,15 +1029,15 @@ msgstr "Offer"
msgid "Onboarding"
msgstr "Onboarding"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Once you delete your account, there is no going back. This action cannot be undone."
#: src/views/settings/index.tsx:273
#: src/views/settings/index.tsx:245
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Once you delete your workspace, there is no going back. This action cannot be undone."
#: src/components/AuthForm.tsx:280
#: src/components/AuthForm.tsx:279
msgid "or"
msgstr "or"
@@ -1087,7 +1057,7 @@ msgstr "Part-time"
msgid "Payment frequency"
msgstr "Payment frequency"
#: src/views/members/index.tsx:118
#: src/views/members/index.tsx:107
msgid "Pending"
msgstr "Pending"
@@ -1104,19 +1074,19 @@ msgstr "Personal Project"
msgid "Planning"
msgstr "Planning"
#: src/components/AuthForm.tsx:306
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Please enter a valid email address"
#: src/components/AuthForm.tsx:294
#: src/components/AuthForm.tsx:293
msgid "Please enter a valid name"
msgstr "Please enter a valid name"
#: src/components/AuthForm.tsx:319
#: src/components/AuthForm.tsx:318
msgid "Please enter a valid password"
msgstr "Please enter a valid password"
#: src/views/settings/components/Avatar.tsx:57
#: src/views/settings/components/Avatar.tsx:55
msgid "Please select a file to upload."
msgstr "Please select a file to upload."
@@ -1126,28 +1096,26 @@ msgstr "Please select a file to upload."
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/Avatar.tsx:40
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/settings/components/Avatar.tsx:38
#: src/views/settings/components/Avatar.tsx:96
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:159
#: src/views/card/index.tsx:116
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:62
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/board/index.tsx:135
#: src/views/board/index.tsx:191
#: src/views/board/index.tsx:133
#: src/views/board/index.tsx:189
#: src/views/board/components/VisibilityButton.tsx:53
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
#: src/views/board/components/NewListForm.tsx:78
#: src/views/board/components/NewCardForm.tsx:145
#: src/components/NewWorkspaceForm.tsx:41
#: src/components/FeedbackModal.tsx:41
#: src/components/DeleteLabelConfirmation.tsx:23
#: src/views/board/components/NewCardForm.tsx:128
#: src/components/NewWorkspaceForm.tsx:39
#: src/components/FeedbackButton.tsx:46
msgid "Please try again later, or contact customer support."
msgstr "Please try again later, or contact customer support."
@@ -1169,11 +1137,11 @@ msgstr "Privacy policy"
msgid "Private"
msgstr "Private"
#: src/views/settings/components/Avatar.tsx:26
#: src/views/settings/components/Avatar.tsx:24
msgid "Profile image updated"
msgstr "Profile image updated"
#: src/views/settings/index.tsx:144
#: src/views/settings/index.tsx:118
msgid "Profile picture"
msgstr "Profile picture"
@@ -1209,7 +1177,7 @@ msgstr "Remote"
msgid "Remove"
msgstr "Remove"
#: src/views/members/index.tsx:132
#: src/views/members/index.tsx:120
msgid "Remove member"
msgstr "Remove member"
@@ -1250,7 +1218,7 @@ msgstr "Revoke"
msgid "Roadmap"
msgstr "Roadmap"
#: src/views/members/index.tsx:191
#: src/views/members/index.tsx:178
msgid "Role"
msgstr "Role"
@@ -1258,7 +1226,7 @@ msgstr "Role"
msgid "Run on your own infrastructure"
msgstr "Run on your own infrastructure"
#: src/views/card/components/Comment.tsx:165
#: src/views/card/components/Comment.tsx:163
msgid "Save"
msgstr "Save"
@@ -1291,24 +1259,20 @@ msgid "self-assigned the card"
msgstr "self-assigned the card"
#: src/components/FeedbackButton.tsx:137
#~ msgid "Send"
#~ msgstr "Send"
#: src/components/FeedbackModal.tsx:116
msgid "Send feedback"
msgstr "Send feedback"
msgid "Send"
msgstr "Send"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
msgstr "Settings"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:134
#: src/views/settings/index.tsx:108
msgid "Settings | {0}"
msgstr "Settings | {0}"
@@ -1330,7 +1294,7 @@ msgstr "Sign up disabled"
msgid "Sign up is currently disabled. Please try again later."
msgstr "Sign up is currently disabled. Please try again later."
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Sign up with "
msgstr "Sign up with "
@@ -1359,15 +1323,11 @@ msgstr "Star on Github"
msgid "Success"
msgstr "Success"
#: src/components/UserMenu.tsx:180
msgid "Support"
msgstr "Support"
#: src/views/home/components/Pricing.tsx:57
msgid "Support the development of the project"
msgstr "Support the development of the project"
#: src/components/UserMenu.tsx:139
#: src/components/UserMenu.tsx:98
msgid "System"
msgstr "System"
@@ -1383,7 +1343,7 @@ msgstr "Templates"
msgid "Terms of service"
msgstr "Terms of service"
#: src/components/FeedbackModal.tsx:34
#: src/components/FeedbackButton.tsx:39
msgid "Thank you for your feedback!"
msgstr "Thank you for your feedback!"
@@ -1400,7 +1360,7 @@ msgstr "The open source <0/> alternative to Trello"
msgid "The visibility of your board has been set to {0}."
msgstr "The visibility of your board has been set to {0}."
#: src/components/UserMenu.tsx:126
#: src/components/UserMenu.tsx:85
msgid "Theme"
msgstr "Theme"
@@ -1410,14 +1370,9 @@ msgstr "They won't be able to access this workspace."
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/components/DeleteLabelConfirmation.tsx:42
msgid "This action can't be undone."
msgstr "This action can't be undone."
#: src/views/public/board/index.tsx:146
msgid "This board is private or does not exist"
msgstr "This board is private or does not exist"
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
msgid "This board URL has already been taken"
msgstr "This board URL has already been taken"
@@ -1451,7 +1406,7 @@ msgstr "Toggle menu"
msgid "Track all card changes with detailed activity history."
msgstr "Track all card changes with detailed activity history."
#: src/views/settings/index.tsx:92
#: src/views/settings/index.tsx:69
msgid "Trello disconnected"
msgstr "Trello disconnected"
@@ -1467,7 +1422,7 @@ msgstr "Triaging"
msgid "Unable to add comment"
msgstr "Unable to add comment"
#: src/views/board/components/NewCardForm.tsx:142
#: src/views/board/components/NewCardForm.tsx:125
msgid "Unable to create card"
msgstr "Unable to create card"
@@ -1475,7 +1430,7 @@ msgstr "Unable to create card"
msgid "Unable to create list"
msgstr "Unable to create list"
#: src/components/NewWorkspaceForm.tsx:40
#: src/components/NewWorkspaceForm.tsx:38
msgid "Unable to create workspace"
msgstr "Unable to create workspace"
@@ -1491,7 +1446,7 @@ msgstr "Unable to delete comment"
msgid "Unable to remove member"
msgstr "Unable to remove member"
#: src/components/FeedbackModal.tsx:40
#: src/components/FeedbackButton.tsx:45
msgid "Unable to send feedback"
msgstr "Unable to send feedback"
@@ -1503,12 +1458,12 @@ msgstr "Unable to update board URL"
msgid "Unable to update board visibility"
msgstr "Unable to update board visibility"
#: src/views/card/index.tsx:158
#: src/views/board/index.tsx:190
#: src/views/card/index.tsx:115
#: src/views/board/index.tsx:188
msgid "Unable to update card"
msgstr "Unable to update card"
#: src/views/card/components/Comment.tsx:63
#: src/views/card/components/Comment.tsx:61
msgid "Unable to update comment"
msgstr "Unable to update comment"
@@ -1517,7 +1472,7 @@ msgid "Unable to update labels"
msgstr "Unable to update labels"
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:134
#: src/views/board/index.tsx:132
msgid "Unable to update list"
msgstr "Unable to update list"
@@ -1561,11 +1516,11 @@ msgstr "Unlimited lists"
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
msgid "Update"
msgstr "Update"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Update label"
msgstr "Update label"
@@ -1606,23 +1561,19 @@ msgstr "URL must be at least 3 characters long"
msgid "Use template"
msgstr "Use template"
#: src/views/members/index.tsx:185
#: src/views/members/index.tsx:172
msgid "User"
msgstr "User"
#: src/views/members/components/InviteMemberForm.tsx:58
msgid "User is already a member of this workspace"
msgstr "User is already a member of this workspace"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "View and manage your API keys."
#: src/views/settings/index.tsx:199
#: src/views/settings/index.tsx:171
msgid "View and manage your billing and subscription."
msgstr "View and manage your billing and subscription."
@@ -1630,18 +1581,10 @@ msgstr "View and manage your billing and subscription."
msgid "View docs"
msgstr "View docs"
#: src/views/public/board/index.tsx:120
msgid "View only"
msgstr "View only"
#: src/views/home/components/Features.tsx:147
msgid "View our roadmap."
msgstr "View our roadmap."
#: src/views/public/board/index.tsx:149
msgid "View workspace"
msgstr "View workspace"
#: src/views/board/components/VisibilityButton.tsx:91
msgid "Visibility"
msgstr "Visibility"
@@ -1678,7 +1621,7 @@ msgstr "When Trello launched in 2011, it blew everyone away with its carefully d
msgid "Why make an open source Trello?"
msgstr "Why make an open source Trello?"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Workspace"
msgstr "Workspace"
@@ -1686,7 +1629,7 @@ msgstr "Workspace"
msgid "Workspace deleted"
msgstr "Workspace deleted"
#: src/views/settings/index.tsx:175
#: src/views/settings/index.tsx:147
msgid "Workspace description"
msgstr "Workspace description"
@@ -1707,8 +1650,8 @@ msgstr "Workspace description updated"
msgid "Workspace members"
msgstr "Workspace members"
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
#: src/views/settings/index.tsx:130
#: src/components/NewWorkspaceForm.tsx:78
msgid "Workspace name"
msgstr "Workspace name"
@@ -1728,7 +1671,7 @@ msgstr "Workspace name updated"
msgid "Workspace slug updated"
msgstr "Workspace slug updated"
#: src/views/settings/index.tsx:165
#: src/views/settings/index.tsx:138
msgid "Workspace URL"
msgstr "Workspace URL"
@@ -1776,15 +1719,15 @@ msgstr "Your boards have been imported."
msgid "Your display name has been updated."
msgstr "Your display name has been updated."
#: src/views/settings/components/Avatar.tsx:27
#: src/views/settings/components/Avatar.tsx:25
msgid "Your profile image has been updated."
msgstr "Your profile image has been updated."
#: src/views/settings/index.tsx:93
#: src/views/settings/index.tsx:70
msgid "Your Trello account has been disconnected."
msgstr "Your Trello account has been disconnected."
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:214
msgid "Your Trello account is connected."
msgstr "Your Trello account is connected."

File diff suppressed because one or more lines are too long

View File

@@ -13,22 +13,22 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:123
#: src/views/card/components/Comment.tsx:121
msgid " (edited)"
msgstr " (editado)"
#: src/components/FeedbackModal.tsx:102
#: src/components/FeedbackButton.tsx:123
msgid ", or see our"
msgstr ", o consulta nuestra"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:189
#: src/views/card/index.tsx:148
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:392
#: src/views/board/components/NewCardForm.tsx:365
msgid "{0} labels"
msgstr "{0} etiquetas"
@@ -36,6 +36,10 @@ msgstr "{0} etiquetas"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importar tablero (1)} other {Importar tableros ({boardCount})}}"
#: src/views/home/index.tsx:51
msgid "#1 Hacker News"
msgstr "#1 Hacker News"
#: src/views/home/components/Pricing.tsx:36
msgid "1 user"
msgstr "1 usuario"
@@ -48,8 +52,8 @@ msgstr "Una aplicación kanban potente y flexible que te ayuda a organizar el tr
msgid "Account deleted"
msgstr "Cuenta eliminada"
#: src/views/public/board/CardModal.tsx:128
#: src/views/card/index.tsx:256
#: src/views/public/board/CardModal.tsx:104
#: src/views/card/index.tsx:215
msgid "Activity"
msgstr "Actividad"
@@ -62,11 +66,11 @@ msgid "Add a card"
msgstr "Añadir una tarjeta"
#: src/views/card/components/NewCommentForm.tsx:57
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/Comment.tsx:144
msgid "Add a comment..."
msgstr "Añadir un comentario..."
#: src/components/Editor.tsx:303
#: src/components/Editor.tsx:302
msgid "Add description... (type '/' to open commands)"
msgstr "Añadir descripción... (escribe '/' para abrir comandos)"
@@ -75,7 +79,7 @@ msgstr "Añadir descripción... (escribe '/' para abrir comandos)"
msgid "Add label"
msgstr "Añadir etiqueta"
#: src/views/members/components/InviteMemberForm.tsx:85
#: src/views/members/components/InviteMemberForm.tsx:50
#: src/views/card/components/MemberSelector.tsx:130
msgid "Add member"
msgstr "Añadir miembro"
@@ -108,11 +112,11 @@ msgstr "Todos los sistemas operativos"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "¿Ya tienes una cuenta? <0><1>Iniciar sesión</1></0>"
#: src/views/settings/index.tsx:100
#: src/views/settings/index.tsx:77
msgid "An error occurred while disconnecting your Trello account."
msgstr "Ocurrió un error al desconectar tu cuenta de Trello."
#: src/views/settings/index.tsx:257
#: src/views/settings/index.tsx:229
msgid "API keys"
msgstr "Claves API"
@@ -145,10 +149,6 @@ msgstr "¿Estás seguro de que quieres eliminar esta tarjeta?"
msgid "Are you sure you want to delete this comment?"
msgstr "¿Estás seguro de que quieres eliminar este comentario?"
#: src/components/DeleteLabelConfirmation.tsx:39
msgid "Are you sure you want to delete this label?"
msgstr "¿Estás seguro de que quieres eliminar esta etiqueta?"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
msgid "Are you sure you want to delete your account?"
msgstr "¿Estás seguro de que quieres eliminar tu cuenta?"
@@ -169,12 +169,12 @@ msgstr "Pendientes"
msgid "Basic Kanban"
msgstr "Kanban básico"
#: src/views/settings/index.tsx:196
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturación"
#: src/views/settings/index.tsx:206
#: src/views/settings/index.tsx:178
msgid "Billing portal"
msgstr "Portal de facturación"
@@ -182,7 +182,7 @@ msgstr "Portal de facturación"
msgid "Blog Post"
msgstr "Entrada de blog"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Tablero"
@@ -194,8 +194,7 @@ msgstr "El nombre del tablero no puede exceder los 100 caracteres"
msgid "Board name is required"
msgstr "El nombre del tablero es obligatorio"
#: src/views/public/board/index.tsx:143
#: src/views/board/index.tsx:358
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Tablero no encontrado"
@@ -207,7 +206,7 @@ msgstr "La URL del tablero solo puede contener letras, números y guiones"
msgid "Board URL cannot exceed 60 characters"
msgstr "La URL del tablero no puede exceder los 60 caracteres"
#: src/views/public/board/index.tsx:59
#: src/views/public/board/index.tsx:53
msgid "Board URL copied to clipboard"
msgstr "URL del tablero copiada al portapapeles"
@@ -223,13 +222,13 @@ msgstr "Visibilidad del tablero"
msgid "Board visibility updated"
msgstr "Visibilidad del tablero actualizada"
#: src/views/boards/index.tsx:27
#: src/components/SideNavigation.tsx:68
#: src/views/boards/index.tsx:25
#: src/components/SideNavigation.tsx:39
msgid "Boards"
msgstr "Tableros"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/boards/index.tsx:23
#: src/views/boards/index.tsx:21
msgid "Boards | {0}"
msgstr "Tableros | {0}"
@@ -251,20 +250,19 @@ msgstr "Informe de error"
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/Comment.tsx:158
#: src/components/DeleteLabelConfirmation.tsx:47
#: src/views/card/components/Comment.tsx:156
msgid "Cancel"
msgstr "Cancelar"
#: src/views/card/index.tsx:234
#: src/views/card/index.tsx:193
msgid "Card not found"
msgstr "Tarjeta no encontrada"
#: src/views/board/components/NewCardForm.tsx:278
#: src/views/board/components/NewCardForm.tsx:254
msgid "Card title"
msgstr "Título de la tarjeta"
#: src/views/settings/index.tsx:188
#: src/views/settings/index.tsx:160
msgid "Change the language of the app."
msgstr "Cambiar el idioma de la aplicación."
@@ -314,7 +312,7 @@ msgstr "Control y propiedad completos:"
msgid "Confirm URL change"
msgstr "Confirmar cambio de URL"
#: src/views/settings/index.tsx:233
#: src/views/settings/index.tsx:205
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Conectar Trello"
@@ -323,7 +321,7 @@ msgstr "Conectar Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Conecta tus herramientas favoritas para agilizar tu flujo de trabajo."
#: src/views/settings/index.tsx:220
#: src/views/settings/index.tsx:192
msgid "Connect your Trello account to import boards."
msgstr "Conecta tu cuenta de Trello para importar tableros."
@@ -331,7 +329,7 @@ msgstr "Conecta tu cuenta de Trello para importar tableros."
msgid "Contact"
msgstr "Contacto"
#: src/components/FeedbackModal.tsx:100
#: src/components/FeedbackButton.tsx:121
msgid "Contact us"
msgstr "Contáctanos"
@@ -339,12 +337,12 @@ msgstr "Contáctanos"
msgid "Content Creation"
msgstr "Creación de contenido"
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Continuar con "
#. placeholder {0}: provider.name
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:268
msgid "Continue with {0}"
msgstr "Continuar con {0}"
@@ -353,7 +351,7 @@ msgid "Control who can view and edit your boards."
msgstr "Controla quién puede ver y editar tus tableros."
#: src/views/board/components/NewListForm.tsx:140
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/board/components/NewCardForm.tsx:391
#: src/components/LabelForm.tsx:212
msgid "Create another"
msgstr "Crear otro"
@@ -362,15 +360,15 @@ msgstr "Crear otro"
msgid "Create board"
msgstr "Crear tablero"
#: src/views/board/components/NewCardForm.tsx:428
#: src/views/board/components/NewCardForm.tsx:401
msgid "Create card"
msgstr "Crear tarjeta"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Create label"
msgstr "Crear etiqueta"
#: src/views/board/components/NewListForm.tsx:152
#: src/views/board/components/NewListForm.tsx:148
msgid "Create list"
msgstr "Crear lista"
@@ -383,16 +381,16 @@ msgid "Create new key"
msgstr "Crear nueva clave"
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:354
#: src/views/board/components/NewCardForm.tsx:327
msgid "Create new label"
msgstr "Crear nueva etiqueta"
#: src/views/board/index.tsx:426
#: src/views/board/index.tsx:327
msgid "Create new list"
msgstr "Crear nueva lista"
#: src/components/WorkspaceMenu.tsx:116
#: src/components/NewWorkspaceForm.tsx:93
#: src/components/WorkspaceMenu.tsx:85
#: src/components/NewWorkspaceForm.tsx:91
msgid "Create workspace"
msgstr "Crear espacio de trabajo"
@@ -416,19 +414,18 @@ msgstr "Las URL personalizadas son una función premium. Serás dirigido a actua
msgid "Customer Support"
msgstr "Atención al cliente"
#: src/components/UserMenu.tsx:153
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Oscuro"
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/components/LabelForm.tsx:226
#: src/components/DeleteLabelConfirmation.tsx:49
msgid "Delete"
msgstr "Eliminar"
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:270
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Eliminar cuenta"
@@ -441,7 +438,7 @@ msgstr "Eliminar tablero"
msgid "Delete card"
msgstr "Eliminar tarjeta"
#: src/views/card/components/Comment.tsx:91
#: src/views/card/components/Comment.tsx:89
msgid "Delete comment"
msgstr "Eliminar comentario"
@@ -449,8 +446,8 @@ msgstr "Eliminar comentario"
msgid "Delete list"
msgstr "Eliminar lista"
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:253
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Eliminar espacio de trabajo"
@@ -459,7 +456,7 @@ msgstr "Eliminar espacio de trabajo"
msgid "Design"
msgstr "Diseño"
#: src/views/settings/index.tsx:248
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Desconectar Trello"
@@ -467,7 +464,7 @@ msgstr "Desconectar Trello"
msgid "Discuss and collaborate on cards."
msgstr "Discute y colabora en las tarjetas."
#: src/views/settings/index.tsx:149
#: src/views/settings/index.tsx:123
msgid "Display name"
msgstr "Nombre visible"
@@ -487,7 +484,7 @@ msgstr "Nombre visible actualizado"
msgid "Do you offer a free plan?"
msgstr "¿Ofrecen un plan gratuito?"
#: src/components/FeedbackModal.tsx:109
#: src/components/FeedbackButton.tsx:130
msgid "docs"
msgstr "documentos"
@@ -497,7 +494,6 @@ msgstr "Documentos"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
#: src/components/UserMenu.tsx:191
msgid "Documentation"
msgstr "Documentación"
@@ -517,7 +513,7 @@ msgstr "Terminado"
msgid "Edit board URL"
msgstr "Editar URL del tablero"
#: src/views/card/components/Comment.tsx:82
#: src/views/card/components/Comment.tsx:80
msgid "Edit comment"
msgstr "Editar comentario"
@@ -525,19 +521,15 @@ msgstr "Editar comentario"
msgid "Edit label"
msgstr "Editar etiqueta"
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
msgid "Edit workspace URL"
msgstr "Editar URL del espacio de trabajo"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Editando"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "correo electrónico"
#: src/views/members/components/InviteMemberForm.tsx:99
#: src/views/members/components/InviteMemberForm.tsx:64
msgid "Email"
msgstr "Correo electrónico"
@@ -545,15 +537,15 @@ msgstr "Correo electrónico"
msgid "Enhancement"
msgstr "Mejora"
#: src/components/AuthForm.tsx:302
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Introduce tu dirección de correo electrónico"
#: src/components/AuthForm.tsx:290
#: src/components/AuthForm.tsx:289
msgid "Enter your name"
msgstr "Introduce tu nombre"
#: src/components/AuthForm.tsx:315
#: src/components/AuthForm.tsx:314
msgid "Enter your password"
msgstr "Introduce tu contraseña"
@@ -561,28 +553,19 @@ msgstr "Introduce tu contraseña"
msgid "Error deleting account"
msgstr "Error al eliminar la cuenta"
#: src/components/DeleteLabelConfirmation.tsx:22
msgid "Error deleting label"
msgstr "Error al eliminar la etiqueta"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
msgid "Error deleting workspace"
msgstr "Error al eliminar el espacio de trabajo"
#: src/views/settings/index.tsx:99
#: src/views/settings/index.tsx:76
msgid "Error disconnecting Trello"
msgstr "Error al desconectar Trello"
#: src/views/members/components/InviteMemberForm.tsx:57
#: src/views/members/components/InviteMemberForm.tsx:63
msgid "Error inviting member"
msgstr "Error al invitar al miembro"
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
msgid "Error updating display name"
msgstr "Error al actualizar el nombre visible"
#: src/views/settings/components/Avatar.tsx:39
#: src/views/settings/components/Avatar.tsx:37
msgid "Error updating profile image"
msgstr "Error al actualizar la imagen de perfil"
@@ -598,8 +581,8 @@ msgstr "Error al actualizar el nombre del espacio de trabajo"
msgid "Error updating workspace URL"
msgstr "Error al actualizar la URL del espacio de trabajo"
#: src/views/settings/components/Avatar.tsx:56
#: src/views/settings/components/Avatar.tsx:97
#: src/views/settings/components/Avatar.tsx:54
#: src/views/settings/components/Avatar.tsx:95
msgid "Error uploading profile image"
msgstr "Error al subir la imagen de perfil"
@@ -639,12 +622,11 @@ msgstr "Solicitud de función"
msgid "Features"
msgstr "Características"
#: src/components/UserMenu.tsx:199
#: src/components/FeedbackModal.tsx:59
#: src/components/FeedbackButton.tsx:78
msgid "Feedback"
msgstr "Comentarios"
#: src/components/FeedbackModal.tsx:33
#: src/components/FeedbackButton.tsx:38
msgid "Feedback sent"
msgstr "Comentarios enviados"
@@ -692,7 +674,7 @@ msgstr "Comenzar"
msgid "Get started by creating a new board"
msgstr "Comienza creando un nuevo tablero"
#: src/views/board/index.tsx:418
#: src/views/board/index.tsx:319
msgid "Get started by creating a new list"
msgstr "Comienza creando una nueva lista"
@@ -765,11 +747,11 @@ msgstr "Reconozco que todos los datos del espacio de trabajo serán eliminados p
msgid "Ideas"
msgstr "Ideas"
#: src/components/FeedbackModal.tsx:75
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Ideas para mejorar esta página..."
#: src/views/boards/index.tsx:38
#: src/views/boards/index.tsx:39
msgid "Import"
msgstr "Importar"
@@ -815,19 +797,11 @@ msgstr "Integraciones"
msgid "Interviewing"
msgstr "Entrevistando"
#: src/views/members/components/InviteMemberForm.tsx:26
msgid "Invalid email address"
msgstr "Dirección de correo electrónico no válida"
#: src/views/members/index.tsx:169
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Invitar"
#: src/views/members/components/InviteMemberForm.tsx:113
msgid "Invite another"
msgstr "Invitar a otro"
#: src/views/members/components/InviteMemberForm.tsx:123
#: src/views/members/components/InviteMemberForm.tsx:82
#: src/views/card/components/MemberSelector.tsx:112
msgid "Invite member"
msgstr "Invitar miembro"
@@ -849,8 +823,8 @@ msgstr "Kanban reinventado"
msgid "Keep in mind that this action is irreversible."
msgstr "Ten en cuenta que esta acción es irreversible."
#: src/views/card/index.tsx:113
#: src/views/board/components/NewCardForm.tsx:358
#: src/views/card/index.tsx:243
#: src/views/board/components/NewCardForm.tsx:331
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
msgstr "Etiquetas"
@@ -859,7 +833,7 @@ msgstr "Etiquetas"
msgid "Labels & Filters"
msgstr "Etiquetas y filtros"
#: src/views/settings/index.tsx:185
#: src/views/settings/index.tsx:157
msgid "Language"
msgstr "Idioma"
@@ -875,15 +849,15 @@ msgstr "Legal"
msgid "License"
msgstr "Licencia"
#: src/components/UserMenu.tsx:167
#: src/components/UserMenu.tsx:126
msgid "Light"
msgstr "Claro"
#: src/views/public/board/index.tsx:57
#: src/views/public/board/index.tsx:51
msgid "Link copied"
msgstr "Enlace copiado"
#: src/views/card/index.tsx:105
#: src/views/card/index.tsx:235
msgid "List"
msgstr "Lista"
@@ -895,7 +869,7 @@ msgstr "Nombre de la lista"
msgid "Login | kan.bn"
msgstr "Iniciar sesión | kan.bn"
#: src/components/UserMenu.tsx:209
#: src/components/UserMenu.tsx:136
msgid "Logout"
msgstr "Cerrar sesión"
@@ -907,7 +881,7 @@ msgstr "Largo plazo"
msgid "Low Priority"
msgstr "Prioridad baja"
#: src/components/AuthForm.tsx:338
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "enlace mágico"
@@ -915,16 +889,16 @@ msgstr "enlace mágico"
msgid "Medium Priority"
msgstr "Prioridad media"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:121
#: src/views/board/components/NewCardForm.tsx:317
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
#: src/components/SideNavigation.tsx:44
msgid "Members"
msgstr "Miembros"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:157
#: src/views/members/index.tsx:144
msgid "Members | {0}"
msgstr "Miembros | {0}"
@@ -945,11 +919,11 @@ msgstr "movió la tarjeta a otra lista"
msgid "Name"
msgstr "Nombre"
#: src/components/FeedbackModal.tsx:95
#: src/components/FeedbackButton.tsx:116
msgid "Need help?"
msgstr "¿Necesitas ayuda?"
#: src/views/boards/index.tsx:48
#: src/views/boards/index.tsx:52
msgid "New"
msgstr "Nuevo"
@@ -957,7 +931,7 @@ msgstr "Nuevo"
msgid "New board"
msgstr "Nuevo tablero"
#: src/views/board/components/NewCardForm.tsx:261
#: src/views/board/components/NewCardForm.tsx:237
msgid "New card"
msgstr "Nueva tarjeta"
@@ -969,7 +943,7 @@ msgstr "Nueva importación"
msgid "New label"
msgstr "Nueva etiqueta"
#: src/views/board/index.tsx:395
#: src/views/board/index.tsx:296
#: src/views/board/components/NewListForm.tsx:112
msgid "New list"
msgstr "Nueva lista"
@@ -978,7 +952,7 @@ msgstr "Nueva lista"
msgid "New Ticket"
msgstr "Nuevo ticket"
#: src/components/NewWorkspaceForm.tsx:64
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Nuevo espacio de trabajo"
@@ -1002,7 +976,7 @@ msgstr "No se encontraron tableros"
msgid "No credit card required"
msgstr "No se requiere tarjeta de crédito"
#: src/views/board/index.tsx:415
#: src/views/board/index.tsx:316
msgid "No lists"
msgstr "Sin listas"
@@ -1014,15 +988,15 @@ msgstr "Oferta"
msgid "Onboarding"
msgstr "Incorporación"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Una vez que elimines tu cuenta, no hay vuelta atrás. Esta acción no se puede deshacer."
#: src/views/settings/index.tsx:273
#: src/views/settings/index.tsx:245
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Una vez que elimines tu espacio de trabajo, no hay vuelta atrás. Esta acción no se puede deshacer."
#: src/components/AuthForm.tsx:280
#: src/components/AuthForm.tsx:279
msgid "or"
msgstr "o"
@@ -1042,7 +1016,7 @@ msgstr "Tiempo parcial"
msgid "Payment frequency"
msgstr "Frecuencia de pago"
#: src/views/members/index.tsx:118
#: src/views/members/index.tsx:107
msgid "Pending"
msgstr "Pendiente"
@@ -1059,19 +1033,19 @@ msgstr "Proyecto personal"
msgid "Planning"
msgstr "Planificación"
#: src/components/AuthForm.tsx:306
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Por favor, introduce una dirección de correo electrónico válida"
#: src/components/AuthForm.tsx:294
#: src/components/AuthForm.tsx:293
msgid "Please enter a valid name"
msgstr "Por favor, introduce un nombre válido"
#: src/components/AuthForm.tsx:319
#: src/components/AuthForm.tsx:318
msgid "Please enter a valid password"
msgstr "Por favor, introduce una contraseña válida"
#: src/views/settings/components/Avatar.tsx:57
#: src/views/settings/components/Avatar.tsx:55
msgid "Please select a file to upload."
msgstr "Por favor selecciona un archivo para subir."
@@ -1081,28 +1055,26 @@ msgstr "Por favor selecciona un archivo para subir."
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/Avatar.tsx:40
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/settings/components/Avatar.tsx:38
#: src/views/settings/components/Avatar.tsx:96
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:159
#: src/views/card/index.tsx:116
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:62
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/board/index.tsx:135
#: src/views/board/index.tsx:191
#: src/views/board/index.tsx:133
#: src/views/board/index.tsx:189
#: src/views/board/components/VisibilityButton.tsx:53
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
#: src/views/board/components/NewListForm.tsx:78
#: src/views/board/components/NewCardForm.tsx:145
#: src/components/NewWorkspaceForm.tsx:41
#: src/components/FeedbackModal.tsx:41
#: src/components/DeleteLabelConfirmation.tsx:23
#: src/views/board/components/NewCardForm.tsx:128
#: src/components/NewWorkspaceForm.tsx:39
#: src/components/FeedbackButton.tsx:46
msgid "Please try again later, or contact customer support."
msgstr "Por favor, inténtalo de nuevo más tarde o contacta con atención al cliente."
@@ -1124,11 +1096,11 @@ msgstr "Política de privacidad"
msgid "Private"
msgstr "Privado"
#: src/views/settings/components/Avatar.tsx:26
#: src/views/settings/components/Avatar.tsx:24
msgid "Profile image updated"
msgstr "Imagen de perfil actualizada"
#: src/views/settings/index.tsx:144
#: src/views/settings/index.tsx:118
msgid "Profile picture"
msgstr "Foto de perfil"
@@ -1164,7 +1136,7 @@ msgstr "Remoto"
msgid "Remove"
msgstr "Eliminar"
#: src/views/members/index.tsx:132
#: src/views/members/index.tsx:120
msgid "Remove member"
msgstr "Eliminar miembro"
@@ -1205,7 +1177,7 @@ msgstr "Revocar"
msgid "Roadmap"
msgstr "Hoja de ruta"
#: src/views/members/index.tsx:191
#: src/views/members/index.tsx:178
msgid "Role"
msgstr "Rol"
@@ -1213,7 +1185,7 @@ msgstr "Rol"
msgid "Run on your own infrastructure"
msgstr "Ejecuta en tu propia infraestructura"
#: src/views/card/components/Comment.tsx:165
#: src/views/card/components/Comment.tsx:163
msgid "Save"
msgstr "Guardar"
@@ -1245,21 +1217,21 @@ msgstr "Autoalojamiento con Github"
msgid "self-assigned the card"
msgstr "se autoasignó la tarjeta"
#: src/components/FeedbackModal.tsx:116
msgid "Send feedback"
msgstr "Enviar comentarios"
#: src/components/FeedbackButton.tsx:137
msgid "Send"
msgstr "Enviar"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
msgstr "Configuración"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:134
#: src/views/settings/index.tsx:108
msgid "Settings | {0}"
msgstr "Configuración | {0}"
@@ -1281,7 +1253,7 @@ msgstr "Registro deshabilitado"
msgid "Sign up is currently disabled. Please try again later."
msgstr "El registro está actualmente deshabilitado. Por favor, inténtalo de nuevo más tarde."
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Sign up with "
msgstr "Registrarse con "
@@ -1310,15 +1282,11 @@ msgstr "Estrella en Github"
msgid "Success"
msgstr "Éxito"
#: src/components/UserMenu.tsx:180
msgid "Support"
msgstr "Soporte"
#: src/views/home/components/Pricing.tsx:57
msgid "Support the development of the project"
msgstr "Apoya el desarrollo del proyecto"
#: src/components/UserMenu.tsx:139
#: src/components/UserMenu.tsx:98
msgid "System"
msgstr "Sistema"
@@ -1334,7 +1302,7 @@ msgstr "Plantillas"
msgid "Terms of service"
msgstr "Términos de servicio"
#: src/components/FeedbackModal.tsx:34
#: src/components/FeedbackButton.tsx:39
msgid "Thank you for your feedback!"
msgstr "¡Gracias por tus comentarios!"
@@ -1351,7 +1319,7 @@ msgstr "La alternativa de código abierto <0/> a Trello"
msgid "The visibility of your board has been set to {0}."
msgstr "La visibilidad de tu tablero ha sido establecida a {0}."
#: src/components/UserMenu.tsx:126
#: src/components/UserMenu.tsx:85
msgid "Theme"
msgstr "Tema"
@@ -1361,14 +1329,9 @@ msgstr "No podrán acceder a este espacio de trabajo."
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/components/DeleteLabelConfirmation.tsx:42
msgid "This action can't be undone."
msgstr "Esta acción no se puede deshacer."
#: src/views/public/board/index.tsx:146
msgid "This board is private or does not exist"
msgstr "Este tablero es privado o no existe"
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
msgid "This board URL has already been taken"
msgstr "Esta URL de tablero ya ha sido utilizada"
@@ -1398,7 +1361,7 @@ msgstr "Alternar menú"
msgid "Track all card changes with detailed activity history."
msgstr "Rastrea todos los cambios en las tarjetas con un historial de actividad detallado."
#: src/views/settings/index.tsx:92
#: src/views/settings/index.tsx:69
msgid "Trello disconnected"
msgstr "Trello desconectado"
@@ -1414,7 +1377,7 @@ msgstr "Clasificación"
msgid "Unable to add comment"
msgstr "No se puede añadir el comentario"
#: src/views/board/components/NewCardForm.tsx:142
#: src/views/board/components/NewCardForm.tsx:125
msgid "Unable to create card"
msgstr "No se puede crear la tarjeta"
@@ -1422,7 +1385,7 @@ msgstr "No se puede crear la tarjeta"
msgid "Unable to create list"
msgstr "No se puede crear la lista"
#: src/components/NewWorkspaceForm.tsx:40
#: src/components/NewWorkspaceForm.tsx:38
msgid "Unable to create workspace"
msgstr "No se puede crear el espacio de trabajo"
@@ -1438,7 +1401,7 @@ msgstr "No se puede eliminar el comentario"
msgid "Unable to remove member"
msgstr "No se puede eliminar al miembro"
#: src/components/FeedbackModal.tsx:40
#: src/components/FeedbackButton.tsx:45
msgid "Unable to send feedback"
msgstr "No se pudieron enviar los comentarios"
@@ -1450,12 +1413,12 @@ msgstr "No se puede actualizar la URL del tablero"
msgid "Unable to update board visibility"
msgstr "No se puede actualizar la visibilidad del tablero"
#: src/views/card/index.tsx:158
#: src/views/board/index.tsx:190
#: src/views/card/index.tsx:115
#: src/views/board/index.tsx:188
msgid "Unable to update card"
msgstr "No se puede actualizar la tarjeta"
#: src/views/card/components/Comment.tsx:63
#: src/views/card/components/Comment.tsx:61
msgid "Unable to update comment"
msgstr "No se puede actualizar el comentario"
@@ -1464,7 +1427,7 @@ msgid "Unable to update labels"
msgstr "No se pueden actualizar las etiquetas"
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:134
#: src/views/board/index.tsx:132
msgid "Unable to update list"
msgstr "No se puede actualizar la lista"
@@ -1508,11 +1471,11 @@ msgstr "Listas ilimitadas"
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
msgid "Update"
msgstr "Actualizar"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Update label"
msgstr "Actualizar etiqueta"
@@ -1553,23 +1516,19 @@ msgstr "La URL debe tener al menos 3 caracteres"
msgid "Use template"
msgstr "Usar plantilla"
#: src/views/members/index.tsx:185
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Usuario"
#: src/views/members/components/InviteMemberForm.tsx:58
msgid "User is already a member of this workspace"
msgstr "El usuario ya es miembro de este espacio de trabajo"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "Ver y gestionar tus claves API."
#: src/views/settings/index.tsx:199
#: src/views/settings/index.tsx:171
msgid "View and manage your billing and subscription."
msgstr "Ver y gestionar tu facturación y suscripción."
@@ -1577,18 +1536,10 @@ msgstr "Ver y gestionar tu facturación y suscripción."
msgid "View docs"
msgstr "Ver documentación"
#: src/views/public/board/index.tsx:120
msgid "View only"
msgstr "Solo visualización"
#: src/views/home/components/Features.tsx:147
msgid "View our roadmap."
msgstr "Ver nuestra hoja de ruta."
#: src/views/public/board/index.tsx:149
msgid "View workspace"
msgstr "Ver espacio de trabajo"
#: src/views/board/components/VisibilityButton.tsx:91
msgid "Visibility"
msgstr "Visibilidad"
@@ -1621,7 +1572,7 @@ msgstr "Cuando Trello se lanzó en 2011, impresionó a todos con su simplicidad
msgid "Why make an open source Trello?"
msgstr "¿Por qué crear un Trello de código abierto?"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Workspace"
msgstr "Espacio de trabajo"
@@ -1629,7 +1580,7 @@ msgstr "Espacio de trabajo"
msgid "Workspace deleted"
msgstr "Espacio de trabajo eliminado"
#: src/views/settings/index.tsx:175
#: src/views/settings/index.tsx:147
msgid "Workspace description"
msgstr "Descripción del espacio de trabajo"
@@ -1650,8 +1601,8 @@ msgstr "Descripción del espacio de trabajo actualizada"
msgid "Workspace members"
msgstr "Miembros del espacio de trabajo"
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
#: src/views/settings/index.tsx:130
#: src/components/NewWorkspaceForm.tsx:78
msgid "Workspace name"
msgstr "Nombre del espacio de trabajo"
@@ -1671,7 +1622,7 @@ msgstr "Nombre del espacio de trabajo actualizado"
msgid "Workspace slug updated"
msgstr "Slug del espacio de trabajo actualizado"
#: src/views/settings/index.tsx:165
#: src/views/settings/index.tsx:138
msgid "Workspace URL"
msgstr "URL del espacio de trabajo"
@@ -1719,15 +1670,15 @@ msgstr "Tus tableros han sido importados."
msgid "Your display name has been updated."
msgstr "Tu nombre de visualización ha sido actualizado."
#: src/views/settings/components/Avatar.tsx:27
#: src/views/settings/components/Avatar.tsx:25
msgid "Your profile image has been updated."
msgstr "Tu imagen de perfil ha sido actualizada."
#: src/views/settings/index.tsx:93
#: src/views/settings/index.tsx:70
msgid "Your Trello account has been disconnected."
msgstr "Tu cuenta de Trello ha sido desconectada."
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:214
msgid "Your Trello account is connected."
msgstr "Tu cuenta de Trello está conectada."

File diff suppressed because one or more lines are too long

View File

@@ -13,22 +13,22 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:123
#: src/views/card/components/Comment.tsx:121
msgid " (edited)"
msgstr " (modifié)"
#: src/components/FeedbackModal.tsx:102
#: src/components/FeedbackButton.tsx:123
msgid ", or see our"
msgstr ", ou consultez notre"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:189
#: src/views/card/index.tsx:148
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:392
#: src/views/board/components/NewCardForm.tsx:365
msgid "{0} labels"
msgstr "{0} étiquettes"
@@ -36,6 +36,10 @@ msgstr "{0} étiquettes"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importer le tableau (1)} other {Importer les tableaux ({boardCount})}}"
#: src/views/home/index.tsx:51
msgid "#1 Hacker News"
msgstr "#1 Hacker News"
#: src/views/home/components/Pricing.tsx:36
msgid "1 user"
msgstr "1 utilisateur"
@@ -48,8 +52,8 @@ msgstr "Une application kanban puissante et flexible qui vous aide à organiser
msgid "Account deleted"
msgstr "Compte supprimé"
#: src/views/public/board/CardModal.tsx:128
#: src/views/card/index.tsx:256
#: src/views/public/board/CardModal.tsx:104
#: src/views/card/index.tsx:215
msgid "Activity"
msgstr "Activité"
@@ -62,11 +66,11 @@ msgid "Add a card"
msgstr "Ajouter une carte"
#: src/views/card/components/NewCommentForm.tsx:57
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/Comment.tsx:144
msgid "Add a comment..."
msgstr "Ajouter un commentaire..."
#: src/components/Editor.tsx:303
#: src/components/Editor.tsx:302
msgid "Add description... (type '/' to open commands)"
msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes)"
@@ -75,7 +79,7 @@ msgstr "Ajouter une description... (tapez '/' pour ouvrir les commandes)"
msgid "Add label"
msgstr "Ajouter une étiquette"
#: src/views/members/components/InviteMemberForm.tsx:85
#: src/views/members/components/InviteMemberForm.tsx:50
#: src/views/card/components/MemberSelector.tsx:130
msgid "Add member"
msgstr "Ajouter un membre"
@@ -108,11 +112,11 @@ msgstr "Tous les systèmes opérationnels"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Vous avez déjà un compte ? <0><1>Connectez-vous</1></0>"
#: src/views/settings/index.tsx:100
#: src/views/settings/index.tsx:77
msgid "An error occurred while disconnecting your Trello account."
msgstr "Une erreur s'est produite lors de la déconnexion de votre compte Trello."
#: src/views/settings/index.tsx:257
#: src/views/settings/index.tsx:229
msgid "API keys"
msgstr "Clés API"
@@ -145,10 +149,6 @@ msgstr "Êtes-vous sûr de vouloir supprimer cette carte ?"
msgid "Are you sure you want to delete this comment?"
msgstr "Êtes-vous sûr de vouloir supprimer ce commentaire ?"
#: src/components/DeleteLabelConfirmation.tsx:39
msgid "Are you sure you want to delete this label?"
msgstr "Êtes-vous sûr de vouloir supprimer cette étiquette ?"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
msgid "Are you sure you want to delete your account?"
msgstr "Êtes-vous sûr de vouloir supprimer votre compte ?"
@@ -169,12 +169,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Kanban basique"
#: src/views/settings/index.tsx:196
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturation"
#: src/views/settings/index.tsx:206
#: src/views/settings/index.tsx:178
msgid "Billing portal"
msgstr "Portail de facturation"
@@ -182,7 +182,7 @@ msgstr "Portail de facturation"
msgid "Blog Post"
msgstr "Article de blog"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Tableau"
@@ -194,8 +194,7 @@ msgstr "Le nom du tableau ne peut pas dépasser 100 caractères"
msgid "Board name is required"
msgstr "Le nom du tableau est requis"
#: src/views/public/board/index.tsx:143
#: src/views/board/index.tsx:358
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Tableau introuvable"
@@ -207,7 +206,7 @@ msgstr "L'URL du tableau ne peut contenir que des lettres, des chiffres et des t
msgid "Board URL cannot exceed 60 characters"
msgstr "L'URL du tableau ne peut pas dépasser 60 caractères"
#: src/views/public/board/index.tsx:59
#: src/views/public/board/index.tsx:53
msgid "Board URL copied to clipboard"
msgstr "URL du tableau copiée dans le presse-papiers"
@@ -223,13 +222,13 @@ msgstr "Visibilité du tableau"
msgid "Board visibility updated"
msgstr "Visibilité du tableau mise à jour"
#: src/views/boards/index.tsx:27
#: src/components/SideNavigation.tsx:68
#: src/views/boards/index.tsx:25
#: src/components/SideNavigation.tsx:39
msgid "Boards"
msgstr "Tableaux"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/boards/index.tsx:23
#: src/views/boards/index.tsx:21
msgid "Boards | {0}"
msgstr "Tableaux | {0}"
@@ -251,20 +250,19 @@ msgstr "Rapport de bug"
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/Comment.tsx:158
#: src/components/DeleteLabelConfirmation.tsx:47
#: src/views/card/components/Comment.tsx:156
msgid "Cancel"
msgstr "Annuler"
#: src/views/card/index.tsx:234
#: src/views/card/index.tsx:193
msgid "Card not found"
msgstr "Carte introuvable"
#: src/views/board/components/NewCardForm.tsx:278
#: src/views/board/components/NewCardForm.tsx:254
msgid "Card title"
msgstr "Titre de la carte"
#: src/views/settings/index.tsx:188
#: src/views/settings/index.tsx:160
msgid "Change the language of the app."
msgstr "Changer la langue de l'application."
@@ -314,7 +312,7 @@ msgstr "Contrôle et propriété complets :"
msgid "Confirm URL change"
msgstr "Confirmer le changement d'URL"
#: src/views/settings/index.tsx:233
#: src/views/settings/index.tsx:205
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Connecter Trello"
@@ -323,7 +321,7 @@ msgstr "Connecter Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Connectez vos outils favoris pour simplifier votre flux de travail."
#: src/views/settings/index.tsx:220
#: src/views/settings/index.tsx:192
msgid "Connect your Trello account to import boards."
msgstr "Connectez votre compte Trello pour importer des tableaux."
@@ -331,7 +329,7 @@ msgstr "Connectez votre compte Trello pour importer des tableaux."
msgid "Contact"
msgstr "Contact"
#: src/components/FeedbackModal.tsx:100
#: src/components/FeedbackButton.tsx:121
msgid "Contact us"
msgstr "Contactez-nous"
@@ -339,12 +337,12 @@ msgstr "Contactez-nous"
msgid "Content Creation"
msgstr "Création de contenu"
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Continuer avec "
#. placeholder {0}: provider.name
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:268
msgid "Continue with {0}"
msgstr "Continuer avec {0}"
@@ -353,7 +351,7 @@ msgid "Control who can view and edit your boards."
msgstr "Contrôlez qui peut voir et modifier vos tableaux."
#: src/views/board/components/NewListForm.tsx:140
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/board/components/NewCardForm.tsx:391
#: src/components/LabelForm.tsx:212
msgid "Create another"
msgstr "Créer un autre"
@@ -362,15 +360,15 @@ msgstr "Créer un autre"
msgid "Create board"
msgstr "Créer un tableau"
#: src/views/board/components/NewCardForm.tsx:428
#: src/views/board/components/NewCardForm.tsx:401
msgid "Create card"
msgstr "Créer une carte"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Create label"
msgstr "Créer une étiquette"
#: src/views/board/components/NewListForm.tsx:152
#: src/views/board/components/NewListForm.tsx:148
msgid "Create list"
msgstr "Créer une liste"
@@ -383,16 +381,16 @@ msgid "Create new key"
msgstr "Créer une nouvelle clé"
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:354
#: src/views/board/components/NewCardForm.tsx:327
msgid "Create new label"
msgstr "Créer une nouvelle étiquette"
#: src/views/board/index.tsx:426
#: src/views/board/index.tsx:327
msgid "Create new list"
msgstr "Créer une nouvelle liste"
#: src/components/WorkspaceMenu.tsx:116
#: src/components/NewWorkspaceForm.tsx:93
#: src/components/WorkspaceMenu.tsx:85
#: src/components/NewWorkspaceForm.tsx:91
msgid "Create workspace"
msgstr "Créer un espace de travail"
@@ -416,19 +414,18 @@ msgstr "Les URL personnalisées sont une fonctionnalité premium. Vous serez dir
msgid "Customer Support"
msgstr "Support client"
#: src/components/UserMenu.tsx:153
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Sombre"
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/components/LabelForm.tsx:226
#: src/components/DeleteLabelConfirmation.tsx:49
msgid "Delete"
msgstr "Supprimer"
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:270
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Supprimer le compte"
@@ -441,7 +438,7 @@ msgstr "Supprimer le tableau"
msgid "Delete card"
msgstr "Supprimer la carte"
#: src/views/card/components/Comment.tsx:91
#: src/views/card/components/Comment.tsx:89
msgid "Delete comment"
msgstr "Supprimer le commentaire"
@@ -449,8 +446,8 @@ msgstr "Supprimer le commentaire"
msgid "Delete list"
msgstr "Supprimer la liste"
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:253
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Supprimer l'espace de travail"
@@ -459,7 +456,7 @@ msgstr "Supprimer l'espace de travail"
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:248
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Déconnecter Trello"
@@ -467,7 +464,7 @@ msgstr "Déconnecter Trello"
msgid "Discuss and collaborate on cards."
msgstr "Discutez et collaborez sur les cartes."
#: src/views/settings/index.tsx:149
#: src/views/settings/index.tsx:123
msgid "Display name"
msgstr "Nom d'affichage"
@@ -487,7 +484,7 @@ msgstr "Nom d'affichage mis à jour"
msgid "Do you offer a free plan?"
msgstr "Proposez-vous un plan gratuit ?"
#: src/components/FeedbackModal.tsx:109
#: src/components/FeedbackButton.tsx:130
msgid "docs"
msgstr "documentation"
@@ -497,7 +494,6 @@ msgstr "Documentation"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
#: src/components/UserMenu.tsx:191
msgid "Documentation"
msgstr "Documentation"
@@ -517,7 +513,7 @@ msgstr "Fait"
msgid "Edit board URL"
msgstr "Modifier l'URL du tableau"
#: src/views/card/components/Comment.tsx:82
#: src/views/card/components/Comment.tsx:80
msgid "Edit comment"
msgstr "Modifier le commentaire"
@@ -525,19 +521,15 @@ msgstr "Modifier le commentaire"
msgid "Edit label"
msgstr "Modifier l'étiquette"
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
msgid "Edit workspace URL"
msgstr "Modifier l'URL de l'espace de travail"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Édition"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "e-mail"
#: src/views/members/components/InviteMemberForm.tsx:99
#: src/views/members/components/InviteMemberForm.tsx:64
msgid "Email"
msgstr "E-mail"
@@ -545,15 +537,15 @@ msgstr "E-mail"
msgid "Enhancement"
msgstr "Amélioration"
#: src/components/AuthForm.tsx:302
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Saisissez votre adresse e-mail"
#: src/components/AuthForm.tsx:290
#: src/components/AuthForm.tsx:289
msgid "Enter your name"
msgstr "Saisissez votre nom"
#: src/components/AuthForm.tsx:315
#: src/components/AuthForm.tsx:314
msgid "Enter your password"
msgstr "Saisissez votre mot de passe"
@@ -561,28 +553,19 @@ msgstr "Saisissez votre mot de passe"
msgid "Error deleting account"
msgstr "Erreur lors de la suppression du compte"
#: src/components/DeleteLabelConfirmation.tsx:22
msgid "Error deleting label"
msgstr "Erreur lors de la suppression de l'étiquette"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
msgid "Error deleting workspace"
msgstr "Erreur lors de la suppression de l'espace de travail"
#: src/views/settings/index.tsx:99
#: src/views/settings/index.tsx:76
msgid "Error disconnecting Trello"
msgstr "Erreur lors de la déconnexion de Trello"
#: src/views/members/components/InviteMemberForm.tsx:57
#: src/views/members/components/InviteMemberForm.tsx:63
msgid "Error inviting member"
msgstr "Erreur lors de l'invitation du membre"
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
msgid "Error updating display name"
msgstr "Erreur lors de la mise à jour du nom d'affichage"
#: src/views/settings/components/Avatar.tsx:39
#: src/views/settings/components/Avatar.tsx:37
msgid "Error updating profile image"
msgstr "Erreur lors de la mise à jour de l'image de profil"
@@ -598,8 +581,8 @@ msgstr "Erreur lors de la mise à jour du nom de l'espace de travail"
msgid "Error updating workspace URL"
msgstr "Erreur lors de la mise à jour de l'URL de l'espace de travail"
#: src/views/settings/components/Avatar.tsx:56
#: src/views/settings/components/Avatar.tsx:97
#: src/views/settings/components/Avatar.tsx:54
#: src/views/settings/components/Avatar.tsx:95
msgid "Error uploading profile image"
msgstr "Erreur lors du téléchargement de l'image de profil"
@@ -639,12 +622,11 @@ msgstr "Demande de fonctionnalité"
msgid "Features"
msgstr "Fonctionnalités"
#: src/components/UserMenu.tsx:199
#: src/components/FeedbackModal.tsx:59
#: src/components/FeedbackButton.tsx:78
msgid "Feedback"
msgstr "Commentaires"
#: src/components/FeedbackModal.tsx:33
#: src/components/FeedbackButton.tsx:38
msgid "Feedback sent"
msgstr "Commentaires envoyés"
@@ -692,7 +674,7 @@ msgstr "Commencer"
msgid "Get started by creating a new board"
msgstr "Commencez par créer un nouveau tableau"
#: src/views/board/index.tsx:418
#: src/views/board/index.tsx:319
msgid "Get started by creating a new list"
msgstr "Commencez par créer une nouvelle liste"
@@ -765,11 +747,11 @@ msgstr "Je reconnais que toutes les données de l'espace de travail seront défi
msgid "Ideas"
msgstr "Idées"
#: src/components/FeedbackModal.tsx:75
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Idées pour améliorer cette page..."
#: src/views/boards/index.tsx:38
#: src/views/boards/index.tsx:39
msgid "Import"
msgstr "Importer"
@@ -815,19 +797,11 @@ msgstr "Intégrations"
msgid "Interviewing"
msgstr "Entretien"
#: src/views/members/components/InviteMemberForm.tsx:26
msgid "Invalid email address"
msgstr "Adresse e-mail invalide"
#: src/views/members/index.tsx:169
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Inviter"
#: src/views/members/components/InviteMemberForm.tsx:113
msgid "Invite another"
msgstr "Inviter un autre"
#: src/views/members/components/InviteMemberForm.tsx:123
#: src/views/members/components/InviteMemberForm.tsx:82
#: src/views/card/components/MemberSelector.tsx:112
msgid "Invite member"
msgstr "Inviter un membre"
@@ -849,8 +823,8 @@ msgstr "Kanban réinventé"
msgid "Keep in mind that this action is irreversible."
msgstr "Gardez à l'esprit que cette action est irréversible."
#: src/views/card/index.tsx:113
#: src/views/board/components/NewCardForm.tsx:358
#: src/views/card/index.tsx:243
#: src/views/board/components/NewCardForm.tsx:331
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
msgstr "Étiquettes"
@@ -859,7 +833,7 @@ msgstr "Étiquettes"
msgid "Labels & Filters"
msgstr "Étiquettes & filtres"
#: src/views/settings/index.tsx:185
#: src/views/settings/index.tsx:157
msgid "Language"
msgstr "Langue"
@@ -875,15 +849,15 @@ msgstr "Mentions légales"
msgid "License"
msgstr "Licence"
#: src/components/UserMenu.tsx:167
#: src/components/UserMenu.tsx:126
msgid "Light"
msgstr "Clair"
#: src/views/public/board/index.tsx:57
#: src/views/public/board/index.tsx:51
msgid "Link copied"
msgstr "Lien copié"
#: src/views/card/index.tsx:105
#: src/views/card/index.tsx:235
msgid "List"
msgstr "Liste"
@@ -895,7 +869,7 @@ msgstr "Nom de la liste"
msgid "Login | kan.bn"
msgstr "Connexion | kan.bn"
#: src/components/UserMenu.tsx:209
#: src/components/UserMenu.tsx:136
msgid "Logout"
msgstr "Déconnexion"
@@ -907,7 +881,7 @@ msgstr "Long terme"
msgid "Low Priority"
msgstr "Priorité basse"
#: src/components/AuthForm.tsx:338
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "lien magique"
@@ -915,16 +889,16 @@ msgstr "lien magique"
msgid "Medium Priority"
msgstr "Priorité moyenne"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:121
#: src/views/board/components/NewCardForm.tsx:317
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
#: src/components/SideNavigation.tsx:44
msgid "Members"
msgstr "Membres"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:157
#: src/views/members/index.tsx:144
msgid "Members | {0}"
msgstr "Membres | {0}"
@@ -945,11 +919,11 @@ msgstr "a déplacé la carte vers une autre liste"
msgid "Name"
msgstr "Nom"
#: src/components/FeedbackModal.tsx:95
#: src/components/FeedbackButton.tsx:116
msgid "Need help?"
msgstr "Besoin d'aide ?"
#: src/views/boards/index.tsx:48
#: src/views/boards/index.tsx:52
msgid "New"
msgstr "Nouveau"
@@ -957,7 +931,7 @@ msgstr "Nouveau"
msgid "New board"
msgstr "Nouveau tableau"
#: src/views/board/components/NewCardForm.tsx:261
#: src/views/board/components/NewCardForm.tsx:237
msgid "New card"
msgstr "Nouvelle carte"
@@ -969,7 +943,7 @@ msgstr "Nouvel import"
msgid "New label"
msgstr "Nouvelle étiquette"
#: src/views/board/index.tsx:395
#: src/views/board/index.tsx:296
#: src/views/board/components/NewListForm.tsx:112
msgid "New list"
msgstr "Nouvelle liste"
@@ -978,7 +952,7 @@ msgstr "Nouvelle liste"
msgid "New Ticket"
msgstr "Nouveau ticket"
#: src/components/NewWorkspaceForm.tsx:64
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Nouvel espace de travail"
@@ -1002,7 +976,7 @@ msgstr "Aucun tableau trouvé"
msgid "No credit card required"
msgstr "Aucune carte de crédit requise"
#: src/views/board/index.tsx:415
#: src/views/board/index.tsx:316
msgid "No lists"
msgstr "Aucune liste"
@@ -1014,15 +988,15 @@ msgstr "Offre"
msgid "Onboarding"
msgstr "Intégration"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Une fois que vous supprimez votre compte, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
#: src/views/settings/index.tsx:273
#: src/views/settings/index.tsx:245
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Une fois que vous supprimez votre espace de travail, il n'y a pas de retour possible. Cette action ne peut pas être annulée."
#: src/components/AuthForm.tsx:280
#: src/components/AuthForm.tsx:279
msgid "or"
msgstr "ou"
@@ -1042,7 +1016,7 @@ msgstr "Temps partiel"
msgid "Payment frequency"
msgstr "Fréquence de paiement"
#: src/views/members/index.tsx:118
#: src/views/members/index.tsx:107
msgid "Pending"
msgstr "En attente"
@@ -1059,19 +1033,19 @@ msgstr "Projet personnel"
msgid "Planning"
msgstr "Planification"
#: src/components/AuthForm.tsx:306
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Veuillez saisir une adresse e-mail valide"
#: src/components/AuthForm.tsx:294
#: src/components/AuthForm.tsx:293
msgid "Please enter a valid name"
msgstr "Veuillez saisir un nom valide"
#: src/components/AuthForm.tsx:319
#: src/components/AuthForm.tsx:318
msgid "Please enter a valid password"
msgstr "Veuillez saisir un mot de passe valide"
#: src/views/settings/components/Avatar.tsx:57
#: src/views/settings/components/Avatar.tsx:55
msgid "Please select a file to upload."
msgstr "Veuillez sélectionner un fichier à télécharger."
@@ -1081,28 +1055,26 @@ msgstr "Veuillez sélectionner un fichier à télécharger."
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/Avatar.tsx:40
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/settings/components/Avatar.tsx:38
#: src/views/settings/components/Avatar.tsx:96
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:159
#: src/views/card/index.tsx:116
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:62
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/board/index.tsx:135
#: src/views/board/index.tsx:191
#: src/views/board/index.tsx:133
#: src/views/board/index.tsx:189
#: src/views/board/components/VisibilityButton.tsx:53
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
#: src/views/board/components/NewListForm.tsx:78
#: src/views/board/components/NewCardForm.tsx:145
#: src/components/NewWorkspaceForm.tsx:41
#: src/components/FeedbackModal.tsx:41
#: src/components/DeleteLabelConfirmation.tsx:23
#: src/views/board/components/NewCardForm.tsx:128
#: src/components/NewWorkspaceForm.tsx:39
#: src/components/FeedbackButton.tsx:46
msgid "Please try again later, or contact customer support."
msgstr "Veuillez réessayer plus tard ou contacter le service client."
@@ -1124,11 +1096,11 @@ msgstr "Politique de confidentialité"
msgid "Private"
msgstr "Privé"
#: src/views/settings/components/Avatar.tsx:26
#: src/views/settings/components/Avatar.tsx:24
msgid "Profile image updated"
msgstr "Image de profil mise à jour"
#: src/views/settings/index.tsx:144
#: src/views/settings/index.tsx:118
msgid "Profile picture"
msgstr "Photo de profil"
@@ -1164,7 +1136,7 @@ msgstr "À distance"
msgid "Remove"
msgstr "Supprimer"
#: src/views/members/index.tsx:132
#: src/views/members/index.tsx:120
msgid "Remove member"
msgstr "Supprimer le membre"
@@ -1205,7 +1177,7 @@ msgstr "Révoquer"
msgid "Roadmap"
msgstr "Feuille de route"
#: src/views/members/index.tsx:191
#: src/views/members/index.tsx:178
msgid "Role"
msgstr "Rôle"
@@ -1213,7 +1185,7 @@ msgstr "Rôle"
msgid "Run on your own infrastructure"
msgstr "Exécutez sur votre propre infrastructure"
#: src/views/card/components/Comment.tsx:165
#: src/views/card/components/Comment.tsx:163
msgid "Save"
msgstr "Enregistrer"
@@ -1245,21 +1217,21 @@ msgstr "Auto-hébergement avec Github"
msgid "self-assigned the card"
msgstr "s'est auto-assigné la carte"
#: src/components/FeedbackModal.tsx:116
msgid "Send feedback"
msgstr "Envoyer des commentaires"
#: src/components/FeedbackButton.tsx:137
msgid "Send"
msgstr "Envoyer"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
msgstr "Paramètres"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:134
#: src/views/settings/index.tsx:108
msgid "Settings | {0}"
msgstr "Paramètres | {0}"
@@ -1281,7 +1253,7 @@ msgstr "Inscription désactivée"
msgid "Sign up is currently disabled. Please try again later."
msgstr "L'inscription est actuellement désactivée. Veuillez réessayer plus tard."
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Sign up with "
msgstr "S'inscrire avec "
@@ -1310,15 +1282,11 @@ msgstr "Étoile sur Github"
msgid "Success"
msgstr "Succès"
#: src/components/UserMenu.tsx:180
msgid "Support"
msgstr "Assistance"
#: src/views/home/components/Pricing.tsx:57
msgid "Support the development of the project"
msgstr "Soutenir le développement du projet"
#: src/components/UserMenu.tsx:139
#: src/components/UserMenu.tsx:98
msgid "System"
msgstr "Système"
@@ -1334,7 +1302,7 @@ msgstr "Modèles"
msgid "Terms of service"
msgstr "Conditions d'utilisation"
#: src/components/FeedbackModal.tsx:34
#: src/components/FeedbackButton.tsx:39
msgid "Thank you for your feedback!"
msgstr "Merci pour vos commentaires !"
@@ -1351,7 +1319,7 @@ msgstr "L'alternative open source <0/> à Trello"
msgid "The visibility of your board has been set to {0}."
msgstr "La visibilité de votre tableau a été définie sur {0}."
#: src/components/UserMenu.tsx:126
#: src/components/UserMenu.tsx:85
msgid "Theme"
msgstr "Thème"
@@ -1361,14 +1329,9 @@ msgstr "Ils ne pourront plus accéder à cet espace de travail."
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/components/DeleteLabelConfirmation.tsx:42
msgid "This action can't be undone."
msgstr "Cette action ne peut pas être annulée."
#: src/views/public/board/index.tsx:146
msgid "This board is private or does not exist"
msgstr "Ce tableau est privé ou n'existe pas"
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
msgid "This board URL has already been taken"
msgstr "Cette URL de tableau est déjà utilisée"
@@ -1398,7 +1361,7 @@ msgstr "Basculer le menu"
msgid "Track all card changes with detailed activity history."
msgstr "Suivez tous les changements de cartes avec un historique d'activité détaillé."
#: src/views/settings/index.tsx:92
#: src/views/settings/index.tsx:69
msgid "Trello disconnected"
msgstr "Trello déconnecté"
@@ -1414,7 +1377,7 @@ msgstr "Triage"
msgid "Unable to add comment"
msgstr "Impossible d'ajouter un commentaire"
#: src/views/board/components/NewCardForm.tsx:142
#: src/views/board/components/NewCardForm.tsx:125
msgid "Unable to create card"
msgstr "Impossible de créer la carte"
@@ -1422,7 +1385,7 @@ msgstr "Impossible de créer la carte"
msgid "Unable to create list"
msgstr "Impossible de créer une liste"
#: src/components/NewWorkspaceForm.tsx:40
#: src/components/NewWorkspaceForm.tsx:38
msgid "Unable to create workspace"
msgstr "Impossible de créer l'espace de travail"
@@ -1438,7 +1401,7 @@ msgstr "Impossible de supprimer le commentaire"
msgid "Unable to remove member"
msgstr "Impossible de supprimer le membre"
#: src/components/FeedbackModal.tsx:40
#: src/components/FeedbackButton.tsx:45
msgid "Unable to send feedback"
msgstr "Impossible d'envoyer les commentaires"
@@ -1450,12 +1413,12 @@ msgstr "Impossible de mettre à jour l'URL du tableau"
msgid "Unable to update board visibility"
msgstr "Impossible de mettre à jour la visibilité du tableau"
#: src/views/card/index.tsx:158
#: src/views/board/index.tsx:190
#: src/views/card/index.tsx:115
#: src/views/board/index.tsx:188
msgid "Unable to update card"
msgstr "Impossible de mettre à jour la carte"
#: src/views/card/components/Comment.tsx:63
#: src/views/card/components/Comment.tsx:61
msgid "Unable to update comment"
msgstr "Impossible de mettre à jour le commentaire"
@@ -1464,7 +1427,7 @@ msgid "Unable to update labels"
msgstr "Impossible de mettre à jour les étiquettes"
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:134
#: src/views/board/index.tsx:132
msgid "Unable to update list"
msgstr "Impossible de mettre à jour la liste"
@@ -1508,11 +1471,11 @@ msgstr "Listes illimitées"
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
msgid "Update"
msgstr "Mettre à jour"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Update label"
msgstr "Mettre à jour l'étiquette"
@@ -1553,23 +1516,19 @@ msgstr "L'URL doit comporter au moins 3 caractères"
msgid "Use template"
msgstr "Utiliser le modèle"
#: src/views/members/index.tsx:185
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Utilisateur"
#: src/views/members/components/InviteMemberForm.tsx:58
msgid "User is already a member of this workspace"
msgstr "L'utilisateur est déjà membre de cet espace de travail"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Vidéo"
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "Consultez et gérez vos clés API."
#: src/views/settings/index.tsx:199
#: src/views/settings/index.tsx:171
msgid "View and manage your billing and subscription."
msgstr "Consultez et gérez votre facturation et votre abonnement."
@@ -1577,18 +1536,10 @@ msgstr "Consultez et gérez votre facturation et votre abonnement."
msgid "View docs"
msgstr "Voir la documentation"
#: src/views/public/board/index.tsx:120
msgid "View only"
msgstr "Affichage uniquement"
#: src/views/home/components/Features.tsx:147
msgid "View our roadmap."
msgstr "Consultez notre feuille de route."
#: src/views/public/board/index.tsx:149
msgid "View workspace"
msgstr "Voir l'espace de travail"
#: src/views/board/components/VisibilityButton.tsx:91
msgid "Visibility"
msgstr "Visibilité"
@@ -1621,7 +1572,7 @@ msgstr "Quand Trello a été lancé en 2011, il a impressionné tout le monde pa
msgid "Why make an open source Trello?"
msgstr "Pourquoi créer un Trello open source ?"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Workspace"
msgstr "Espace de travail"
@@ -1629,7 +1580,7 @@ msgstr "Espace de travail"
msgid "Workspace deleted"
msgstr "Espace de travail supprimé"
#: src/views/settings/index.tsx:175
#: src/views/settings/index.tsx:147
msgid "Workspace description"
msgstr "Description de l'espace de travail"
@@ -1650,8 +1601,8 @@ msgstr "Description de l'espace de travail mise à jour"
msgid "Workspace members"
msgstr "Membres de l'espace de travail"
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
#: src/views/settings/index.tsx:130
#: src/components/NewWorkspaceForm.tsx:78
msgid "Workspace name"
msgstr "Nom de l'espace de travail"
@@ -1671,7 +1622,7 @@ msgstr "Nom de l'espace de travail mis à jour"
msgid "Workspace slug updated"
msgstr "Slug de l'espace de travail mis à jour"
#: src/views/settings/index.tsx:165
#: src/views/settings/index.tsx:138
msgid "Workspace URL"
msgstr "URL de l'espace de travail"
@@ -1719,15 +1670,15 @@ msgstr "Vos tableaux ont été importés."
msgid "Your display name has been updated."
msgstr "Votre nom d'affichage a été mis à jour."
#: src/views/settings/components/Avatar.tsx:27
#: src/views/settings/components/Avatar.tsx:25
msgid "Your profile image has been updated."
msgstr "Votre image de profil a été mise à jour."
#: src/views/settings/index.tsx:93
#: src/views/settings/index.tsx:70
msgid "Your Trello account has been disconnected."
msgstr "Votre compte Trello a été déconnecté."
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:214
msgid "Your Trello account is connected."
msgstr "Votre compte Trello est connecté."

File diff suppressed because one or more lines are too long

View File

@@ -13,22 +13,22 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:123
#: src/views/card/components/Comment.tsx:121
msgid " (edited)"
msgstr " (modificato)"
#: src/components/FeedbackModal.tsx:102
#: src/components/FeedbackButton.tsx:123
msgid ", or see our"
msgstr ", o consulta i nostri"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:189
#: src/views/card/index.tsx:148
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:392
#: src/views/board/components/NewCardForm.tsx:365
msgid "{0} labels"
msgstr "{0} etichette"
@@ -36,6 +36,10 @@ msgstr "{0} etichette"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Importa bacheca (1)} other {Importa bacheche ({boardCount})}}"
#: src/views/home/index.tsx:51
msgid "#1 Hacker News"
msgstr "#1 Hacker News"
#: src/views/home/components/Pricing.tsx:36
msgid "1 user"
msgstr "1 utente"
@@ -48,8 +52,8 @@ msgstr "Un'app kanban potente e flessibile che ti aiuta a organizzare il lavoro,
msgid "Account deleted"
msgstr "Account eliminato"
#: src/views/public/board/CardModal.tsx:128
#: src/views/card/index.tsx:256
#: src/views/public/board/CardModal.tsx:104
#: src/views/card/index.tsx:215
msgid "Activity"
msgstr "Attività"
@@ -62,11 +66,11 @@ msgid "Add a card"
msgstr "Aggiungi una carta"
#: src/views/card/components/NewCommentForm.tsx:57
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/Comment.tsx:144
msgid "Add a comment..."
msgstr "Aggiungi un commento..."
#: src/components/Editor.tsx:303
#: src/components/Editor.tsx:302
msgid "Add description... (type '/' to open commands)"
msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi)"
@@ -75,7 +79,7 @@ msgstr "Aggiungi descrizione... (digita '/' per aprire i comandi)"
msgid "Add label"
msgstr "Aggiungi etichetta"
#: src/views/members/components/InviteMemberForm.tsx:85
#: src/views/members/components/InviteMemberForm.tsx:50
#: src/views/card/components/MemberSelector.tsx:130
msgid "Add member"
msgstr "Aggiungi membro"
@@ -108,11 +112,11 @@ msgstr "Tutti i sistemi operativi"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Hai già un account? <0><1>Accedi</1></0>"
#: src/views/settings/index.tsx:100
#: src/views/settings/index.tsx:77
msgid "An error occurred while disconnecting your Trello account."
msgstr "Si è verificato un errore durante la disconnessione del tuo account Trello."
#: src/views/settings/index.tsx:257
#: src/views/settings/index.tsx:229
msgid "API keys"
msgstr "Chiavi API"
@@ -145,10 +149,6 @@ msgstr "Sei sicuro di voler eliminare questa carta?"
msgid "Are you sure you want to delete this comment?"
msgstr "Sei sicuro di voler eliminare questo commento?"
#: src/components/DeleteLabelConfirmation.tsx:39
msgid "Are you sure you want to delete this label?"
msgstr "Sei sicuro di voler eliminare questa etichetta?"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
msgid "Are you sure you want to delete your account?"
msgstr "Sei sicuro di voler eliminare il tuo account?"
@@ -169,12 +169,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Kanban base"
#: src/views/settings/index.tsx:196
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Fatturazione"
#: src/views/settings/index.tsx:206
#: src/views/settings/index.tsx:178
msgid "Billing portal"
msgstr "Portale di fatturazione"
@@ -182,7 +182,7 @@ msgstr "Portale di fatturazione"
msgid "Blog Post"
msgstr "Post del blog"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Bacheca"
@@ -194,8 +194,7 @@ msgstr "Il nome della bacheca non può superare i 100 caratteri"
msgid "Board name is required"
msgstr "Il nome della bacheca è obbligatorio"
#: src/views/public/board/index.tsx:143
#: src/views/board/index.tsx:358
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Bacheca non trovata"
@@ -207,7 +206,7 @@ msgstr "L'URL della bacheca può contenere solo lettere, numeri e trattini"
msgid "Board URL cannot exceed 60 characters"
msgstr "L'URL della bacheca non può superare i 60 caratteri"
#: src/views/public/board/index.tsx:59
#: src/views/public/board/index.tsx:53
msgid "Board URL copied to clipboard"
msgstr "URL della bacheca copiato negli appunti"
@@ -223,13 +222,13 @@ msgstr "Visibilità bacheca"
msgid "Board visibility updated"
msgstr "Visibilità della bacheca aggiornata"
#: src/views/boards/index.tsx:27
#: src/components/SideNavigation.tsx:68
#: src/views/boards/index.tsx:25
#: src/components/SideNavigation.tsx:39
msgid "Boards"
msgstr "Bacheche"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/boards/index.tsx:23
#: src/views/boards/index.tsx:21
msgid "Boards | {0}"
msgstr "Bacheche | {0}"
@@ -251,20 +250,19 @@ msgstr "Segnalazione bug"
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/Comment.tsx:158
#: src/components/DeleteLabelConfirmation.tsx:47
#: src/views/card/components/Comment.tsx:156
msgid "Cancel"
msgstr "Annulla"
#: src/views/card/index.tsx:234
#: src/views/card/index.tsx:193
msgid "Card not found"
msgstr "Carta non trovata"
#: src/views/board/components/NewCardForm.tsx:278
#: src/views/board/components/NewCardForm.tsx:254
msgid "Card title"
msgstr "Titolo della carta"
#: src/views/settings/index.tsx:188
#: src/views/settings/index.tsx:160
msgid "Change the language of the app."
msgstr "Cambia la lingua dell'app."
@@ -314,7 +312,7 @@ msgstr "Controllo e proprietà completi:"
msgid "Confirm URL change"
msgstr "Conferma modifica URL"
#: src/views/settings/index.tsx:233
#: src/views/settings/index.tsx:205
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Connetti Trello"
@@ -323,7 +321,7 @@ msgstr "Connetti Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Connetti i tuoi strumenti preferiti per semplificare il tuo flusso di lavoro."
#: src/views/settings/index.tsx:220
#: src/views/settings/index.tsx:192
msgid "Connect your Trello account to import boards."
msgstr "Connetti il tuo account Trello per importare le bacheche."
@@ -331,7 +329,7 @@ msgstr "Connetti il tuo account Trello per importare le bacheche."
msgid "Contact"
msgstr "Contatti"
#: src/components/FeedbackModal.tsx:100
#: src/components/FeedbackButton.tsx:121
msgid "Contact us"
msgstr "Contattaci"
@@ -339,12 +337,12 @@ msgstr "Contattaci"
msgid "Content Creation"
msgstr "Creazione contenuti"
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Continua con "
#. placeholder {0}: provider.name
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:268
msgid "Continue with {0}"
msgstr "Continua con {0}"
@@ -353,7 +351,7 @@ msgid "Control who can view and edit your boards."
msgstr "Controlla chi può visualizzare e modificare le tue bacheche."
#: src/views/board/components/NewListForm.tsx:140
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/board/components/NewCardForm.tsx:391
#: src/components/LabelForm.tsx:212
msgid "Create another"
msgstr "Crea un altro"
@@ -362,15 +360,15 @@ msgstr "Crea un altro"
msgid "Create board"
msgstr "Crea bacheca"
#: src/views/board/components/NewCardForm.tsx:428
#: src/views/board/components/NewCardForm.tsx:401
msgid "Create card"
msgstr "Crea carta"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Create label"
msgstr "Crea etichetta"
#: src/views/board/components/NewListForm.tsx:152
#: src/views/board/components/NewListForm.tsx:148
msgid "Create list"
msgstr "Crea lista"
@@ -383,16 +381,16 @@ msgid "Create new key"
msgstr "Crea nuova chiave"
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:354
#: src/views/board/components/NewCardForm.tsx:327
msgid "Create new label"
msgstr "Crea nuova etichetta"
#: src/views/board/index.tsx:426
#: src/views/board/index.tsx:327
msgid "Create new list"
msgstr "Crea nuova lista"
#: src/components/WorkspaceMenu.tsx:116
#: src/components/NewWorkspaceForm.tsx:93
#: src/components/WorkspaceMenu.tsx:85
#: src/components/NewWorkspaceForm.tsx:91
msgid "Create workspace"
msgstr "Crea spazio di lavoro"
@@ -416,19 +414,18 @@ msgstr "Gli URL personalizzati sono una funzionalità premium. Sarai indirizzato
msgid "Customer Support"
msgstr "Assistenza clienti"
#: src/components/UserMenu.tsx:153
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Scuro"
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/components/LabelForm.tsx:226
#: src/components/DeleteLabelConfirmation.tsx:49
msgid "Delete"
msgstr "Elimina"
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:270
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Elimina account"
@@ -441,7 +438,7 @@ msgstr "Elimina bacheca"
msgid "Delete card"
msgstr "Elimina carta"
#: src/views/card/components/Comment.tsx:91
#: src/views/card/components/Comment.tsx:89
msgid "Delete comment"
msgstr "Elimina commento"
@@ -449,8 +446,8 @@ msgstr "Elimina commento"
msgid "Delete list"
msgstr "Elimina lista"
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:253
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Elimina spazio di lavoro"
@@ -459,7 +456,7 @@ msgstr "Elimina spazio di lavoro"
msgid "Design"
msgstr "Design"
#: src/views/settings/index.tsx:248
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Disconnetti Trello"
@@ -467,7 +464,7 @@ msgstr "Disconnetti Trello"
msgid "Discuss and collaborate on cards."
msgstr "Discuti e collabora sulle schede."
#: src/views/settings/index.tsx:149
#: src/views/settings/index.tsx:123
msgid "Display name"
msgstr "Nome visualizzato"
@@ -487,7 +484,7 @@ msgstr "Nome visualizzato aggiornato"
msgid "Do you offer a free plan?"
msgstr "Offrite un piano gratuito?"
#: src/components/FeedbackModal.tsx:109
#: src/components/FeedbackButton.tsx:130
msgid "docs"
msgstr "documenti"
@@ -497,7 +494,6 @@ msgstr "Documenti"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
#: src/components/UserMenu.tsx:191
msgid "Documentation"
msgstr "Documentazione"
@@ -517,7 +513,7 @@ msgstr "Fatto"
msgid "Edit board URL"
msgstr "Modifica URL della bacheca"
#: src/views/card/components/Comment.tsx:82
#: src/views/card/components/Comment.tsx:80
msgid "Edit comment"
msgstr "Modifica commento"
@@ -525,19 +521,15 @@ msgstr "Modifica commento"
msgid "Edit label"
msgstr "Modifica etichetta"
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
msgid "Edit workspace URL"
msgstr "Modifica URL dell'area di lavoro"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Modifica"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "email"
#: src/views/members/components/InviteMemberForm.tsx:99
#: src/views/members/components/InviteMemberForm.tsx:64
msgid "Email"
msgstr "Email"
@@ -545,15 +537,15 @@ msgstr "Email"
msgid "Enhancement"
msgstr "Miglioramento"
#: src/components/AuthForm.tsx:302
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Inserisci il tuo indirizzo email"
#: src/components/AuthForm.tsx:290
#: src/components/AuthForm.tsx:289
msgid "Enter your name"
msgstr "Inserisci il tuo nome"
#: src/components/AuthForm.tsx:315
#: src/components/AuthForm.tsx:314
msgid "Enter your password"
msgstr "Inserisci la tua password"
@@ -561,28 +553,19 @@ msgstr "Inserisci la tua password"
msgid "Error deleting account"
msgstr "Errore durante l'eliminazione dell'account"
#: src/components/DeleteLabelConfirmation.tsx:22
msgid "Error deleting label"
msgstr "Errore durante l'eliminazione dell'etichetta"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
msgid "Error deleting workspace"
msgstr "Errore durante l'eliminazione dell'area di lavoro"
#: src/views/settings/index.tsx:99
#: src/views/settings/index.tsx:76
msgid "Error disconnecting Trello"
msgstr "Errore durante la disconnessione da Trello"
#: src/views/members/components/InviteMemberForm.tsx:57
#: src/views/members/components/InviteMemberForm.tsx:63
msgid "Error inviting member"
msgstr "Errore durante l'invito del membro"
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
msgid "Error updating display name"
msgstr "Errore durante l'aggiornamento del nome visualizzato"
#: src/views/settings/components/Avatar.tsx:39
#: src/views/settings/components/Avatar.tsx:37
msgid "Error updating profile image"
msgstr "Errore durante l'aggiornamento dell'immagine del profilo"
@@ -598,8 +581,8 @@ msgstr "Errore durante l'aggiornamento del nome dell'area di lavoro"
msgid "Error updating workspace URL"
msgstr "Errore durante l'aggiornamento dell'URL dell'area di lavoro"
#: src/views/settings/components/Avatar.tsx:56
#: src/views/settings/components/Avatar.tsx:97
#: src/views/settings/components/Avatar.tsx:54
#: src/views/settings/components/Avatar.tsx:95
msgid "Error uploading profile image"
msgstr "Errore durante il caricamento dell'immagine del profilo"
@@ -639,12 +622,11 @@ msgstr "Richiesta funzionalità"
msgid "Features"
msgstr "Funzionalità"
#: src/components/UserMenu.tsx:199
#: src/components/FeedbackModal.tsx:59
#: src/components/FeedbackButton.tsx:78
msgid "Feedback"
msgstr "Feedback"
#: src/components/FeedbackModal.tsx:33
#: src/components/FeedbackButton.tsx:38
msgid "Feedback sent"
msgstr "Feedback inviato"
@@ -692,7 +674,7 @@ msgstr "Inizia ora"
msgid "Get started by creating a new board"
msgstr "Inizia creando una nuova bacheca"
#: src/views/board/index.tsx:418
#: src/views/board/index.tsx:319
msgid "Get started by creating a new list"
msgstr "Inizia creando una nuova lista"
@@ -765,11 +747,11 @@ msgstr "Riconosco che tutti i dati dell'area di lavoro saranno eliminati permane
msgid "Ideas"
msgstr "Idee"
#: src/components/FeedbackModal.tsx:75
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Idee per migliorare questa pagina..."
#: src/views/boards/index.tsx:38
#: src/views/boards/index.tsx:39
msgid "Import"
msgstr "Importa"
@@ -815,19 +797,11 @@ msgstr "Integrazioni"
msgid "Interviewing"
msgstr "Colloquio"
#: src/views/members/components/InviteMemberForm.tsx:26
msgid "Invalid email address"
msgstr "Indirizzo email non valido"
#: src/views/members/index.tsx:169
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Invita"
#: src/views/members/components/InviteMemberForm.tsx:113
msgid "Invite another"
msgstr "Invita un altro"
#: src/views/members/components/InviteMemberForm.tsx:123
#: src/views/members/components/InviteMemberForm.tsx:82
#: src/views/card/components/MemberSelector.tsx:112
msgid "Invite member"
msgstr "Invita membro"
@@ -849,8 +823,8 @@ msgstr "Kanban reinventato"
msgid "Keep in mind that this action is irreversible."
msgstr "Tieni presente che questa azione è irreversibile."
#: src/views/card/index.tsx:113
#: src/views/board/components/NewCardForm.tsx:358
#: src/views/card/index.tsx:243
#: src/views/board/components/NewCardForm.tsx:331
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
msgstr "Etichette"
@@ -859,7 +833,7 @@ msgstr "Etichette"
msgid "Labels & Filters"
msgstr "Etichette & Filtri"
#: src/views/settings/index.tsx:185
#: src/views/settings/index.tsx:157
msgid "Language"
msgstr "Lingua"
@@ -875,15 +849,15 @@ msgstr "Legale"
msgid "License"
msgstr "Licenza"
#: src/components/UserMenu.tsx:167
#: src/components/UserMenu.tsx:126
msgid "Light"
msgstr "Chiaro"
#: src/views/public/board/index.tsx:57
#: src/views/public/board/index.tsx:51
msgid "Link copied"
msgstr "Link copiato"
#: src/views/card/index.tsx:105
#: src/views/card/index.tsx:235
msgid "List"
msgstr "Lista"
@@ -895,7 +869,7 @@ msgstr "Nome lista"
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
#: src/components/UserMenu.tsx:209
#: src/components/UserMenu.tsx:136
msgid "Logout"
msgstr "Esci"
@@ -907,7 +881,7 @@ msgstr "A lungo termine"
msgid "Low Priority"
msgstr "Bassa priorità"
#: src/components/AuthForm.tsx:338
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "link magico"
@@ -915,16 +889,16 @@ msgstr "link magico"
msgid "Medium Priority"
msgstr "Media priorità"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:121
#: src/views/board/components/NewCardForm.tsx:317
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
#: src/components/SideNavigation.tsx:44
msgid "Members"
msgstr "Membri"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:157
#: src/views/members/index.tsx:144
msgid "Members | {0}"
msgstr "Membri | {0}"
@@ -945,11 +919,11 @@ msgstr "ha spostato la scheda in un'altra lista"
msgid "Name"
msgstr "Nome"
#: src/components/FeedbackModal.tsx:95
#: src/components/FeedbackButton.tsx:116
msgid "Need help?"
msgstr "Hai bisogno di aiuto?"
#: src/views/boards/index.tsx:48
#: src/views/boards/index.tsx:52
msgid "New"
msgstr "Nuovo"
@@ -957,7 +931,7 @@ msgstr "Nuovo"
msgid "New board"
msgstr "Nuova bacheca"
#: src/views/board/components/NewCardForm.tsx:261
#: src/views/board/components/NewCardForm.tsx:237
msgid "New card"
msgstr "Nuova carta"
@@ -969,7 +943,7 @@ msgstr "Nuova importazione"
msgid "New label"
msgstr "Nuova etichetta"
#: src/views/board/index.tsx:395
#: src/views/board/index.tsx:296
#: src/views/board/components/NewListForm.tsx:112
msgid "New list"
msgstr "Nuova lista"
@@ -978,7 +952,7 @@ msgstr "Nuova lista"
msgid "New Ticket"
msgstr "Nuovo ticket"
#: src/components/NewWorkspaceForm.tsx:64
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Nuovo spazio di lavoro"
@@ -1002,7 +976,7 @@ msgstr "Nessuna bacheca trovata"
msgid "No credit card required"
msgstr "Nessuna carta di credito richiesta"
#: src/views/board/index.tsx:415
#: src/views/board/index.tsx:316
msgid "No lists"
msgstr "Nessuna lista"
@@ -1014,15 +988,15 @@ msgstr "Offerta"
msgid "Onboarding"
msgstr "Inserimento"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Una volta eliminato il tuo account, non si può tornare indietro. Questa azione non può essere annullata."
#: src/views/settings/index.tsx:273
#: src/views/settings/index.tsx:245
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Una volta eliminata l'area di lavoro, non si può tornare indietro. Questa azione non può essere annullata."
#: src/components/AuthForm.tsx:280
#: src/components/AuthForm.tsx:279
msgid "or"
msgstr "o"
@@ -1042,7 +1016,7 @@ msgstr "Part-time"
msgid "Payment frequency"
msgstr "Frequenza di pagamento"
#: src/views/members/index.tsx:118
#: src/views/members/index.tsx:107
msgid "Pending"
msgstr "In attesa"
@@ -1059,19 +1033,19 @@ msgstr "Progetto personale"
msgid "Planning"
msgstr "Pianificazione"
#: src/components/AuthForm.tsx:306
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Inserisci un indirizzo email valido"
#: src/components/AuthForm.tsx:294
#: src/components/AuthForm.tsx:293
msgid "Please enter a valid name"
msgstr "Inserisci un nome valido"
#: src/components/AuthForm.tsx:319
#: src/components/AuthForm.tsx:318
msgid "Please enter a valid password"
msgstr "Inserisci una password valida"
#: src/views/settings/components/Avatar.tsx:57
#: src/views/settings/components/Avatar.tsx:55
msgid "Please select a file to upload."
msgstr "Seleziona un file da caricare."
@@ -1081,28 +1055,26 @@ msgstr "Seleziona un file da caricare."
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/Avatar.tsx:40
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/settings/components/Avatar.tsx:38
#: src/views/settings/components/Avatar.tsx:96
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:159
#: src/views/card/index.tsx:116
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:62
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/board/index.tsx:135
#: src/views/board/index.tsx:191
#: src/views/board/index.tsx:133
#: src/views/board/index.tsx:189
#: src/views/board/components/VisibilityButton.tsx:53
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
#: src/views/board/components/NewListForm.tsx:78
#: src/views/board/components/NewCardForm.tsx:145
#: src/components/NewWorkspaceForm.tsx:41
#: src/components/FeedbackModal.tsx:41
#: src/components/DeleteLabelConfirmation.tsx:23
#: src/views/board/components/NewCardForm.tsx:128
#: src/components/NewWorkspaceForm.tsx:39
#: src/components/FeedbackButton.tsx:46
msgid "Please try again later, or contact customer support."
msgstr "Riprova più tardi o contatta l'assistenza clienti."
@@ -1124,11 +1096,11 @@ msgstr "Informativa sulla privacy"
msgid "Private"
msgstr "Privato"
#: src/views/settings/components/Avatar.tsx:26
#: src/views/settings/components/Avatar.tsx:24
msgid "Profile image updated"
msgstr "Immagine del profilo aggiornata"
#: src/views/settings/index.tsx:144
#: src/views/settings/index.tsx:118
msgid "Profile picture"
msgstr "Immagine del profilo"
@@ -1164,7 +1136,7 @@ msgstr "Remoto"
msgid "Remove"
msgstr "Rimuovi"
#: src/views/members/index.tsx:132
#: src/views/members/index.tsx:120
msgid "Remove member"
msgstr "Rimuovi membro"
@@ -1205,7 +1177,7 @@ msgstr "Revoca"
msgid "Roadmap"
msgstr "Roadmap"
#: src/views/members/index.tsx:191
#: src/views/members/index.tsx:178
msgid "Role"
msgstr "Ruolo"
@@ -1213,7 +1185,7 @@ msgstr "Ruolo"
msgid "Run on your own infrastructure"
msgstr "Esegui sulla tua infrastruttura"
#: src/views/card/components/Comment.tsx:165
#: src/views/card/components/Comment.tsx:163
msgid "Save"
msgstr "Salva"
@@ -1245,21 +1217,21 @@ msgstr "Self host con Github"
msgid "self-assigned the card"
msgstr "si è auto-assegnato la scheda"
#: src/components/FeedbackModal.tsx:116
msgid "Send feedback"
msgstr "Invia feedback"
#: src/components/FeedbackButton.tsx:137
msgid "Send"
msgstr "Invia"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
msgstr "Impostazioni"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:134
#: src/views/settings/index.tsx:108
msgid "Settings | {0}"
msgstr "Impostazioni | {0}"
@@ -1281,7 +1253,7 @@ msgstr "Registrazione disabilitata"
msgid "Sign up is currently disabled. Please try again later."
msgstr "La registrazione è attualmente disabilitata. Riprova più tardi."
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Sign up with "
msgstr "Registrati con "
@@ -1310,15 +1282,11 @@ msgstr "Metti una stella su Github"
msgid "Success"
msgstr "Operazione riuscita"
#: src/components/UserMenu.tsx:180
msgid "Support"
msgstr "Supporto"
#: src/views/home/components/Pricing.tsx:57
msgid "Support the development of the project"
msgstr "Sostieni lo sviluppo del progetto"
#: src/components/UserMenu.tsx:139
#: src/components/UserMenu.tsx:98
msgid "System"
msgstr "Sistema"
@@ -1334,7 +1302,7 @@ msgstr "Template"
msgid "Terms of service"
msgstr "Termini di servizio"
#: src/components/FeedbackModal.tsx:34
#: src/components/FeedbackButton.tsx:39
msgid "Thank you for your feedback!"
msgstr "Grazie per il tuo feedback!"
@@ -1351,7 +1319,7 @@ msgstr "L'alternativa open source <0/> a Trello"
msgid "The visibility of your board has been set to {0}."
msgstr "La visibilità della tua bacheca è stata impostata su {0}."
#: src/components/UserMenu.tsx:126
#: src/components/UserMenu.tsx:85
msgid "Theme"
msgstr "Tema"
@@ -1361,14 +1329,9 @@ msgstr "Non potranno accedere a questo spazio di lavoro."
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/components/DeleteLabelConfirmation.tsx:42
msgid "This action can't be undone."
msgstr "Questa azione non può essere annullata."
#: src/views/public/board/index.tsx:146
msgid "This board is private or does not exist"
msgstr "Questa bacheca è privata o non esiste"
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
msgid "This board URL has already been taken"
msgstr "Questo URL della bacheca è già stato utilizzato"
@@ -1398,7 +1361,7 @@ msgstr "Attiva/disattiva menu"
msgid "Track all card changes with detailed activity history."
msgstr "Tieni traccia di tutte le modifiche alle schede con una cronologia dettagliata delle attività."
#: src/views/settings/index.tsx:92
#: src/views/settings/index.tsx:69
msgid "Trello disconnected"
msgstr "Trello disconnesso"
@@ -1414,7 +1377,7 @@ msgstr "Smistamento"
msgid "Unable to add comment"
msgstr "Impossibile aggiungere il commento"
#: src/views/board/components/NewCardForm.tsx:142
#: src/views/board/components/NewCardForm.tsx:125
msgid "Unable to create card"
msgstr "Impossibile creare la scheda"
@@ -1422,7 +1385,7 @@ msgstr "Impossibile creare la scheda"
msgid "Unable to create list"
msgstr "Impossibile creare la lista"
#: src/components/NewWorkspaceForm.tsx:40
#: src/components/NewWorkspaceForm.tsx:38
msgid "Unable to create workspace"
msgstr "Impossibile creare lo spazio di lavoro"
@@ -1438,7 +1401,7 @@ msgstr "Impossibile eliminare il commento"
msgid "Unable to remove member"
msgstr "Impossibile rimuovere il membro"
#: src/components/FeedbackModal.tsx:40
#: src/components/FeedbackButton.tsx:45
msgid "Unable to send feedback"
msgstr "Impossibile inviare feedback"
@@ -1450,12 +1413,12 @@ msgstr "Impossibile aggiornare l'URL della bacheca"
msgid "Unable to update board visibility"
msgstr "Impossibile aggiornare la visibilità della bacheca"
#: src/views/card/index.tsx:158
#: src/views/board/index.tsx:190
#: src/views/card/index.tsx:115
#: src/views/board/index.tsx:188
msgid "Unable to update card"
msgstr "Impossibile aggiornare la scheda"
#: src/views/card/components/Comment.tsx:63
#: src/views/card/components/Comment.tsx:61
msgid "Unable to update comment"
msgstr "Impossibile aggiornare il commento"
@@ -1464,7 +1427,7 @@ msgid "Unable to update labels"
msgstr "Impossibile aggiornare le etichette"
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:134
#: src/views/board/index.tsx:132
msgid "Unable to update list"
msgstr "Impossibile aggiornare la lista"
@@ -1508,11 +1471,11 @@ msgstr "Liste illimitate"
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
msgid "Update"
msgstr "Aggiorna"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Update label"
msgstr "Aggiorna etichetta"
@@ -1553,23 +1516,19 @@ msgstr "L'URL deve contenere almeno 3 caratteri"
msgid "Use template"
msgstr "Usa template"
#: src/views/members/index.tsx:185
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Utente"
#: src/views/members/components/InviteMemberForm.tsx:58
msgid "User is already a member of this workspace"
msgstr "L'utente è già membro di questo spazio di lavoro"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "Visualizza e gestisci le tue chiavi API."
#: src/views/settings/index.tsx:199
#: src/views/settings/index.tsx:171
msgid "View and manage your billing and subscription."
msgstr "Visualizza e gestisci la tua fatturazione e abbonamento."
@@ -1577,18 +1536,10 @@ msgstr "Visualizza e gestisci la tua fatturazione e abbonamento."
msgid "View docs"
msgstr "Visualizza documenti"
#: src/views/public/board/index.tsx:120
msgid "View only"
msgstr "Solo visualizzazione"
#: src/views/home/components/Features.tsx:147
msgid "View our roadmap."
msgstr "Visualizza la nostra roadmap."
#: src/views/public/board/index.tsx:149
msgid "View workspace"
msgstr "Visualizza spazio di lavoro"
#: src/views/board/components/VisibilityButton.tsx:91
msgid "Visibility"
msgstr "Visibilità"
@@ -1621,7 +1572,7 @@ msgstr "Quando Trello fu lanciato nel 2011, stupì tutti con la sua semplicità
msgid "Why make an open source Trello?"
msgstr "Perché creare un Trello open source?"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Workspace"
msgstr "Spazio di lavoro"
@@ -1629,7 +1580,7 @@ msgstr "Spazio di lavoro"
msgid "Workspace deleted"
msgstr "Spazio di lavoro eliminato"
#: src/views/settings/index.tsx:175
#: src/views/settings/index.tsx:147
msgid "Workspace description"
msgstr "Descrizione dello spazio di lavoro"
@@ -1650,8 +1601,8 @@ msgstr "Descrizione dell'area di lavoro aggiornata"
msgid "Workspace members"
msgstr "Membri del workspace"
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
#: src/views/settings/index.tsx:130
#: src/components/NewWorkspaceForm.tsx:78
msgid "Workspace name"
msgstr "Nome dello spazio di lavoro"
@@ -1671,7 +1622,7 @@ msgstr "Nome dello spazio di lavoro aggiornato"
msgid "Workspace slug updated"
msgstr "Slug dell'area di lavoro aggiornato"
#: src/views/settings/index.tsx:165
#: src/views/settings/index.tsx:138
msgid "Workspace URL"
msgstr "URL dello spazio di lavoro"
@@ -1719,15 +1670,15 @@ msgstr "Le tue bacheche sono state importate."
msgid "Your display name has been updated."
msgstr "Il tuo nome visualizzato è stato aggiornato."
#: src/views/settings/components/Avatar.tsx:27
#: src/views/settings/components/Avatar.tsx:25
msgid "Your profile image has been updated."
msgstr "La tua immagine del profilo è stata aggiornata."
#: src/views/settings/index.tsx:93
#: src/views/settings/index.tsx:70
msgid "Your Trello account has been disconnected."
msgstr "Il tuo account Trello è stato disconnesso."
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:214
msgid "Your Trello account is connected."
msgstr "Il tuo account Trello è connesso."

File diff suppressed because one or more lines are too long

View File

@@ -13,22 +13,22 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/views/card/components/Comment.tsx:123
#: src/views/card/components/Comment.tsx:121
msgid " (edited)"
msgstr " (bewerkt)"
#: src/components/FeedbackModal.tsx:102
#: src/components/FeedbackButton.tsx:123
msgid ", or see our"
msgstr ", of bekijk onze"
#. placeholder {0}: card?.title ?? "Card"
#. placeholder {1}: board?.name ?? "Board"
#: src/views/card/index.tsx:189
#: src/views/card/index.tsx:148
msgid "{0} | {1}"
msgstr "{0} | {1}"
#. placeholder {0}: labelPublicIds.length
#: src/views/board/components/NewCardForm.tsx:392
#: src/views/board/components/NewCardForm.tsx:365
msgid "{0} labels"
msgstr "{0} labels"
@@ -36,6 +36,10 @@ msgstr "{0} labels"
msgid "{boardCount, plural, one {Import board (1)} other {Import boards ({boardCount})}}"
msgstr "{boardCount, plural, one {Bord importeren (1)} other {Borden importeren ({boardCount})}}"
#: src/views/home/index.tsx:51
msgid "#1 Hacker News"
msgstr "#1 Hacker News"
#: src/views/home/components/Pricing.tsx:36
msgid "1 user"
msgstr "1 gebruiker"
@@ -48,8 +52,8 @@ msgstr "Een krachtige, flexibele kanban-app die je helpt werk te organiseren, vo
msgid "Account deleted"
msgstr "Account verwijderd"
#: src/views/public/board/CardModal.tsx:128
#: src/views/card/index.tsx:256
#: src/views/public/board/CardModal.tsx:104
#: src/views/card/index.tsx:215
msgid "Activity"
msgstr "Activiteit"
@@ -62,11 +66,11 @@ msgid "Add a card"
msgstr "Voeg een kaart toe"
#: src/views/card/components/NewCommentForm.tsx:57
#: src/views/card/components/Comment.tsx:146
#: src/views/card/components/Comment.tsx:144
msgid "Add a comment..."
msgstr "Voeg een reactie toe..."
#: src/components/Editor.tsx:303
#: src/components/Editor.tsx:302
msgid "Add description... (type '/' to open commands)"
msgstr "Voeg beschrijving toe... (typ '/' om commando's te openen)"
@@ -75,7 +79,7 @@ msgstr "Voeg beschrijving toe... (typ '/' om commando's te openen)"
msgid "Add label"
msgstr "Label toevoegen"
#: src/views/members/components/InviteMemberForm.tsx:85
#: src/views/members/components/InviteMemberForm.tsx:50
#: src/views/card/components/MemberSelector.tsx:130
msgid "Add member"
msgstr "Lid toevoegen"
@@ -108,11 +112,11 @@ msgstr "Alle systemen operationeel"
msgid "Already have an account? <0><1>Sign in</1></0>"
msgstr "Heb je al een account? <0><1>Log in</1></0>"
#: src/views/settings/index.tsx:100
#: src/views/settings/index.tsx:77
msgid "An error occurred while disconnecting your Trello account."
msgstr "Er is een fout opgetreden bij het verbreken van de verbinding met je Trello-account."
#: src/views/settings/index.tsx:257
#: src/views/settings/index.tsx:229
msgid "API keys"
msgstr "API-sleutels"
@@ -145,10 +149,6 @@ msgstr "Weet je zeker dat je deze kaart wilt verwijderen?"
msgid "Are you sure you want to delete this comment?"
msgstr "Weet je zeker dat je deze opmerking wilt verwijderen?"
#: src/components/DeleteLabelConfirmation.tsx:39
msgid "Are you sure you want to delete this label?"
msgstr "Weet je zeker dat je dit label wilt verwijderen?"
#: src/views/settings/components/DeleteAccountConfirmation.tsx:54
msgid "Are you sure you want to delete your account?"
msgstr "Weet je zeker dat je je account wilt verwijderen?"
@@ -169,12 +169,12 @@ msgstr "Backlog"
msgid "Basic Kanban"
msgstr "Basis kanban"
#: src/views/settings/index.tsx:196
#: src/views/settings/index.tsx:168
#: src/views/boards/components/TemplateBoards.tsx:55
msgid "Billing"
msgstr "Facturering"
#: src/views/settings/index.tsx:206
#: src/views/settings/index.tsx:178
msgid "Billing portal"
msgstr "Factureringsportaal"
@@ -182,7 +182,7 @@ msgstr "Factureringsportaal"
msgid "Blog Post"
msgstr "Blogbericht"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Board"
msgstr "Bord"
@@ -194,8 +194,7 @@ msgstr "Bordnaam mag niet langer zijn dan 100 tekens"
msgid "Board name is required"
msgstr "Bordnaam is verplicht"
#: src/views/public/board/index.tsx:143
#: src/views/board/index.tsx:358
#: src/views/board/index.tsx:265
msgid "Board not found"
msgstr "Bord niet gevonden"
@@ -207,7 +206,7 @@ msgstr "Board URL kan alleen letters, cijfers en koppeltekens bevatten"
msgid "Board URL cannot exceed 60 characters"
msgstr "Board URL mag niet langer zijn dan 60 tekens"
#: src/views/public/board/index.tsx:59
#: src/views/public/board/index.tsx:53
msgid "Board URL copied to clipboard"
msgstr "Board URL gekopieerd naar klembord"
@@ -223,13 +222,13 @@ msgstr "Bordzichtbaarheid"
msgid "Board visibility updated"
msgstr "Zichtbaarheid van bord bijgewerkt"
#: src/views/boards/index.tsx:27
#: src/components/SideNavigation.tsx:68
#: src/views/boards/index.tsx:25
#: src/components/SideNavigation.tsx:39
msgid "Boards"
msgstr "Borden"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/boards/index.tsx:23
#: src/views/boards/index.tsx:21
msgid "Boards | {0}"
msgstr "Borden | {0}"
@@ -251,20 +250,19 @@ msgstr "Bugrapport"
#: src/views/members/components/DeleteMemberConfirmation.tsx:55
#: src/views/card/components/DeleteCommentConfirmation.tsx:76
#: src/views/card/components/DeleteCardConfirmation.tsx:86
#: src/views/card/components/Comment.tsx:158
#: src/components/DeleteLabelConfirmation.tsx:47
#: src/views/card/components/Comment.tsx:156
msgid "Cancel"
msgstr "Annuleren"
#: src/views/card/index.tsx:234
#: src/views/card/index.tsx:193
msgid "Card not found"
msgstr "Kaart niet gevonden"
#: src/views/board/components/NewCardForm.tsx:278
#: src/views/board/components/NewCardForm.tsx:254
msgid "Card title"
msgstr "Kaarttitel"
#: src/views/settings/index.tsx:188
#: src/views/settings/index.tsx:160
msgid "Change the language of the app."
msgstr "Wijzig de taal van de app."
@@ -314,7 +312,7 @@ msgstr "Volledige controle en eigendom:"
msgid "Confirm URL change"
msgstr "URL-wijziging bevestigen"
#: src/views/settings/index.tsx:233
#: src/views/settings/index.tsx:205
#: src/views/boards/components/ImportBoardsForm.tsx:157
msgid "Connect Trello"
msgstr "Verbind Trello"
@@ -323,7 +321,7 @@ msgstr "Verbind Trello"
msgid "Connect your favorite tools to streamline your workflow."
msgstr "Verbind je favoriete tools om je werkstroom te stroomlijnen."
#: src/views/settings/index.tsx:220
#: src/views/settings/index.tsx:192
msgid "Connect your Trello account to import boards."
msgstr "Verbind je Trello-account om borden te importeren."
@@ -331,7 +329,7 @@ msgstr "Verbind je Trello-account om borden te importeren."
msgid "Contact"
msgstr "Contact"
#: src/components/FeedbackModal.tsx:100
#: src/components/FeedbackButton.tsx:121
msgid "Contact us"
msgstr "Neem contact op"
@@ -339,12 +337,12 @@ msgstr "Neem contact op"
msgid "Content Creation"
msgstr "Content creatie"
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Continue with "
msgstr "Doorgaan met "
#. placeholder {0}: provider.name
#: src/components/AuthForm.tsx:269
#: src/components/AuthForm.tsx:268
msgid "Continue with {0}"
msgstr "Doorgaan met {0}"
@@ -353,7 +351,7 @@ msgid "Control who can view and edit your boards."
msgstr "Bepaal wie je borden kan bekijken en bewerken."
#: src/views/board/components/NewListForm.tsx:140
#: src/views/board/components/NewCardForm.tsx:418
#: src/views/board/components/NewCardForm.tsx:391
#: src/components/LabelForm.tsx:212
msgid "Create another"
msgstr "Maak nog een"
@@ -362,15 +360,15 @@ msgstr "Maak nog een"
msgid "Create board"
msgstr "Maak bord"
#: src/views/board/components/NewCardForm.tsx:428
#: src/views/board/components/NewCardForm.tsx:401
msgid "Create card"
msgstr "Maak kaart"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Create label"
msgstr "Maak label"
#: src/views/board/components/NewListForm.tsx:152
#: src/views/board/components/NewListForm.tsx:148
msgid "Create list"
msgstr "Lijst maken"
@@ -383,16 +381,16 @@ msgid "Create new key"
msgstr "Nieuwe sleutel aanmaken"
#: src/views/card/components/LabelSelector.tsx:98
#: src/views/board/components/NewCardForm.tsx:354
#: src/views/board/components/NewCardForm.tsx:327
msgid "Create new label"
msgstr "Maak nieuw label"
#: src/views/board/index.tsx:426
#: src/views/board/index.tsx:327
msgid "Create new list"
msgstr "Maak nieuwe lijst"
#: src/components/WorkspaceMenu.tsx:116
#: src/components/NewWorkspaceForm.tsx:93
#: src/components/WorkspaceMenu.tsx:85
#: src/components/NewWorkspaceForm.tsx:91
msgid "Create workspace"
msgstr "Werkruimte maken"
@@ -416,19 +414,18 @@ msgstr "Aangepaste URL's zijn een premium functie. Je wordt doorgestuurd om je a
msgid "Customer Support"
msgstr "Klantenservice"
#: src/components/UserMenu.tsx:153
#: src/components/UserMenu.tsx:112
msgid "Dark"
msgstr "Donker"
#: src/views/card/components/DeleteCommentConfirmation.tsx:82
#: src/views/card/components/DeleteCardConfirmation.tsx:92
#: src/components/LabelForm.tsx:226
#: src/components/DeleteLabelConfirmation.tsx:49
msgid "Delete"
msgstr "Verwijderen"
#: src/views/settings/index.tsx:288
#: src/views/settings/index.tsx:298
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:270
#: src/views/settings/components/DeleteAccountConfirmation.tsx:96
msgid "Delete account"
msgstr "Account verwijderen"
@@ -441,7 +438,7 @@ msgstr "Board verwijderen"
msgid "Delete card"
msgstr "Kaart verwijderen"
#: src/views/card/components/Comment.tsx:91
#: src/views/card/components/Comment.tsx:89
msgid "Delete comment"
msgstr "Reactie verwijderen"
@@ -449,8 +446,8 @@ msgstr "Reactie verwijderen"
msgid "Delete list"
msgstr "Lijst verwijderen"
#: src/views/settings/index.tsx:270
#: src/views/settings/index.tsx:281
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:253
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:106
msgid "Delete workspace"
msgstr "Werkruimte verwijderen"
@@ -459,7 +456,7 @@ msgstr "Werkruimte verwijderen"
msgid "Design"
msgstr "Ontwerp"
#: src/views/settings/index.tsx:248
#: src/views/settings/index.tsx:220
msgid "Disconnect Trello"
msgstr "Trello ontkoppelen"
@@ -467,7 +464,7 @@ msgstr "Trello ontkoppelen"
msgid "Discuss and collaborate on cards."
msgstr "Bespreek en werk samen aan kaarten."
#: src/views/settings/index.tsx:149
#: src/views/settings/index.tsx:123
msgid "Display name"
msgstr "Weergavenaam"
@@ -487,7 +484,7 @@ msgstr "Weergavenaam bijgewerkt"
msgid "Do you offer a free plan?"
msgstr "Bieden jullie een gratis abonnement aan?"
#: src/components/FeedbackModal.tsx:109
#: src/components/FeedbackButton.tsx:130
msgid "docs"
msgstr "docs"
@@ -497,7 +494,6 @@ msgstr "Docs"
#: src/views/home/components/Footer.tsx:77
#: src/views/boards/components/TemplateBoards.tsx:23
#: src/components/UserMenu.tsx:191
msgid "Documentation"
msgstr "Documentatie"
@@ -517,7 +513,7 @@ msgstr "Klaar"
msgid "Edit board URL"
msgstr "Board URL bewerken"
#: src/views/card/components/Comment.tsx:82
#: src/views/card/components/Comment.tsx:80
msgid "Edit comment"
msgstr "Reactie bewerken"
@@ -525,19 +521,15 @@ msgstr "Reactie bewerken"
msgid "Edit label"
msgstr "Label bewerken"
#: src/views/board/components/UpdateBoardSlugForm.tsx:161
msgid "Edit workspace URL"
msgstr "Werkruimte-URL bewerken"
#: src/views/boards/components/TemplateBoards.tsx:31
msgid "Editing"
msgstr "Bewerken"
#: src/components/AuthForm.tsx:337
#: src/components/AuthForm.tsx:336
msgid "email"
msgstr "e-mail"
#: src/views/members/components/InviteMemberForm.tsx:99
#: src/views/members/components/InviteMemberForm.tsx:64
msgid "Email"
msgstr "E-mail"
@@ -545,15 +537,15 @@ msgstr "E-mail"
msgid "Enhancement"
msgstr "Verbetering"
#: src/components/AuthForm.tsx:302
#: src/components/AuthForm.tsx:301
msgid "Enter your email address"
msgstr "Voer je e-mailadres in"
#: src/components/AuthForm.tsx:290
#: src/components/AuthForm.tsx:289
msgid "Enter your name"
msgstr "Voer je naam in"
#: src/components/AuthForm.tsx:315
#: src/components/AuthForm.tsx:314
msgid "Enter your password"
msgstr "Voer je wachtwoord in"
@@ -561,28 +553,19 @@ msgstr "Voer je wachtwoord in"
msgid "Error deleting account"
msgstr "Fout bij verwijderen account"
#: src/components/DeleteLabelConfirmation.tsx:22
msgid "Error deleting label"
msgstr "Fout bij het verwijderen van label"
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:45
msgid "Error deleting workspace"
msgstr "Fout bij verwijderen werkruimte"
#: src/views/settings/index.tsx:99
#: src/views/settings/index.tsx:76
msgid "Error disconnecting Trello"
msgstr "Fout bij ontkoppelen van Trello"
#: src/views/members/components/InviteMemberForm.tsx:57
#: src/views/members/components/InviteMemberForm.tsx:63
msgid "Error inviting member"
msgstr "Fout bij het uitnodigen van lid"
#: src/views/settings/components/UpdateDisplayNameForm.tsx:54
msgid "Error updating display name"
msgstr "Fout bij bijwerken weergavenaam"
#: src/views/settings/components/Avatar.tsx:39
#: src/views/settings/components/Avatar.tsx:37
msgid "Error updating profile image"
msgstr "Fout bij het bijwerken van profielafbeelding"
@@ -598,8 +581,8 @@ msgstr "Fout bij bijwerken naam werkruimte"
msgid "Error updating workspace URL"
msgstr "Fout bij het bijwerken van werkruimte-URL"
#: src/views/settings/components/Avatar.tsx:56
#: src/views/settings/components/Avatar.tsx:97
#: src/views/settings/components/Avatar.tsx:54
#: src/views/settings/components/Avatar.tsx:95
msgid "Error uploading profile image"
msgstr "Fout bij het uploaden van profielafbeelding"
@@ -639,12 +622,11 @@ msgstr "Functieverzoek"
msgid "Features"
msgstr "Functies"
#: src/components/UserMenu.tsx:199
#: src/components/FeedbackModal.tsx:59
#: src/components/FeedbackButton.tsx:78
msgid "Feedback"
msgstr "Feedback"
#: src/components/FeedbackModal.tsx:33
#: src/components/FeedbackButton.tsx:38
msgid "Feedback sent"
msgstr "Feedback verzonden"
@@ -692,7 +674,7 @@ msgstr "Aan de slag"
msgid "Get started by creating a new board"
msgstr "Begin door een nieuw bord te maken"
#: src/views/board/index.tsx:418
#: src/views/board/index.tsx:319
msgid "Get started by creating a new list"
msgstr "Begin door een nieuwe lijst te maken"
@@ -765,11 +747,11 @@ msgstr "Ik bevestig dat alle gegevens van de werkruimte permanent worden verwijd
msgid "Ideas"
msgstr "Ideeën"
#: src/components/FeedbackModal.tsx:75
#: src/components/FeedbackButton.tsx:98
msgid "Ideas to improve this page..."
msgstr "Ideeën om deze pagina te verbeteren..."
#: src/views/boards/index.tsx:38
#: src/views/boards/index.tsx:39
msgid "Import"
msgstr "Importeren"
@@ -815,19 +797,11 @@ msgstr "Integraties"
msgid "Interviewing"
msgstr "Interviewen"
#: src/views/members/components/InviteMemberForm.tsx:26
msgid "Invalid email address"
msgstr "Ongeldig e-mailadres"
#: src/views/members/index.tsx:169
#: src/views/members/index.tsx:156
msgid "Invite"
msgstr "Uitnodigen"
#: src/views/members/components/InviteMemberForm.tsx:113
msgid "Invite another"
msgstr "Nog iemand uitnodigen"
#: src/views/members/components/InviteMemberForm.tsx:123
#: src/views/members/components/InviteMemberForm.tsx:82
#: src/views/card/components/MemberSelector.tsx:112
msgid "Invite member"
msgstr "Lid uitnodigen"
@@ -849,8 +823,8 @@ msgstr "Kanban opnieuw uitgevonden"
msgid "Keep in mind that this action is irreversible."
msgstr "Houd er rekening mee dat deze actie onomkeerbaar is."
#: src/views/card/index.tsx:113
#: src/views/board/components/NewCardForm.tsx:358
#: src/views/card/index.tsx:243
#: src/views/board/components/NewCardForm.tsx:331
#: src/views/board/components/Filters.tsx:101
msgid "Labels"
msgstr "Labels"
@@ -859,7 +833,7 @@ msgstr "Labels"
msgid "Labels & Filters"
msgstr "Labels & filters"
#: src/views/settings/index.tsx:185
#: src/views/settings/index.tsx:157
msgid "Language"
msgstr "Taal"
@@ -875,15 +849,15 @@ msgstr "Juridisch"
msgid "License"
msgstr "Licentie"
#: src/components/UserMenu.tsx:167
#: src/components/UserMenu.tsx:126
msgid "Light"
msgstr "Licht"
#: src/views/public/board/index.tsx:57
#: src/views/public/board/index.tsx:51
msgid "Link copied"
msgstr "Link gekopieerd"
#: src/views/card/index.tsx:105
#: src/views/card/index.tsx:235
msgid "List"
msgstr "Lijst"
@@ -895,7 +869,7 @@ msgstr "Lijstnaam"
msgid "Login | kan.bn"
msgstr "Login | kan.bn"
#: src/components/UserMenu.tsx:209
#: src/components/UserMenu.tsx:136
msgid "Logout"
msgstr "Uitloggen"
@@ -907,7 +881,7 @@ msgstr "Lange termijn"
msgid "Low Priority"
msgstr "Lage prioriteit"
#: src/components/AuthForm.tsx:338
#: src/components/AuthForm.tsx:337
msgid "magic link"
msgstr "magische link"
@@ -915,16 +889,16 @@ msgstr "magische link"
msgid "Medium Priority"
msgstr "Gemiddelde prioriteit"
#: src/views/members/index.tsx:161
#: src/views/card/index.tsx:121
#: src/views/board/components/NewCardForm.tsx:317
#: src/views/members/index.tsx:148
#: src/views/card/index.tsx:251
#: src/views/board/components/NewCardForm.tsx:290
#: src/views/board/components/Filters.tsx:93
#: src/components/SideNavigation.tsx:73
#: src/components/SideNavigation.tsx:44
msgid "Members"
msgstr "Leden"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/members/index.tsx:157
#: src/views/members/index.tsx:144
msgid "Members | {0}"
msgstr "Leden | {0}"
@@ -945,11 +919,11 @@ msgstr "heeft de kaart naar een andere lijst verplaatst"
msgid "Name"
msgstr "Naam"
#: src/components/FeedbackModal.tsx:95
#: src/components/FeedbackButton.tsx:116
msgid "Need help?"
msgstr "Hulp nodig?"
#: src/views/boards/index.tsx:48
#: src/views/boards/index.tsx:52
msgid "New"
msgstr "Nieuw"
@@ -957,7 +931,7 @@ msgstr "Nieuw"
msgid "New board"
msgstr "Nieuw bord"
#: src/views/board/components/NewCardForm.tsx:261
#: src/views/board/components/NewCardForm.tsx:237
msgid "New card"
msgstr "Nieuwe kaart"
@@ -969,7 +943,7 @@ msgstr "Nieuwe import"
msgid "New label"
msgstr "Nieuw label"
#: src/views/board/index.tsx:395
#: src/views/board/index.tsx:296
#: src/views/board/components/NewListForm.tsx:112
msgid "New list"
msgstr "Nieuwe lijst"
@@ -978,7 +952,7 @@ msgstr "Nieuwe lijst"
msgid "New Ticket"
msgstr "Nieuw ticket"
#: src/components/NewWorkspaceForm.tsx:64
#: src/components/NewWorkspaceForm.tsx:62
msgid "New workspace"
msgstr "Nieuwe werkruimte"
@@ -1002,7 +976,7 @@ msgstr "Geen borden gevonden"
msgid "No credit card required"
msgstr "Geen creditcard vereist"
#: src/views/board/index.tsx:415
#: src/views/board/index.tsx:316
msgid "No lists"
msgstr "Geen lijsten"
@@ -1014,15 +988,15 @@ msgstr "Aanbod"
msgid "Onboarding"
msgstr "Inwerktraject"
#: src/views/settings/index.tsx:291
#: src/views/settings/index.tsx:263
msgid "Once you delete your account, there is no going back. This action cannot be undone."
msgstr "Zodra je je account verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
#: src/views/settings/index.tsx:273
#: src/views/settings/index.tsx:245
msgid "Once you delete your workspace, there is no going back. This action cannot be undone."
msgstr "Zodra je je werkruimte verwijdert, is er geen weg terug. Deze actie kan niet ongedaan worden gemaakt."
#: src/components/AuthForm.tsx:280
#: src/components/AuthForm.tsx:279
msgid "or"
msgstr "of"
@@ -1042,7 +1016,7 @@ msgstr "Deeltijd"
msgid "Payment frequency"
msgstr "Betalingsfrequentie"
#: src/views/members/index.tsx:118
#: src/views/members/index.tsx:107
msgid "Pending"
msgstr "In behandeling"
@@ -1059,19 +1033,19 @@ msgstr "Persoonlijk project"
msgid "Planning"
msgstr "Planning"
#: src/components/AuthForm.tsx:306
#: src/components/AuthForm.tsx:305
msgid "Please enter a valid email address"
msgstr "Voer een geldig e-mailadres in"
#: src/components/AuthForm.tsx:294
#: src/components/AuthForm.tsx:293
msgid "Please enter a valid name"
msgstr "Voer een geldige naam in"
#: src/components/AuthForm.tsx:319
#: src/components/AuthForm.tsx:318
msgid "Please enter a valid password"
msgstr "Voer een geldig wachtwoord in"
#: src/views/settings/components/Avatar.tsx:57
#: src/views/settings/components/Avatar.tsx:55
msgid "Please select a file to upload."
msgstr "Selecteer een bestand om te uploaden."
@@ -1081,28 +1055,26 @@ msgstr "Selecteer een bestand om te uploaden."
#: src/views/settings/components/UpdateDisplayNameForm.tsx:55
#: src/views/settings/components/DeleteWorkspaceConfirmation.tsx:46
#: src/views/settings/components/DeleteAccountConfirmation.tsx:40
#: src/views/settings/components/Avatar.tsx:40
#: src/views/settings/components/Avatar.tsx:98
#: src/views/members/components/InviteMemberForm.tsx:64
#: src/views/settings/components/Avatar.tsx:38
#: src/views/settings/components/Avatar.tsx:96
#: src/views/members/components/DeleteMemberConfirmation.tsx:28
#: src/views/card/index.tsx:159
#: src/views/card/index.tsx:116
#: src/views/card/components/NewCommentForm.tsx:31
#: src/views/card/components/MemberSelector.tsx:80
#: src/views/card/components/ListSelector.tsx:53
#: src/views/card/components/LabelSelector.tsx:73
#: src/views/card/components/DeleteCommentConfirmation.tsx:45
#: src/views/card/components/DeleteCardConfirmation.tsx:52
#: src/views/card/components/Comment.tsx:64
#: src/views/card/components/Comment.tsx:62
#: src/views/boards/components/ImportBoardsForm.tsx:205
#: src/views/board/index.tsx:135
#: src/views/board/index.tsx:191
#: src/views/board/index.tsx:133
#: src/views/board/index.tsx:189
#: src/views/board/components/VisibilityButton.tsx:53
#: src/views/board/components/UpdateBoardSlugForm.tsx:72
#: src/views/board/components/NewListForm.tsx:78
#: src/views/board/components/NewCardForm.tsx:145
#: src/components/NewWorkspaceForm.tsx:41
#: src/components/FeedbackModal.tsx:41
#: src/components/DeleteLabelConfirmation.tsx:23
#: src/views/board/components/NewCardForm.tsx:128
#: src/components/NewWorkspaceForm.tsx:39
#: src/components/FeedbackButton.tsx:46
msgid "Please try again later, or contact customer support."
msgstr "Probeer het later opnieuw of neem contact op met de klantenservice."
@@ -1124,11 +1096,11 @@ msgstr "Privacybeleid"
msgid "Private"
msgstr "Privé"
#: src/views/settings/components/Avatar.tsx:26
#: src/views/settings/components/Avatar.tsx:24
msgid "Profile image updated"
msgstr "Profielafbeelding bijgewerkt"
#: src/views/settings/index.tsx:144
#: src/views/settings/index.tsx:118
msgid "Profile picture"
msgstr "Profielfoto"
@@ -1164,7 +1136,7 @@ msgstr "Op afstand"
msgid "Remove"
msgstr "Verwijderen"
#: src/views/members/index.tsx:132
#: src/views/members/index.tsx:120
msgid "Remove member"
msgstr "Lid verwijderen"
@@ -1205,7 +1177,7 @@ msgstr "Intrekken"
msgid "Roadmap"
msgstr "Roadmap"
#: src/views/members/index.tsx:191
#: src/views/members/index.tsx:178
msgid "Role"
msgstr "Rol"
@@ -1213,7 +1185,7 @@ msgstr "Rol"
msgid "Run on your own infrastructure"
msgstr "Draai op je eigen infrastructuur"
#: src/views/card/components/Comment.tsx:165
#: src/views/card/components/Comment.tsx:163
msgid "Save"
msgstr "Opslaan"
@@ -1245,21 +1217,21 @@ msgstr "Zelf hosten met Github"
msgid "self-assigned the card"
msgstr "heeft de kaart aan zichzelf toegewezen"
#: src/components/FeedbackModal.tsx:116
msgid "Send feedback"
msgstr "Feedback versturen"
#: src/components/FeedbackButton.tsx:137
msgid "Send"
msgstr "Versturen"
#: src/views/boards/components/TemplateBoards.tsx:69
msgid "Senior"
msgstr "Senior"
#: src/views/settings/index.tsx:138
#: src/components/SideNavigation.tsx:78
#: src/views/settings/index.tsx:112
#: src/components/SideNavigation.tsx:49
msgid "Settings"
msgstr "Instellingen"
#. placeholder {0}: workspace.name ?? "Workspace"
#: src/views/settings/index.tsx:134
#: src/views/settings/index.tsx:108
msgid "Settings | {0}"
msgstr "Instellingen | {0}"
@@ -1281,7 +1253,7 @@ msgstr "Registreren uitgeschakeld"
msgid "Sign up is currently disabled. Please try again later."
msgstr "Registreren is momenteel uitgeschakeld. Probeer het later opnieuw."
#: src/components/AuthForm.tsx:335
#: src/components/AuthForm.tsx:334
msgid "Sign up with "
msgstr "Registreren met "
@@ -1310,15 +1282,11 @@ msgstr "Star op Github"
msgid "Success"
msgstr "Geslaagd"
#: src/components/UserMenu.tsx:180
msgid "Support"
msgstr "Ondersteuning"
#: src/views/home/components/Pricing.tsx:57
msgid "Support the development of the project"
msgstr "Ondersteun de ontwikkeling van het project"
#: src/components/UserMenu.tsx:139
#: src/components/UserMenu.tsx:98
msgid "System"
msgstr "Systeem"
@@ -1334,7 +1302,7 @@ msgstr "Sjablonen"
msgid "Terms of service"
msgstr "Servicevoorwaarden"
#: src/components/FeedbackModal.tsx:34
#: src/components/FeedbackButton.tsx:39
msgid "Thank you for your feedback!"
msgstr "Bedankt voor je feedback!"
@@ -1351,7 +1319,7 @@ msgstr "Het open source <0/> alternatief voor Trello"
msgid "The visibility of your board has been set to {0}."
msgstr "De zichtbaarheid van je bord is ingesteld op {0}."
#: src/components/UserMenu.tsx:126
#: src/components/UserMenu.tsx:85
msgid "Theme"
msgstr "Thema"
@@ -1361,14 +1329,9 @@ msgstr "Ze zullen geen toegang meer hebben tot deze werkruimte."
#: src/views/card/components/DeleteCommentConfirmation.tsx:68
#: src/views/card/components/DeleteCardConfirmation.tsx:78
#: src/components/DeleteLabelConfirmation.tsx:42
msgid "This action can't be undone."
msgstr "Deze actie kan niet ongedaan worden gemaakt."
#: src/views/public/board/index.tsx:146
msgid "This board is private or does not exist"
msgstr "Dit bord is privé of bestaat niet"
#: src/views/board/components/UpdateBoardSlugForm.tsx:135
msgid "This board URL has already been taken"
msgstr "Deze board URL is al in gebruik"
@@ -1398,7 +1361,7 @@ msgstr "Menu in-/uitschakelen"
msgid "Track all card changes with detailed activity history."
msgstr "Volg alle kaartwijzigingen met gedetailleerde activiteitengeschiedenis."
#: src/views/settings/index.tsx:92
#: src/views/settings/index.tsx:69
msgid "Trello disconnected"
msgstr "Trello ontkoppeld"
@@ -1414,7 +1377,7 @@ msgstr "Triage"
msgid "Unable to add comment"
msgstr "Kan geen reactie toevoegen"
#: src/views/board/components/NewCardForm.tsx:142
#: src/views/board/components/NewCardForm.tsx:125
msgid "Unable to create card"
msgstr "Kan kaart niet aanmaken"
@@ -1422,7 +1385,7 @@ msgstr "Kan kaart niet aanmaken"
msgid "Unable to create list"
msgstr "Kan geen lijst maken"
#: src/components/NewWorkspaceForm.tsx:40
#: src/components/NewWorkspaceForm.tsx:38
msgid "Unable to create workspace"
msgstr "Kan werkruimte niet aanmaken"
@@ -1438,7 +1401,7 @@ msgstr "Kan opmerking niet verwijderen"
msgid "Unable to remove member"
msgstr "Kan lid niet verwijderen"
#: src/components/FeedbackModal.tsx:40
#: src/components/FeedbackButton.tsx:45
msgid "Unable to send feedback"
msgstr "Feedback kon niet worden verzonden"
@@ -1450,12 +1413,12 @@ msgstr "Kan board URL niet bijwerken"
msgid "Unable to update board visibility"
msgstr "Kan bordzichtbaarheid niet bijwerken"
#: src/views/card/index.tsx:158
#: src/views/board/index.tsx:190
#: src/views/card/index.tsx:115
#: src/views/board/index.tsx:188
msgid "Unable to update card"
msgstr "Kan kaart niet bijwerken"
#: src/views/card/components/Comment.tsx:63
#: src/views/card/components/Comment.tsx:61
msgid "Unable to update comment"
msgstr "Kan reactie niet bijwerken"
@@ -1464,7 +1427,7 @@ msgid "Unable to update labels"
msgstr "Kan labels niet bijwerken"
#: src/views/card/components/ListSelector.tsx:52
#: src/views/board/index.tsx:134
#: src/views/board/index.tsx:132
msgid "Unable to update list"
msgstr "Kan lijst niet bijwerken"
@@ -1508,11 +1471,11 @@ msgstr "Onbeperkt aantal lijsten"
#: src/views/settings/components/UpdateWorkspaceNameForm.tsx:82
#: src/views/settings/components/UpdateWorkspaceDescriptionForm.tsx:90
#: src/views/settings/components/UpdateDisplayNameForm.tsx:79
#: src/views/board/components/UpdateBoardSlugForm.tsx:174
#: src/views/board/components/UpdateBoardSlugForm.tsx:166
msgid "Update"
msgstr "Bijwerken"
#: src/components/LabelForm.tsx:236
#: src/components/LabelForm.tsx:233
msgid "Update label"
msgstr "Label bijwerken"
@@ -1553,23 +1516,19 @@ msgstr "URL moet minimaal 3 tekens lang zijn"
msgid "Use template"
msgstr "Sjabloon gebruiken"
#: src/views/members/index.tsx:185
#: src/views/members/index.tsx:172
msgid "User"
msgstr "Gebruiker"
#: src/views/members/components/InviteMemberForm.tsx:58
msgid "User is already a member of this workspace"
msgstr "Gebruiker is al lid van deze werkruimte"
#: src/views/boards/components/TemplateBoards.tsx:37
msgid "Video"
msgstr "Video"
#: src/views/settings/index.tsx:260
#: src/views/settings/index.tsx:232
msgid "View and manage your API keys."
msgstr "Bekijk en beheer je API-sleutels."
#: src/views/settings/index.tsx:199
#: src/views/settings/index.tsx:171
msgid "View and manage your billing and subscription."
msgstr "Bekijk en beheer je facturering en abonnement."
@@ -1577,18 +1536,10 @@ msgstr "Bekijk en beheer je facturering en abonnement."
msgid "View docs"
msgstr "Bekijk documentatie"
#: src/views/public/board/index.tsx:120
msgid "View only"
msgstr "Alleen bekijken"
#: src/views/home/components/Features.tsx:147
msgid "View our roadmap."
msgstr "Bekijk onze roadmap."
#: src/views/public/board/index.tsx:149
msgid "View workspace"
msgstr "Werkruimte bekijken"
#: src/views/board/components/VisibilityButton.tsx:91
msgid "Visibility"
msgstr "Zichtbaarheid"
@@ -1621,7 +1572,7 @@ msgstr "Toen Trello in 2011 werd gelanceerd, blies het iedereen omver met zijn z
msgid "Why make an open source Trello?"
msgstr "Waarom een open source Trello maken?"
#: src/views/board/index.tsx:332
#: src/views/board/index.tsx:239
msgid "Workspace"
msgstr "Werkruimte"
@@ -1629,7 +1580,7 @@ msgstr "Werkruimte"
msgid "Workspace deleted"
msgstr "Werkruimte verwijderd"
#: src/views/settings/index.tsx:175
#: src/views/settings/index.tsx:147
msgid "Workspace description"
msgstr "Werkruimte beschrijving"
@@ -1650,8 +1601,8 @@ msgstr "Werkruimtebeschrijving bijgewerkt"
msgid "Workspace members"
msgstr "Werkruimteleden"
#: src/views/settings/index.tsx:156
#: src/components/NewWorkspaceForm.tsx:80
#: src/views/settings/index.tsx:130
#: src/components/NewWorkspaceForm.tsx:78
msgid "Workspace name"
msgstr "Naam werkruimte"
@@ -1671,7 +1622,7 @@ msgstr "Werkruimtenaam bijgewerkt"
msgid "Workspace slug updated"
msgstr "Werkruimte-slug bijgewerkt"
#: src/views/settings/index.tsx:165
#: src/views/settings/index.tsx:138
msgid "Workspace URL"
msgstr "Werkruimte URL"
@@ -1719,15 +1670,15 @@ msgstr "Je borden zijn geïmporteerd."
msgid "Your display name has been updated."
msgstr "Je weergavenaam is bijgewerkt."
#: src/views/settings/components/Avatar.tsx:27
#: src/views/settings/components/Avatar.tsx:25
msgid "Your profile image has been updated."
msgstr "Je profielafbeelding is bijgewerkt."
#: src/views/settings/index.tsx:93
#: src/views/settings/index.tsx:70
msgid "Your Trello account has been disconnected."
msgstr "Je Trello-account is ontkoppeld."
#: src/views/settings/index.tsx:242
#: src/views/settings/index.tsx:214
msgid "Your Trello account is connected."
msgstr "Je Trello-account is verbonden."

File diff suppressed because one or more lines are too long

View File

@@ -1,18 +0,0 @@
import type { NextRequest } from "next/server";
import { NextResponse } from "next/server";
import { env } from "next-runtime-env";
export function middleware(request: NextRequest) {
if (request.nextUrl.pathname === "/") {
if (env("NEXT_PUBLIC_KAN_ENV") !== "cloud") {
const loginUrl = new URL("/login", request.url);
return NextResponse.redirect(loginUrl);
}
}
return NextResponse.next();
}
export const config = {
matcher: ["/"],
};

View File

@@ -1,9 +1,8 @@
import "~/styles/globals.css";
import "~/utils/i18n";
import type { NextPage, Viewport } from "next";
import type { AppProps, AppType } from "next/app";
import type { ReactElement, ReactNode } from "react";
import type { AppType } from "next/app";
import { Viewport } from "next";
import { Plus_Jakarta_Sans } from "next/font/google";
import Script from "next/script";
import { env } from "next-runtime-env";
@@ -35,15 +34,7 @@ export const viewport: Viewport = {
userScalable: false,
};
export type NextPageWithLayout<P = {}, IP = P> = NextPage<P, IP> & {
getLayout?: (page: ReactElement) => ReactNode;
};
type AppPropsWithLayout = AppProps & {
Component: NextPageWithLayout;
};
const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
const MyApp: AppType = ({ Component, pageProps }) => {
const posthogKey = env("NEXT_PUBLIC_POSTHOG_KEY");
useEffect(() => {
@@ -59,8 +50,6 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
}
}, [posthogKey]);
const getLayout = Component.getLayout ?? ((page) => page);
return (
<>
<style jsx global>{`
@@ -86,10 +75,10 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
<PopupProvider>
{posthogKey ? (
<PostHogProvider client={posthog}>
{getLayout(<Component {...pageProps} />)}
<Component {...pageProps} />
</PostHogProvider>
) : (
getLayout(<Component {...pageProps} />)
<Component {...pageProps} />
)}
</PopupProvider>
</ModalProvider>

View File

@@ -46,7 +46,6 @@ export default async function handler(
const client = new S3Client({
region: env.S3_REGION ?? "",
endpoint: env.S3_ENDPOINT ?? "",
forcePathStyle: env.S3_FORCE_PATH_STYLE === "true",
credentials: {
accessKeyId: env.S3_ACCESS_KEY_ID ?? "",
secretAccessKey: env.S3_SECRET_ACCESS_KEY ?? "",
@@ -59,7 +58,6 @@ export default async function handler(
new PutObjectCommand({
Bucket: nextRuntimeEnv("NEXT_PUBLIC_AVATAR_BUCKET_NAME") ?? "",
Key: filename,
ACL: "public-read",
}),
);

View File

@@ -1,4 +1,4 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { type NextApiRequest, type NextApiResponse } from "next";
import { openApiDocument } from "@kan/api/openapi";

View File

@@ -1,17 +1,15 @@
import type { NextPageWithLayout } from "~/pages/_app";
import { getDashboardLayout } from "~/components/Dashboard";
import { WorkspaceProvider } from "~/providers/workspace";
import Dashboard from "~/components/Dashboard";
import Popup from "~/components/Popup";
import BoardView from "~/views/board";
const BoardPage: NextPageWithLayout = () => {
export default function BoardPage() {
return (
<>
<BoardView />
<WorkspaceProvider>
<Dashboard>
<BoardView />
</Dashboard>
<Popup />
</>
</WorkspaceProvider>
);
};
BoardPage.getLayout = (page) => getDashboardLayout(page);
export default BoardPage;
}

View File

@@ -1,17 +1,15 @@
import type { NextPageWithLayout } from "../_app";
import { getDashboardLayout } from "~/components/Dashboard";
import { WorkspaceProvider } from "~/providers/workspace";
import Dashboard from "~/components/Dashboard";
import Popup from "~/components/Popup";
import BoardsView from "~/views/boards";
const BoardsPage: NextPageWithLayout = () => {
export default function BoardsPage() {
return (
<>
<BoardsView />
<WorkspaceProvider>
<Dashboard>
<BoardsView />
</Dashboard>
<Popup />
</>
</WorkspaceProvider>
);
};
BoardsPage.getLayout = (page) => getDashboardLayout(page);
export default BoardsPage;
}

View File

@@ -1,18 +1,15 @@
import type { NextPageWithLayout } from "~/pages/_app";
import { getDashboardLayout } from "~/components/Dashboard";
import Dashboard from "~/components/Dashboard";
import Popup from "~/components/Popup";
import { WorkspaceProvider } from "~/providers/workspace";
import CardView, { CardRightPanel } from "~/views/card";
const CardPage: NextPageWithLayout = () => {
export default function CardPage() {
return (
<>
<CardView />
<WorkspaceProvider>
<Dashboard hasRightPanel rightPanel={<CardRightPanel />}>
<CardView />
</Dashboard>
<Popup />
</>
</WorkspaceProvider>
);
};
CardPage.getLayout = (page) =>
getDashboardLayout(page, <CardRightPanel />, true);
export default CardPage;
}

View File

@@ -1,17 +1,15 @@
import type { NextPageWithLayout } from "~/pages/_app";
import { getDashboardLayout } from "~/components/Dashboard";
import { WorkspaceProvider } from "~/providers/workspace";
import Dashboard from "~/components/Dashboard";
import Popup from "~/components/Popup";
import MembersView from "~/views/members";
const MembersPage: NextPageWithLayout = () => {
export default function MembersPage() {
return (
<>
<MembersView />
<WorkspaceProvider>
<Dashboard>
<MembersView />
</Dashboard>
<Popup />
</>
</WorkspaceProvider>
);
};
MembersPage.getLayout = (page) => getDashboardLayout(page);
export default MembersPage;
}

View File

@@ -1,17 +1,15 @@
import type { NextPageWithLayout } from "~/pages/_app";
import { getDashboardLayout } from "~/components/Dashboard";
import Popup from "~/components/Popup";
import { WorkspaceProvider } from "~/providers/workspace";
import Dashboard from "~/components/Dashboard";
import SettingsView from "~/views/settings";
import Popup from "~/components/Popup";
const SettingsPage: NextPageWithLayout = () => {
export default function SettingsPage() {
return (
<>
<SettingsView />
<WorkspaceProvider>
<Dashboard>
<SettingsView />
</Dashboard>
<Popup />
</>
</WorkspaceProvider>
);
};
SettingsPage.getLayout = (page) => getDashboardLayout(page);
export default SettingsPage;
}

View File

@@ -1,15 +1,5 @@
import { createContext, useContext, useState } from "react";
interface ModalState {
contentType: string;
entityId?: string;
entityLabel?: string;
}
interface Props {
children: React.ReactNode;
}
type ModalContextType = {
isOpen: boolean;
openModal: (
@@ -21,64 +11,33 @@ type ModalContextType = {
modalContentType: string;
entityId: string;
entityLabel: string;
modalStates: Record<string, any>;
setModalState: (modalType: string, state: any) => void;
getModalState: (modalType: string) => any;
clearModalState: (modalType: string) => void;
clearAllModalStates: () => void;
};
interface Props {
children: React.ReactNode;
}
const ModalContext = createContext<ModalContextType | undefined>(undefined);
export const ModalProvider: React.FC<Props> = ({ children }) => {
const [modalStack, setModalStack] = useState<ModalState[]>([]);
const [modalStates, setModalStates] = useState<Record<string, any>>({});
const isOpen = modalStack.length > 0;
const currentModal = modalStack[modalStack.length - 1];
const modalContentType = currentModal?.contentType || "";
const entityId = currentModal?.entityId || "";
const entityLabel = currentModal?.entityLabel || "";
const [isOpen, setIsOpen] = useState(false);
const [entityId, setEntityId] = useState("");
const [entityLabel, setEntityLabel] = useState("");
const [modalContentType, setModalContentType] = useState("");
const openModal = (
contentType: string,
entityId?: string,
entityLabel?: string,
) => {
const newModal: ModalState = { contentType, entityId, entityLabel };
setModalStack(prev => [...prev, newModal]);
setIsOpen(true);
setModalContentType(contentType);
if (entityId) setEntityId(entityId);
if (entityLabel) setEntityLabel(entityLabel);
};
const closeModal = () => {
setModalStack(prev => {
if (prev.length <= 1) {
return [];
}
return prev.slice(0, -1);
});
};
const setModalState = (modalType: string, state: any) => {
setModalStates(prev => ({
...prev,
[modalType]: state
}));
};
const getModalState = (modalType: string) => {
return modalStates[modalType];
};
const clearModalState = (modalType: string) => {
setModalStates(prev => {
const newStates = { ...prev };
delete newStates[modalType];
return newStates;
});
};
const clearAllModalStates = () => {
setModalStates({});
setIsOpen(false);
};
return (
@@ -90,11 +49,6 @@ export const ModalProvider: React.FC<Props> = ({ children }) => {
modalContentType,
entityId,
entityLabel,
modalStates,
setModalState,
getModalState,
clearModalState,
clearAllModalStates,
}}
>
{children}

View File

@@ -18,7 +18,6 @@ import Editor from "~/components/Editor";
import Input from "~/components/Input";
import LabelIcon from "~/components/LabelIcon";
import Toggle from "~/components/Toggle";
import { useModalFormState } from "~/hooks/useModalFormState";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
@@ -50,24 +49,17 @@ export function NewCardForm({
const utils = api.useUtils();
// persists the form values
const { formState, saveFormState } = useModalFormState<NewCardFormInput>({
modalType: "NEW_CARD",
initialValues: {
title: "",
description: "",
listPublicId,
labelPublicIds: [],
memberPublicIds: [],
isCreateAnotherEnabled: false,
position: "start",
},
resetOnClose: true,
});
const { register, handleSubmit, reset, setValue, watch } =
useForm<NewCardFormInput>({
values: formState,
defaultValues: {
title: "",
description: "",
listPublicId,
labelPublicIds: [],
memberPublicIds: [],
isCreateAnotherEnabled: false,
position: "start",
},
});
const labelPublicIds = watch("labelPublicIds") || [];
@@ -75,15 +67,6 @@ export function NewCardForm({
const isCreateAnotherEnabled = watch("isCreateAnotherEnabled");
const position = watch("position");
const title = watch("title");
const description = watch("description");
// saving form state whenever form values change
useEffect(() => {
const subscription = watch((data) => {
saveFormState(data as NewCardFormInput);
});
return () => subscription.unsubscribe();
}, [watch, saveFormState]);
const { data: boardData } = api.board.byId.useQuery(queryParams, {
enabled: !!boardPublicId,
@@ -148,24 +131,17 @@ export function NewCardForm({
},
onSuccess: async () => {
const isCreateAnotherEnabled = watch("isCreateAnotherEnabled");
if (!isCreateAnotherEnabled) {
// close modal (state will auto-clear due to resetOnClose: true)
closeModal();
} else {
// reset form for creating another card
const newFormState = {
title: "",
description: "",
listPublicId: watch("listPublicId"),
labelPublicIds: [],
memberPublicIds: [],
isCreateAnotherEnabled,
position,
};
reset(newFormState);
saveFormState(newFormState);
}
if (!isCreateAnotherEnabled) closeModal();
await utils.board.byId.invalidate(queryParams);
reset({
title: "",
description: "",
listPublicId: watch("listPublicId"),
labelPublicIds: [],
memberPublicIds: [],
isCreateAnotherEnabled,
position,
});
},
});
@@ -288,11 +264,8 @@ export function NewCardForm({
<div className="mt-2">
<div className="block max-h-48 min-h-24 w-full overflow-y-auto rounded-md border-0 bg-dark-300 bg-white/5 px-3 py-2 text-sm shadow-sm ring-1 ring-inset ring-light-600 focus-within:ring-2 focus-within:ring-inset focus-within:ring-light-700 dark:ring-dark-700 dark:focus-within:ring-dark-700 sm:leading-6">
<Editor
content={description}
onChange={(value) => {
setValue("description", value);
saveFormState({ ...formState, description: value });
}}
content=""
onChange={(value) => setValue("description", value)}
/>
</div>
</div>

View File

@@ -145,12 +145,7 @@ export function NewListForm({
/>
<div>
<Button
type="submit"
disabled={createList.isPending || !watch("name")}
>
{t`Create list`}
</Button>
<Button type="submit">{t`Create list`}</Button>
</div>
</div>
</form>

View File

@@ -1,53 +0,0 @@
import Link from "next/link";
import { env } from "next-runtime-env";
import { HiLink } from "react-icons/hi";
const UpdateBoardSlugButton = ({
handleOnClick,
workspaceSlug,
boardSlug,
isLoading,
}: {
handleOnClick: () => void;
workspaceSlug: string;
boardSlug: string;
isLoading: boolean;
}) => {
if (!isLoading && (!workspaceSlug || !boardSlug)) return <></>;
if (isLoading) {
return (
<div className="hidden h-[36px] w-[225px] animate-pulse rounded-full bg-light-200 dark:bg-dark-100 xl:flex" />
);
}
return (
<button
onClick={handleOnClick}
className="hidden cursor-pointer items-center gap-2 rounded-full border-[1px] bg-light-50 p-1 pl-4 pr-1 text-sm text-light-950 hover:bg-light-100 dark:border-dark-600 dark:bg-dark-50 dark:text-dark-900 dark:hover:bg-dark-100 xl:flex"
>
<div className="flex items-center">
<span>
{env("NEXT_PUBLIC_KAN_ENV") === "cloud"
? "kan.bn"
: env("NEXT_PUBLIC_BASE_URL")}
</span>
<div className="mx-1.5 h-4 w-px rotate-[20deg] bg-gray-300 dark:bg-dark-600"></div>
<span>{workspaceSlug}</span>
<div className="mx-1.5 h-4 w-px rotate-[20deg] bg-gray-300 dark:bg-dark-600"></div>
<span>{boardSlug}</span>
</div>
<Link
href={`${env("NEXT_PUBLIC_BASE_URL")}/${workspaceSlug}/${boardSlug}`}
target="_blank"
rel="noopener noreferrer"
onClick={(e) => e.stopPropagation()}
className="flex h-7 w-7 items-center justify-center rounded-full hover:bg-light-200 dark:hover:bg-dark-200"
>
<HiLink className="h-[13px] w-[13px]" />
</Link>
</button>
);
};
export default UpdateBoardSlugButton;

View File

@@ -135,7 +135,7 @@ export function UpdateBoardSlugForm({
? t`This board URL has already been taken`
: undefined)
}
prefix={`${env("NEXT_PUBLIC_KAN_ENV") === "cloud" ? "kan.bn" : env("NEXT_PUBLIC_BASE_URL")}/${workspaceSlug}/`}
prefix={`${env("NEXT_PUBLIC_BASE_URL")}/${workspaceSlug}/`}
onKeyDown={async (e) => {
if (e.key === "Enter") {
e.preventDefault();
@@ -152,14 +152,7 @@ export function UpdateBoardSlugForm({
/>
</div>
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<div className="flex items-center gap-2">
<Button
variant="secondary"
href="/settings?edit=workspace_url"
onClick={closeModal}
>
{t`Edit workspace URL`}
</Button>
<div>
<Button
type="submit"
isLoading={updateBoardSlug.isPending}
@@ -167,8 +160,7 @@ export function UpdateBoardSlugForm({
!isDirty ||
updateBoardSlug.isPending ||
errors.slug?.message !== undefined ||
isBoardSlugAvailable?.isReserved ||
checkBoardSlugAvailability.isLoading
isBoardSlugAvailable?.isReserved
}
>
{t`Update`}

View File

@@ -13,7 +13,6 @@ import type { UpdateBoardInput } from "@kan/api/types";
import Button from "~/components/Button";
import { DeleteLabelConfirmation } from "~/components/DeleteLabelConfirmation";
import FeedbackModal from "~/components/FeedbackModal";
import { LabelForm } from "~/components/LabelForm";
import Modal from "~/components/modal";
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
@@ -33,7 +32,6 @@ import Filters from "./components/Filters";
import List from "./components/List";
import { NewCardForm } from "./components/NewCardForm";
import { NewListForm } from "./components/NewListForm";
import UpdateBoardSlugButton from "./components/UpdateBoardSlugButton";
import { UpdateBoardSlugForm } from "./components/UpdateBoardSlugForm";
import VisibilityButton from "./components/VisibilityButton";
@@ -45,7 +43,7 @@ export default function BoardPage() {
const utils = api.useUtils();
const { showPopup } = usePopup();
const { workspace } = useWorkspace();
const { openModal, modalContentType, entityId, isOpen } = useModal();
const { openModal, modalContentType, entityId } = useModal();
const [selectedPublicListId, setSelectedPublicListId] =
useState<PublicListId>("");
const [isInitialLoading, setIsInitialLoading] = useState(true);
@@ -235,97 +233,6 @@ export default function BoardPage() {
}
};
const renderModalContent = () => {
return (
<>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_BOARD"}
>
<DeleteBoardConfirmation boardPublicId={boardId ?? ""} />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_LIST"}
>
<DeleteListConfirmation
listPublicId={selectedPublicListId}
queryParams={queryParams}
/>
</Modal>
<Modal
modalSize="md"
isVisible={isOpen && modalContentType === "NEW_CARD"}
>
<NewCardForm
boardPublicId={boardId ?? ""}
listPublicId={selectedPublicListId}
queryParams={queryParams}
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_LIST"}
>
<NewListForm
boardPublicId={boardId ?? ""}
queryParams={queryParams}
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_WORKSPACE"}
>
<NewWorkspaceForm />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "NEW_LABEL"}
>
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchBoard} />
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "EDIT_LABEL"}
>
<LabelForm
boardPublicId={boardId ?? ""}
refetch={refetchBoard}
isEdit
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "DELETE_LABEL"}
>
<DeleteLabelConfirmation
refetch={refetchBoard}
labelPublicId={entityId}
/>
</Modal>
<Modal
modalSize="sm"
isVisible={isOpen && modalContentType === "UPDATE_BOARD_SLUG"}
>
<UpdateBoardSlugForm
boardPublicId={boardId ?? ""}
workspaceSlug={workspace.slug ?? ""}
boardSlug={boardData?.slug ?? ""}
queryParams={queryParams}
/>
</Modal>
</>
);
};
return (
<>
<PageHead
@@ -360,12 +267,6 @@ export default function BoardPage() {
)}
<div className="order-1 mb-4 flex items-center justify-end space-x-2 md:order-2 md:mb-0">
<UpdateBoardSlugButton
handleOnClick={() => openModal("UPDATE_BOARD_SLUG")}
isLoading={isLoading}
workspaceSlug={workspace.slug ?? ""}
boardSlug={boardData?.slug ?? ""}
/>
<VisibilityButton
visibility={boardData?.visibility ?? "private"}
boardPublicId={boardId ?? ""}
@@ -457,7 +358,7 @@ export default function BoardPage() {
<div
ref={provided.innerRef}
{...provided.droppableProps}
className="scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-w-[8px] z-10 h-full max-h-[calc(100vh-225px)] min-h-[2rem] overflow-y-auto pr-1 scrollbar dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-600"
className="scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-w-[8px] z-10 h-full max-h-[calc(100vh-265px)] min-h-[2rem] overflow-y-auto pr-1 scrollbar dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-600"
>
{list.cards.map((card, index) => (
<Draggable
@@ -513,7 +414,55 @@ export default function BoardPage() {
</>
) : null}
</div>
{renderModalContent()}
<Modal modalSize={modalContentType === "NEW_CARD" ? "md" : "sm"}>
{modalContentType === "DELETE_BOARD" && (
<DeleteBoardConfirmation boardPublicId={boardId ?? ""} />
)}
{modalContentType === "DELETE_LIST" && (
<DeleteListConfirmation
listPublicId={selectedPublicListId}
queryParams={queryParams}
/>
)}
{modalContentType === "NEW_CARD" && (
<NewCardForm
boardPublicId={boardId ?? ""}
listPublicId={selectedPublicListId}
queryParams={queryParams}
/>
)}
{modalContentType === "NEW_LIST" && (
<NewListForm
boardPublicId={boardId ?? ""}
queryParams={queryParams}
/>
)}
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
{modalContentType === "NEW_LABEL" && (
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchBoard} />
)}
{modalContentType === "EDIT_LABEL" && (
<LabelForm
boardPublicId={boardId ?? ""}
refetch={refetchBoard}
isEdit
/>
)}
{modalContentType === "DELETE_LABEL" && (
<DeleteLabelConfirmation
refetch={refetchBoard}
labelPublicId={entityId}
/>
)}
{modalContentType === "UPDATE_BOARD_SLUG" && (
<UpdateBoardSlugForm
boardPublicId={boardId ?? ""}
workspaceSlug={workspace.slug ?? ""}
boardSlug={boardData?.slug ?? ""}
queryParams={queryParams}
/>
)}
</Modal>
</div>
</>
);

View File

@@ -19,7 +19,7 @@ export function BoardsList() {
if (isLoading)
return (
<div className="grid h-fit w-full grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-3 2xl:grid-cols-7">
<div className="xxl:grid-cols-7 grid w-full grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
<div className="mr-5 flex h-[150px] w-full animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
@@ -45,12 +45,12 @@ export function BoardsList() {
);
return (
<div className="grid h-fit w-full grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-3 2xl:grid-cols-7">
<div className="grid h-fit w-full grid-cols-1 gap-4 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-7">
{data?.map((board) => (
<Link key={board.publicId} href={`boards/${board.publicId}`}>
<div className="align-center relative mr-5 flex h-[150px] w-full items-center justify-center rounded-md border border-dashed border-light-400 bg-light-50 shadow-sm hover:bg-light-200 dark:border-dark-600 dark:bg-dark-50 dark:hover:bg-dark-100">
<PatternedBackground />
<p className="px-4 text-[14px] font-bold text-neutral-700 dark:text-dark-1000">
<p className="text-md px-4 font-bold text-neutral-900 dark:text-dark-1000">
{board.name}
</p>
</div>

View File

@@ -2,7 +2,6 @@ import { t } from "@lingui/core/macro";
import { HiArrowDownTray, HiOutlinePlusSmall } from "react-icons/hi2";
import Button from "~/components/Button";
import FeedbackModal from "~/components/FeedbackModal";
import Modal from "~/components/modal";
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
import { PageHead } from "~/components/PageHead";
@@ -21,8 +20,8 @@ export default function BoardsPage() {
return (
<>
<PageHead title={t`Boards | ${workspace.name ?? "Workspace"}`} />
<div className="m-auto h-full max-w-[1100px] p-6 px-5 md:px-28 md:py-12">
<div className="relative z-10 mb-8 flex w-full items-center justify-between">
<div className="m-auto h-full max-w-[1600px] px-5 py-6 md:px-8 md:py-8">
<div className="mb-8 flex w-full items-center justify-between">
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{t`Boards`}
</h1>
@@ -50,8 +49,7 @@ export default function BoardsPage() {
</div>
</div>
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
<Modal>
{modalContentType === "NEW_BOARD" && <NewBoardForm />}
{modalContentType === "IMPORT_BOARDS" && <ImportBoardsForm />}
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}

View File

@@ -155,13 +155,11 @@ const ActivityList = ({
cardPublicId,
isLoading,
isAdmin,
isViewOnly,
}: {
activities: NonNullable<GetCardByIdOutput>["activities"];
cardPublicId: string;
isLoading: boolean;
isAdmin?: boolean;
isViewOnly?: boolean;
}) => {
const { data } = authClient.useSession();
const { locale } = useLocalisation();
@@ -195,7 +193,6 @@ const ActivityList = ({
isEdited={!!activity.comment?.updatedAt}
isAuthor={activity.comment?.createdBy === data?.user.id}
isAdmin={isAdmin ?? false}
isViewOnly={!!isViewOnly}
/>
);

View File

@@ -27,7 +27,6 @@ const Comment = ({
isAuthor,
isAdmin,
isEdited = false,
isViewOnly = false,
}: {
publicId: string | undefined;
cardPublicId: string;
@@ -39,7 +38,6 @@ const Comment = ({
isAuthor: boolean;
isAdmin: boolean;
isEdited: boolean;
isViewOnly: boolean;
}) => {
const [isEditing, setIsEditing] = useState(false);
const utils = api.useUtils();
@@ -126,7 +124,7 @@ const Comment = ({
</p>
</div>
{dropdownItems.length > 0 && !isViewOnly && (
{dropdownItems.length > 0 && (
<div className="absolute right-4 top-4">
<Dropdown items={dropdownItems}>
<HiEllipsisHorizontal className="h-5 w-5 text-light-900 dark:text-dark-800" />

View File

@@ -113,7 +113,7 @@ export default function LabelSelector({
</Menu.Button>
</div>
) : (
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-50 pl-2 text-left text-sm text-neutral-900 hover:border-light-300 hover:bg-light-200 dark:border-dark-50 dark:text-dark-1000 dark:hover:border-dark-200 dark:hover:bg-dark-100">
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-200 pl-2 text-left text-sm text-neutral-900 hover:bg-light-300 dark:border-dark-100 dark:text-dark-1000 dark:hover:border-dark-300 dark:hover:bg-dark-200">
<HiMiniPlus size={22} className="pr-2" />
{t`Add label`}
</Menu.Button>

View File

@@ -79,7 +79,7 @@ export default function ListSelector({
}}
asChild
>
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-50 py-1 pl-2 text-left text-sm text-neutral-900 hover:border-light-300 hover:bg-light-200 dark:border-dark-50 dark:text-dark-1000 dark:hover:border-dark-200 dark:hover:bg-dark-100">
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-200 py-1 pl-2 text-left text-sm text-neutral-900 hover:border-light-300 hover:bg-light-300 dark:border-dark-100 dark:text-dark-1000 dark:hover:border-dark-300 dark:hover:bg-dark-200">
{selectedList?.value}
</Menu.Button>
</CheckboxDropdown>

View File

@@ -112,7 +112,7 @@ export default function MemberSelector({
createNewItemLabel={t`Invite member`}
asChild
>
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-50 py-1 pl-2 text-left text-sm text-neutral-900 hover:border-light-300 hover:bg-light-200 dark:border-dark-50 dark:text-dark-1000 dark:hover:border-dark-200 dark:hover:bg-dark-100">
<Menu.Button className="flex h-full w-full items-center rounded-[5px] border-[1px] border-light-200 py-1 pl-2 text-left text-sm text-neutral-900 hover:bg-light-300 dark:border-dark-100 dark:text-dark-1000 dark:hover:border-dark-300 dark:hover:bg-dark-200">
{selectedMembers.length ? (
<div className="isolate flex justify-end -space-x-1 overflow-hidden">
{selectedMembers.map(({ value, imageUrl }) => (

View File

@@ -51,7 +51,7 @@ const NewCommentForm = ({ cardPublicId }: { cardPublicId: string }) => {
return (
<form
onSubmit={handleSubmit(onSubmit)}
className="flex w-full max-w-[800px] flex-col rounded-xl border border-light-600 bg-light-100 p-4 text-light-900 focus-visible:outline-none dark:border-dark-400 dark:bg-dark-100 dark:text-dark-1000 sm:text-sm sm:leading-6"
className="flex w-full max-w-[1000px] flex-col rounded-xl border border-light-600 bg-light-200 p-4 text-light-900 focus-visible:outline-none dark:border-dark-400 dark:bg-dark-100 dark:text-dark-1000 sm:text-sm sm:leading-6"
>
<ContentEditable
placeholder={t`Add a comment...`}

View File

@@ -6,7 +6,6 @@ import { IoChevronForwardSharp } from "react-icons/io5";
import Avatar from "~/components/Avatar";
import Editor from "~/components/Editor";
import FeedbackModal from "~/components/FeedbackModal";
import { LabelForm } from "~/components/LabelForm";
import LabelIcon from "~/components/LabelIcon";
import Modal from "~/components/modal";
@@ -100,7 +99,7 @@ export function CardRightPanel() {
}) ?? [];
return (
<div className="h-full w-[360px] border-l-[1px] border-light-300 bg-light-50 p-8 text-light-900 dark:border-dark-300 dark:bg-dark-50 dark:text-dark-900">
<div className="h-full w-[360px] border-l-[1px] border-light-600 bg-light-200 p-8 text-light-900 dark:border-dark-400 dark:bg-dark-100 dark:text-dark-900">
<div className="mb-4 flex w-full flex-row">
<p className="my-2 mb-2 w-[100px] text-sm font-medium">{t`List`}</p>
<ListSelector
@@ -189,9 +188,9 @@ export default function CardPage() {
title={t`${card?.title ?? "Card"} | ${board?.name ?? "Board"}`}
/>
<div className="flex h-full flex-1 flex-row">
<div className="m-auto flex h-full w-full max-w-[800px] flex-col overflow-hidden">
<div className="flex h-full w-full flex-col overflow-hidden">
<div className="h-full max-h-[calc(100dvh-3rem)] overflow-y-auto p-6 md:max-h-[calc(100dvh-4rem)] md:p-8">
<div className="mb-8 flex w-full items-center justify-between md:mt-6">
<div className="mb-8 flex w-full items-center justify-between">
{!card && isLoading && (
<div className="flex space-x-2">
<div className="h-[2.3rem] w-[150px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
@@ -251,7 +250,7 @@ export default function CardPage() {
</div>
</form>
</div>
<div className="border-t-[1px] border-light-300 pt-12 dark:border-dark-300">
<div className="border-t-[1px] border-light-600 pt-12 dark:border-dark-400">
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
{t`Activity`}
</h2>
@@ -272,8 +271,7 @@ export default function CardPage() {
</div>
</div>
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
<Modal>
{modalContentType === "NEW_LABEL" && (
<LabelForm boardPublicId={boardId ?? ""} refetch={refetchCard} />
)}

View File

@@ -40,7 +40,7 @@ export default function HomeView() {
</div>
</div>
{/* <div className="relative overflow-hidden rounded-full bg-gradient-to-b from-light-300 to-light-400 p-[2px] dark:from-dark-300 dark:to-dark-400">
<div className="relative overflow-hidden rounded-full bg-gradient-to-b from-light-300 to-light-400 p-[2px] dark:from-dark-300 dark:to-dark-400">
<div className="relative z-10 rounded-full bg-light-50 dark:bg-dark-50">
<Link
href="https://news.ycombinator.com/item?id=44157177"
@@ -58,7 +58,7 @@ export default function HomeView() {
</div>
</Link>
</div>
</div> */}
</div>
</div>
<p className="mt-2 text-center text-4xl font-bold text-light-1000 dark:text-dark-1000 lg:text-5xl">

View File

@@ -1,43 +1,26 @@
import { zodResolver } from "@hookform/resolvers/zod";
import { t } from "@lingui/core/macro";
import { useEffect, useState } from "react";
import { useEffect } from "react";
import { useForm } from "react-hook-form";
import { HiXMark } from "react-icons/hi2";
import { z } from "zod";
import type { InviteMemberInput } from "@kan/api/types";
import Button from "~/components/Button";
import Input from "~/components/Input";
import Toggle from "~/components/Toggle";
import { useModal } from "~/providers/modal";
import { usePopup } from "~/providers/popup";
import { useWorkspace } from "~/providers/workspace";
import { api } from "~/utils/api";
export function InviteMemberForm() {
const utils = api.useUtils();
const [isCreateAnotherEnabled, setIsCreateAnotherEnabled] = useState(false);
const { closeModal } = useModal();
const { workspace } = useWorkspace();
const { showPopup } = usePopup();
const InviteMemberSchema = z.object({
email: z.string().email({ message: t`Invalid email address` }),
workspacePublicId: z.string(),
});
const {
register,
handleSubmit,
reset,
formState: { errors },
} = useForm<InviteMemberInput>({
const { register, handleSubmit } = useForm<InviteMemberInput>({
defaultValues: {
email: "",
workspacePublicId: workspace.publicId || "",
},
resolver: zodResolver(InviteMemberSchema),
});
const refetchBoards = () => utils.board.all.refetch();
@@ -48,24 +31,6 @@ export function InviteMemberForm() {
await utils.workspace.byId.refetch();
await refetchBoards();
},
onError: (error) => {
reset();
if (!isCreateAnotherEnabled) closeModal();
if (error.data?.code === "CONFLICT") {
showPopup({
header: t`Error inviting member`,
message: t`User is already a member of this workspace`,
icon: "error",
});
} else {
showPopup({
header: t`Error inviting member`,
message: t`Please try again later, or contact customer support.`,
icon: "error",
});
}
},
});
const onSubmit = (data: InviteMemberInput) => {
@@ -104,16 +69,10 @@ export function InviteMemberForm() {
await handleSubmit(onSubmit)();
}
}}
errorMessage={errors.email?.message}
/>
</div>
<div className="mt-12 flex items-center justify-end border-t border-light-600 px-5 pb-5 pt-5 dark:border-dark-600">
<Toggle
label={t`Invite another`}
isChecked={isCreateAnotherEnabled}
onChange={() => setIsCreateAnotherEnabled(!isCreateAnotherEnabled)}
/>
<div>
<Button
type="submit"

View File

@@ -7,7 +7,6 @@ import { authClient } from "@kan/auth/client";
import Avatar from "~/components/Avatar";
import Button from "~/components/Button";
import Dropdown from "~/components/Dropdown";
import FeedbackModal from "~/components/FeedbackModal";
import Modal from "~/components/modal";
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
import { PageHead } from "~/components/PageHead";
@@ -97,7 +96,7 @@ export default function MembersPage() {
</td>
<td
className={twMerge(
"w-auto min-w-[120px] overflow-visible sm:w-[35%] sm:min-w-[150px]",
"w-auto min-w-[120px] sm:w-[35%] sm:min-w-[150px]",
isLastRow && "rounded-br-lg",
)}
>
@@ -121,7 +120,7 @@ export default function MembersPage() {
</div>
<div
className={twMerge(
"relative z-50",
"relative",
(workspace.role !== "admin" || showSkeleton) && "hidden",
)}
>
@@ -155,7 +154,7 @@ export default function MembersPage() {
return (
<>
<PageHead title={t`Members | ${workspace.name ?? "Workspace"}`} />
<div className="m-auto h-full max-w-[1100px] p-6 px-5 md:px-28 md:py-12">
<div className="m-auto h-full max-w-[1600px] p-6 px-5 md:px-28 md:py-12">
<div className="mb-8 flex w-full justify-between">
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{t`Members`}
@@ -172,10 +171,10 @@ export default function MembersPage() {
</div>
<div className="mt-8 flow-root">
<div className="-mx-4 -my-2 sm:-mx-6 lg:-mx-8">
<div className="inline-block min-w-full overflow-x-auto px-4 py-2 pb-16 align-middle sm:px-6 lg:px-8">
<div className="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
<div className="inline-block min-w-full px-4 py-2 align-middle sm:px-6 lg:px-8">
<div className="h-full shadow ring-1 ring-black ring-opacity-5 sm:rounded-lg">
<table className="min-w-full divide-y divide-light-600 overflow-visible dark:divide-dark-600">
<table className="min-w-full divide-y divide-light-600 dark:divide-dark-600">
<thead className="rounded-t-lg bg-light-300 dark:bg-dark-200">
<tr>
<th
@@ -192,7 +191,7 @@ export default function MembersPage() {
</th>
</tr>
</thead>
<tbody className="divide-y divide-light-600 overflow-visible bg-light-50 dark:divide-dark-600 dark:bg-dark-100">
<tbody className="divide-y divide-light-600 bg-light-50 dark:divide-dark-600 dark:bg-dark-100">
{!isLoading &&
data?.members.map((member, index) => (
<TableRow
@@ -222,8 +221,7 @@ export default function MembersPage() {
</div>
</div>
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
<Modal>
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
{modalContentType === "INVITE_MEMBER" && <InviteMemberForm />}
{modalContentType === "REMOVE_MEMBER" && <DeleteMemberConfirmation />}

View File

@@ -1,11 +1,10 @@
import { useRouter } from "next/router";
import { t } from "@lingui/core/macro";
import { useEffect, useRef, useState } from "react";
import { HiXMark } from "react-icons/hi2";
import Badge from "~/components/Badge";
import { authClient } from "@kan/auth/client";
import Editor from "~/components/Editor";
import LabelIcon from "~/components/LabelIcon";
import { useModal } from "~/providers/modal";
import { api } from "~/utils/api";
import ActivityList from "~/views/card/components/ActivityList";
@@ -21,9 +20,7 @@ export function CardModal({
}) {
const router = useRouter();
const { closeModal, isOpen } = useModal();
const [showFade, setShowFade] = useState(false);
const [showTopFade, setShowTopFade] = useState(false);
const scrollRef = useRef<HTMLDivElement>(null);
const { data: session } = authClient.useSession();
const { data, isLoading } = api.card.byId.useQuery(
{
@@ -36,115 +33,85 @@ export function CardModal({
const labels = data?.labels ?? [];
const handleScroll = () => {
if (!scrollRef.current) return;
const { scrollTop, scrollHeight, clientHeight } = scrollRef.current;
const isAtBottom = scrollTop + clientHeight >= scrollHeight - 5;
const isAtTop = scrollTop <= 5;
setShowFade(!isAtBottom);
setShowTopFade(!isAtTop);
};
useEffect(() => {
const scrollElement = scrollRef.current;
if (!scrollElement) return;
handleScroll();
scrollElement.addEventListener("scroll", handleScroll);
return () => scrollElement.removeEventListener("scroll", handleScroll);
}, [data]);
return (
<div className="flex h-full flex-1 flex-row">
<div className="flex h-full w-full flex-col overflow-hidden">
<div className="h-full p-8">
<div className="mb-6">
<div className="flex w-full items-center justify-between">
<button
className="absolute right-[2rem] top-[2rem] rounded p-1 hover:bg-light-300 focus:outline-none dark:hover:bg-dark-300"
onClick={async (e) => {
e.preventDefault();
closeModal();
try {
await router.replace(
`/${workspaceSlug}/${boardSlug}`,
undefined,
{
shallow: true,
},
);
} catch (error) {
console.error(error);
}
}}
>
<HiXMark
size={18}
className="dark:text-dark-9000 text-light-900"
/>
</button>
{isLoading ? (
<div className="flex space-x-2">
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
</div>
) : (
<>
<h1 className="pr-8 font-bold leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{data?.title}
</h1>
</>
)}
</div>
{labels.length > 0 && (
<div className="mt-2">
{labels.map((label) => (
<Badge
key={label.publicId}
value={label.name}
iconLeft={<LabelIcon colourCode={label.colourCode} />}
/>
))}
<div className="h-full max-h-[calc(100vh-4rem)] overflow-y-auto p-8">
<div className="flex w-full items-center justify-between">
<button
className="absolute right-[2rem] top-[2rem] rounded p-1 hover:bg-light-300 focus:outline-none dark:hover:bg-dark-300"
onClick={async (e) => {
e.preventDefault();
closeModal();
try {
await router.replace(
`/${workspaceSlug}/${boardSlug}`,
undefined,
{
shallow: true,
},
);
} catch (error) {
console.error(error);
}
}}
>
<HiXMark
size={18}
className="dark:text-dark-9000 text-light-900"
/>
</button>
{isLoading ? (
<div className="flex space-x-2">
<div className="h-[2.3rem] w-[300px] animate-pulse rounded-[5px] bg-light-300 dark:bg-dark-300" />
</div>
) : (
<>
<h1 className="font-medium leading-[2.3rem] tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{data?.title}
</h1>
</>
)}
</div>
<div className="mb-6">
{labels.map((label) => (
<div
key={label.publicId}
className="my-1 mr-1 inline-flex w-fit items-center gap-x-1.5 rounded-full px-2 py-1 text-[12px] font-medium text-light-800 ring-1 ring-inset ring-light-600 dark:text-dark-1000 dark:ring-dark-800"
>
<svg
fill={label.colourCode ?? "#3730a3"}
className="h-2 w-2"
viewBox="0 0 6 6"
aria-hidden="true"
>
<circle cx={3} cy={3} r={3} />
</svg>
<div>{label.name}</div>
</div>
))}
</div>
<div className="relative">
<div
ref={scrollRef}
className="h-full max-h-[425px] overflow-y-auto"
>
{data?.description && (
<div className="mb-10 flex w-full max-w-2xl justify-between">
<div className="mt-2">
<Editor content={data.description} readOnly />
</div>
</div>
)}
<div className="border-t-[1px] border-light-600 pb-4 pt-12 dark:border-dark-400">
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
{t`Activity`}
</h2>
<div>
{cardPublicId && (
<ActivityList
cardPublicId={cardPublicId}
activities={data?.activities ?? []}
isLoading={isLoading}
isViewOnly={true}
/>
)}
</div>
{data?.description && (
<div className="mb-10 flex w-full max-w-2xl justify-between">
<div className="mt-2">
<Editor content={data.description} readOnly />
</div>
</div>
{showTopFade && (
<div className="pointer-events-none absolute left-0 right-0 top-0 h-6 bg-gradient-to-b from-white/80 to-transparent dark:from-dark-100/80" />
)}
{showFade && (
<div className="pointer-events-none absolute bottom-0 left-0 right-0 h-6 bg-gradient-to-t from-white/80 to-transparent dark:from-dark-100/80" />
)}
)}
<div className="border-t-[1px] border-light-600 pb-4 pt-12 dark:border-dark-400">
<h2 className="text-md pb-4 font-medium text-light-900 dark:text-dark-1000">
{t`Activity`}
</h2>
<div>
{cardPublicId && (
<ActivityList
cardPublicId={cardPublicId}
activities={data?.activities ?? []}
isLoading={isLoading}
/>
)}
</div>
</div>
</div>
</div>

View File

@@ -3,9 +3,8 @@ import { useRouter } from "next/router";
import { t } from "@lingui/core/macro";
import { keepPreviousData } from "@tanstack/react-query";
import { useEffect, useState } from "react";
import { HiLink, HiOutlineLockClosed } from "react-icons/hi2";
import { HiLink } from "react-icons/hi2";
import Button from "~/components/Button";
import Modal from "~/components/modal";
import { PageHead } from "~/components/PageHead";
import PatternedBackground from "~/components/PatternedBackground";
@@ -29,14 +28,9 @@ export default function PublicBoardView() {
? router.query.boardSlug[0]
: router.query.boardSlug;
const workspaceSlug = Array.isArray(router.query.workspaceSlug)
? router.query.workspaceSlug[0]
: router.query.workspaceSlug;
const { data, isLoading } = api.board.bySlug.useQuery(
{
boardSlug: boardSlug ?? "",
workspaceSlug: workspaceSlug ?? "",
members: formatToArray(router.query.members),
labels: formatToArray(router.query.labels),
},
@@ -111,47 +105,26 @@ export default function PublicBoardView() {
{data?.name}
</h1>
)}
{data && (
<div className="z-10 flex items-center space-x-2">
<div className="inline-flex cursor-default items-center justify-center whitespace-nowrap rounded-md border-[1px] border-light-300 bg-light-50 px-3 py-2 text-sm font-semibold text-light-950 shadow-sm dark:border-dark-300 dark:bg-dark-50 dark:text-dark-950">
<span className="mr-2">
<HiOutlineLockClosed />
</span>
{t`View only`}
</div>
<Filters
labels={data.labels ?? []}
members={[]}
isLoading={isLoading}
/>
</div>
)}
<div className="flex items-center space-x-2">
<Filters
labels={data?.labels ?? []}
members={[]}
isLoading={isLoading}
/>
</div>
</div>
<div className="scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] relative h-full flex-1 overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300">
<div className="scrollbar-w-none scrollbar-track-rounded-[4px] scrollbar-thumb-rounded-[4px] scrollbar-h-[8px] relative flex-1 overflow-y-hidden overflow-x-scroll overscroll-contain scrollbar scrollbar-track-light-200 scrollbar-thumb-light-400 dark:scrollbar-track-dark-100 dark:scrollbar-thumb-dark-300">
{isLoading ? (
<div className="ml-[2rem] flex">
<div className="0 mr-5 h-[500px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
<div className="0 mr-5 h-[275px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
<div className="0 mr-5 h-[375px] w-[18rem] animate-pulse rounded-md bg-light-200 dark:bg-dark-100" />
</div>
) : !data ? (
<div className="z-10 flex h-full w-full flex-col items-center justify-center space-y-8 pb-[150px]">
<div className="flex flex-col items-center">
<HiOutlineLockClosed className="h-10 w-10 text-light-800 dark:text-dark-800" />
<p className="mb-2 mt-4 text-[14px] font-bold text-light-1000 dark:text-dark-950">
{t`Board not found`}
</p>
<p className="text-[14px] text-light-900 dark:text-dark-900">
{t`This board is private or does not exist`}
</p>
</div>
<Button href={`/${workspaceSlug}`}>{t`View workspace`}</Button>
</div>
) : (
<div className="flex">
<div className="min-w-[2rem]" />
{data.lists.map((list) => (
{data?.lists.map((list) => (
<div
key={list.publicId}
className="dark-text-dark-1000 mr-5 h-fit min-w-[18rem] max-w-[18rem] rounded-md border border-light-400 bg-light-300 py-2 pl-2 pr-1 text-neutral-900 dark:border-dark-300 dark:bg-dark-100"

View File

@@ -3,8 +3,6 @@ import { t } from "@lingui/core/macro";
import { env } from "next-runtime-env";
import { useState } from "react";
import { generateUID } from "@kan/shared/utils";
import { usePopup } from "~/providers/popup";
import { api } from "~/utils/api";
import { getAvatarUrl } from "~/utils/helpers";
@@ -60,7 +58,7 @@ export default function Avatar({
}
const fileExt = file.name.split(".").pop();
const fileName = `${userId}/avatar-${generateUID()}.${fileExt}`;
const fileName = `${userId}/avatar.${fileExt}`;
setUploading(true);

View File

@@ -1,11 +1,9 @@
import { useRouter } from "next/router";
import { t } from "@lingui/core/macro";
import { env } from "next-runtime-env";
import { useEffect, useRef } from "react";
import { useEffect } from "react";
import { HiMiniArrowTopRightOnSquare } from "react-icons/hi2";
import Button from "~/components/Button";
import FeedbackModal from "~/components/FeedbackModal";
import { LanguageSelector } from "~/components/LanguageSelector";
import Modal from "~/components/modal";
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
@@ -29,9 +27,6 @@ export default function SettingsPage() {
const { workspace } = useWorkspace();
const utils = api.useUtils();
const { showPopup } = usePopup();
const router = useRouter();
const workspaceUrlSectionRef = useRef<HTMLDivElement>(null);
const scrollContainerRef = useRef<HTMLDivElement>(null);
const { data } = api.user.getUser.useQuery();
@@ -64,24 +59,6 @@ export default function SettingsPage() {
};
}, [refetchIntegrations]);
useEffect(() => {
if (
router.query.edit === "workspace_url" &&
workspaceUrlSectionRef.current &&
scrollContainerRef.current
) {
const element = workspaceUrlSectionRef.current;
const container = scrollContainerRef.current;
container.scrollTop = element.offsetTop - 40;
const input = element.querySelector('input[type="text"]');
if (input instanceof HTMLInputElement) {
input.focus();
}
}
}, [router.query.edit]);
const { mutateAsync: disconnectTrello } =
api.integration.disconnect.useMutation({
onSuccess: () => {
@@ -127,12 +104,9 @@ export default function SettingsPage() {
return (
<>
<div className="flex h-full w-full flex-col overflow-hidden">
<div
ref={scrollContainerRef}
className="h-full max-h-[calc(100vdh-3rem)] overflow-y-auto md:max-h-[calc(100vdh-4rem)]"
>
<div className="h-full max-h-[calc(100vdh-3rem)] overflow-y-auto md:max-h-[calc(100vdh-4rem)]">
<PageHead title={t`Settings | ${workspace.name ?? "Workspace"}`} />
<div className="m-auto max-w-[1100px] px-5 py-6 md:px-28 md:py-12">
<div className="m-auto max-w-[1600px] px-5 py-6 md:px-28 md:py-12">
<div className="mb-8 flex w-full justify-between">
<h1 className="font-bold tracking-tight text-neutral-900 dark:text-dark-1000 sm:text-[1.2rem]">
{t`Settings`}
@@ -160,16 +134,14 @@ export default function SettingsPage() {
workspaceName={workspace.name}
/>
<div ref={workspaceUrlSectionRef}>
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
{t`Workspace URL`}
</h2>
<UpdateWorkspaceUrlForm
workspacePublicId={workspace.publicId}
workspaceUrl={workspace.slug ?? ""}
workspacePlan={workspace.plan ?? "free"}
/>
</div>
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
{t`Workspace URL`}
</h2>
<UpdateWorkspaceUrlForm
workspacePublicId={workspace.publicId}
workspaceUrl={workspace.slug ?? ""}
workspacePlan={workspace.plan ?? "free"}
/>
<h2 className="mb-4 mt-8 text-[14px] text-neutral-900 dark:text-dark-1000">
{t`Workspace description`}
@@ -301,8 +273,7 @@ export default function SettingsPage() {
</div>
</div>
<Modal modalSize={modalContentType === "NEW_FEEDBACK" ? "md" : "sm"}>
{modalContentType === "NEW_FEEDBACK" && <FeedbackModal />}
<Modal>
{modalContentType === "NEW_WORKSPACE" && <NewWorkspaceForm />}
{modalContentType === "DELETE_WORKSPACE" && (
<DeleteWorkspaceConfirmation />

View File

@@ -23,22 +23,19 @@ services:
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
- STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
# Email
# SMTP
- SMTP_HOST=${SMTP_HOST}
- SMTP_PORT=${SMTP_PORT}
- SMTP_USER=${SMTP_USER}
- SMTP_PASSWORD=${SMTP_PASSWORD}
- SMTP_SECURE=${SMTP_SECURE}
- EMAIL_FROM=${EMAIL_FROM}
- PLUNK_API_KEY=${PLUNK_API_KEY}
- PLUNK_API_URL=${PLUNK_API_URL}
# S3 storage
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
- S3_REGION=${S3_REGION}
- S3_ENDPOINT=${S3_ENDPOINT}
- S3_FORCE_PATH_STYLE=${S3_FORCE_PATH_STYLE}
- NEXT_PUBLIC_STORAGE_URL=${NEXT_PUBLIC_STORAGE_URL}
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}

View File

@@ -30,7 +30,6 @@ services:
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
- S3_REGION=${S3_REGION}
- S3_ENDPOINT=${S3_ENDPOINT}
- S3_FORCE_PATH_STYLE=${S3_FORCE_PATH_STYLE}
- NEXT_PUBLIC_STORAGE_URL=${NEXT_PUBLIC_STORAGE_URL}
- NEXT_PUBLIC_AVATAR_BUCKET_NAME=${NEXT_PUBLIC_AVATAR_BUCKET_NAME}
- NEXT_PUBLIC_STORAGE_DOMAIN=${NEXT_PUBLIC_STORAGE_DOMAIN}

View File

@@ -42,7 +42,7 @@
"@kan/stripe": "workspace:^",
"@trpc/server": "catalog:",
"superjson": "2.2.1",
"trpc-to-openapi": "^2.3.2",
"trpc-to-openapi": "^2.1.0",
"zod": "catalog:"
},
"devDependencies": {

View File

@@ -111,21 +111,15 @@ export const boardRouter = createTRPCRouter({
.meta({
openapi: {
method: "GET",
path: "/workspaces/{workspaceSlug}/boards/{boardSlug}",
path: "/board/{boardSlug}",
summary: "Get board by slug",
description:
"Retrieves a board by its slug within a specific workspace",
description: "Retrieves a board by its slug",
tags: ["Boards"],
protect: false,
},
})
.input(
z.object({
workspaceSlug: z
.string()
.min(3)
.max(24)
.regex(/^(?![-]+$)[a-zA-Z0-9-]+$/),
boardSlug: z
.string()
.min(3)
@@ -137,26 +131,10 @@ export const boardRouter = createTRPCRouter({
)
.output(z.custom<Awaited<ReturnType<typeof boardRepo.getBySlug>>>())
.query(async ({ ctx, input }) => {
const workspace = await workspaceRepo.getBySlugWithBoards(
ctx.db,
input.workspaceSlug,
);
if (!workspace)
throw new TRPCError({
message: `Workspace with slug ${input.workspaceSlug} not found`,
code: "NOT_FOUND",
});
const result = await boardRepo.getBySlug(
ctx.db,
input.boardSlug,
workspace.id,
{
members: input.members ?? [],
labels: input.labels ?? [],
},
);
const result = await boardRepo.getBySlug(ctx.db, input.boardSlug, {
members: input.members ?? [],
labels: input.labels ?? [],
});
return result;
}),
@@ -298,21 +276,6 @@ export const boardRouter = createTRPCRouter({
await assertUserInWorkspace(ctx.db, userId, board.workspaceId);
if (input.slug) {
const isBoardSlugAvailable = await boardRepo.isBoardSlugAvailable(
ctx.db,
input.slug,
board.workspaceId,
);
if (!isBoardSlugAvailable) {
throw new TRPCError({
message: `Board slug ${input.slug} is not available`,
code: "BAD_REQUEST",
});
}
}
const result = await boardRepo.update(ctx.db, {
name: input.name,
slug: input.slug,
@@ -444,23 +407,11 @@ export const boardRouter = createTRPCRouter({
}),
)
.query(async ({ ctx, input }) => {
const board = await boardRepo.getWorkspaceAndBoardIdByBoardPublicId(
ctx.db,
input.boardPublicId,
);
if (!board)
throw new TRPCError({
message: `Board with public ID ${input.boardPublicId} not found`,
code: "NOT_FOUND",
});
const isBoardSlugAvailable = await boardRepo.isBoardSlugAvailable(
ctx.db,
input.boardSlug,
board.workspaceId,
input.boardPublicId,
);
return {
isReserved: !isBoardSlugAvailable,
};

View File

@@ -55,7 +55,6 @@ export const importRouter = createTRPCRouter({
protect: true,
},
})
.input(z.void())
.output(z.array(z.object({ id: z.string(), name: z.string() })))
.query(async ({ ctx }) => {
const apiKey = apiKeys.trello;

View File

@@ -15,47 +15,22 @@ export const apiKeys = {
};
export const integrationRouter = createTRPCRouter({
providers: protectedProcedure
.meta({
openapi: {
summary: "Get integration providers",
method: "GET",
path: "/integration/providers",
description: "Retrieves all integration providers for the user",
tags: ["Integration"],
protect: true,
},
})
.input(z.void())
.output(
z.array(
z.object({
expiresAt: z.date(),
createdAt: z.date(),
updatedAt: z.date().nullable(),
userId: z.string(),
accessToken: z.string(),
refreshToken: z.string().nullable(),
provider: z.string(),
}),
),
)
.query(async ({ ctx }) => {
const user = ctx.user;
providers: protectedProcedure.query(async ({ ctx }) => {
const user = ctx.user;
if (!user)
throw new TRPCError({
message: "User not authenticated",
code: "UNAUTHORIZED",
});
if (!user)
throw new TRPCError({
message: "User not authenticated",
code: "UNAUTHORIZED",
});
const integrations = await integrationsRepo.getProvidersForUser(
ctx.db,
user.id,
);
const integrations = await integrationsRepo.getProvidersForUser(
ctx.db,
user.id,
);
return integrations;
}),
return integrations;
}),
disconnect: protectedProcedure
.meta({
openapi: {

View File

@@ -8,12 +8,6 @@ import * as labelRepo from "@kan/db/repository/label.repo";
import { createTRPCRouter, protectedProcedure } from "../trpc";
import { assertUserInWorkspace } from "../utils/auth";
const labelSchema = z.object({
publicId: z.string(),
name: z.string(),
colourCode: z.string().nullable(),
});
export const labelRouter = createTRPCRouter({
byPublicId: protectedProcedure
.meta({
@@ -27,7 +21,7 @@ export const labelRouter = createTRPCRouter({
},
})
.input(z.object({ labelPublicId: z.string().min(12) }))
.output(labelSchema)
.output(z.custom<Awaited<ReturnType<typeof labelRepo.getByPublicId>>>())
.query(async ({ ctx, input }) => {
const userId = ctx.user?.id;
@@ -58,11 +52,7 @@ export const labelRouter = createTRPCRouter({
code: "NOT_FOUND",
});
return {
publicId: result.publicId,
name: result.name,
colourCode: result.colourCode,
};
return result;
}),
create: protectedProcedure
.meta({
@@ -82,7 +72,7 @@ export const labelRouter = createTRPCRouter({
colourCode: z.string().length(7),
}),
)
.output(labelSchema)
.output(z.custom<Awaited<ReturnType<typeof labelRepo.create>>>())
.mutation(async ({ ctx, input }) => {
const userId = ctx.user?.id;
@@ -118,11 +108,7 @@ export const labelRouter = createTRPCRouter({
code: "INTERNAL_SERVER_ERROR",
});
return {
publicId: result.publicId,
name: result.name,
colourCode: result.colourCode,
};
return result;
}),
update: protectedProcedure
.meta({
@@ -142,7 +128,7 @@ export const labelRouter = createTRPCRouter({
colourCode: z.string().length(7),
}),
)
.output(labelSchema)
.output(z.custom<Awaited<ReturnType<typeof labelRepo.update>>>())
.mutation(async ({ ctx, input }) => {
const userId = ctx.user?.id;
@@ -167,17 +153,7 @@ export const labelRouter = createTRPCRouter({
const result = await labelRepo.update(ctx.db, input);
if (!result)
throw new TRPCError({
message: `Failed to update label`,
code: "INTERNAL_SERVER_ERROR",
});
return {
publicId: result.publicId,
name: result.name,
colourCode: result.colourCode,
};
return result;
}),
delete: protectedProcedure
.meta({

View File

@@ -1,6 +1,7 @@
import { TRPCError } from "@trpc/server";
import { z } from "zod";
import { authClient } from "@kan/auth/client";
import * as memberRepo from "@kan/db/repository/member.repo";
import * as userRepo from "@kan/db/repository/user.repo";
import * as workspaceRepo from "@kan/db/repository/workspace.repo";
@@ -56,7 +57,7 @@ export const memberRouter = createTRPCRouter({
if (isInvitedEmailAlreadyMember) {
throw new TRPCError({
message: `User with email ${input.email} is already a member of this workspace`,
code: "CONFLICT",
code: "BAD_REQUEST",
});
}
@@ -77,28 +78,16 @@ export const memberRouter = createTRPCRouter({
code: "INTERNAL_SERVER_ERROR",
});
const { status } = await ctx.auth.api.signInMagicLink({
const { error } = await authClient.signIn.magicLink({
email: input.email,
callbackURL: `/boards?type=invite&memberPublicId=${invite.publicId}`,
});
if (!status) {
console.error("Failed to send magic link invitation:", {
email: input.email,
callbackURL: `/boards?type=invite&memberPublicId=${invite.publicId}`,
});
await memberRepo.softDelete(ctx.db, {
memberId: invite.id,
deletedAt: new Date(),
deletedBy: userId,
});
if (error)
throw new TRPCError({
message: `Failed to send magic link invitation to user with email ${input.email}.`,
message: `Failed to send magic link to user with email ${input.email}`,
code: "INTERNAL_SERVER_ERROR",
});
}
return invite;
}),

View File

@@ -20,73 +20,58 @@ export interface User {
stripeCustomerId?: string | null | undefined;
}
const createAuthWithHeaders = (
auth: ReturnType<typeof initAuth>,
headers: Headers,
) => {
return {
api: {
getSession: () => auth.api.getSession({ headers }),
signInMagicLink: (input: { email: string; callbackURL: string }) =>
auth.api.signInMagicLink({
headers,
body: { email: input.email, callbackURL: input.callbackURL },
}),
},
};
};
interface CreateContextOptions {
user: User | null | undefined;
db: dbClient;
auth: ReturnType<typeof createAuthWithHeaders>;
}
export const createInnerTRPCContext = (opts: CreateContextOptions) => {
return {
user: opts.user,
db: opts.db,
auth: opts.auth,
};
};
export const createTRPCContext = async ({ req }: CreateNextContextOptions) => {
const db = createDrizzleClient();
const baseAuth = initAuth(db);
const headers = new Headers(req.headers as Record<string, string>);
const auth = createAuthWithHeaders(baseAuth, headers);
const auth = initAuth(db);
const session = await auth.api.getSession();
const session = await auth.api.getSession({
// @ts-expect-error
headers: new Headers(req.headers),
});
return createInnerTRPCContext({ db, user: session?.user, auth });
return createInnerTRPCContext({ db, user: session?.user });
};
export const createNextApiContext = async (req: NextApiRequest) => {
const db = createDrizzleClient();
const baseAuth = initAuth(db);
const headers = new Headers(req.headers as Record<string, string>);
const auth = createAuthWithHeaders(baseAuth, headers);
const auth = initAuth(db);
const session = await auth.api.getSession();
const session = await auth.api.getSession({
// @ts-expect-error
headers: new Headers(req.headers),
});
return createInnerTRPCContext({ db, user: session?.user, auth });
return createInnerTRPCContext({ db, user: session?.user });
};
export const createRESTContext = async ({ req }: CreateNextContextOptions) => {
const db = createDrizzleClient();
const baseAuth = initAuth(db);
const headers = new Headers(req.headers as Record<string, string>);
const auth = createAuthWithHeaders(baseAuth, headers);
const auth = initAuth(db);
let session;
try {
session = await auth.api.getSession();
session = await auth.api.getSession({
// @ts-expect-error
headers: new Headers(req.headers),
});
} catch (error) {
console.error("Error getting session, ", error);
throw error;
}
return createInnerTRPCContext({ db, user: session?.user, auth });
return createInnerTRPCContext({ db, user: session?.user });
};
const t = initTRPC

View File

@@ -11,7 +11,7 @@ import type { dbClient } from "@kan/db/client";
import * as memberRepo from "@kan/db/repository/member.repo";
import * as userRepo from "@kan/db/repository/user.repo";
import * as schema from "@kan/db/schema";
import { cloudMailerClient, sendEmail } from "@kan/email";
import { sendEmail } from "@kan/email";
import { createStripeClient } from "@kan/stripe";
export const configuredProviders = socialProviderList.reduce<
@@ -84,7 +84,7 @@ export const socialProvidersPlugin = () => ({
method: "GET",
},
async (ctx) =>
ctx.json(ctx.context.socialProviders.map((p) => p.id.toLowerCase())),
ctx.json(ctx.context.socialProviders.map((p) => p.name.toLowerCase())),
),
},
});
@@ -166,34 +166,13 @@ export const initAuth = (db: dbClient) => {
databaseHooks: {
user: {
create: {
async before(user) {
before() {
if (env("NEXT_PUBLIC_DISABLE_SIGN_UP")?.toLowerCase() === "true") {
const pendingInvitation = await memberRepo.getByEmailAndStatus(
db,
user.email,
"invited",
);
if (!pendingInvitation) {
return Promise.resolve(false);
}
return Promise.resolve(true);
return Promise.resolve(false);
}
return Promise.resolve(true);
},
async after(user) {
if (cloudMailerClient) {
await cloudMailerClient.events.track({
event: "user-signup",
email: user.email,
data: {
name: user.name,
userId: user.id,
},
});
}
if (
user.image &&
!user.image.includes(process.env.NEXT_PUBLIC_STORAGE_DOMAIN!)
@@ -202,7 +181,6 @@ export const initAuth = (db: dbClient) => {
const client = new S3Client({
region: env("S3_REGION") ?? "",
endpoint: env("S3_ENDPOINT") ?? "",
forcePathStyle: env("S3_FORCE_PATH_STYLE") === "true",
credentials: {
accessKeyId: env("S3_ACCESS_KEY_ID") ?? "",
secretAccessKey: env("S3_SECRET_ACCESS_KEY") ?? "",

View File

@@ -1,4 +1,4 @@
import { and, asc, desc, eq, inArray, isNull, or } from "drizzle-orm";
import { and, asc, desc, eq, exists, inArray, isNull, or, sql } from "drizzle-orm";
import type { dbClient } from "@kan/db/client";
import type { BoardVisibilityStatus } from "@kan/db/schema";
@@ -201,7 +201,6 @@ export const getByPublicId = async (
export const getBySlug = async (
db: dbClient,
boardSlug: string,
workspaceId: number,
filters: {
members: string[];
labels: string[];
@@ -294,7 +293,6 @@ export const getBySlug = async (
},
where: and(
eq(boards.slug, boardSlug),
eq(boards.workspaceId, workspaceId),
isNull(boards.deletedAt),
eq(boards.visibility, "public"),
),
@@ -483,18 +481,30 @@ export const getWorkspaceAndBoardIdByBoardPublicId = async (
export const isBoardSlugAvailable = async (
db: dbClient,
boardSlug: string,
workspaceId: number,
boardPublicId: string,
) => {
const result = await db.query.boards.findFirst({
columns: {
id: true,
},
where: and(
eq(boards.slug, boardSlug),
eq(boards.workspaceId, workspaceId),
isNull(boards.deletedAt),
),
});
const result = await db
.select({ id: boards.id })
.from(boards)
.where(
and(
eq(boards.publicId, boardPublicId),
exists(
db
.select({ id: boards.id })
.from(boards)
.where(
and(
eq(boards.slug, boardSlug),
eq(boards.workspaceId, sql`${boards.workspaceId}`), // Reference outer query's workspaceId
isNull(boards.deletedAt),
),
)
.limit(1),
),
),
)
.limit(1);
return result === undefined;
return result.length === 0;
};

View File

@@ -23,12 +23,7 @@ export const create = async (
createdBy: labelInput.createdBy,
boardId: labelInput.boardId,
})
.returning({
id: labels.id,
publicId: labels.publicId,
name: labels.name,
colourCode: labels.colourCode,
});
.returning({ id: labels.id });
if (labelInput.cardId && result) {
await db.insert(cardsToLabels).values({
@@ -96,7 +91,6 @@ export const update = async (
.where(eq(labels.publicId, labelInput.labelPublicId))
.returning({
id: labels.id,
publicId: labels.publicId,
name: labels.name,
colourCode: labels.colourCode,
});

View File

@@ -41,20 +41,6 @@ export const getByPublicId = async (db: dbClient, publicId: string) => {
});
};
export const getByEmailAndStatus = async (
db: dbClient,
email: string,
status: MemberStatus,
) => {
return db.query.workspaceMembers.findFirst({
where: and(
eq(workspaceMembers.email, email),
eq(workspaceMembers.status, status),
isNull(workspaceMembers.deletedAt),
),
});
};
export const acceptInvite = async (
db: dbClient,
args: { memberId: number; userId: string },

View File

@@ -23,7 +23,6 @@
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
},
"dependencies": {
"@plunk/node": "^3.0.3",
"@react-email/components": "^0.0.25",
"nodemailer": "^7.0.3",
"react-email": "^3.0.1"

View File

@@ -1,8 +0,0 @@
import Plunk from "@plunk/node";
export const cloudMailerClient =
process.env.NEXT_PUBLIC_KAN_ENV === "cloud"
? new Plunk(process.env.PLUNK_API_KEY ?? "", {
baseUrl: process.env.PLUNK_API_URL,
})
: null;

View File

@@ -1,4 +1,3 @@
export const name = "email";
export { sendEmail } from "./sendEmail";
export { cloudMailerClient } from "./cloudMailerClient";

View File

@@ -1,7 +1,6 @@
import { render } from "@react-email/render";
import nodemailer from "nodemailer";
import { cloudMailerClient } from "./cloudMailerClient";
import JoinWorkspaceTemplate from "./templates/join-workspace";
import MagicLinkTemplate from "./templates/magic-link";
import ResetPasswordTemplate from "./templates/reset-password";
@@ -45,15 +44,6 @@ export const sendEmail = async (
html,
};
if (cloudMailerClient) {
const response = await cloudMailerClient.emails.send({
...options,
body: html,
});
return response;
}
const response = await transporter.sendMail(options);
if (!response.accepted.length) {

166
pnpm-lock.yaml generated
View File

@@ -10,14 +10,14 @@ catalogs:
specifier: ^5.59.15
version: 5.62.7
'@trpc/client':
specifier: ^11.4.3
version: 11.4.3
specifier: ^11.0.0-rc.477
version: 11.0.0-rc.660
'@trpc/react-query':
specifier: ^11.4.3
version: 11.4.3
specifier: ^11.0.0-rc.477
version: 11.0.0-rc.660
'@trpc/server':
specifier: ^11.4.3
version: 11.4.3
specifier: ^11.0.0-rc.477
version: 11.0.0-rc.660
eslint:
specifier: ^9.12.0
version: 9.16.0
@@ -140,16 +140,16 @@ importers:
version: 2.14.0(@tiptap/core@2.14.0(@tiptap/pm@2.14.0))(@tiptap/pm@2.14.0)
'@trpc/client':
specifier: 'catalog:'
version: 11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2)
version: 11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2)
'@trpc/next':
specifier: ^11.0.0-rc.660
version: 11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
version: 11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
'@trpc/react-query':
specifier: 'catalog:'
version: 11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
version: 11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
'@trpc/server':
specifier: 'catalog:'
version: 11.4.3(typescript@5.7.2)
version: 11.0.0-rc.660(typescript@5.7.2)
aws-sdk:
specifier: ^2.1692.0
version: 2.1692.0
@@ -291,13 +291,13 @@ importers:
version: link:../stripe
'@trpc/server':
specifier: 'catalog:'
version: 11.4.3(typescript@5.7.2)
version: 11.0.0-rc.660(typescript@5.7.2)
superjson:
specifier: 2.2.1
version: 2.2.1
trpc-to-openapi:
specifier: ^2.3.2
version: 2.3.2(@trpc/server@11.4.3(typescript@5.7.2))(zod-openapi@4.1.0(zod@3.24.0))(zod@3.24.0)
specifier: ^2.1.0
version: 2.1.0(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(zod-openapi@4.1.0(zod@3.24.0))(zod@3.24.0)
zod:
specifier: 'catalog:'
version: 3.24.0
@@ -409,9 +409,6 @@ importers:
packages/email:
dependencies:
'@plunk/node':
specifier: ^3.0.3
version: 3.0.3
'@react-email/components':
specifier: ^0.0.25
version: 0.0.25(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -2197,9 +2194,6 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
'@plunk/node@3.0.3':
resolution: {integrity: sha512-f3NT418/EdLjebQ4arAwR64cnz7d5H7i1CeKh8+B0cVBrwzHvF+Q+QkhutF+FAp49yuI/BYc71qQH+RFc2fxxQ==}
'@popperjs/core@2.11.8':
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
@@ -2824,11 +2818,11 @@ packages:
'@tootallnate/quickjs-emscripten@0.23.0':
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
'@trpc/client@11.4.3':
resolution: {integrity: sha512-i2suttUCfColktXT8bqex5kHW5jpT15nwUh0hGSDiW1keN621kSUQKcLJ095blqQAUgB+lsmgSqSMmB4L9shQQ==}
'@trpc/client@11.0.0-rc.660':
resolution: {integrity: sha512-bNpkZEfyMGKHynYFxdLpY8nJ1n7E3JHKcd4Pe2cagmpkzOEF9tFT3kzNf+eLI8XMG8196lTRR0J0W2/1Q8/cug==}
peerDependencies:
'@trpc/server': 11.4.3
typescript: '>=5.7.2'
'@trpc/server': 11.0.0-rc.660+74625d5e4
typescript: '>=5.6.2'
'@trpc/next@11.0.0-rc.660':
resolution: {integrity: sha512-LQHdiVED8h+CJEAy/X9PDmY3fM8VPdZ+3bVkbmEiP4xoNnSKRTbSbknFyRzG9M2AogfIafF4zAZVwOvCxexyGw==}
@@ -2847,20 +2841,20 @@ packages:
'@trpc/react-query':
optional: true
'@trpc/react-query@11.4.3':
resolution: {integrity: sha512-z+jhAiOBD22NNhHtvF0iFp9hO36YFA7M8AiUu/XtNmMxyLd3Y9/d1SMjMwlTdnGqxEGPo41VEWBrdhDUGtUuHg==}
'@trpc/react-query@11.0.0-rc.660':
resolution: {integrity: sha512-U2BHtYVt+8jt0a8Nrrk5cep8O1UZRxtTCBHtXie9kmJyQWWml43KfHxL5ssnFywaFrDZQz6Ec7kIoOxR/CQNfg==}
peerDependencies:
'@tanstack/react-query': ^5.80.3
'@trpc/client': 11.4.3
'@trpc/server': 11.4.3
'@tanstack/react-query': ^5.59.15
'@trpc/client': 11.0.0-rc.660+74625d5e4
'@trpc/server': 11.0.0-rc.660+74625d5e4
react: '>=18.2.0'
react-dom: '>=18.2.0'
typescript: '>=5.7.2'
typescript: '>=5.6.2'
'@trpc/server@11.4.3':
resolution: {integrity: sha512-wnWq3wiLlMOlYkaIZz+qbuYA5udPTLS4GVVRyFkr6aT83xpdCHyVtURT+u4hSoIrOXQM9OPCNXSXsAujWZDdaw==}
'@trpc/server@11.0.0-rc.660':
resolution: {integrity: sha512-QUapcZCNOpHT7ng9LceGc9ImkboWd0Go9ryrduZpL+p4jdfaC6409AQ3x4XEW6Wu3yBmZAn4CywCsDrDhjDy/w==}
peerDependencies:
typescript: '>=5.7.2'
typescript: '>=5.6.2'
'@tsconfig/node10@1.0.11':
resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
@@ -3581,6 +3575,10 @@ packages:
config-chain@1.1.13:
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
consola@3.2.3:
resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
engines: {node: ^14.18.0 || >=16.10.0}
constant-case@2.0.0:
resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==}
@@ -3631,8 +3629,8 @@ packages:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
crossws@0.3.5:
resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
crossws@0.3.1:
resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==}
css-box-model@1.2.1:
resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==}
@@ -4446,8 +4444,8 @@ packages:
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
engines: {node: '>=6.0'}
h3@1.15.1:
resolution: {integrity: sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==}
h3@1.13.0:
resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==}
handlebars@4.7.8:
resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
@@ -4979,6 +4977,9 @@ packages:
lodash.castarray@4.4.0:
resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
lodash.clonedeep@4.5.0:
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
lodash.get@4.4.2:
resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
deprecated: This package is deprecated. Use the optional chaining (?.) operator instead.
@@ -5339,6 +5340,11 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
mime@3.0.0:
resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
engines: {node: '>=10.0.0'}
hasBin: true
mimic-fn@2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
@@ -5491,6 +5497,9 @@ packages:
no-case@2.3.2:
resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==}
node-fetch-native@1.6.4:
resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==}
node-fetch@2.7.0:
resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
engines: {node: 4.x || >=6.0.0}
@@ -5504,9 +5513,6 @@ packages:
resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
hasBin: true
node-mock-http@1.0.1:
resolution: {integrity: sha512-0gJJgENizp4ghds/Ywu2FCmcRsgBTmRQzYPZm61wy+Em2sBarSka0OhQS5huLBg6od1zkNpnWMCZloQDFVvOMQ==}
node-plop@0.26.3:
resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==}
engines: {node: '>=8.9.4'}
@@ -5570,6 +5576,9 @@ packages:
obuf@1.1.2:
resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
ohash@1.1.4:
resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==}
on-exit-leak-free@2.1.2:
resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==}
engines: {node: '>=14.0.0'}
@@ -5588,8 +5597,8 @@ packages:
openapi-types@12.1.3:
resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==}
openapi3-ts@4.4.0:
resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==}
openapi3-ts@4.3.3:
resolution: {integrity: sha512-LKkzBGJcZ6wdvkKGMoSvpK+0cbN5Xc3XuYkJskO+vjEQWJgs1kgtyUk0pjf8KwPuysv323Er62F5P17XQl96Qg==}
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
@@ -6727,12 +6736,12 @@ packages:
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
trpc-to-openapi@2.3.2:
resolution: {integrity: sha512-uDZou+5a+H77yhiqfzVRBXzTSX8/mQUGeFpr8+VtZmpzUBOmv5XYbyEtWpG7fOdGWZkB99wuuKeWUwNwwOGaXQ==}
trpc-to-openapi@2.1.0:
resolution: {integrity: sha512-LODbI2a9LQamLpEz9hsqeMJBxpNT8KqfyICJhTVe8JBPZM8DvUkoICPlsdHf1KJVteoem/LlbwkD7loKYPWP1Q==}
peerDependencies:
'@trpc/server': ^11.1.0
'@trpc/server': ^11.0.0-rc.648
zod: ^3.23.8
zod-openapi: 4.2.4
zod-openapi: ^4.1.0
ts-api-utils@1.4.3:
resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
@@ -6865,6 +6874,9 @@ packages:
undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
unenv@1.10.0:
resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==}
unified@10.1.2:
resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
@@ -8916,10 +8928,6 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
'@plunk/node@3.0.3':
dependencies:
tslib: 2.8.1
'@popperjs/core@2.11.8': {}
'@react-aria/focus@3.19.0(react@18.3.1)':
@@ -9701,33 +9709,33 @@ snapshots:
'@tootallnate/quickjs-emscripten@0.23.0': {}
'@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2)':
'@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2)':
dependencies:
'@trpc/server': 11.4.3(typescript@5.7.2)
'@trpc/server': 11.0.0-rc.660(typescript@5.7.2)
typescript: 5.7.2
'@trpc/next@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)':
'@trpc/next@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/react-query@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(next@15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)':
dependencies:
'@trpc/client': 11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2)
'@trpc/server': 11.4.3(typescript@5.7.2)
'@trpc/client': 11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2)
'@trpc/server': 11.0.0-rc.660(typescript@5.7.2)
next: 15.3.4(@babel/core@7.24.5)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
typescript: 5.7.2
optionalDependencies:
'@tanstack/react-query': 5.62.7(react@18.3.1)
'@trpc/react-query': 11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
'@trpc/react-query': 11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)
'@trpc/react-query@11.4.3(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.4.3(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)':
'@trpc/react-query@11.0.0-rc.660(@tanstack/react-query@5.62.7(react@18.3.1))(@trpc/client@11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2))(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)':
dependencies:
'@tanstack/react-query': 5.62.7(react@18.3.1)
'@trpc/client': 11.4.3(@trpc/server@11.4.3(typescript@5.7.2))(typescript@5.7.2)
'@trpc/server': 11.4.3(typescript@5.7.2)
'@trpc/client': 11.0.0-rc.660(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(typescript@5.7.2)
'@trpc/server': 11.0.0-rc.660(typescript@5.7.2)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
typescript: 5.7.2
'@trpc/server@11.4.3(typescript@5.7.2)':
'@trpc/server@11.0.0-rc.660(typescript@5.7.2)':
dependencies:
typescript: 5.7.2
@@ -10607,6 +10615,8 @@ snapshots:
ini: 1.3.8
proto-list: 1.2.4
consola@3.2.3: {}
constant-case@2.0.0:
dependencies:
snake-case: 2.1.0
@@ -10658,7 +10668,7 @@ snapshots:
shebang-command: 2.0.0
which: 2.0.2
crossws@0.3.5:
crossws@0.3.1:
dependencies:
uncrypto: 0.1.3
@@ -11632,17 +11642,18 @@ snapshots:
section-matter: 1.0.0
strip-bom-string: 1.0.0
h3@1.15.1:
h3@1.13.0:
dependencies:
cookie-es: 1.2.2
crossws: 0.3.5
crossws: 0.3.1
defu: 6.1.4
destr: 2.0.3
iron-webcrypto: 1.2.1
node-mock-http: 1.0.1
ohash: 1.1.4
radix3: 1.1.2
ufo: 1.5.4
uncrypto: 0.1.3
unenv: 1.10.0
handlebars@4.7.8:
dependencies:
@@ -12184,6 +12195,8 @@ snapshots:
lodash.castarray@4.4.0: {}
lodash.clonedeep@4.5.0: {}
lodash.get@4.4.2: {}
lodash.isplainobject@4.0.6: {}
@@ -12925,6 +12938,8 @@ snapshots:
dependencies:
mime-db: 1.52.0
mime@3.0.0: {}
mimic-fn@2.1.0: {}
mini-svg-data-uri@1.4.4: {}
@@ -13061,6 +13076,8 @@ snapshots:
dependencies:
lower-case: 1.1.4
node-fetch-native@1.6.4: {}
node-fetch@2.7.0:
dependencies:
whatwg-url: 5.0.0
@@ -13068,8 +13085,6 @@ snapshots:
node-gyp-build@4.8.4:
optional: true
node-mock-http@1.0.1: {}
node-plop@0.26.3:
dependencies:
'@babel/runtime-corejs3': 7.26.0
@@ -13140,6 +13155,8 @@ snapshots:
obuf@1.1.2: {}
ohash@1.1.4: {}
on-exit-leak-free@2.1.2: {}
once@1.4.0:
@@ -13158,7 +13175,7 @@ snapshots:
openapi-types@12.1.3: {}
openapi3-ts@4.4.0:
openapi3-ts@4.3.3:
dependencies:
yaml: 2.6.1
@@ -14501,12 +14518,13 @@ snapshots:
trough@2.2.0: {}
trpc-to-openapi@2.3.2(@trpc/server@11.4.3(typescript@5.7.2))(zod-openapi@4.1.0(zod@3.24.0))(zod@3.24.0):
trpc-to-openapi@2.1.0(@trpc/server@11.0.0-rc.660(typescript@5.7.2))(zod-openapi@4.1.0(zod@3.24.0))(zod@3.24.0):
dependencies:
'@trpc/server': 11.4.3(typescript@5.7.2)
'@trpc/server': 11.0.0-rc.660(typescript@5.7.2)
co-body: 6.2.0
h3: 1.15.1
openapi3-ts: 4.4.0
h3: 1.13.0
lodash.clonedeep: 4.5.0
openapi3-ts: 4.3.3
zod: 3.24.0
zod-openapi: 4.1.0(zod@3.24.0)
optionalDependencies:
@@ -14650,6 +14668,14 @@ snapshots:
undici-types@6.19.8: {}
unenv@1.10.0:
dependencies:
consola: 3.2.3
defu: 6.1.4
mime: 3.0.0
node-fetch-native: 1.6.4
pathe: 1.1.2
unified@10.1.2:
dependencies:
'@types/unist': 2.0.11

View File

@@ -5,9 +5,9 @@ packages:
catalog:
"@tanstack/react-query": ^5.59.15
"@trpc/client": ^11.4.3
"@trpc/react-query": ^11.4.3
"@trpc/server": ^11.4.3
"@trpc/client": ^11.0.0-rc.477
"@trpc/react-query": ^11.0.0-rc.477
"@trpc/server": ^11.0.0-rc.477
eslint: ^9.12.0
prettier: ^3.3.3
tailwindcss: ^3.4.14

View File

@@ -106,12 +106,9 @@
"S3_ACCESS_KEY_ID",
"S3_SECRET_ACCESS_KEY",
"S3_ENDPOINT",
"S3_FORCE_PATH_STYLE",
"PORT",
"BETTER_AUTH_SECRET",
"BETTER_AUTH_TRUSTED_ORIGINS",
"PLUNK_API_KEY",
"PLUNK_API_URL"
"BETTER_AUTH_TRUSTED_ORIGINS"
],
"globalPassThroughEnv": [
"NODE_ENV",