Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
133881c
feat: add (not completed) create event form
Mopsior Feb 20, 2026
4df0954
feat: add drawer date picker
Mopsior Feb 20, 2026
35697c9
chore: change calendar sizes on mobile
Mopsior Feb 20, 2026
76cb6ef
feat: (date-picker) add error handling, (nested-drawer) add bottomChi…
Mopsior Feb 21, 2026
5778574
feat: add time-picker
Mopsior Feb 21, 2026
b2592f9
fix (time-picker): optimization
Mopsior Feb 21, 2026
2858605
feat: add totalTime inputs and calculateDuration
Mopsior Feb 21, 2026
d6db13c
feat: endTime before startTime validation
Mopsior Feb 21, 2026
9e26adb
chore: change time-picker sizes
Mopsior Feb 21, 2026
e1a9f13
feat: add eventType selection
Mopsior Feb 21, 2026
21abe84
feat: add small and dynamic variant for RadioGroup
Mopsior Feb 25, 2026
c345cca
feat: add calendar selector
Mopsior Feb 27, 2026
95e697d
hot-fix: fix drawer not opening in calendar settings
Mopsior Feb 28, 2026
5bdddb0
feat: add mobile calendar picker drawer
Mopsior Feb 28, 2026
684eb6e
hot-fix: global Nested Drawer scale bug
Mopsior Feb 28, 2026
e51ed17
hot-fix: global drawer double closing animation
Mopsior Mar 1, 2026
360998b
feat: add title input
Mopsior Mar 1, 2026
32ebc68
feat: add date-picker errors
Mopsior Mar 2, 2026
e50765c
fix: missing key error
Mopsior Mar 2, 2026
7fe15c1
feat: split form into separate components
Mopsior Mar 3, 2026
114d4db
fix: validation erros when switching time variant
Mopsior Mar 6, 2026
2fb7e1f
fix (validation): field error providing
Mopsior Mar 6, 2026
8ec4041
feat: add event creation in db
Mopsior Mar 9, 2026
8704238
fix: remvoe IDOR vulnerabilityin creation server functions
Mopsior Mar 9, 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
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@
"i18n-ally.localesPaths": ["./src/locales"],
"i18n-ally.keystyle": "nested",
"i18n-ally.sourceLanguage": "pl",
"i18n-ally.displayLanguage": "pl"
"i18n-ally.displayLanguage": "pl",
"editor.defaultFormatter": "biomejs.biome"
}
23 changes: 15 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,20 +85,27 @@ The theme is applied as a CSS class (`light` or `dark`) on the `<html>` element.
</div>
```

## 💡 Quick Tips
<details>
<summary>Getting <b>UserID</b></summary>

In `/app/*` you can get userID from **loader data** (fetched on `/app/route.tsx`)

```tsx
// import path matters!
import { Route } from '@/routes/app/route'
// ...
const { userId } = Route.useLoaderData()
```
</details>

## 🐞 Error handling

Handling error should be done through `<ErrorScreen />` component (and added later similar things). This will create one space for sending data to PostHog

## 🗺️ Roadmap

- [ ] Add mobile calendar view
- [x] Move to Biome
- [ ] Handle months that aren't provided in dataset
- [ ] A11y:
- [ ] Disable switching months if forms/drawers are opened (add check using global state)
- [ ] Handling Esc for return button
- [ ] ServerFn Error translations handling
- [ ] **Production**: add PostHog
Project roadmap can be found in [Github Projects](https://github.com/users/Mopsior/projects/8/views/2)

## ☁️ Deployment

Expand Down
8 changes: 8 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"@tailwindcss/vite": "^4.1.18",
"@tanstack/react-devtools": "^0.7.11",
"@tanstack/react-form": "^1.27.7",
"@tanstack/react-form-devtools": "^0.2.17",
"@tanstack/react-query": "^5.90.16",
"@tanstack/react-query-devtools": "^5.91.2",
"@tanstack/react-router": "^1.147.1",
Expand All @@ -37,6 +38,7 @@
"@tanstack/zod-adapter": "^1.154.7",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"drizzle-kit": "^0.31.8",
"drizzle-orm": "^0.45.1",
"i18next": "^25.7.4",
Expand All @@ -46,6 +48,7 @@
"nitro": "latest",
"pg": "^8.16.3",
"react": "^19.2.3",
"react-day-picker": "^9.13.2",
"react-dom": "^19.2.3",
"react-i18next": "^16.5.1",
"react-scan": "^0.4.3",
Expand Down Expand Up @@ -79,6 +82,11 @@
"web-vitals": "^5.1.0"
},
"packageManager": "pnpm@10.9.0+sha512.0486e394640d3c1fb3c9d43d49cf92879ff74f8516959c235308f5a8f62e2e19528a65cdc2a3058f587cde71eba3d5b56327c8c33a97e4c4051ca48a10ca2d5f",
"pnpm": {
"patchedDependencies": {
"vaul@1.1.2": "patches/vaul.patch"
}
},
"lint-staged": {
"*.{js,ts,cjs,mjs,d.cts,d.mts,jsx,tsx,json,jsonc}": [
"biome check --write --no-errors-on-unmatched"
Expand Down
36 changes: 36 additions & 0 deletions patches/vaul.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
diff --git a/dist/index.js b/dist/index.js
index 7f343be1fafe1cf302ee6afc7268c29490895e34..a4f8181b7321ffc0ff8dd100ce964818d2800b49 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -1633,6 +1633,13 @@ function NestedRoot({ onDrag, onOpenChange, open: nestedIsOpen, ...rest }) {
if (!onNestedDrag) {
throw new Error('Drawer.NestedRoot must be placed in another drawer');
}
+ // Fix for controlled nested drawers stacking effect
+ // https://github.com/emilkowalski/vaul/issues/540
+ React__namespace.default.useEffect(() => {
+ if (nestedIsOpen !== undefined) {
+ onNestedOpenChange(nestedIsOpen);
+ }
+ }, [nestedIsOpen]);
return /*#__PURE__*/ React__namespace.default.createElement(Root, {
nested: true,
open: nestedIsOpen,
diff --git a/dist/index.mjs b/dist/index.mjs
index 0dbbce5526681925a81804ced237a045a53c0355..7621c6bf5fc7b31c08af3ceee55da265ac909bdc 100644
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -1611,6 +1611,13 @@ function NestedRoot({ onDrag, onOpenChange, open: nestedIsOpen, ...rest }) {
if (!onNestedDrag) {
throw new Error('Drawer.NestedRoot must be placed in another drawer');
}
+ // Fix for controlled nested drawers stacking effect
+ // https://github.com/emilkowalski/vaul/issues/540
+ React__default.useEffect(() => {
+ if (nestedIsOpen !== undefined) {
+ onNestedOpenChange(nestedIsOpen);
+ }
+ }, [nestedIsOpen]);
return /*#__PURE__*/ React__default.createElement(Root, {
nested: true,
open: nestedIsOpen,
Loading