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
Ilia Mashkov
458ee0e449
refactor: CardSidebar layout breakpoint md → lg for wider description area
2026-05-18 13:11:53 +03:00
Ilia Mashkov
979e2071d1
refactor: widen section and sidebar, plain period text, Badge xs size for stack
2026-05-18 13:07:01 +03:00
Ilia Mashkov
37098be3c8
feat: Badge size prop (sm/md) and use Badge in ExperienceCard
2026-05-18 13:02:07 +03:00
Ilia Mashkov
48a08ec3fb
feat: formatMonthYearRange — period now includes abbreviated month
2026-05-18 13:01:58 +03:00
Ilia Mashkov
1550989fd9
feat: CardSidebar layout component and ExperienceCard sidebar redesign
...
Sidebar: period badge, company, stack tags.
Main: role title and rich-text description.
2026-05-18 12:51:33 +03:00
Ilia Mashkov
782c619a91
feat: ExperienceCard stack field and Card subcomponent layout
2026-05-18 12:39:41 +03:00
Ilia Mashkov
543020f85c
feat: apply Fraunces font to ProjectCard title
2026-05-18 12:39:33 +03:00
Ilia Mashkov
e00c1460e1
refactor: responsive spacing on CardHeader and CardFooter
2026-05-18 12:39:20 +03:00
Ilia Mashkov
f874a943ff
fix: a11y — accessible label on SectionAccordion, opacity-60 on category headings
2026-05-18 12:39:07 +03:00
Ilia Mashkov
ff62cba5b1
feat: add line-height-relaxed token and text selection/focus-visible styles
2026-05-18 12:38:28 +03:00
Ilia Mashkov
f4986d6657
chore: split React import to satisfy linter in ViewTransitionWrapper
2026-05-18 12:38:17 +03:00
Ilia Mashkov
e3959c0e45
fix: add cursor-pointer to Button
2026-05-18 12:38:10 +03:00