UNPKG

@travelopia/react-components

Version:

Headless React components library focused on INP performance

1 lines 30.5 kB
{"version":3,"file":"index.mjs","sources":["../src/utils/performance.ts","../src/utils/useControllableState.ts","../src/utils/useId.ts","../src/components/TpAccordion/TpAccordionContext.tsx","../src/components/TpAccordion/TpAccordion.tsx","../node_modules/clsx/dist/clsx.mjs","../src/components/TpAccordion/TpAccordionItem.tsx","../src/components/TpAccordion/TpAccordionContent.tsx","../src/hooks/useCallbackWithYield.ts","../src/components/TpAccordion/TpAccordionTrigger.tsx","../src/components/TpModal/TpModalContext.tsx","../src/components/TpModal/TpModal.tsx","../src/components/TpModal/TpModalClose.tsx","../src/utils/useFocusTrap.ts","../src/components/TpModal/TpModalContent.tsx","../src/components/TpModal/TpModalDescription.tsx","../src/utils/useBodyScrollLock.ts","../src/components/TpModal/TpModalOverlay.tsx","../src/components/TpModal/TpModalTitle.tsx","../src/hooks/useStateWithYield.ts","../src/hooks/useTpAccordion.ts","../src/hooks/useTpModal.ts"],"sourcesContent":["/**\n * Break up heavy tasks and yield to main thread.\n *\n * @return {Promise<void>}\n */\nexport async function yieldToMainThread(): Promise<void> {\n // Use scheduler.yield() if available, otherwise fall back to setTimeout\n if (typeof window !== 'undefined' && window.scheduler?.yield) {\n await window.scheduler.yield()\n return\n }\n\n await new Promise<void>((resolve) => {\n setTimeout(resolve, 0)\n })\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { yieldToMainThread } from './performance'\n\ninterface UseControllableStateProps<T> {\n value?: T\n defaultValue?: T\n onChange?: (value: T) => void\n}\n\n/**\n * Custom hook to handle both controlled and uncontrolled state\n * with automatic yielding to the main thread before state updates.\n */\nexport function useControllableState<T>({\n value: controlledValue,\n defaultValue,\n onChange,\n}: UseControllableStateProps<T>): [T | undefined, (value: T) => Promise<void>] {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue)\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : uncontrolledValue\n const onChangeRef = useRef(onChange)\n\n useEffect(() => {\n onChangeRef.current = onChange\n })\n\n const setValue = useCallback(\n async (nextValue: T) => {\n await yieldToMainThread()\n if (!isControlled) {\n setUncontrolledValue(nextValue)\n }\n onChangeRef.current?.(nextValue)\n },\n [isControlled]\n )\n\n return [value, setValue]\n}\n","import { useId as useReactId } from 'react'\n\n/**\n * Generate a unique ID with an optional prefix\n */\nexport function useId(prefix?: string): string {\n const id = useReactId()\n return prefix ? `${prefix}-${id}` : id\n}\n","import { createContext, useContext } from 'react'\nimport type { TpAccordionContextValue } from './TpAccordion.types'\n\nexport const TpAccordionContext = createContext<TpAccordionContextValue | undefined>(undefined)\n\nexport function useTpAccordionContext() {\n const context = useContext(TpAccordionContext)\n\n if (!context) {\n throw new Error('TpAccordion compound components must be used within TpAccordion')\n }\n\n return context\n}\n","import { useCallback, useMemo } from 'react'\nimport { useControllableState } from '../../utils/useControllableState'\nimport { useId } from '../../utils/useId'\nimport type { TpAccordionProps } from './TpAccordion.types'\nimport { TpAccordionContext } from './TpAccordionContext'\n\nexport function TpAccordion({\n children,\n value: controlledValue,\n defaultValue = [],\n onValueChange,\n}: TpAccordionProps) {\n const [value, setValue] = useControllableState({\n value: controlledValue,\n defaultValue,\n onChange: onValueChange,\n })\n\n const baseId = useId('tpaccordion')\n\n const onItemToggle = useCallback(\n (itemValue: string) => {\n const currentValue = value ?? []\n const isOpen = currentValue.includes(itemValue)\n\n if (isOpen) {\n // Remove from array\n setValue(currentValue.filter((v) => v !== itemValue))\n } else {\n // Add to array\n setValue([...currentValue, itemValue])\n }\n },\n [value, setValue]\n )\n\n const getItemId = useCallback((itemValue: string) => `${baseId}-item-${itemValue}`, [baseId])\n\n const getContentId = useCallback(\n (itemValue: string) => `${baseId}-content-${itemValue}`,\n [baseId]\n )\n\n const getTriggerId = useCallback(\n (itemValue: string) => `${baseId}-trigger-${itemValue}`,\n [baseId]\n )\n\n const contextValue = useMemo(\n () => ({\n value: value ?? [],\n onItemToggle,\n getItemId,\n getContentId,\n getTriggerId,\n }),\n [value, onItemToggle, getItemId, getContentId, getTriggerId]\n )\n\n return <TpAccordionContext.Provider value={contextValue}>{children}</TpAccordionContext.Provider>\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import clsx from 'clsx'\nimport { createContext, useContext, useMemo } from 'react'\nimport styles from './TpAccordion.module.css'\nimport type { TpAccordionItemProps } from './TpAccordion.types'\nimport { useTpAccordionContext } from './TpAccordionContext'\n\ninterface TpAccordionItemContextValue {\n value: string\n isOpen: boolean\n}\n\nconst TpAccordionItemContext = createContext<TpAccordionItemContextValue | undefined>(undefined)\n\nexport function useTpAccordionItemContext() {\n const context = useContext(TpAccordionItemContext)\n\n if (!context) {\n throw new Error('TpAccordionItem compound components must be used within TpAccordionItem')\n }\n\n return context\n}\n\nexport function TpAccordionItem({ children, value, className, ...props }: TpAccordionItemProps) {\n const { value: openValues, getItemId } = useTpAccordionContext()\n const isOpen = openValues.includes(value)\n\n const contextValue = useMemo(\n () => ({\n value,\n isOpen,\n }),\n [value, isOpen]\n )\n\n return (\n <TpAccordionItemContext.Provider value={contextValue}>\n <div id={getItemId(value)} className={clsx(styles.item, className)} {...props}>\n {children}\n </div>\n </TpAccordionItemContext.Provider>\n )\n}\n","import clsx from 'clsx'\nimport styles from './TpAccordion.module.css'\nimport type { TpAccordionContentProps } from './TpAccordion.types'\nimport { useTpAccordionContext } from './TpAccordionContext'\nimport { useTpAccordionItemContext } from './TpAccordionItem'\n\nexport function TpAccordionContent({ children, className, ...props }: TpAccordionContentProps) {\n const { getContentId, getTriggerId } = useTpAccordionContext()\n const { value, isOpen } = useTpAccordionItemContext()\n\n return (\n <section\n id={getContentId(value)}\n aria-labelledby={getTriggerId(value)}\n className={clsx(styles.content, className)}\n data-state={isOpen ? 'open' : 'closed'}\n {...props}\n >\n <div className={styles.contentInner}>{children}</div>\n </section>\n )\n}\n","import { useCallback } from 'react'\nimport { yieldToMainThread } from '../utils/performance'\n\n/**\n * Hook that wraps useCallback with automatic yielding to the main thread.\n * Useful for event handlers and callbacks that need to improve INP.\n *\n * @example\n * const handleClick = useCallbackWithYield(() => {\n * setState(true)\n * }, [setState])\n */\nexport function useCallbackWithYield<E extends React.SyntheticEvent>(\n callback: (event: E) => void | Promise<void>,\n deps: React.DependencyList\n) {\n return useCallback(async (event: E) => {\n await yieldToMainThread()\n return callback(event)\n // biome-ignore lint/correctness/useExhaustiveDependencies: We intentionally forward the deps array from the caller; this hook abstracts useCallback.\n }, deps)\n}\n","import clsx from 'clsx'\nimport { useCallbackWithYield } from '../../hooks/useCallbackWithYield'\nimport styles from './TpAccordion.module.css'\nimport type { TpAccordionTriggerProps } from './TpAccordion.types'\nimport { useTpAccordionContext } from './TpAccordionContext'\nimport { useTpAccordionItemContext } from './TpAccordionItem'\n\nexport function TpAccordionTrigger({ children, className, ...props }: TpAccordionTriggerProps) {\n const { onItemToggle, getTriggerId, getContentId } = useTpAccordionContext()\n const { value, isOpen } = useTpAccordionItemContext()\n\n const handleClick = useCallbackWithYield(() => {\n onItemToggle(value)\n }, [onItemToggle, value])\n\n return (\n <button\n type=\"button\"\n id={getTriggerId(value)}\n aria-expanded={isOpen}\n aria-controls={getContentId(value)}\n className={clsx(styles.trigger, className)}\n onClick={handleClick}\n {...props}\n >\n {children}\n </button>\n )\n}\n","import { createContext, useContext } from 'react'\nimport type { TpModalContextValue } from './TpModal.types'\n\nexport const TpModalContext = createContext<TpModalContextValue | null>(null)\n\nexport function useTpModalContext() {\n const context = useContext(TpModalContext)\n if (!context) {\n throw new Error('TpModal components must be used within a TpModal')\n }\n return context\n}\n","import { useCallback, useMemo } from 'react'\nimport { useControllableState } from '../../utils/useControllableState'\nimport { useId } from '../../utils/useId'\nimport type { TpModalProps } from './TpModal.types'\nimport { TpModalContext } from './TpModalContext'\n\nexport function TpModal({\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n}: TpModalProps) {\n const [isOpen, setIsOpen] = useControllableState({\n value: controlledOpen,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n\n const titleId = useId('tpmodal-title')\n const descriptionId = useId('tpmodal-description')\n\n const open = useCallback(() => {\n setIsOpen(true)\n }, [setIsOpen])\n\n const close = useCallback(() => {\n setIsOpen(false)\n }, [setIsOpen])\n\n const contextValue = useMemo(\n () => ({\n isOpen: isOpen ?? false,\n open,\n close,\n titleId,\n descriptionId,\n }),\n [isOpen, open, close, titleId, descriptionId]\n )\n\n return <TpModalContext.Provider value={contextValue}>{children}</TpModalContext.Provider>\n}\n","import clsx from 'clsx'\nimport { useCallbackWithYield } from '../../hooks/useCallbackWithYield'\nimport styles from './TpModal.module.css'\nimport type { TpModalCloseProps } from './TpModal.types'\nimport { useTpModalContext } from './TpModalContext'\n\nexport function TpModalClose({\n children,\n className,\n onClick,\n 'aria-label': ariaLabel = 'Close modal',\n ...props\n}: TpModalCloseProps) {\n const { close } = useTpModalContext()\n\n const handleClick = useCallbackWithYield(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n close()\n onClick?.(event)\n },\n [close, onClick]\n )\n\n return (\n <button\n type=\"button\"\n className={clsx(styles.close, className)}\n onClick={handleClick}\n aria-label={ariaLabel}\n {...props}\n >\n {children}\n </button>\n )\n}\n","import { useEffect, useRef } from 'react'\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]',\n 'area[href]',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'button:not([disabled])',\n 'iframe',\n 'object',\n 'embed',\n '[contenteditable]',\n '[tabindex]:not([tabindex^=\"-\"])',\n]\n\n/**\n * Hook to trap focus within a container element\n */\nexport function useFocusTrap(isActive: boolean) {\n const containerRef = useRef<HTMLElement>(null)\n const previousActiveElement = useRef<HTMLElement | null>(null)\n\n useEffect(() => {\n if (!isActive) return\n\n const container = containerRef.current\n if (!container) return\n\n // Store the currently focused element\n previousActiveElement.current = document.activeElement as HTMLElement\n\n // Get all focusable elements\n const getFocusableElements = (): HTMLElement[] => {\n const elements = container.querySelectorAll<HTMLElement>(FOCUSABLE_ELEMENTS.join(','))\n return Array.from(elements)\n }\n\n // Focus the first element\n const focusableElements = getFocusableElements()\n if (focusableElements.length > 0) {\n focusableElements[0]?.focus()\n }\n\n // Handle tab key\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n\n const focusableElements = getFocusableElements()\n if (focusableElements.length === 0) return\n\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n if (!firstElement || !lastElement) return\n\n if (event.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n event.preventDefault()\n lastElement.focus()\n }\n } else if (document.activeElement === lastElement) {\n // Tab\n event.preventDefault()\n firstElement.focus()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n\n // Cleanup: restore focus\n return () => {\n document.removeEventListener('keydown', handleKeyDown)\n previousActiveElement.current?.focus()\n }\n }, [isActive])\n\n return containerRef\n}\n","import clsx from 'clsx'\nimport { useCallback, useEffect } from 'react'\nimport { useFocusTrap } from '../../utils/useFocusTrap'\nimport styles from './TpModal.module.css'\nimport type { TpModalContentProps } from './TpModal.types'\nimport { useTpModalContext } from './TpModalContext'\n\nexport function TpModalContent({ children, className, ...props }: TpModalContentProps) {\n const { isOpen, close, titleId, descriptionId } = useTpModalContext()\n const contentRef = useFocusTrap(isOpen)\n\n // Handle Escape key\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n close()\n }\n },\n [close]\n )\n\n useEffect(() => {\n if (!isOpen) return\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [isOpen, handleKeyDown])\n\n // Stop propagation to prevent overlay click\n const handleContentClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation()\n }\n\n if (!isOpen) return null\n\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: Keyboard events are handled via Escape key listener\n <div\n ref={contentRef as React.RefObject<HTMLDivElement>}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n className={clsx(styles.content, className)}\n onClick={handleContentClick}\n {...props}\n >\n {children}\n </div>\n )\n}\n","import clsx from 'clsx'\nimport styles from './TpModal.module.css'\nimport type { TpModalDescriptionProps } from './TpModal.types'\nimport { useTpModalContext } from './TpModalContext'\n\nexport function TpModalDescription({ children, className, ...props }: TpModalDescriptionProps) {\n const { descriptionId } = useTpModalContext()\n\n return (\n <div id={descriptionId} className={clsx(styles.description, className)} {...props}>\n {children}\n </div>\n )\n}\n","import { useEffect } from 'react'\n\n/**\n * Hook to lock body scroll when a modal is open\n */\nexport function useBodyScrollLock(isLocked: boolean) {\n useEffect(() => {\n if (!isLocked) return\n\n const originalOverflow = document.body.style.overflow\n const originalPaddingRight = document.body.style.paddingRight\n\n // Get scrollbar width\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n\n // Lock scroll\n document.body.style.overflow = 'hidden'\n\n // Add padding to prevent layout shift\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`\n }\n\n return () => {\n document.body.style.overflow = originalOverflow\n document.body.style.paddingRight = originalPaddingRight\n }\n }, [isLocked])\n}\n","import clsx from 'clsx'\nimport { createPortal } from 'react-dom'\nimport { useCallbackWithYield } from '../../hooks/useCallbackWithYield'\nimport { useBodyScrollLock } from '../../utils/useBodyScrollLock'\nimport styles from './TpModal.module.css'\nimport type { TpModalOverlayProps } from './TpModal.types'\nimport { useTpModalContext } from './TpModalContext'\n\nexport function TpModalOverlay({\n children,\n closeOnClick = true,\n className,\n onClick,\n ...props\n}: TpModalOverlayProps) {\n const { isOpen, close } = useTpModalContext()\n\n useBodyScrollLock(isOpen)\n\n const handleClick = useCallbackWithYield(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (closeOnClick) {\n close()\n }\n onClick?.(event)\n },\n [closeOnClick, close, onClick]\n )\n\n if (!isOpen) return null\n\n const overlay = (\n // biome-ignore lint/a11y/noStaticElementInteractions: Overlay is intentionally clickable for modal dismissal\n // biome-ignore lint/a11y/useKeyWithClickEvents: Escape key is handled in TpModalContent\n <div className={clsx(styles.overlay, className)} onClick={handleClick} {...props}>\n {children}\n </div>\n )\n\n // Always render to body via portal\n return createPortal(overlay, document.body)\n}\n","import clsx from 'clsx'\nimport styles from './TpModal.module.css'\nimport type { TpModalTitleProps } from './TpModal.types'\nimport { useTpModalContext } from './TpModalContext'\n\nexport function TpModalTitle({\n children,\n className,\n as: Component = 'h2',\n ...props\n}: TpModalTitleProps) {\n const { titleId } = useTpModalContext()\n\n return (\n <Component id={titleId} className={clsx(styles.title, className)} {...props}>\n {children}\n </Component>\n )\n}\n","import { useCallback, useState } from 'react'\nimport { yieldToMainThread } from '../utils/performance'\n\n/**\n * Hook that wraps useState with automatic yielding to the main thread.\n * The setter function will yield before updating state, improving INP.\n *\n * @example\n * const [isOpen, setIsOpen] = useStateWithYield(false)\n * // setIsOpen automatically yields before updating\n * <button onClick={() => setIsOpen(true)}>Open</button>\n */\nexport function useStateWithYield<T>(initialValue: T) {\n const [state, setState] = useState(initialValue)\n\n const setStateYielded = useCallback(async (value: T | ((prev: T) => T)) => {\n await yieldToMainThread()\n setState(value)\n }, [])\n\n return [state, setStateYielded] as const\n}\n","import { useCallback, useState } from 'react'\n\nexport interface UseTpAccordionReturn {\n value: string[]\n openItem: (itemValue: string) => void\n closeItem: (itemValue: string) => void\n toggleItem: (itemValue: string) => void\n openAll: (itemValues: string[]) => void\n closeAll: () => void\n}\n\n/**\n * Hook to manage accordion state\n * @param defaultValue - Initial open items (default: [])\n * @returns Object with value state and control functions\n */\nexport function useTpAccordion(defaultValue: string[] = []): UseTpAccordionReturn {\n const [value, setValue] = useState(defaultValue)\n\n const openItem = useCallback((itemValue: string) => {\n setValue((prev) => (prev.includes(itemValue) ? prev : [...prev, itemValue]))\n }, [])\n\n const closeItem = useCallback((itemValue: string) => {\n setValue((prev) => prev.filter((v) => v !== itemValue))\n }, [])\n\n const toggleItem = useCallback((itemValue: string) => {\n setValue((prev) =>\n prev.includes(itemValue) ? prev.filter((v) => v !== itemValue) : [...prev, itemValue]\n )\n }, [])\n\n const openAll = useCallback((itemValues: string[]) => {\n setValue(itemValues)\n }, [])\n\n const closeAll = useCallback(() => {\n setValue([])\n }, [])\n\n return {\n value,\n openItem,\n closeItem,\n toggleItem,\n openAll,\n closeAll,\n }\n}\n","import { useCallback, useState } from 'react'\n\nexport interface UseTpModalReturn {\n isOpen: boolean\n open: () => void\n close: () => void\n toggle: () => void\n}\n\n/**\n * Hook to manage modal state\n * @param defaultOpen - Initial open state (default: false)\n * @returns Object with isOpen state and control functions\n */\nexport function useTpModal(defaultOpen = false): UseTpModalReturn {\n const [isOpen, setIsOpen] = useState(defaultOpen)\n\n const open = useCallback(() => {\n setIsOpen(true)\n }, [])\n\n const close = useCallback(() => {\n setIsOpen(false)\n }, [])\n\n const toggle = useCallback(() => {\n setIsOpen((prev) => !prev)\n }, [])\n\n return {\n isOpen,\n open,\n close,\n toggle,\n }\n}\n"],"names":["useReactId","styles","close","focusableElements","overlay"],"mappings":"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","x_google_ignoreList":[5]}