diff --git a/CHANGELOG.md b/CHANGELOG.md index 7265893..a2b2ad1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.4.4] - 2026-08-12 + +### Fixed + +- `Breadcrumb` / `CookieConsent` `linkComponent` typing: `to` is required on the injected link props (and always passed when rendering links), so react-router `Link` is assignable without a host adapter. Exports: `BreadcrumbLinkComponent`, `CookieConsentLinkComponent`. + ## [0.4.3] - 2026-08-06 ### Added diff --git a/src/components/components/Breadcrumb/Breadcrumb.tsx b/src/components/components/Breadcrumb/Breadcrumb.tsx index 20a2205..b294d2b 100644 --- a/src/components/components/Breadcrumb/Breadcrumb.tsx +++ b/src/components/components/Breadcrumb/Breadcrumb.tsx @@ -14,12 +14,15 @@ export interface BreadcrumbItem { linkProps?: Record } -type BreadcrumbLinkComponent = ComponentType<{ +/** + * Injectable link surface for SPA routers. + * `to` is always provided when Breadcrumb renders a link, so react-router `Link` is assignable. + */ +export type BreadcrumbLinkComponent = ComponentType<{ + to: string href?: string - to?: string className?: string children?: ReactNode - [key: string]: unknown }> export interface BreadcrumbProps { @@ -89,10 +92,10 @@ const Breadcrumb: FC = ({ ) : null} - {isLink ? ( + {isLink && target ? ( diff --git a/src/components/components/Breadcrumb/index.ts b/src/components/components/Breadcrumb/index.ts index 457ce2d..0a84ee7 100644 --- a/src/components/components/Breadcrumb/index.ts +++ b/src/components/components/Breadcrumb/index.ts @@ -1,2 +1,6 @@ export { Breadcrumb } from './Breadcrumb' -export type { BreadcrumbProps, BreadcrumbItem } from './Breadcrumb' +export type { + BreadcrumbProps, + BreadcrumbItem, + BreadcrumbLinkComponent, +} from './Breadcrumb' diff --git a/src/components/components/CookieConsent/CookieConsent.tsx b/src/components/components/CookieConsent/CookieConsent.tsx index 179134e..00088b3 100644 --- a/src/components/components/CookieConsent/CookieConsent.tsx +++ b/src/components/components/CookieConsent/CookieConsent.tsx @@ -17,12 +17,15 @@ export interface CookieConsentLink { linkProps?: Record } -type ConsentLinkComponent = ComponentType<{ +/** + * Injectable link surface for SPA routers. + * `to` is always provided when CookieConsent renders a link, so react-router `Link` is assignable. + */ +export type CookieConsentLinkComponent = ComponentType<{ + to: string href?: string - to?: string className?: string children?: ReactNode - [key: string]: unknown }> export interface CookieConsentProps { @@ -33,13 +36,13 @@ export interface CookieConsentProps { cookieName?: string cookieDays?: number /** Host injects `Link` from react-router (or any anchor-like component). Defaults to ``. */ - linkComponent?: ConsentLinkComponent + linkComponent?: CookieConsentLinkComponent onAccept?: () => void onDismiss?: () => void className?: string } -const DefaultLink: ConsentLinkComponent = ({ +const DefaultLink: CookieConsentLinkComponent = ({ href, to, children, @@ -108,18 +111,24 @@ const CookieConsent: FC = ({ {message} {links.length > 0 ? (
    - {links.map((link, index) => ( -
  • - - {link.label} - -
  • - ))} + {links.map((link, index) => { + const target = link.to ?? link.href + if (!target) + return null + + return ( +
  • + + {link.label} + +
  • + ) + })}
) : null} diff --git a/src/components/components/CookieConsent/index.ts b/src/components/components/CookieConsent/index.ts index 61c5b0b..2023785 100644 --- a/src/components/components/CookieConsent/index.ts +++ b/src/components/components/CookieConsent/index.ts @@ -1,3 +1,7 @@ export { CookieConsent } from './CookieConsent' -export type { CookieConsentProps, CookieConsentLink } from './CookieConsent' +export type { + CookieConsentProps, + CookieConsentLink, + CookieConsentLinkComponent, +} from './CookieConsent' export { getCookie, setCookie } from './cookies' diff --git a/src/components/index.ts b/src/components/index.ts index d51b9a6..d721e26 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -4,7 +4,11 @@ export { SecretComponent } from './components/editors/SecretComponent' export type { SecretDataSource, SecretComponentProps } from './components/editors/SecretComponent' export { FormContainer, FormContent, FormFooter, FormHeader } from './components/FormLayout' export { Breadcrumb } from './components/Breadcrumb' -export type { BreadcrumbProps, BreadcrumbItem } from './components/Breadcrumb' +export type { + BreadcrumbProps, + BreadcrumbItem, + BreadcrumbLinkComponent, +} from './components/Breadcrumb' export { Offcanvas } from './components/Offcanvas' export { Modal, ConfirmDialog } from './components/Modal' export type { ModalProps, ModalSize, ConfirmDialogProps } from './components/Modal' @@ -22,7 +26,11 @@ export type { MasonryProps } from './components/Masonry' export { LightBox } from './components/LightBox' export type { LightBoxProps, LightBoxSlide } from './components/LightBox' export { CookieConsent, getCookie, setCookie } from './components/CookieConsent' -export type { CookieConsentProps, CookieConsentLink } from './components/CookieConsent' +export type { + CookieConsentProps, + CookieConsentLink, + CookieConsentLinkComponent, +} from './components/CookieConsent' export { WhatsAppButton, buildWhatsAppHref, diff --git a/src/package.json b/src/package.json index b242d64..5591822 100644 --- a/src/package.json +++ b/src/package.json @@ -1,6 +1,6 @@ { "name": "@maks-it.com/webui", - "version": "0.4.3", + "version": "0.4.4", "description": "Shared contracts, utilities, and React components for MaksIT WebUI apps", "type": "module", "main": "./dist/index.cjs",