Ilia Mashkov
bf36a40bb5
chore: swap the favicon
2026-05-21 16:57:30 +03:00
Ilia Mashkov
886cf4b5c4
feat: add spring slide animation for section content
2026-05-21 16:36:00 +03:00
Ilia Mashkov
fc588f9e66
feat: set page title and description
2026-05-21 16:01:42 +03:00
Ilia Mashkov
f08ee51332
chore: remove unused files
2026-05-21 15:58:48 +03:00
Ilia Mashkov
9ded41db3c
feat: set the favicon
2026-05-21 15:58:11 +03:00
Ilia Mashkov
0697e9ad72
feat: add error handling and tests for client.ts
2026-05-21 15:57:43 +03:00
Ilia Mashkov
caff3fe7e3
fix: align footer paddings with main ones
2026-05-21 15:55:47 +03:00
ilia
56f3f94e41
Merge pull request 'feat: add PBHttpError and try/catch in getFirstRecord' ( #6 ) from fix/get-first-record into main
...
Build and push / build (push) Successful in 3m35s
Reviewed-on: #6
2026-05-21 10:08:04 +00:00
Ilia Mashkov
9deefaf3fc
feat: add PBHttpError and try/catch in getFirstRecord
2026-05-21 13:05:31 +03:00
ilia
a54963091c
Merge pull request 'fix: require PB_URL in production, fall back to localhost in dev only' ( #5 ) from fix/pocketbase into main
...
Build and push / build (push) Failing after 1m10s
Reviewed-on: #5
2026-05-19 16:28:43 +00:00
Ilia Mashkov
6b15a0e658
fix: gracefully handle PocketBase unreachable during static generation
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-19 19:27:04 +03:00
Ilia Mashkov
93b8adf55d
fix: require PB_URL in production, fall back to localhost in dev only
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-19 19:26:58 +03:00
ilia
03a90e1cf0
Merge pull request 'fix: old palette purged from stories and stories purged from production build' ( #4 ) from fixes/storybook into main
...
Build and push / build (push) Failing after 1m14s
Reviewed-on: #4
2026-05-19 15:58:13 +00:00
Ilia Mashkov
06d69a860e
fix: add css and json to biome check, set yarn version in package.json
2026-05-19 18:57:16 +03:00
Ilia Mashkov
181cfdebdf
fix: old palette purged from stories and stories purged from production build
2026-05-19 18:50:45 +03:00
Ilia Mashkov
e0565d6ddc
fix: yarn instead of npm for dockerfile
Build and push / build (push) Failing after 2m17s
2026-05-19 18:37:58 +03:00
ilia
598d566487
Merge pull request 'feat: add route-level error page and per-section error boundary' ( #3 ) from feature/error-handling into main
...
Build and push / build (push) Failing after 22s
Reviewed-on: #3
2026-05-19 15:27:17 +00:00
Ilia Mashkov
dd9cc766d5
feat: add route-level error page and per-section error boundary
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-19 18:20:53 +03:00
ilia
d1b4452867
Merge pull request 'chore: add .dockerignore' ( #2 ) from fixes/responsive into main
...
Build and push / build (push) Failing after 4m25s
Reviewed-on: #2
2026-05-19 15:11:13 +00:00
Ilia Mashkov
d62c0ad501
chore: add Gitea Actions deploy workflow
2026-05-19 18:09:59 +03:00
Ilia Mashkov
cf2f1bc7f3
chore: unignore .gitea directory
2026-05-19 18:09:26 +03:00
Ilia Mashkov
7f6e6369ff
fix: reduce padding and spacing for mobile
...
Main: px-4 py-6 on mobile (was px-8 py-12). Section accordion:
mb/py on inactive links tightened to 1/1 on mobile, space-y-0
between sections. Active title text-xl on mobile to prevent
wrapping at ~400px, matches inactive title size.
2026-05-19 18:06:51 +03:00
Ilia Mashkov
d0f09f0dbd
feat: social links with inline SVG icons from CMS
...
SocialRecord gains icon field (SVG markup string). InlineSvg component
parses SVG string via html-react-parser. Footer renders icon on mobile
(sm:hidden label), label on sm+ (hidden icon). Email field refactored
from string to SocialRecord relation.
2026-05-19 18:06:20 +03:00
Ilia Mashkov
41af0b90a0
feat: add Link secondary variant with border-bottom at sm+
...
Secondary variant drops text-decoration, uses opacity-60/hover-100
and brutal-border-bottom at sm+ for use in icon+label links where
the underline should only appear alongside the label.
2026-05-19 18:06:10 +03:00
Ilia Mashkov
954b17d824
fix: reduce Button sm padding on mobile
2026-05-19 18:05:57 +03:00
Ilia Mashkov
906ec3b805
feat: fixed footer with responsive height tokens
...
Footer is fixed bottom-0 with h-footer (5rem mobile) / md:h-footer-wide
(4rem desktop). Body gets matching pb-footer/md:pb-footer-wide to
reserve space. Tokens registered in @theme inline as --spacing-footer*.
2026-05-19 18:05:46 +03:00
Ilia Mashkov
4d6d78a528
chore: add .dockerignore
2026-05-19 18:05:37 +03:00
Ilia Mashkov
f40e9f54a3
chore: add dockerfile
2026-05-19 09:55:12 +03:00
Ilia Mashkov
7829f81d1a
chore: add dockerfile
2026-05-19 09:46:35 +03:00
ilia
cd9da6dd26
Merge pull request 'fix: storybook font rendering and shared fonts module' ( #1 ) from feat/portfolio-setup into main
...
Reviewed-on: #1
2026-05-18 18:45:21 +00:00
Ilia Mashkov
d5ba77b4ce
feat: add poweredByHeader: false
2026-05-18 21:40:10 +03:00
Ilia Mashkov
5c00f8e8a0
feat: add /api/revalidate webhook for on-demand ISR
...
POST with x-revalidate-secret header and { tag } body calls
revalidateTag to purge a collection from the Next.js data cache.
Guarded by REVALIDATE_SECRET env var.
2026-05-18 21:34:51 +03:00
Ilia Mashkov
cb3bdce24a
feat: tag all PocketBase fetches for ISR cache invalidation
...
Each getCollection/getFirstRecord call now passes the collection name
as a cache tag so revalidateTag can target individual collections.
2026-05-18 21:34:43 +03:00
Ilia Mashkov
42ca683c65
feat: add tags/revalidate options to PocketBase fetch client
...
PB_URL falls back through PB_URL → NEXT_PUBLIC_PB_URL → localhost so
internal Docker hostname is used server-side without leaking into the
client bundle. cache: force-cache replaced with next: { tags, revalidate }
for ISR tag-based invalidation.
2026-05-18 21:34:34 +03:00
Ilia Mashkov
fea6682024
feat: switch to standalone output with PocketBase remotePatterns
...
Drops static export (STATIC_EXPORT env var) in favour of standalone
for ISR. Images remotePatterns reads PB_HOSTNAME/PB_PORT env vars so
Docker internal hostname works without hardcoding.
2026-05-18 21:34:25 +03:00
Ilia Mashkov
540df57f8d
feat: add 404 page with centered layout
...
not-found.tsx renders oversized Fraunces heading with a back link.
Body gets flex flex-col min-h-screen so main can flex-1 to fill
available height without pushing the footer off screen.
2026-05-18 20:46:22 +03:00
Ilia Mashkov
b88263a65a
fix: DetailedProjectCard — render description as RichText
2026-05-18 20:46:13 +03:00
Ilia Mashkov
06e39b58c6
refactor: ProjectsSection — use shared buildFileUrl, pass url prop, switch to stacked layout
2026-05-18 20:46:02 +03:00
Ilia Mashkov
ac9ee0eb4e
feat: ProjectCard — add url prop, RichText description, open link in new tab
2026-05-18 20:45:54 +03:00
Ilia Mashkov
2ae5ae3210
feat: wire Footer to PocketBase site_settings
...
Fetches CV file, email and social links via expand=contacts,contacts.socials.
CV rendered as polymorphic Button with download attr; socials and email
rendered as Link components.
2026-05-18 20:45:44 +03:00
Ilia Mashkov
f159c6e861
feat: add SocialRecord, ContactsRecord, SiteSettingsRecord API types
...
Models PocketBase relations: SiteSettings → contacts → ContactsRecord
→ socials[] → SocialRecord. expand fields typed as optional resolved
records for use with PocketBase expand query param.
2026-05-18 20:45:32 +03:00
Ilia Mashkov
b33b9f328c
feat: add Link shared component
...
Renders Next.js Link for internal routes, plain anchor with
target="_blank" rel="noopener noreferrer" when external prop is set.
2026-05-18 20:45:17 +03:00
Ilia Mashkov
c9631f9905
feat: add buildFileUrl utility with tests
...
Moved from ProjectsSection inline function to shared/lib/utils.
Accepts optional baseUrl for testability without env mocking.
2026-05-18 20:45:06 +03:00
Ilia Mashkov
ba7395cb32
feat: make Button polymorphic — renders <a> when href is provided
...
Discriminated union types (AsButton | AsAnchor), isAnchorProps type guard
eliminates all 'as' casts. as const satisfies for VARIANTS/SIZES lookup
tables. brutal-border replaces border-[3px] in ghost variant.
2026-05-18 20:44:50 +03:00
Ilia Mashkov
7e542597d0
feat: Footer widget with email link and CV download, added to root layout
2026-05-18 14:15:25 +03:00
Ilia Mashkov
0552a2a8e5
refactor: register text-section-title in @theme inline, use as plain utility class
2026-05-18 14:06:01 +03:00
Ilia Mashkov
d955aeb628
refactor: replace inline style with Tailwind class and font-wonk utility
2026-05-18 14:04:56 +03:00
Ilia Mashkov
b40ff4f588
fix: fluid section title with clamp() to prevent wrapping below 900px
2026-05-18 14:02:03 +03:00
Ilia Mashkov
531de6899e
refactor: ProjectCard sm button, left-border year matching ExperienceCard style
2026-05-18 13:20:47 +03:00
Ilia Mashkov
10034ec561
refactor: ProjectCard sidebar layout — year, tags, button in sidebar
2026-05-18 13:14:40 +03:00