'use client' import classNames from 'classnames' import { forwardRef, HTMLAttributes, Ref, useEffect, useMemo, useRef, useState } from 'react' import type { TAriaLive, TProgressbarRole, TProgressbarSkin, TProgressbarStatusPlacement, TProgressbarStatusType, TProgressbarTitlePosition, } from 'shared-types' import { uuidish } from 'shared-utils/utils' export type { TProgressbarRole, TProgressbarSkin, TProgressbarStatusPlacement, TProgressbarStatusType, TProgressbarTitlePosition } export interface IPktProgressbar extends Omit, 'role' | 'title'> { ariaLabel?: string | null ariaLabelledby?: string | null ariaLive?: TAriaLive ariaValueText?: string | null id?: string role?: TProgressbarRole skin?: TProgressbarSkin statusPlacement?: TProgressbarStatusPlacement statusType?: TProgressbarStatusType title?: string | null titlePosition?: TProgressbarTitlePosition valueCurrent: number valueMax?: number valueMin?: number ref?: Ref } export const PktProgressbar = forwardRef( ( { ariaLabel, ariaLabelledby, ariaLive = 'polite', ariaValueText, id, role = 'progressbar', skin = 'dark-blue', statusPlacement = 'following', statusType = 'none', title, titlePosition = 'left', valueCurrent = 0, valueMax = 100, valueMin = 0, className, ...props }, ref, ) => { const generatedId = useMemo(() => uuidish(), []) const progressbarId = id || generatedId const labelRef = useRef(null) const [labelWidth, setLabelWidth] = useState(0) useEffect(() => { if (labelRef.current) { setLabelWidth(labelRef.current.getBoundingClientRect().width || 0) } }, [valueCurrent]) const totalSteps = valueMax - valueMin const currentPercentage = statusType === 'fraction' ? Math.round((valueCurrent / totalSteps) * 100) : Math.round(((valueCurrent - valueMin) / totalSteps) * 100) const formattedTitle = `${valueCurrent} av ${totalSteps}` const computedAriaValueText = statusType === 'fraction' && !ariaValueText ? `${valueCurrent} av ${valueMax - valueMin}` : ariaValueText || undefined const computedAriaLabelledby = !ariaLabel ? ariaLabelledby || `${progressbarId}-title` : undefined return (
{title && (

{title}

)}
{statusType !== 'none' && (
{statusType === 'percentage' ? `${currentPercentage}%` : formattedTitle}
)}
) }, ) PktProgressbar.displayName = 'PktProgressbar'