Commit Graph
100 Commits
Author SHA1 Message Date
old4ever f3350e0124 feat: simplify date picker shortcuts 2026-04-10 15:40:47 -04:00
old4ever 27492ee01f feat: add location autocomplete 2026-04-10 15:40:38 -04:00
old4ever 12849b2362 feat: add AI settings controls 2026-04-10 15:40:29 -04:00
old4ever e01a7ed1ad feat: use friendly event date labels 2026-04-09 17:41:37 -04:00
old4ever 12f2fd95dc refactor: centralize event dialog form state 2026-04-09 17:41:26 -04:00
old4ever 911e5735a4 feat: add shared recurrence helpers 2026-04-09 17:41:04 -04:00
old4ever 95bc5db9a8 refactor: move calendar chrome into the home page 2026-04-09 13:25:52 -04:00
old4ever 22224bebc6 feat: redesign local calendar workspace 2026-04-09 13:25:30 -04:00
old4ever f05e6f5792 feat: clarify AI draft messaging in toolbar 2026-04-09 11:59:45 -04:00
old4ever ecff8bebb1 feat: review single AI-generated events before saving 2026-04-09 11:59:32 -04:00
old4ever aef22f704f ♿️ feat: keep event actions menu visible 2026-04-09 01:10:37 -04:00
old4ever e4953ee42e chore: update skills
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-09 01:04:00 -04:00
old4ever 92f60d3a9a 📱 fix: hide keyboard shortcuts trigger on mobile 2026-04-09 00:59:15 -04:00
old4ever 513aafcebc feat: support multiple image uploads for AI event generation 🖼️
- Updated OpenRouter integration to accept an array of image URLs
- Updated ImagePicker to use the `multiple` attribute natively
- Added `appendImagesDeduped` for handling client-side image deduplication
- Enhanced clipboard pasting to extract multiple images at once
- Rendered multiple images in a horizontal thumbnail strip in the AIToolbar
- Added tests to cover multi-image logic and AI request mapping
2026-04-08 20:46:43 -04:00
old4ever cac201a4d2 feat: add document-level paste and Ctrl/Cmd+V handler for image clipboard support 2026-04-08 19:58:40 -04:00
old4ever 1c864f162e feat: handle image paste in AI toolbar textarea via onPaste handler 2026-04-08 19:58:36 -04:00
old4ever b3121ed532 refactor: remove strict MIME-type allowlist check from validateImageFile 2026-04-08 19:58:05 -04:00
old4ever d850d88a3a test: add unit tests for extractImageFromClipboard 2026-04-08 19:58:03 -04:00
old4ever 2d34bbebc4 feat: add extractImageFromClipboard utility with broad image/* MIME matching 2026-04-08 19:58:01 -04:00
old4ever 722c0f0f7d 🚸 feat: redesign AI toolbar with two-zone layout and HoverCard shortcuts popover
- Split composer into AI zone (primary accent) and data actions zone (neutral)
- Move Attach/Generate to labeled footer bar below textarea (left/right aligned)
- Add info icon with HoverCard (hover preview) + Popover (pinned click) showing identical keyboard shortcuts content using shadcn HoverCard to fix theme inconsistency vs Tooltip
- Expose imperative triggerRef on ImagePicker for keyboard shortcut access
- Wire TooltipProvider in root layout; install shadcn kbd and hover-card
- Unauthenticated state shows locked CTA with real sign-in button weight
- Add behavioral contract tests for footer bar, info trigger, and zone layout
2026-04-08 13:08:36 -04:00
old4ever 650d1d5f95 🩹 fix: restore textarea placeholder padding in ai-toolbar
Replace px-0 py-0 override with px-3 py-1 so placeholder text is
never flush against the edge. The ::placeholder pseudo-element
inherits box padding from the textarea; zeroing it out removed all
visual breathing room for the hint text.

Also adds tests/textarea.test.ts that locks down this behaviour via
class-string assertions on the resolved cn() output.
2026-04-08 09:19:59 -04:00
old4ever b93669a416 🔥 fix: remove border and background from empty events skeleton 2026-04-08 09:15:05 -04:00
old4ever 9dfd4ef326 ✨ feat: add Google and Apple OAuth via better-auth socialProviders 2026-04-08 09:12:50 -04:00
old4ever e59476dea9 fix: remove fixed height and icon margins from sign-in buttons 2026-04-08 01:51:22 -04:00
old4ever 86bb20baf4 fix: remove icon margin overrides from mode toggle menu items 2026-04-08 01:51:17 -04:00
old4ever 1ef63d8070 fix: remove fixed height and icon margins from event actions toolbar 2026-04-08 01:51:12 -04:00
old4ever 0f46e9322f refactor: mobile-first AI toolbar layout 2026-04-08 01:50:06 -04:00
old4ever 0807779c9b feat: make AI summary notification dismissable 2026-04-08 01:47:29 -04:00
old4ever a3000def67 fix: remove redundant shadcn component className overrides 2026-04-08 01:43:55 -04:00
old4ever a819cbfced fix: normalize action button icon spacing and text size 2026-04-08 01:33:33 -04:00
old4ever de6407170d fix: align component styling inconsistencies 2026-04-08 01:29:51 -04:00
old4ever 8eda6c89e2 feat: replace all vanilla HTML elements with shadcn components
- Install skeleton and tooltip shadcn components
- event-dialog: textarea → Textarea, duration chips → Button ghost
- date-time-picker: raw button trigger → Button outline, quick-date chips → Button ghost
- event-card: <a> URL link → Button link asChild
- sign-in: animate-pulse div → Skeleton
- ai-toolbar: animate-pulse div → Skeleton, event count span → Badge secondary
- event-actions-toolbar: event count span → Badge secondary
2026-04-08 01:17:18 -04:00
old4ever 1cee73702b feat: add quick duration selectors (+15 min, +30 min, +1h, +3h) in event dialog 2026-04-08 01:07:14 -04:00
old4ever 6884a87e3c feat: add Today / Next week / Next month quick selectors to date picker 2026-04-08 01:04:34 -04:00
old4ever cc5ce95e1b feat: replace raw date/time inputs with shadcn Calendar + Select picker
- Add popover shadcn component (radix-ui based)
- Create DateTimePicker component: Calendar popover for date + hour/minute
  selects for time, allDay-aware, emits ISO / YYYY-MM-DD strings
- Replace datetime-local / date <Input> fields in EventDialog with DateTimePicker
- Remove unused CalendarIcon and Clock imports from event-dialog
2026-04-08 01:02:47 -04:00
old4ever 19228b0a71 feat(ui): add Separator component 2026-04-08 00:57:07 -04:00
old4ever 26a82681c4 refactor(page): move event actions into AIToolbar, remove standalone EventActionsToolbar 2026-04-08 00:57:02 -04:00
old4ever 2fc21ee929 feat(ai-toolbar): merge event actions into toolbar, add motion animations and AI summary panel
- Add event action props (events, onAddEvent, onImport, onExport, onClearAll)
- Show skeleton loading state while session is pending
- Render event action buttons (Add, Import, Export, Clear) in action bar
- Add AnimatePresence for image preview attach/remove
- Replace Card summary panel with animated glass-card panel
- Inline AI Summarize button into action bar when authenticated
- Add Sparkles icon to AI command section header
2026-04-08 00:56:58 -04:00
old4ever 8d7cc5b2a5 style(recurrence-picker): tighten spacing and use muted xs labels 2026-04-08 00:56:52 -04:00
old4ever a26787a026 feat(event-dialog): redesign with glass-strong styling, icon-decorated inputs, and Cancel button
- Apply glass-strong to DialogContent
- Add LucideMapPin and CalendarIcon/Clock icons to input fields
- Replace native checkbox with Checkbox + Label component
- Unify allDay date inputs into single relative-positioned blocks
- Add Cancel button to DialogFooter
- Rename Save to Create for new events
2026-04-08 00:56:49 -04:00
old4ever e000d41474 feat(event-actions-toolbar): redesign with icon buttons, sm size, and event count badge 2026-04-08 00:56:43 -04:00
old4ever 5c7003fd13 feat(drag-drop-container): replace border highlight with animated glass overlay on drag 2026-04-08 00:56:38 -04:00
old4ever 8b54a661fe feat(events-list): add AnimatePresence for list transitions and improve empty state 2026-04-08 00:56:35 -04:00
old4ever c80322f20a feat(event-card): redesign with motion layout animations, improved date formatting, and contextual metadata
- Wrap card in motion.div with layout/enter/exit animations
- Replace Card/CardHeader/CardContent with flat glass-card div
- Add hover-reveal action menu with opacity transition
- Improve date formatting with locale options for month/day/time
- Show end time inline next to start
- Add ExternalLink for event URLs
- Add icons to dropdown menu items with DropdownMenuSeparator
2026-04-08 00:56:28 -04:00
old4ever 2992cfbccd feat(rrule-display): display recurrence rule as a Badge instead of plain text 2026-04-08 00:56:21 -04:00
old4ever 625e019ae7 feat(mode-toggle): simplify component, add icons to menu items and active state highlight 2026-04-08 00:56:17 -04:00
old4ever 8ee5688168 feat(sign-in): add icons, use ghost variant and sm size for header buttons 2026-04-08 00:56:13 -04:00
old4ever 59bc8fee38 feat(auth): redesign auth pages with glass UI and motion animations
- error page: replace Card with glass-strong panel, add AlertTriangle icon
- signin page: add framer-motion entrance animation, CalendarDays branding,
  Loader2 spinner while loading, merge isPending/session checks
- signout page: replace Card with glass-strong panel, add LogOut icon,
  tighten user identity display
2026-04-08 00:56:08 -04:00
old4ever c6086bdcc7 refactor(layout): switch to Geist fonts, redesign header, default to dark theme
- Replace Magra with Geist Mono font
- Rename font variables to geistSans/geistMono
- Apply both font variables to body
- Redesign sticky header with glass-strong and CalendarDays icon
- Wrap main content in max-w-4xl centered container
- Add glass-strong className to Toaster
- Default theme changed to dark
2026-04-08 00:56:03 -04:00
old4ever 22fe3ec97b style: overhaul design tokens, shadows, animations, and glass utilities
- Replace warm/mixed color palette with clean cool blue-grey tokens
- Reduce border-radius from 1.25rem to 0.75rem
- Rewrite shadow system using oklch with proper depth scale
- Switch fonts from custom serif/sans to Geist Sans/Mono CSS vars
- Add CSS animation keyframes (fade-in, slide-up, slide-down, scale-in)
- Add glass, glass-card, and glass-strong utility classes
2026-04-08 00:55:55 -04:00
old4ever 40dfde34a2 deps: add framer-motion and radix-ui packages 2026-04-08 00:55:48 -04:00
old4ever 865bef63ac chore: add .chrome to .gitignore 2026-04-08 00:55:45 -04:00
old4ever 9e27b41efe chore: migrate ui skills to bun
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-07 23:18:56 -04:00
old4ever c4865a6d20 feat: install ui skills
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-07 23:17:14 -04:00
old4ever d002bbc29e ♿️ feat: fix accessibility warnings, PWA icons, and form field attributes
- add DialogDescription (sr-only) to EventDialog to satisfy Radix UI
  aria-describedby requirement and silence the React console warning
- add htmlFor/id pairing to the all-day checkbox label in EventDialog
- add id and name attributes to all raw form fields (textarea, checkbox)
  in event-dialog to resolve biome a11y lint warnings (4 fields fixed)
- add name attribute to hidden file inputs in image-picker and ics-file-picker
- generate public/icon-192x192.png and public/icon-512x512.png so the PWA
  manifest no longer returns 404 for the app icons
2026-04-07 23:08:48 -04:00
old4ever cbd2559169 🐛 fix: normalize AI-generated dates to valid ISO offset datetimes
- add normalizeAiDateString() to coerce bare ISO datetimes, date-only
  strings, and fractional-second variants into offset-aware format
- apply via z.preprocess in AiEventResponseItemSchema so Zod validation
  no longer rejects AI responses missing a timezone offset
- fix system prompt to use toISOString() (unambiguous UTC) and clarify
  expected datetime format for the AI model
- install bun-types and add to tsconfig so bun:test resolves cleanly
- add 8 behaviour-driven tests covering all normalizer edge cases
2026-04-07 23:01:42 -04:00
old4ever f3ccbf5db5 fix: ignore .chrome dir that breaks turbopack
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-07 22:59:41 -04:00
old4ever 735350a4d1 chore: create .chrome directory
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-07 17:06:19 -04:00
old4ever 685241c92f chore: update skills
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-07 17:06:08 -04:00
old4ever 7ffcb4dc43 chore: add dokploy mcp
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-07 16:12:28 -04:00
old4ever be70a4579f Merge pull request 'feat: multimodal AI event creation with image support' (#1) from image-parse into main 2026-04-07 15:21:27 -04:00
old4ever f38b0188df 🚨 fix: resolve all linter and typecheck warnings across codebase 2026-04-07 14:42:24 -04:00
old4ever 54ca910609 🔧 chore: add biome config for Tailwind CSS and CSS module declarations 2026-04-07 14:42:17 -04:00
old4ever fab0d2ff47 refactor(components): derive ImagePicker variant types from buttonVariants
Replace manually duplicated variant/size type literals with
VariantProps<typeof buttonVariants> for type safety and
consistency with the Button component.
2026-04-07 13:11:42 -04:00
old4ever a7716d87df fix(components): add unoptimized image prop, overflow containment, and accessibility
Add unoptimized prop to image preview to support blob URLs, contain
overflow on preview container, replace div with semantic section
element in DragDropContainer with aria-label, and import shared
image constants.
2026-04-07 13:11:35 -04:00
old4ever 096f548ec3 refactor(page): extract AI handler helpers and add client-side image validation
Break down the monolithic handleAiCreate into focused helpers
(sendAiRequest, persistAiEvents, populateEventForm), add client-side
image file validation before upload, and use toast.promise finally
callback for loading state cleanup.
2026-04-07 13:11:26 -04:00
old4ever 79f98ebfd3 refactor(api): simplify AI event route with extracted utilities and env-based model
Replace inline JSON extraction with the shared json-utils module,
extract chat response content parsing into a dedicated helper, make
the AI model configurable via AI_MODEL env var, and improve error
messages for production safety.
2026-04-07 13:11:15 -04:00
old4ever 7bb4f2be9d refactor(types): strengthen Zod schemas with regex validation and derive CalendarEvent
Add regex-based data URL validation for images, compute binary size
from base64 for accurate 10MB limit, enforce datetime strings with
offset for start/end fields, and derive CalendarEvent from the AI
response item type to eliminate field duplication.
2026-04-07 13:11:05 -04:00
old4ever dc4204a740 refactor(lib): extract shared image constants and JSON parsing utilities
Move image extensions, MIME types, and size limit into a dedicated
constants module. Extract JSON-from-text parsing into a pure utility
function for reuse across the codebase.
2026-04-07 13:10:59 -04:00
old4ever a0a7e021a8 style: standardize import ordering, type imports, and formatting in source files
Sort imports alphabetically, convert value imports to type-only where
appropriate, normalize indentation to tabs, and sort exports
alphabetically across UI components, pages, and lib modules.
2026-04-07 13:10:49 -04:00
old4ever cbae9fa1c9 style: standardize formatting in opencode tooling files
Reformat JSON configs and TypeScript scripts to use consistent
tab indentation, semicolons, and double quotes.
2026-04-07 13:10:35 -04:00
old4ever 4e09059a3d chore(deps): add @typescript/native-preview, biome lint integration, and typecheck script
Add @typescript/native-preview for tsgo typechecking, integrate biome
check into the lint script, and add a dedicated typecheck script.
2026-04-07 13:10:16 -04:00
old4ever 95de6ae46a feat(page): wire image upload state, base64 conversion, and API integration into home page 2026-04-07 11:58:10 -04:00
old4ever 5e888ce7ae feat(components): add image preview, picker, and clear controls to AIToolbar 2026-04-07 11:58:01 -04:00
old4ever 94de1dde0e feat(components): add image drag-drop support to DragDropContainer 2026-04-07 11:57:47 -04:00
old4ever c02c6ece5d feat(components): add ImagePicker file upload component 2026-04-07 11:57:32 -04:00
old4ever 8d1b04f646 feat(api): refactor AI event route with Zod validation, multimodal image support, and JSON extraction 2026-04-07 11:57:22 -04:00
old4ever 3d6999312c feat(lib): add AI event Zod schemas for request validation and response parsing 2026-04-07 11:57:11 -04:00
old4ever 6944215578 chore(deps): add zod dependency 2026-04-07 11:57:01 -04:00
old4ever f8213883df chore: zod skill
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-07 11:31:34 -04:00
old4ever c2263602c4 chore: install openagent opencode
Signed-off-by: Dmytro Stanchiev <git@dmytros.dev>
2026-04-07 11:31:26 -04:00
old4ever b4c03ff25e style(ui): standardize UI component file formatting 2026-04-07 08:10:13 -04:00
old4ever fd5716f39e style(components): standardize main component file formatting 2026-04-07 08:10:05 -04:00
old4ever 954e73c007 style(app): standardize app page file formatting 2026-04-07 08:09:56 -04:00
old4ever 48ef4f60df style(api): standardize API route file formatting 2026-04-07 08:09:49 -04:00
old4ever e39ba6be97 style(lib): standardize utils file formatting 2026-04-07 08:09:43 -04:00
old4ever 3b7c246a47 style(lib): standardize rfc5545-types file formatting 2026-04-07 08:09:40 -04:00
old4ever 5be55cec7c style(lib): standardize events-db file formatting 2026-04-07 08:09:36 -04:00
old4ever dab77befc2 style(auth): standardize auth file formatting 2026-04-07 08:09:32 -04:00
old4ever 076cf8acd0 style(db): standardize database source file formatting 2026-04-07 08:09:26 -04:00
old4ever ae8d547486 style(public): standardize manifest.json formatting 2026-04-07 08:09:19 -04:00
old4ever 3d9e2452c4 style(db): standardize database migration file formatting 2026-04-07 08:09:15 -04:00
old4ever db9d6399dd style(config): standardize configuration file formatting 2026-04-07 08:09:09 -04:00
old4ever a897e8ead1 feat(lib): add OpenRouter client implementation 2026-04-07 08:08:58 -04:00
old4ever c3e3018018 feat(deps): add @openrouter/sdk dependency 2026-04-07 08:08:51 -04:00
old4ever be389c6cfa style(skills): standardize utility-types.ts formatting 2026-04-07 08:08:44 -04:00
old4ever ada8e03a04 chore(config): add OpenRouterTeam to skill selector repos 2026-04-07 08:08:36 -04:00
old4ever 956de68591 style(skills): standardize skill metadata JSON formatting 2026-04-07 08:08:28 -04:00
old4ever e25f917b9a chore(skills): add create-agent and typescript-sdk skills 2026-04-07 08:08:01 -04:00
old4ever 3fec791f28 Merge branch 'betterauth-migration' 2026-04-06 23:38:56 -04:00