kaneo (minimalist kanban) fork to experiment adding a tangled integration github.com/usekaneo/kaneo
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor: change interface declarations to type aliases for consistency

+145 -147
+2 -2
apps/api/src/time-entry/controllers/update-time-entry.ts
··· 3 3 import db from "../../database"; 4 4 import { timeEntryTable } from "../../database/schema"; 5 5 6 - interface UpdateTimeEntryParams { 6 + type UpdateTimeEntryParams = { 7 7 timeEntryId: string; 8 8 startTime: Date; 9 9 endTime?: Date; 10 10 description?: string; 11 - } 11 + }; 12 12 13 13 async function updateTimeEntry(params: UpdateTimeEntryParams) { 14 14 const { timeEntryId, startTime, endTime, description } = params;
+2 -2
apps/api/src/utils/workspace-access-middleware.ts
··· 14 14 idKey: string; 15 15 }; 16 16 17 - interface WorkspaceAccessMiddlewareConfig { 17 + type WorkspaceAccessMiddlewareConfig = { 18 18 sources: WorkspaceIdSource[]; 19 - } 19 + }; 20 20 21 21 export function workspaceAccessMiddleware( 22 22 config: WorkspaceAccessMiddlewareConfig,
+2 -2
apps/docs/components/section-separator.tsx
··· 1 1 import type { ReactNode } from "react"; 2 2 3 - interface SectionSeparatorProps { 3 + type SectionSeparatorProps = { 4 4 children: ReactNode; 5 - } 5 + }; 6 6 7 7 export default function SectionSeparator({ children }: SectionSeparatorProps) { 8 8 return (
+2 -2
apps/docs/components/structured-data.tsx
··· 1 1 import Script from "next/script"; 2 2 3 - interface StructuredDataProps { 3 + type StructuredDataProps = { 4 4 type?: "organization" | "software" | "article" | "faq"; 5 5 data?: { 6 6 title?: string; ··· 13 13 answer: string; 14 14 }>; 15 15 }; 16 - } 16 + }; 17 17 18 18 export default function StructuredData({ 19 19 type = "organization",
+2 -2
apps/docs/lib/og.tsx
··· 3 3 import { ImageResponse } from "next/og"; 4 4 import type { ReactElement, ReactNode } from "react"; 5 5 6 - interface GenerateProps { 6 + type GenerateProps = { 7 7 title: ReactNode; 8 8 description?: ReactNode; 9 9 primaryTextColor?: string; 10 10 site?: string; 11 - } 11 + }; 12 12 13 13 const font = readFileSync("./lib/Geist-Regular.ttf"); 14 14 const fontBold = readFileSync("./lib/Geist-Bold.ttf");
+2 -2
apps/web/src/components/activity/comment-card.tsx
··· 50 50 import { cn } from "@/lib/cn"; 51 51 import { useUserPreferencesStore } from "@/store/user-preferences"; 52 52 53 - interface CommentCardProps { 53 + type CommentCardProps = { 54 54 commentId: string; 55 55 taskId: string; 56 56 content: string; ··· 61 61 image?: string | null; 62 62 } | null; 63 63 createdAt: string; 64 - } 64 + }; 65 65 66 66 export default function CommentCard({ 67 67 commentId,
+2 -2
apps/web/src/components/activity/comment-input.tsx
··· 40 40 import { cn } from "@/lib/cn"; 41 41 import { useUserPreferencesStore } from "@/store/user-preferences"; 42 42 43 - interface CommentInputProps { 43 + type CommentInputProps = { 44 44 taskId: string; 45 - } 45 + }; 46 46 47 47 export default function CommentInput({ taskId }: CommentInputProps) { 48 48 const { theme } = useUserPreferencesStore();
+2 -2
apps/web/src/components/auth/layout.tsx
··· 1 1 import { Logo } from "../common/logo"; 2 2 3 - interface AuthLayoutProps { 3 + type AuthLayoutProps = { 4 4 children: React.ReactNode; 5 5 title: string; 6 6 subtitle?: string; 7 - } 7 + }; 8 8 9 9 export function AuthLayout({ children, title, subtitle }: AuthLayoutProps) { 10 10 return (
+2 -2
apps/web/src/components/auth/toggle.tsx
··· 1 1 import { Link } from "@tanstack/react-router"; 2 2 import useGetConfig from "@/hooks/queries/config/use-get-config"; 3 3 4 - interface AuthToggleProps { 4 + type AuthToggleProps = { 5 5 message: string; 6 6 linkText: string; 7 7 linkTo: string; 8 - } 8 + }; 9 9 10 10 export function AuthToggle({ message, linkText, linkTo }: AuthToggleProps) { 11 11 const { data: config } = useGetConfig();
+2 -2
apps/web/src/components/backlog-list-view/backlog-task-row.tsx
··· 30 30 import TaskCardLabels from "../kanban-board/task-labels"; 31 31 import { ContextMenu, ContextMenuTrigger } from "../ui/context-menu"; 32 32 33 - interface BacklogTaskRowProps { 33 + type BacklogTaskRowProps = { 34 34 task: Task; 35 - } 35 + }; 36 36 37 37 export default function BacklogTaskRow({ task }: BacklogTaskRowProps) { 38 38 const navigate = useNavigate();
+2 -2
apps/web/src/components/backlog-list-view/index.tsx
··· 31 31 import CreateTaskModal from "../shared/modals/create-task-modal"; 32 32 import BacklogTaskRow from "./backlog-task-row"; 33 33 34 - interface BacklogListViewProps { 34 + type BacklogListViewProps = { 35 35 project?: ProjectWithTasks; 36 - } 36 + }; 37 37 38 38 function BacklogListView({ project }: BacklogListViewProps) { 39 39 const { mutate: updateTask } = useUpdateTask();
+6 -6
apps/web/src/components/common/layout.tsx
··· 8 8 import { cn } from "@/lib/cn"; 9 9 import { useUserPreferencesStore } from "@/store/user-preferences"; 10 10 11 - interface LayoutProps { 11 + type LayoutProps = { 12 12 children: ReactNode; 13 13 className?: string; 14 - } 14 + }; 15 15 16 - interface HeaderProps { 16 + type HeaderProps = { 17 17 children: ReactNode; 18 18 className?: string; 19 - } 19 + }; 20 20 21 - interface ContentProps { 21 + type ContentProps = { 22 22 children: ReactNode; 23 23 className?: string; 24 - } 24 + }; 25 25 26 26 function LayoutHeader({ children, className }: HeaderProps) { 27 27 return (
+2 -2
apps/web/src/components/common/logo.tsx
··· 1 1 import { Link } from "@tanstack/react-router"; 2 2 import useProjectStore from "@/store/project"; 3 3 4 - interface LogoProps { 4 + type LogoProps = { 5 5 className?: string; 6 - } 6 + }; 7 7 8 8 export function Logo({ className = "" }: LogoProps) { 9 9 const { setProject } = useProjectStore();
+2 -2
apps/web/src/components/common/project-layout.tsx
··· 25 25 import useActiveWorkspace from "@/hooks/queries/workspace/use-active-workspace"; 26 26 import { cn } from "@/lib/cn"; 27 27 28 - interface ProjectLayoutProps { 28 + type ProjectLayoutProps = { 29 29 projectId: string; 30 30 workspaceId: string; 31 31 headerActions?: ReactNode; 32 32 children: ReactNode; 33 - } 33 + }; 34 34 35 35 export default function ProjectLayout({ 36 36 projectId,
+2 -2
apps/web/src/components/common/task-layout.tsx
··· 21 21 import useGetTask from "@/hooks/queries/task/use-get-task"; 22 22 import useActiveWorkspace from "@/hooks/queries/workspace/use-active-workspace"; 23 23 24 - interface TaskLayoutProps { 24 + type TaskLayoutProps = { 25 25 taskId: string; 26 26 projectId: string; 27 27 workspaceId: string; 28 28 headerActions?: ReactNode; 29 29 children: ReactNode; 30 30 rightSidebar?: ReactNode; 31 - } 31 + }; 32 32 33 33 export default function TaskLayout({ 34 34 taskId,
+2 -2
apps/web/src/components/common/workspace-layout.tsx
··· 21 21 import useActiveWorkspace from "@/hooks/queries/workspace/use-active-workspace"; 22 22 import { cn } from "@/lib/cn"; 23 23 24 - interface WorkspaceLayoutProps { 24 + type WorkspaceLayoutProps = { 25 25 title: string; 26 26 headerActions?: ReactNode; 27 27 children: ReactNode; 28 28 onCreateProject?: () => void; 29 29 className?: string; 30 - } 30 + }; 31 31 32 32 export default function WorkspaceLayout({ 33 33 title,
+2 -2
apps/web/src/components/kanban-board/column/column-dropzone.tsx
··· 7 7 import type { ProjectWithTasks } from "@/types/project"; 8 8 import TaskCard from "../task-card"; 9 9 10 - interface ColumnDropzoneProps { 10 + type ColumnDropzoneProps = { 11 11 column: ProjectWithTasks["columns"][number]; 12 12 onIsOverChange?: (isOver: boolean) => void; 13 - } 13 + }; 14 14 15 15 export function ColumnDropzone({ 16 16 column,
+2 -2
apps/web/src/components/kanban-board/column/column-footer.tsx
··· 4 4 import toKebabCase from "@/lib/to-kebab-case"; 5 5 import type { ProjectWithTasks } from "@/types/project"; 6 6 7 - interface ColumnFooterProps { 7 + type ColumnFooterProps = { 8 8 column: ProjectWithTasks["columns"][number]; 9 - } 9 + }; 10 10 11 11 export function ColumnFooter({ column }: ColumnFooterProps) { 12 12 const [isTaskModalOpen, setIsTaskModalOpen] = useState(false);
+2 -2
apps/web/src/components/kanban-board/column/column-header.tsx
··· 6 6 import useProjectStore from "@/store/project"; 7 7 import type { ProjectWithTasks } from "@/types/project"; 8 8 9 - interface ColumnHeaderProps { 9 + type ColumnHeaderProps = { 10 10 column: ProjectWithTasks["columns"][number]; 11 - } 11 + }; 12 12 13 13 export function ColumnHeader({ column }: ColumnHeaderProps) { 14 14 const { project, setProject } = useProjectStore();
+2 -2
apps/web/src/components/kanban-board/column/index.tsx
··· 6 6 import { ColumnDropzone } from "./column-dropzone"; 7 7 import { ColumnHeader } from "./column-header"; 8 8 9 - interface ColumnProps { 9 + type ColumnProps = { 10 10 column: ProjectWithTasks["columns"][number]; 11 - } 11 + }; 12 12 13 13 function Column({ column }: ColumnProps) { 14 14 const [isTaskModalOpen, setIsTaskModalOpen] = useState(false);
+4 -4
apps/web/src/components/kanban-board/task-card-context-menu/task-card-context-menu-content.tsx
··· 24 24 import { getPriorityIcon } from "@/lib/priority"; 25 25 import type Task from "@/types/task"; 26 26 27 - interface TaskCardContext { 27 + type TaskCardContext = { 28 28 worskpaceId: string; 29 29 projectId: string; 30 - } 30 + }; 31 31 32 - interface TaskCardContextMenuContentProps { 32 + type TaskCardContextMenuContentProps = { 33 33 task: Task; 34 34 taskCardContext: TaskCardContext; 35 35 onDeleteClick: () => void; 36 - } 36 + }; 37 37 38 38 export default function TaskCardContextMenuContent({ 39 39 task,
+2 -2
apps/web/src/components/kanban-board/task-card.tsx
··· 29 29 import TaskCardContextMenuContent from "./task-card-context-menu/task-card-context-menu-content"; 30 30 import TaskCardLabels from "./task-labels"; 31 31 32 - interface TaskCardProps { 32 + type TaskCardProps = { 33 33 task: Task; 34 - } 34 + }; 35 35 36 36 function TaskCard({ task }: TaskCardProps) { 37 37 const {
+2 -2
apps/web/src/components/list-view/task-row.tsx
··· 30 30 import TaskCardLabels from "../kanban-board/task-labels"; 31 31 import { ContextMenu, ContextMenuTrigger } from "../ui/context-menu"; 32 32 33 - interface TaskRowProps { 33 + type TaskRowProps = { 34 34 task: Task; 35 35 projectSlug: string; 36 - } 36 + }; 37 37 38 38 function TaskRow({ task, projectSlug }: TaskRowProps) { 39 39 const navigate = useNavigate();
+2 -2
apps/web/src/components/notification/notification-dropdown.tsx
··· 32 32 import { useRegisterShortcuts } from "@/hooks/use-keyboard-shortcuts"; 33 33 import { cn } from "@/lib/cn"; 34 34 35 - export interface NotificationDropdownRef { 35 + export type NotificationDropdownRef = { 36 36 toggle: () => void; 37 - } 37 + }; 38 38 39 39 const NotificationDropdown = forwardRef<NotificationDropdownRef>( 40 40 (_props, ref) => {
+2 -2
apps/web/src/components/page-title.tsx
··· 1 1 import { useEffect } from "react"; 2 2 3 - interface PageTitleProps { 3 + type PageTitleProps = { 4 4 title: string; 5 5 suffix?: string; 6 6 hideAppName?: boolean; 7 - } 7 + }; 8 8 9 9 export default function PageTitle({ 10 10 title,
+2 -2
apps/web/src/components/project/tasks-import-export.tsx
··· 10 10 import { cn } from "@/lib/cn"; 11 11 import type { ProjectWithTasks } from "@/types/project"; 12 12 13 - interface TasksImportExportProps { 13 + type TasksImportExportProps = { 14 14 project: ProjectWithTasks; 15 - } 15 + }; 16 16 17 17 export function TasksImportExport({ project }: TasksImportExportProps) { 18 18 const [isImportOpen, setIsImportOpen] = useState(false);
+4 -4
apps/web/src/components/public-project/kanban-view.tsx
··· 4 4 import type Task from "@/types/task"; 5 5 import { PublicTaskCard } from "./task-card"; 6 6 7 - interface Column { 7 + type Column = { 8 8 id: string; 9 9 name: string; 10 10 icon: LucideIcon; 11 11 tasks: Task[]; 12 - } 12 + }; 13 13 14 - interface PublicKanbanViewProps { 14 + type PublicKanbanViewProps = { 15 15 project: ProjectWithTasks; 16 16 onTaskClick: (task: Task) => void; 17 - } 17 + }; 18 18 19 19 export function PublicKanbanView({ 20 20 project,
+4 -4
apps/web/src/components/public-project/list-view.tsx
··· 4 4 import type Task from "@/types/task"; 5 5 import { PublicTaskRow } from "./task-row"; 6 6 7 - interface Column { 7 + type Column = { 8 8 id: string; 9 9 name: string; 10 10 icon: LucideIcon; 11 11 tasks: Task[]; 12 - } 12 + }; 13 13 14 - interface PublicListViewProps { 14 + type PublicListViewProps = { 15 15 project: ProjectWithTasks; 16 16 onTaskClick: (task: Task) => void; 17 - } 17 + }; 18 18 19 19 export function PublicListView({ project, onTaskClick }: PublicListViewProps) { 20 20 const columns: Column[] = DEFAULT_COLUMNS.map((column) => ({
+2 -2
apps/web/src/components/public-project/task-card.tsx
··· 5 5 import { cn } from "@/lib/cn"; 6 6 import type Task from "@/types/task"; 7 7 8 - interface PublicTaskCardProps { 8 + type PublicTaskCardProps = { 9 9 task: Task; 10 10 projectSlug: string; 11 11 onTaskClick: (task: Task) => void; 12 - } 12 + }; 13 13 14 14 export function PublicTaskCard({ 15 15 task,
+2 -2
apps/web/src/components/public-project/task-detail-modal.tsx
··· 6 6 import { cn } from "@/lib/cn"; 7 7 import type Task from "@/types/task"; 8 8 9 - interface PublicTaskDetailModalProps { 9 + type PublicTaskDetailModalProps = { 10 10 task: Task | null; 11 11 projectSlug: string; 12 12 open: boolean; 13 13 onOpenChange: (open: boolean) => void; 14 - } 14 + }; 15 15 16 16 export function PublicTaskDetailModal({ 17 17 task,
+2 -2
apps/web/src/components/public-project/task-row.tsx
··· 5 5 import { getPriorityIcon } from "@/lib/priority"; 6 6 import type Task from "@/types/task"; 7 7 8 - interface PublicTaskRowProps { 8 + type PublicTaskRowProps = { 9 9 task: Task; 10 10 projectSlug: string; 11 11 onTaskClick: (task: Task) => void; 12 - } 12 + }; 13 13 14 14 export function PublicTaskRow({ 15 15 task,
+6 -6
apps/web/src/components/settings-layout.tsx
··· 22 22 import { shortcuts } from "@/constants/shortcuts"; 23 23 import { cn } from "@/lib/cn"; 24 24 25 - interface SettingsLayoutProps { 25 + type SettingsLayoutProps = { 26 26 title: string; 27 27 description?: string; 28 28 icon?: ReactNode; ··· 30 30 backLabel?: string; 31 31 children: ReactNode; 32 32 className?: string; 33 - } 33 + }; 34 34 35 35 export function SettingsLayout({ 36 36 title, ··· 120 120 ); 121 121 } 122 122 123 - interface SettingsSectionProps { 123 + type SettingsSectionProps = { 124 124 title: string; 125 125 description?: string; 126 126 icon?: ReactNode; 127 127 children: ReactNode; 128 128 className?: string; 129 - } 129 + }; 130 130 131 131 export function SettingsSection({ 132 132 title, ··· 155 155 ); 156 156 } 157 157 158 - interface DangerZoneSectionProps { 158 + type DangerZoneSectionProps = { 159 159 title: string; 160 160 description: string; 161 161 children: ReactNode; 162 - } 162 + }; 163 163 164 164 export function DangerZoneSection({ 165 165 title,
+2 -2
apps/web/src/components/settings/api-key-created-modal.tsx
··· 12 12 DialogTitle, 13 13 } from "../ui/dialog"; 14 14 15 - interface ApiKeyCreatedModalProps { 15 + type ApiKeyCreatedModalProps = { 16 16 apiKey: string; 17 17 keyName: string; 18 18 open: boolean; 19 19 onClose: () => void; 20 - } 20 + }; 21 21 22 22 export function ApiKeyCreatedModal({ 23 23 apiKey,
+2 -2
apps/web/src/components/settings/api-key-table.tsx
··· 13 13 TableRow, 14 14 } from "../ui/table"; 15 15 16 - interface ApiKeyTableProps { 16 + type ApiKeyTableProps = { 17 17 apiKeys: ApiKey[]; 18 18 isLoading: boolean; 19 - } 19 + }; 20 20 21 21 export function ApiKeyTable({ apiKeys, isLoading }: ApiKeyTableProps) { 22 22 const { mutateAsync: deleteApiKey } = useDeleteApiKey();
+2 -2
apps/web/src/components/settings/create-api-key-dialog.tsx
··· 34 34 35 35 type FormValues = z.infer<typeof createApiKeySchema>; 36 36 37 - interface CreateApiKeyDialogProps { 37 + type CreateApiKeyDialogProps = { 38 38 open: boolean; 39 39 onClose: () => void; 40 40 onSuccess: (data: CreateApiKeyResponse) => void; 41 - } 41 + }; 42 42 43 43 export function CreateApiKeyDialog({ 44 44 open,
+2 -2
apps/web/src/components/shared/modals/create-task-modal.tsx
··· 44 44 import { getPriorityIcon } from "@/lib/priority"; 45 45 import useProjectStore from "@/store/project"; 46 46 47 - interface CreateTaskModalProps { 47 + type CreateTaskModalProps = { 48 48 open: boolean; 49 49 onClose: () => void; 50 50 status?: string; 51 - } 51 + }; 52 52 53 53 type Priority = "no-priority" | "low" | "medium" | "high" | "urgent"; 54 54
+2 -2
apps/web/src/components/shared/modals/create-workspace-modal.tsx
··· 21 21 import useCreateWorkspace from "@/hooks/queries/workspace/use-create-workspace"; 22 22 import { useUserPreferencesStore } from "@/store/user-preferences"; 23 23 24 - interface CreateWorkspaceModalProps { 24 + type CreateWorkspaceModalProps = { 25 25 open: boolean; 26 26 onClose: () => void; 27 - } 27 + }; 28 28 29 29 function CreateWorkspaceModal({ open, onClose }: CreateWorkspaceModalProps) { 30 30 const [name, setName] = useState("");
+2 -2
apps/web/src/components/task/task-assignee-popover.tsx
··· 12 12 import { useGetActiveWorkspaceUsers } from "@/hooks/queries/workspace-users/use-get-active-workspace-users"; 13 13 import type Task from "@/types/task"; 14 14 15 - interface TaskAssigneePopoverProps { 15 + type TaskAssigneePopoverProps = { 16 16 task: Task; 17 17 workspaceId: string; 18 18 children: React.ReactNode; 19 - } 19 + }; 20 20 21 21 export default function TaskAssigneePopover({ 22 22 task,
+2 -2
apps/web/src/components/task/task-description-editor.tsx
··· 37 37 import { cn } from "@/lib/cn"; 38 38 import { useUserPreferencesStore } from "@/store/user-preferences"; 39 39 40 - interface TaskDescriptionEditorProps { 40 + type TaskDescriptionEditorProps = { 41 41 value: string; 42 42 onChange: (value: string) => void; 43 43 placeholder?: string; 44 - } 44 + }; 45 45 46 46 export default function TaskDescriptionEditor({ 47 47 value: _value,
+2 -2
apps/web/src/components/task/task-description.tsx
··· 42 42 import debounce from "@/lib/debounce"; 43 43 import { useUserPreferencesStore } from "@/store/user-preferences"; 44 44 45 - interface TaskDescriptionProps { 45 + type TaskDescriptionProps = { 46 46 taskId: string; 47 - } 47 + }; 48 48 49 49 export default function TaskDescription({ taskId }: TaskDescriptionProps) { 50 50 const { data: task } = useGetTask(taskId);
+2 -2
apps/web/src/components/task/task-due-date-popover.tsx
··· 9 9 import { useUpdateTaskDueDate } from "@/hooks/mutations/task/use-update-task-due-date"; 10 10 import type Task from "@/types/task"; 11 11 12 - interface TaskDueDatePopoverProps { 12 + type TaskDueDatePopoverProps = { 13 13 task: Task; 14 14 children: React.ReactNode; 15 - } 15 + }; 16 16 17 17 export default function TaskDueDatePopover({ 18 18 task,
+2 -2
apps/web/src/components/task/task-labels-popover.tsx
··· 38 38 | "pink" 39 39 | "red"; 40 40 41 - interface TaskLabelsPopoverProps { 41 + type TaskLabelsPopoverProps = { 42 42 task: Task; 43 43 workspaceId: string; 44 44 children: React.ReactNode; 45 - } 45 + }; 46 46 47 47 type PopoverStep = "select" | "color"; 48 48
+2 -2
apps/web/src/components/task/task-priority-popover.tsx
··· 11 11 import { getPriorityIcon } from "@/lib/priority"; 12 12 import type Task from "@/types/task"; 13 13 14 - interface TaskPriorityPopoverProps { 14 + type TaskPriorityPopoverProps = { 15 15 task: Task; 16 16 children: React.ReactNode; 17 - } 17 + }; 18 18 19 19 const priorityOptions = [ 20 20 { value: "no-priority", label: "No Priority" },
+2 -2
apps/web/src/components/task/task-status-popover.tsx
··· 11 11 import { getColumnIcon } from "@/lib/column"; 12 12 import type Task from "@/types/task"; 13 13 14 - interface TaskStatusPopoverProps { 14 + type TaskStatusPopoverProps = { 15 15 task: Task; 16 16 children: React.ReactNode; 17 - } 17 + }; 18 18 19 19 const statusOptions = [ 20 20 { value: "to-do", label: "To Do" },
+2 -2
apps/web/src/components/task/task-title.tsx
··· 7 7 import useGetTask from "@/hooks/queries/task/use-get-task"; 8 8 import debounce from "@/lib/debounce"; 9 9 10 - interface TaskTitleProps { 10 + type TaskTitleProps = { 11 11 taskId: string; 12 - } 12 + }; 13 13 14 14 export default function TaskTitle({ taskId }: TaskTitleProps) { 15 15 const { data: task } = useGetTask(taskId);
+2 -3
apps/web/src/components/ui/badge.tsx
··· 23 23 }, 24 24 ); 25 25 26 - export interface BadgeProps 27 - extends React.HTMLAttributes<HTMLDivElement>, 28 - VariantProps<typeof badgeVariants> {} 26 + export type BadgeProps = React.HTMLAttributes<HTMLDivElement> & 27 + VariantProps<typeof badgeVariants>; 29 28 30 29 function Badge({ className, variant, ...props }: BadgeProps) { 31 30 return (
+4 -4
apps/web/src/components/ui/combobox.tsx
··· 17 17 } from "@/components/ui/popover"; 18 18 import { cn } from "@/lib/cn"; 19 19 20 - export interface ComboboxOption { 20 + export type ComboboxOption = { 21 21 value: string; 22 22 label: string; 23 23 icon?: React.ReactNode; 24 - } 24 + }; 25 25 26 - export interface ComboboxProps { 26 + export type ComboboxProps = { 27 27 options: ComboboxOption[]; 28 28 value?: string; 29 29 onValueChange?: (value: string) => void; ··· 40 40 | "ghost" 41 41 | "link"; 42 42 size?: "default" | "sm" | "xs"; 43 - } 43 + }; 44 44 45 45 export function Combobox({ 46 46 options,
+4 -4
apps/web/src/components/ui/error-boundary.tsx
··· 1 1 import React from "react"; 2 2 import { ErrorDisplay } from "./error-display"; 3 3 4 - interface ErrorBoundaryState { 4 + type ErrorBoundaryState = { 5 5 hasError: boolean; 6 6 error?: Error; 7 - } 7 + }; 8 8 9 - interface ErrorBoundaryProps { 9 + type ErrorBoundaryProps = { 10 10 children: React.ReactNode; 11 11 fallback?: React.ComponentType<{ error: Error; resetError: () => void }>; 12 - } 12 + }; 13 13 14 14 export class ErrorBoundary extends React.Component< 15 15 ErrorBoundaryProps,
+2 -2
apps/web/src/components/ui/error-display.tsx
··· 13 13 CardTitle, 14 14 } from "./card"; 15 15 16 - interface ErrorDisplayProps { 16 + type ErrorDisplayProps = { 17 17 error: unknown; 18 18 onRetry?: () => void; 19 19 title?: string; 20 20 className?: string; 21 - } 21 + }; 22 22 23 23 export function ErrorDisplay({ 24 24 error,
+2 -2
apps/web/src/components/ui/error-fallback.tsx
··· 1 1 import { ErrorDisplay } from "./error-display"; 2 2 3 - interface ErrorFallbackProps { 3 + type ErrorFallbackProps = { 4 4 error: Error; 5 5 resetError: () => void; 6 - } 6 + }; 7 7 8 8 export function ErrorFallback({ error, resetError }: ErrorFallbackProps) { 9 9 return (
+4 -4
apps/web/src/components/ui/kbd.tsx
··· 1 1 import { cn } from "@/lib/cn"; 2 2 3 - interface KbdProps { 3 + type KbdProps = { 4 4 children: React.ReactNode; 5 5 className?: string; 6 6 description?: string; 7 7 hideDescription?: boolean; 8 - } 8 + }; 9 9 10 10 export function Kbd({ 11 11 children, ··· 30 30 ); 31 31 } 32 32 33 - interface KbdSequenceProps { 33 + type KbdSequenceProps = { 34 34 keys: string[]; 35 35 separator?: string; 36 36 className?: string; 37 37 description?: string; 38 - } 38 + }; 39 39 40 40 export function KbdSequence({ 41 41 keys,
+2 -2
apps/web/src/components/ui/loading-skeleton.tsx
··· 1 1 import { cn } from "@/lib/cn"; 2 2 3 - interface LoadingSkeletonProps { 3 + type LoadingSkeletonProps = { 4 4 className?: string; 5 - } 5 + }; 6 6 7 7 export function LoadingSkeleton({ className }: LoadingSkeletonProps) { 8 8 return (
+5 -6
apps/web/src/components/ui/spinner.tsx
··· 27 27 }, 28 28 }); 29 29 30 - interface SpinnerContentProps 31 - extends VariantProps<typeof spinnerVariants>, 32 - VariantProps<typeof loaderVariants> { 33 - className?: string; 34 - children?: React.ReactNode; 35 - } 30 + type SpinnerContentProps = VariantProps<typeof spinnerVariants> & 31 + VariantProps<typeof loaderVariants> & { 32 + className?: string; 33 + children?: React.ReactNode; 34 + }; 36 35 37 36 export function Spinner({ 38 37 size,
+2 -2
apps/web/src/hooks/use-keyboard-shortcuts.ts
··· 16 16 type PrefixKey = string; 17 17 type SequentialKey = string; 18 18 19 - interface KeyboardShortcutsContextType { 19 + type KeyboardShortcutsContextType = { 20 20 registerShortcut: (key: ShortcutKey, handler: ShortcutHandler) => void; 21 21 registerSequentialShortcut: ( 22 22 prefix: PrefixKey, ··· 32 32 unregisterSequentialShortcut: (prefix: PrefixKey, key: SequentialKey) => void; 33 33 unregisterModifierShortcut: (modifierKey: string, key: string) => void; 34 34 activePrefix: string | null; 35 - } 35 + }; 36 36 37 37 const KeyboardShortcutsContext = 38 38 createContext<KeyboardShortcutsContextType | null>(null);
+2 -2
apps/web/src/hooks/use-task-filters.ts
··· 3 3 import type { ProjectWithTasks } from "@/types/project"; 4 4 import type Task from "@/types/task"; 5 5 6 - export interface BoardFilters { 6 + export type BoardFilters = { 7 7 status: string | null; 8 8 priority: string | null; 9 9 assignee: string | null; 10 10 dueDate: string | null; 11 11 labels: string[] | null; 12 - } 12 + }; 13 13 14 14 export function useTaskFilters(project: ProjectWithTasks | null | undefined) { 15 15 const [filters, setFilters] = useState<BoardFilters>({
+2 -2
apps/web/src/lib/error-handler.ts
··· 1 - export interface ApiError { 1 + export type ApiError = { 2 2 message: string; 3 3 type: "network" | "cors" | "auth" | "server" | "unknown"; 4 4 status?: number; 5 5 originalError?: Error; 6 - } 6 + }; 7 7 8 8 export function parseApiError(error: unknown): ApiError { 9 9 if (error instanceof Error) {
+2 -2
apps/web/src/main.tsx
··· 42 42 }); 43 43 44 44 declare module "@tanstack/react-router" { 45 - interface Register { 45 + type Register = { 46 46 router: typeof router; 47 - } 47 + }; 48 48 } 49 49 50 50 function App() {
+4 -4
apps/web/src/vite-env.d.ts
··· 3 3 4 4 declare const __APP_VERSION__: string; 5 5 6 - interface ImportMetaEnv { 6 + type ImportMetaEnv = { 7 7 readonly KANEO_API_URL: string; 8 - } 8 + }; 9 9 10 - interface ImportMeta { 10 + type ImportMeta = { 11 11 readonly env: ImportMetaEnv; 12 - } 12 + };
+2 -2
packages/email/src/templates/magic-link.tsx
··· 14 14 15 15 void React; 16 16 17 - export interface MagicLinkEmailProps { 17 + export type MagicLinkEmailProps = { 18 18 magicLink: string; 19 - } 19 + }; 20 20 21 21 const MagicLinkEmail = ({ magicLink }: MagicLinkEmailProps) => ( 22 22 <Html>
+2 -2
packages/email/src/templates/workspace-invitation.tsx
··· 14 14 15 15 void React; 16 16 17 - export interface WorkspaceInvitationEmailProps { 17 + export type WorkspaceInvitationEmailProps = { 18 18 workspaceName: string; 19 19 inviterName: string; 20 20 inviterEmail: string; 21 21 invitationLink: string; 22 22 to: string; 23 - } 23 + }; 24 24 25 25 const WorkspaceInvitationEmail = ({ 26 26 workspaceName,