Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
c45fb16
feat(settings): add appearance settings page and menu
chertik77 Jul 16, 2026
5343f58
feat(settings): add accessibility settings page and config
chertik77 Jul 17, 2026
658caa5
feat(settings): add general settings page and api
chertik77 Jul 17, 2026
4245d00
refactor: add valibot to hey open api generator
chertik77 Jul 17, 2026
f0a57e7
feat(settings): add pointer cursor support and sync UI
chertik77 Jul 17, 2026
e05eb0e
feat(settings): add accent color customization
chertik77 Jul 17, 2026
22ed61d
feat(settings): add toggle to enable or disable animations
chertik77 Jul 17, 2026
680c12d
refactor(setting): rename entities/settings to entities/setting
chertik77 Jul 17, 2026
fff9ad5
feat(settings): add first day of week setting and apply it
chertik77 Jul 17, 2026
99f38f2
refactor: add accent colors map
chertik77 Jul 17, 2026
157d014
feat(settings): add date format and board blur options
chertik77 Jul 18, 2026
73a464a
feat(setting): add confirm before delete option
chertik77 Jul 18, 2026
e10f9e8
refactor(setting): unify settings access with useSettings hook
chertik77 Jul 18, 2026
1942b01
feat(settings): add back button and unify icons
chertik77 Jul 18, 2026
98f2483
refactor(setting): reorganize useSettings exports by domain
chertik77 Jul 18, 2026
e3a26bf
feat(settings): add task settings and sorting options
chertik77 Jul 18, 2026
9a0dbe3
feat(security): add security settings page with session management
chertik77 Jul 18, 2026
46048bb
feat(security): add passkey management UI and API hooks
chertik77 Jul 19, 2026
5138248
feat: add passkeys section
chertik77 Jul 19, 2026
6c62c8e
feat(board): add BoardBackgroundImage component
chertik77 Jul 19, 2026
22f94eb
feat(security): add connected accounts management
chertik77 Jul 19, 2026
5f4f119
feat: add labels settings
chertik77 Jul 20, 2026
744635e
refactor(label): clean up LabelChip styles and exports
chertik77 Jul 20, 2026
2837d01
feat(drag-and-drop): optimize context performance
chertik77 Jul 20, 2026
41bda87
feat(settings): add entry and list animations
chertik77 Jul 21, 2026
7406b2e
refactor(ui): replace motion import with react-m alias
chertik77 Jul 21, 2026
29adfc0
feat(settings): simplify settings and sync api
chertik77 Aug 10, 2026
8ca7e72
feat(settings): refine session and theme handling
chertik77 Aug 10, 2026
3a7bc53
feat(settings): add font size and motion settings
chertik77 Aug 11, 2026
c20a9b4
feat(settings): persist theme and improve UX
chertik77 Aug 11, 2026
9971705
feat(task): overhaul task filtering and sorting
chertik77 Aug 11, 2026
10cdf57
feat(ui): standardize pluralization and cleanup
chertik77 Aug 11, 2026
25f4d2d
feat(settings): improve mobile responsiveness
chertik77 Aug 11, 2026
cb7c8b8
feat(ui): replace sonner with custom toast system
chertik77 Aug 11, 2026
b9395f3
feat(task): remove task sorting functionality
chertik77 Aug 12, 2026
4ce89f7
feat(settings): implement task preferences
chertik77 Aug 12, 2026
cf5510a
feat(settings): persist all appearance preferences
chertik77 Aug 12, 2026
fcf5610
feat(settings): handle passkey cancellation
chertik77 Aug 12, 2026
e775d9e
feat(task): standardize deadline handling and UI
chertik77 Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,4 @@ _Link to the backend repo:_ https://github.com/chertik77/TaskPro-backend

## Languages and Tools

![Languages and Tools](https://skills.syvixor.com/api/icons?i=ts,react,dndkit,baseui,tanstack,betterauth,heyapi,stanjs,axios,datefns,motion,reactdatepicker,reacthookform,lucide,valibot,tailwind,tailwindmerge,fusejs,commitlint,eslint,prettier,githubactions,fsd,yarn,vercel,vite,vscode,figma&perline=10)
![Languages and Tools](https://skills.syvixor.com/api/icons?i=ts,react,dndkit,baseui,tanstack,betterauth,heyapi,stanjs,axios,datefns,motion,reactdatepicker,reacthookform,lucide,thesvg,valibot,tailwind,tailwindmerge,fusejs,commitlint,eslint,prettier,githubactions,fsd,yarn,vercel,vite,vscode,figma&perline=10)
9 changes: 9 additions & 0 deletions eslint.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,22 @@ export default defineConfig(
'Direct access to `import.meta.env` is forbidden. Use `@/shared/config` instead.'
}
],
'no-restricted-imports': [
'error',
{
name: 'motion/react',
importNames: ['motion'],
message: 'Do not import motion. Use m from motion/react-m instead.'
}
],
'newline-before-return': 'error',
'arrow-body-style': ['warn', 'as-needed']
}
},
{
rules: {
'jsx-a11y/no-autofocus': 'off',
'@eslint-react/no-array-index-key': 'off',
'@typescript-eslint/consistent-type-imports': 'error',
'@typescript-eslint/no-import-type-side-effects': 'error',
'@typescript-eslint/consistent-indexed-object-style': 'error',
Expand Down
27 changes: 27 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,33 @@
<meta
name="viewport"
content="width=device-width, initial-scale=1.0" />
<script>
;(() => {
const root = document.documentElement

let appearance = {}

appearance =
JSON.parse(localStorage.getItem('taskpro-appearance')) || {}

let theme =
appearance.theme ?? localStorage.getItem('taskpro-theme') ?? 'light'

if (theme === 'system') {
theme = window.matchMedia('(prefers-color-scheme: dark)').matches
? 'dark'
: 'light'
}

root.dataset.theme = theme
root.dataset.fontSize = appearance.fontSize ?? 'medium'
root.dataset.animations = appearance.animations ?? 'system'

if (appearance.accentColor) {
root.style.setProperty('--accent-color', appearance.accentColor)
}
})()
</script>
<meta
name="description"
content="The ultimate task management tool for individuals and teams. Organize tasks, set deadlines, track progress, and increase productivity with TaskPro." />
Expand Down
5 changes: 3 additions & 2 deletions openapi-ts.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ export default defineConfig({
input: `${process.env.VITE_API_BASE_URL}/openapi.json`,
output: 'src/shared/api/generated',
plugins: [
'valibot',
'@tanstack/react-query',
{
name: '@hey-api/client-axios',
throwOnError: true,
runtimeConfigPath: 'src/shared/lib/openapi/hey-api.ts'
},
{ enums: 'javascript', name: '@hey-api/typescript' },
{ name: '@hey-api/sdk', transformer: true },
{ name: '@hey-api/transformers', dates: true }
{ name: '@hey-api/sdk', validator: true }
]
})
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
{
"name": "task-pro-frontend",
"private": true,
"type": "module",
"engines": {
"node": ">=24.0.0"
},
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite --open",
"build": "tsc && vite build",
Expand All @@ -20,6 +19,7 @@
},
"dependencies": {
"@base-ui/react": "^1.6.0",
"@better-auth/passkey": "^1.6.23",
"@daypicker/react": "^10.0.1",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
Expand All @@ -28,6 +28,7 @@
"@radix-ui/react-roving-focus": "^1.1.15",
"@tanstack/react-query": "^5.101.2",
"@tanstack/react-router": "1.170.17",
"@thesvg/react": "^3.2.8",
"@vercel/analytics": "^2.0.1",
"@vercel/speed-insights": "^2.0.0",
"axios": "^1.18.1",
Expand All @@ -41,9 +42,9 @@
"react": "^19.2.7",
"react-dom": "^19.2.7",
"react-hook-form": "7.81.0",
"sonner": "^2.0.7",
"stan-js": "^1.9.1",
"tailwind-merge": "^3.6.0",
"use-context-selector": "^2.0.0",
"use-debounce": "^10.1.1",
"valibot": "^1.4.2"
},
Expand Down
57 changes: 0 additions & 57 deletions public/social-icons.svg

This file was deleted.

6 changes: 4 additions & 2 deletions src/app/ambient/react-query.d.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import type { QueryKey } from '@tanstack/react-query'
import type { AxiosError } from 'axios'
import type { BetterFetchError } from 'better-auth/react'

declare module '@tanstack/react-query' {
interface Register {
defaultError: AxiosError
defaultError: AxiosError | BetterFetchError
mutationMeta: {
invalidates?: QueryKey[]
successMessage?: string
errorMessage?: string | ((error?: AxiosError) => string)
errorMessage?:
string | ((error?: AxiosError | BetterFetchError) => string | undefined)
}
}
}
70 changes: 55 additions & 15 deletions src/app/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
}

@theme inline {
--default-transition-duration: 0.3s;

--font-*: initial;
--font-poppins: 'Poppins', sans-serif;

Expand All @@ -45,46 +47,47 @@
--color-white: #ffffff;
--color-white-soft: #fcfcfc;
--color-white-muted: #f6f6f7;
--color-brand: #bedbb0;
--color-brand-light: #9dc888;
--color-blue: #8fa1d0;
--color-accent: var(--accent-color);
--color-priority-low: #9bb7d4;
--color-priority-medium: #e5a8b7;
--color-red: #dc2626;
--color-pink: #e09cb5;
--color-green: #bedbb0;
--color-green-light: #9dc888;

--text-*: initial;
--text-xs: 8px;
--text-xs: calc(8px * var(--font-scale));
--text-xs--line-height: normal;
--text-xs--font-weight: 400;
--text-xs--letter-spacing: -0.16px;

--text-sm: 10px;
--text-sm: calc(10px * var(--font-scale));
--text-sm--line-height: normal;
--text-sm--font-weight: 400;
--text-sm--letter-spacing: -0.2px;

--text-md: 12px;
--text-md: calc(12px * var(--font-scale));
--text-md--line-height: normal;
--text-md--letter-spacing: -0.24px;

--text-base: 14px;
--text-base: calc(14px * var(--font-scale));
--text-base--line-height: 1.28;
--text-base--letter-spacing: -0.28px;

--text-lg: 16px;
--text-lg: calc(16px * var(--font-scale));
--text-lg--line-height: normal;
--text-lg--letter-spacing: -0.64px;

--text-xl: 18px;
--text-xl: calc(18px * var(--font-scale));
--text-xl--line-height: normal;
--text-xl--font-weight: 500;
--text-xl--letter-spacing: -0.36px;

--text-2xl: 28px;
--text-2xl: calc(28px * var(--font-scale));
--text-2xl--line-height: normal;
--text-2xl--font-weight: 600;
--text-2xl--letter-spacing: -1.12px;

--text-3xl: 40px;
--text-3xl: calc(40px * var(--font-scale));
--text-3xl--line-height: normal;
--text-3xl--font-weight: 600;
--text-3xl--letter-spacing: -1.6px;
Expand Down Expand Up @@ -146,13 +149,50 @@
}

@layer base {
:root {
--accent-color: var(--color-green);
--font-scale: 1;
}

button:not(:disabled),
[role='button']:not(:disabled) {
cursor: pointer;
}

html[data-animations='off'] *,
html[data-animations='off'] *::before,
html[data-animations='off'] *::after {
animation-duration: 0s !important;
animation-iteration-count: 1 !important;
transition-duration: 0s !important;
scroll-behavior: auto !important;
}

@media (prefers-reduced-motion: reduce) {
html[data-animations='system'] *,
html[data-animations='system'] *::before,
html[data-animations='system'] *::after {
animation-duration: 0s !important;
animation-iteration-count: 1 !important;
transition-duration: 0s !important;
scroll-behavior: auto !important;
}
}

html[data-font-size='small'] {
--font-scale: 0.92;
}

html[data-font-size='medium'] {
--font-scale: 1;
}

html[data-font-size='large'] {
--font-scale: 1.12;
}
}

@custom-variant dark (&:where(.dark, .dark *));
@custom-variant dark (&:where(html[data-theme='dark'] *));

@custom-variant hocus {
@media (hover: hover) {
Expand Down Expand Up @@ -209,11 +249,11 @@
}

@utility styled-outline {
@apply outline-brand outline-2;
@apply outline-accent outline-2;
}

@utility bg-soft-green {
@apply to-brand bg-linear-180 from-white;
@apply to-green bg-linear-180 from-white;
}

@utility disable-text-selection {
Expand Down
2 changes: 1 addition & 1 deletion src/app/providers/RouteProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const RouterProvider = () => (
defaultPendingComponent={() => (
<div className='fixed top-0 right-0 block h-12 w-screen'>
<div className='bg-soft-green flex h-screen items-center justify-center'>
<Loader className='size-12' />
<Loader className='size-12 stroke-black' />
</div>
</div>
)}
Expand Down
23 changes: 2 additions & 21 deletions src/app/providers/ToastProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,3 @@
import { Toaster } from 'sonner'
import { Toaster } from '@/shared/ui'

import { useMe } from '@/entities/user'

import { useTabletAndBelowMediaQuery } from '@/shared/lib'

export const ToastProvider = () => {
const user = useMe()

const isTabletAndBelow = useTabletAndBelowMediaQuery()

return (
<Toaster
position={isTabletAndBelow ? 'top-center' : 'bottom-right'}
richColors
closeButton
duration={5000}
theme={user?.theme === 'dark' ? 'dark' : 'light'}
className='text-balance'
/>
)
}
export const ToastProvider = () => <Toaster />
11 changes: 10 additions & 1 deletion src/app/routes/dashboard/$boardId.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,14 @@ import { Board } from '@/widgets/kanban-board'
export const Route = createFileRoute('/dashboard/$boardId')({
component: Board,
validateSearch: TaskContracts.TaskSearchSchema,
search: { middlewares: [stripSearchParams({ search: '' })] }
search: {
middlewares: [
stripSearchParams({
search: '',
priority: [],
deadline: [],
labels: []
})
]
}
})
7 changes: 7 additions & 0 deletions src/app/routes/dashboard/settings/general.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { createFileRoute } from '@tanstack/react-router'

import { GeneralSettings } from '@/features/settings/general'

export const Route = createFileRoute('/dashboard/settings/general')({
component: GeneralSettings
})
7 changes: 7 additions & 0 deletions src/app/routes/dashboard/settings/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { createFileRoute, redirect } from '@tanstack/react-router'

export const Route = createFileRoute('/dashboard/settings/')({
beforeLoad: () => {
throw redirect({ to: '/dashboard/settings/general' })
}
})
Loading
Loading