diff --git a/app/[[...slug]]/page.tsx b/app/[[...slug]]/page.tsx index 4fa0ef0..8bb725a 100644 --- a/app/[[...slug]]/page.tsx +++ b/app/[[...slug]]/page.tsx @@ -19,9 +19,9 @@ export async function generateStaticParams() { } } -type Props = { +export interface Props { params: Promise<{ slug?: string[] }>; -}; +} /** * Portfolio page — one route per section, sections list always visible. diff --git a/src/entities/experience/ui/ExperienceCard/ExperienceCard.tsx b/src/entities/experience/ui/ExperienceCard/ExperienceCard.tsx index 01d7afa..1208d4d 100644 --- a/src/entities/experience/ui/ExperienceCard/ExperienceCard.tsx +++ b/src/entities/experience/ui/ExperienceCard/ExperienceCard.tsx @@ -1,6 +1,6 @@ import { Badge, Card, CardSidebar, CardTitle, RichText } from '$shared/ui'; -type Props = { +export interface Props { /** * Job title */ @@ -25,7 +25,7 @@ type Props = { * Additional CSS classes forwarded to the card */ className?: string; -}; +} /** * Work experience card with sidebar layout. diff --git a/src/entities/project/ui/DetailedProjectCard/DetailedProjectCard.tsx b/src/entities/project/ui/DetailedProjectCard/DetailedProjectCard.tsx index f4365ef..fba5a5c 100644 --- a/src/entities/project/ui/DetailedProjectCard/DetailedProjectCard.tsx +++ b/src/entities/project/ui/DetailedProjectCard/DetailedProjectCard.tsx @@ -2,7 +2,7 @@ import Image from 'next/image'; import { Card, RichText } from '$shared/ui'; import { ProjectMetadata } from '../ProjectMetadata/ProjectMetadata'; -type Props = { +export interface Props { /** * Project name */ @@ -36,7 +36,7 @@ type Props = { * @default false */ reverse?: boolean; -}; +} /** * Full-width detailed project card with metadata sidebar. diff --git a/src/entities/project/ui/ProjectCard/ProjectCard.tsx b/src/entities/project/ui/ProjectCard/ProjectCard.tsx index f498486..6a1cd63 100644 --- a/src/entities/project/ui/ProjectCard/ProjectCard.tsx +++ b/src/entities/project/ui/ProjectCard/ProjectCard.tsx @@ -1,7 +1,7 @@ import { cn } from '$shared/lib'; import { Badge, Button, Card, CardSidebar, CardTitle, ImageLightbox, RichText } from '$shared/ui'; -type Props = { +export interface Props { /** * Project name */ @@ -32,7 +32,7 @@ type Props = { * @default false */ priority?: boolean; -}; +} /** * Project card with sidebar layout. diff --git a/src/entities/project/ui/ProjectMetadata/ProjectMetadata.tsx b/src/entities/project/ui/ProjectMetadata/ProjectMetadata.tsx index 9722b83..4cc58ec 100644 --- a/src/entities/project/ui/ProjectMetadata/ProjectMetadata.tsx +++ b/src/entities/project/ui/ProjectMetadata/ProjectMetadata.tsx @@ -1,6 +1,6 @@ import { cn } from '$shared/lib'; -type Props = { +export interface Props { /** * Project year */ @@ -17,7 +17,7 @@ type Props = { * Additional CSS classes */ className?: string; -}; +} /** * Sidebar metadata display for a project: year, role, and stack. diff --git a/src/shared/assets/icons/CloseIcon.tsx b/src/shared/assets/icons/CloseIcon.tsx index 722f9e5..6a5ca73 100644 --- a/src/shared/assets/icons/CloseIcon.tsx +++ b/src/shared/assets/icons/CloseIcon.tsx @@ -1,9 +1,9 @@ -type Props = { +export interface Props { /** * CSS classes on the svg element */ className?: string; -}; +} /** * Close / X icon (Lucide). diff --git a/src/shared/assets/icons/MagnifyIcon.tsx b/src/shared/assets/icons/MagnifyIcon.tsx index d6197cc..0491147 100644 --- a/src/shared/assets/icons/MagnifyIcon.tsx +++ b/src/shared/assets/icons/MagnifyIcon.tsx @@ -1,9 +1,9 @@ -type Props = { +export interface Props { /** * CSS classes on the svg element */ className?: string; -}; +} /** * Magnify / search icon (Lucide). diff --git a/src/shared/ui/ImageLightbox/ui/ImageLightbox.tsx b/src/shared/ui/ImageLightbox/ui/ImageLightbox.tsx index 358080e..02d9a38 100644 --- a/src/shared/ui/ImageLightbox/ui/ImageLightbox.tsx +++ b/src/shared/ui/ImageLightbox/ui/ImageLightbox.tsx @@ -7,7 +7,7 @@ import { cn } from '$shared/lib'; import { Button } from '$shared/ui/Button'; import { Modal, type ModalHandle } from '$shared/ui/Modal'; -type Props = { +export interface Props { /** * Image source URL */ @@ -33,7 +33,7 @@ type Props = { * @default '(min-width: 1024px) 56rem, 100vw' */ sizes?: string; -}; +} /** * Clickable image thumbnail that opens a fullscreen brutalist dialog on click. diff --git a/src/shared/ui/InlineSvg/ui/InlineSvg.tsx b/src/shared/ui/InlineSvg/ui/InlineSvg.tsx index 182dad4..a988764 100644 --- a/src/shared/ui/InlineSvg/ui/InlineSvg.tsx +++ b/src/shared/ui/InlineSvg/ui/InlineSvg.tsx @@ -1,7 +1,7 @@ import parse from 'html-react-parser'; import { cn } from '$shared/lib'; -type Props = { +export interface Props { /** * SVG markup string to inline as React elements */ @@ -10,7 +10,7 @@ type Props = { * Additional CSS classes on the wrapper span */ className?: string; -}; +} /** * Parses an SVG markup string into React elements. diff --git a/src/shared/ui/Modal/ui/Modal.tsx b/src/shared/ui/Modal/ui/Modal.tsx index 4ac1b68..8df4b2a 100644 --- a/src/shared/ui/Modal/ui/Modal.tsx +++ b/src/shared/ui/Modal/ui/Modal.tsx @@ -23,14 +23,14 @@ export type ModalHandle = { close: () => void; }; -type Props = DialogHTMLAttributes & { +export interface Props extends DialogHTMLAttributes { /** * Called when the user activates the backdrop (click or Enter/Space). * Replaces the default close — useful when the close path must be wrapped * (e.g. in a view transition). When omitted, the dialog closes itself. */ onBackdropClose?: () => void; -}; +} /** * Thin wrapper over native `` with `showModal()`. Locks body scroll diff --git a/src/shared/ui/RichText/ui/RichText.tsx b/src/shared/ui/RichText/ui/RichText.tsx index 36b88fb..5136c97 100644 --- a/src/shared/ui/RichText/ui/RichText.tsx +++ b/src/shared/ui/RichText/ui/RichText.tsx @@ -1,7 +1,7 @@ import parse from 'html-react-parser'; import { cn } from '$shared/lib'; -type Props = { +export interface Props { /** * HTML string from PocketBase rich-text editor */ @@ -10,7 +10,7 @@ type Props = { * Additional CSS classes merged onto the wrapper div */ className?: string; -}; +} /** * Renders a PocketBase rich-text HTML string as React elements. diff --git a/src/shared/ui/ViewTransitionWrapper/ui/ViewTransitionWrapper.tsx b/src/shared/ui/ViewTransitionWrapper/ui/ViewTransitionWrapper.tsx index 3aad3d4..b3c478f 100644 --- a/src/shared/ui/ViewTransitionWrapper/ui/ViewTransitionWrapper.tsx +++ b/src/shared/ui/ViewTransitionWrapper/ui/ViewTransitionWrapper.tsx @@ -6,7 +6,7 @@ import { Fragment, type ReactNode, ViewTransition as VT } from 'react'; */ const Transition = (VT ?? Fragment) as typeof VT; -type Props = { +export interface Props { /** * Maps to the view-transition-name CSS property */ @@ -15,7 +15,7 @@ type Props = { * Content to animate */ children: ReactNode; -}; +} /** * Wraps children in React's ViewTransition when available, diff --git a/src/widgets/SectionFactory/ui/SectionErrorBoundary/SectionErrorBoundary.tsx b/src/widgets/SectionFactory/ui/SectionErrorBoundary/SectionErrorBoundary.tsx index bf72206..1a5934a 100644 --- a/src/widgets/SectionFactory/ui/SectionErrorBoundary/SectionErrorBoundary.tsx +++ b/src/widgets/SectionFactory/ui/SectionErrorBoundary/SectionErrorBoundary.tsx @@ -3,12 +3,12 @@ import type { ErrorInfo, ReactNode } from 'react'; import { Component } from 'react'; -type Props = { +export interface Props { /** * Section content to render */ children: ReactNode; -}; +} type State = { /** diff --git a/src/widgets/SectionsAccordion/ui/SectionsAccordion/SectionsAccordion.tsx b/src/widgets/SectionsAccordion/ui/SectionsAccordion/SectionsAccordion.tsx index 6e8f74b..106523a 100644 --- a/src/widgets/SectionsAccordion/ui/SectionsAccordion/SectionsAccordion.tsx +++ b/src/widgets/SectionsAccordion/ui/SectionsAccordion/SectionsAccordion.tsx @@ -3,7 +3,7 @@ import { Children } from 'react'; import type { SectionRecord } from '$entities/Section'; import { SectionAccordion } from '$entities/Section'; -type Props = { +export interface Props { /** * Ordered section metadata — drives navigation labels and IDs */ @@ -17,7 +17,7 @@ type Props = { * Pre-rendered RSC content slots, one per section, matched by index */ children: ReactNode; -}; +} /** * Renders all portfolio sections as an accordion list.