i got these types in these files. If therea re any repeated types (different name but same/ similar content, as well as with optinal things), i want to centalise it into my types folder. because if i wanted to modify a type and that type is used/depended on other tinhs, it iwll make it hard to change. 'so here is a list of all types from each compoentn file. do let me know which should stay in their compoennt file and which should be moved to the types folder. 'List of types:
clients.tsx:
interface CompositeShowcaseProps {
  textSection: {
    title: string;
    paragraphs: string[];
    tagline?: string;
  };
  logos: { src: string; alt?: string }[];
  gallery: {
    title: string;
    slides: {
      imageUrl: string;
      heading: string;
      paragraph: string;
      alt?: string;
    }[];
  };
}

contactform.tsx:
interface ContactFormProps {
  title: string;
  tagline?: string;
  enquiryOptions: string[];
}

ExpandableBulletPoints.tsx:
interface TextSectionData {
  title: string;
  paragraphs: string[];
  tagline?: string;
}

interface CircleData {
  imageSrc?: string;
  alt?: string;
  text?: string;
}

interface ExpandableItem {
  bulletTitle: string;
  content: {
    sectionTitle: string;
    sections: TextSectionData[];
    circles?: CircleData[];
  };
}

Footer.tsx:
interface FooterProps {
  logoSrc: string;
  logoAlt?: string;
  bullets: string[];
}

ImageCaption.tsx:
interface ImageCaptionOverlayProps {
  heading: string;
  paragraph: string;
}

ImageGallery.tsx:
interface SlideData {
  imageUrl: string;
  heading: string;
  paragraph: string;
  alt?: string;
}

interface ImageGalleryProps {
  title: string;
  slides: SlideData[];
}

ImageParagraphGroup:

export interface SectionData {
  imageSrc: string;
  imageAlt: string;
  sectionTitle: string;
  paragraphs: readonly string[];
  imageOn: "left" | "right";
}

interface ImageParagraphGroupProps {
  title: string;
  sections: readonly SectionData[];
  taglineItems?: string[];
}

ImageParagraphSection:
interface ImageParagraphSectionProps {
  imageSrc: string;
  imageAlt?: string;
  sectionTitle: string;
  paragraphs: readonly string[]; // now an array
  imageOn: "left" | "right";
}

ImageWithTitle.tsx:
interface ImageWithTitleProps {
  title: string;
  imageUrl: string;
  alt?: string;
  width?: number; // in pixels
  height?: number; // in pixels
  rotationDegrees?: number; // e.g. 15
}

LogoTicker.tsx:
interface LogoTickerProps {
  logos: { src: string; alt?: string }[];
}

MapWithData.tsx:
interface MapWithDetailsSectionProps {
  coordinates: [number, number]; // [latitude, longitude]
  title: string;
  bulletpoints: string[];
  zoom?: number;
}

MultiText+circle.tsx:
interface TextSectionData {
  title: string;
  paragraphs: string[];
  tagline?: string;
}

interface CircleData {
  imageSrc?: string;
  alt?: string;
  text?: string;
}

interface MultiTextCircleSectionProps {
  sectionTitle?: string;
  sections: TextSectionData[];
  circles?: CircleData[]; // Optional now
}

OpenFreeMap.tsx:
interface OpenFreeMapProps {
  coordinates: [number, number]; // [lng, lat]
  zoom?: number;
  pitch?: number;
  bearing?: number;
}

StampRally.tsx:
interface StampRallyProps {
  textSection: {
    title: string;
    paragraphs: string[];
    tagline?: string;
  };
  imageWithTitle: {
    title: string;
    imageSrc: string;
    imageAlt?: string;
    imageWidth?: number;
    imageHeight?: number;
    rotate?: number;
  };
  logos: { src: string; alt?: string }[];
}

Text+Circles.tsx:
interface InfoSectionProps {
  title: string;
  paragraphs: string[];
  circles: {
    imageSrc?: string;
    alt?: string;
    text?: string;
  }[];
}

TextImageGallerySection.tsx:
interface ImageData {
  imageUrl: string;
  heading: string;
  paragraph: string;
  alt?: string;
}

interface TextImageGallerySectionProps {
  overallTitle: string;
  paragraphTitle?: string;
  paragraphText: string;
  imageSrc: string;
  imageAlt?: string;
  galleryTitle: string;
  images: ImageData[];
}

TextSection.tsx:
interface TextSectionProps {
  title: string;
  paragraphs: string[];
  tagline?: string; // Optional tagline
}

TitlePage.tsx:
interface Creator {
  name: string;
  url?: string;
}

interface TitlePageProps {
  title: string;
  creators: Creator[];
  motto: string;
  logos: { imageSrc: string; alt: string; url: string }[];
}

TitleSection.tsx:
interface Creator {
  name: string;
  url?: string;
}

interface TitleSectionProps {
  title: string;
  creators: Creator[];
  motto: string;
}

WhatWeDo.tsx:
interface TextSectionData {
  title: string;
  paragraphs: string[];
  tagline?: string;
}

interface SlideData {
  imageUrl: string;
  heading: string;
  paragraph: string;
  alt?: string;
}

interface CircleData {
  imageSrc?: string;
  alt?: string;
  text?: string;
}

interface ExpandableItem {
  bulletTitle: string;
  content: {
    sectionTitle: string;
    sections: TextSectionData[];
    circles?: CircleData[];
  };
}

interface ContentItem {
  gallery: {
    slides: SlideData[];
  };
  expandableItem: ExpandableItem;
}

interface ContentBlockGroupSectionProps {
  textSection: TextSectionData;
  items: ContentItem[];
}'
I already have 1 'export interface CircleItem {
  imageSrc?: string;
  alt?: string;
  text?: string;
  url?: string;
}
' in types/ui.ts. '