Commit Graph

99 Commits

Author SHA1 Message Date
Ilia Mashkov e518fc46a9 feat: section body animation with blur-out, delayed enter, and animation tokens
Add animation tokens to :root (--ease-spring, --ease-decelerate,
--ease-default, --duration-fast/normal/slow/spring). Apply spring easing
to section title enter. Add separate section-body transition: fast
blur-out exit (100ms), clean slide-in enter (350ms) delayed by 200ms so
content appears after the title animation completes.
2026-05-13 09:39:47 +03:00
Ilia Mashkov 481dda3c95 fix: resolve inactive section title hover opacity conflict
hover:opacity-60 on Link and opacity-30/group-hover:opacity-50 on h2
were multiplying (0.6 × 0.5 = 0.30 = base), making hover invisible.
Removed opacity from Link, consolidated to h2 only: opacity-30 base,
group-hover:opacity-60 on hover.
2026-05-13 09:39:08 +03:00
Ilia Mashkov d28343e22c feat: section open/close animations via ViewTransition and @starting-style
Enable experimental.viewTransition in Next.js config. Wrap active section
in ViewTransitionWrapper so the browser cross-fades between sections on
navigation. Replace animate-fadeIn keyframe with @starting-style + CSS
transition for the initial render enter animation.
2026-05-12 16:10:50 +03:00
Ilia Mashkov 7cba3053f4 feat: ViewTransitionWrapper shared component with stable react-dom fallback
Wraps children in React's ViewTransition (canary API) when available,
falling back to Fragment in environments where ViewTransition is undefined
(test env, stable react-dom). Add react/canary to tsconfig types to
expose the ViewTransition component type.
2026-05-12 16:10:37 +03:00
Ilia Mashkov 0090718869 fix: add outline to primary and secondary button variants 2026-05-12 13:58:29 +03:00
Ilia Mashkov 301e7a2555 feat: RichText component for safe PocketBase HTML rendering
Add html-react-parser-backed RichText component that converts HTML
strings from PocketBase rich-text fields into React elements without
dangerouslySetInnerHTML. Replace raw <p> render in IntroSection and
BioSection, and drop the invalid slug filters those collections lacked.
2026-05-12 13:58:17 +03:00
Ilia Mashkov 0a99a37bca fix: remove underline from collapsed section title links
Global a { border-bottom } was leaking onto the inactive section
nav links. Override with border-b-0 hover:border-b-0.
2026-05-12 13:57:39 +03:00
Ilia Mashkov e8bf8b502e fix: align PocketBase type definitions with actual schema
Remove slug field from PageContentRecord (intro/bio collections have none).
Remove number field from SectionRecord (not stored in PocketBase); derive
zero-padded display number from the order field at render time.
2026-05-12 13:57:25 +03:00
Ilia Mashkov 30f8e4be95 design: two-color palette — rename all tokens to --cream / --blue
Replace ochre-clay, carbon-black, burnt-oxide, slate-indigo with clean
two-color system: --cream (#f4f0e8) and --blue (#041cf3). Update every
component, utility class, and test assertion.
2026-05-11 12:59:32 +03:00
Ilia Mashkov af165ec356 feat: MobileNav section items use Link, close menu on pathname change 2026-05-11 11:11:53 +03:00
Ilia Mashkov 1dfa9a62a2 design: update color palette from ochre-clay to white/blue scheme 2026-05-11 11:11:29 +03:00
Ilia Mashkov b4bda4b8f7 chore: biome format vitest config, add Props JSDoc to SidebarNav 2026-05-11 11:11:24 +03:00
Ilia Mashkov f9cdb06632 refactor: SidebarNav uses usePathname and Link instead of IntersectionObserver 2026-05-07 12:54:53 +03:00
Ilia Mashkov 9fa2156ee8 feat: SectionAccordion inactive state uses Link href instead of button onClick 2026-05-07 12:52:54 +03:00
Ilia Mashkov 1a413e3d04 feat: implement portfolio home page with split layout 2026-05-05 09:42:04 +03:00
Ilia Mashkov 24bf946cb0 refactor: SectionFactory static registry, remove dynamic imports 2026-05-05 09:41:56 +03:00
Ilia Mashkov 4219a7b4e7 fix: correct RSC error patterns and extract skills grouping to utility 2026-05-05 09:41:49 +03:00
Ilia Mashkov 4b18fc454e chore: add mock API route handlers and dev env config 2026-05-05 09:41:39 +03:00
Ilia Mashkov 41edc7edf7 refactor: reorganize shared/lib into per-function subfolders 2026-04-24 11:43:08 +03:00
Ilia Mashkov f3b4e1d064 refactor: extract contact links to shared config 2026-04-24 10:11:34 +03:00
Ilia Mashkov fce4672218 feat: add groupByKey utility 2026-04-24 09:34:27 +03:00
Ilia Mashkov d89dc2ee70 chore: add vitest/globals types, remove redundant vitest imports, fix pre-existing lint issues 2026-04-24 09:34:27 +03:00
Ilia Mashkov f0fccd55f1 fix: replace revalidate with cache force-cache for SSG compatibility 2026-04-24 09:34:27 +03:00
Ilia Mashkov 5dbf5e34c2 fix: mock next/font in tests and remove broken shared export 2026-04-23 21:01:46 +03:00
Ilia Mashkov 1d333fd945 chore: format codebase and move SectionAccordion to entities/Section 2026-04-23 20:52:43 +03:00
Ilia Mashkov 9c139adbf5 feat: define PocketBase types and fetch client 2026-04-23 20:35:46 +03:00
Ilia Mashkov 759f579695 fix: storybook font rendering and shared fonts module 2026-04-23 20:35:32 +03:00
Ilia Mashkov de03d21429 feat: add Storybook with component stories
Installs @storybook/nextjs-vite. Stories co-located with components,
grouped by layer (Shared/Entities/Widgets). Multi-variant cases use
render functions instead of one story per variant/size.
2026-04-19 09:19:17 +03:00
Ilia Mashkov a47341ffcb feat: add Navigation widget barrel export 2026-04-19 08:40:10 +03:00
Ilia Mashkov cfe50069b7 feat: add MobileNav, SidebarNav, and UtilityBar widgets
TDD implementation of three navigation widgets: mobile overlay toggle,
fixed sidebar with IntersectionObserver-driven active section tracking,
and utility bar with contact info and CV download action.
2026-04-19 08:40:08 +03:00
Ilia Mashkov 590147adb1 feat: add experience entity (ExperienceCard) and entities barrel export 2026-04-19 08:37:24 +03:00
Ilia Mashkov eeef679f69 feat: add project entity (ProjectMetadata, ProjectCard, DetailedProjectCard) 2026-04-19 08:37:21 +03:00
Ilia Mashkov 0fa66f275d feat: add shared/ui and shared barrel exports; add FSD path aliases to tsconfig 2026-04-19 08:34:38 +03:00
Ilia Mashkov ad188fcb21 feat: add TechStackBrick and TechStackGrid components to shared/ui 2026-04-19 08:27:56 +03:00
Ilia Mashkov faf6c574d1 feat: add SectionAccordion component to shared/ui 2026-04-19 08:27:08 +03:00
Ilia Mashkov d17104b294 feat: add Section and Container components to shared/ui 2026-04-19 08:26:26 +03:00
Ilia Mashkov 9c52889b72 fix: associate Input/Textarea labels and wire error aria-describedby
Uses useId() for stable IDs so label htmlFor matches input id,
and error spans are referenced via aria-describedby.
2026-04-19 08:25:07 +03:00
Ilia Mashkov dc3bedeeec feat: add Input and Textarea components to shared/ui 2026-04-19 08:20:29 +03:00
Ilia Mashkov 26860b27e5 feat: add Card component family to shared/ui 2026-04-19 08:19:58 +03:00
Ilia Mashkov 11e7aa9a96 feat: add Button component to shared/ui 2026-04-19 08:19:23 +03:00
Ilia Mashkov 169988906c refactor: rename shared/ui component dirs to PascalCase 2026-04-18 23:26:14 +03:00
Ilia Mashkov f95588381d fix: export BadgeVariant type from Badge public API 2026-04-18 15:54:45 +03:00
Ilia Mashkov bb9c91b4f8 feat: add Badge component to shared/ui 2026-04-18 15:53:01 +03:00
Ilia Mashkov db2d7b78dd fix: fix indentation, export ClassValue, add object-syntax test 2026-04-18 15:52:05 +03:00
Ilia Mashkov f4c95d5ea6 feat: add cn utility to shared/lib 2026-04-18 15:49:24 +03:00
Ilia Mashkov 38d7a59e1e fix: add h6 to heading selector and display:block to grain overlay 2026-04-18 15:48:29 +03:00
Ilia Mashkov 939884c95d fix: expose all semantic color tokens in @theme inline block 2026-04-18 15:46:40 +03:00
Ilia Mashkov 3a29b99ae8 feat: transfer brutalist design tokens and configure next/font 2026-04-18 15:45:55 +03:00
Ilia Mashkov 08071b3d27 chore: configure vitest with jsdom and layer aliases 2026-04-18 15:39:44 +03:00