@entro314labs/react-arc-tabs 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +215 -0
- package/dist/ArcTabs.css +268 -0
- package/dist/index.cjs +1028 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +70 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.js +990 -0
- package/dist/index.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ArcTabs.tsx","../src/ArcTabsTailwind.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nexport type ArcTabItem = {\n id: string;\n label: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n icon?: React.ReactNode;\n badge?: React.ReactNode;\n};\n\nexport type ArcTabsActivationMode = \"automatic\" | \"manual\";\nexport type ArcTabsSize = \"sm\" | \"md\" | \"lg\";\nexport type ArcTabsFit = \"content\" | \"equal\";\nexport type ArcTabsMotionPreset = \"none\" | \"subtle\" | \"expressive\";\n\nexport type ArcTabsRenderState = {\n index: number;\n selected: boolean;\n disabled: boolean;\n};\n\ntype CSSVarStyle = React.CSSProperties & Record<`--${string}`, string | number>;\n\nexport interface ArcTabsProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n items: ArcTabItem[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string, item: ArcTabItem, index: number) => void;\n activationMode?: ArcTabsActivationMode;\n keepMounted?: boolean;\n size?: ArcTabsSize;\n fit?: ArcTabsFit;\n motionPreset?: ArcTabsMotionPreset;\n motionDuration?: number;\n ariaLabel?: string;\n listId?: string;\n tabsClassName?: string;\n panelClassName?: string;\n radius?: number;\n gap?: number;\n panelPadding?: number | string;\n accentColor?: string;\n tabBackground?: string;\n tabHoverBackground?: string;\n panelBackground?: string;\n panelBorderColor?: string;\n emptyState?: React.ReactNode;\n renderTabLabel?: (\n item: ArcTabItem,\n state: ArcTabsRenderState\n ) => React.ReactNode;\n renderPanel?: (item: ArcTabItem, state: ArcTabsRenderState) => React.ReactNode;\n}\n\nconst joinClassNames = (...parts: Array<string | undefined | false | null>) =>\n parts.filter(Boolean).join(\" \");\n\nconst toCssSize = (value: number | string | undefined) =>\n typeof value === \"number\" ? `${value}px` : value;\n\nconst findFirstEnabledIndex = (items: ArcTabItem[]) =>\n items.findIndex((item) => !item.disabled);\n\nconst getEnabledIndices = (items: ArcTabItem[]) =>\n items.reduce<number[]>((acc, item, index) => {\n if (!item.disabled) acc.push(index);\n return acc;\n }, []);\n\nconst getNextEnabledIndex = (\n enabledIndices: number[],\n currentIndex: number,\n direction: 1 | -1\n) => {\n if (!enabledIndices.length) return -1;\n\n const currentPosition = enabledIndices.indexOf(currentIndex);\n if (currentPosition === -1) {\n return direction === 1\n ? (enabledIndices[0] ?? -1)\n : (enabledIndices[enabledIndices.length - 1] ?? -1);\n }\n\n const nextPosition =\n (currentPosition + direction + enabledIndices.length) % enabledIndices.length;\n return enabledIndices[nextPosition] ?? -1;\n};\n\nexport function ArcTabs({\n items,\n value,\n defaultValue,\n onValueChange,\n activationMode = \"automatic\",\n keepMounted = true,\n size = \"md\",\n fit = \"content\",\n motionPreset = \"subtle\",\n motionDuration = 260,\n ariaLabel = \"Tabs\",\n listId,\n tabsClassName,\n panelClassName,\n radius,\n gap,\n panelPadding,\n accentColor,\n tabBackground,\n tabHoverBackground,\n panelBackground,\n panelBorderColor,\n emptyState = null,\n renderTabLabel,\n renderPanel,\n className,\n style,\n ...rest\n}: ArcTabsProps) {\n const reactId = React.useId();\n const baseId = React.useMemo(\n () => (listId ?? `arc-tabs-${reactId}`).replace(/:/g, \"\"),\n [listId, reactId]\n );\n\n const isControlled = value !== undefined;\n\n const firstEnabledIndex = React.useMemo(\n () => findFirstEnabledIndex(items),\n [items]\n );\n\n const [uncontrolledValue, setUncontrolledValue] = React.useState<\n string | undefined\n >(() => {\n const requested = defaultValue;\n const requestedMatch = items.find(\n (item) => !item.disabled && item.id === requested\n );\n if (requestedMatch) return requestedMatch.id;\n return firstEnabledIndex >= 0 ? items[firstEnabledIndex]?.id : undefined;\n });\n\n const rawValue = isControlled ? value : uncontrolledValue;\n\n const strictSelectedIndex = React.useMemo(\n () => items.findIndex((item) => !item.disabled && item.id === rawValue),\n [items, rawValue]\n );\n\n const selectedIndex =\n strictSelectedIndex >= 0 ? strictSelectedIndex : firstEnabledIndex;\n\n const selectedItem = selectedIndex >= 0 ? items[selectedIndex] : undefined;\n\n React.useEffect(() => {\n if (isControlled) return;\n if (strictSelectedIndex !== -1) return;\n\n if (firstEnabledIndex !== -1) {\n const fallbackId = items[firstEnabledIndex]?.id;\n setUncontrolledValue(fallbackId);\n } else {\n setUncontrolledValue(undefined);\n }\n }, [isControlled, strictSelectedIndex, firstEnabledIndex, items]);\n\n const [focusedIndex, setFocusedIndex] = React.useState<number>(selectedIndex);\n\n React.useEffect(() => {\n if (selectedIndex === -1) {\n setFocusedIndex(-1);\n return;\n }\n\n if (\n focusedIndex < 0 ||\n focusedIndex >= items.length ||\n items[focusedIndex]?.disabled\n ) {\n setFocusedIndex(selectedIndex);\n }\n }, [focusedIndex, selectedIndex, items]);\n\n const enabledIndices = React.useMemo(() => getEnabledIndices(items), [items]);\n\n const tabRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n const listRef = React.useRef<HTMLUListElement | null>(null);\n const activePanelRef = React.useRef<HTMLElement | null>(null);\n const hasMountedRef = React.useRef(false);\n const previousSelectedIndexRef = React.useRef(selectedIndex);\n\n const [hasInteracted, setHasInteracted] = React.useState(false);\n const [panelDirection, setPanelDirection] = React.useState<\n \"forward\" | \"backward\" | \"none\"\n >(\"none\");\n const [indicator, setIndicator] = React.useState({\n x: 0,\n width: 0,\n ready: false\n });\n\n const effectiveMotionDuration =\n motionPreset === \"none\" ? 0 : Math.max(0, motionDuration);\n const showSlidingIndicator =\n motionPreset === \"expressive\" && selectedIndex >= 0;\n\n React.useEffect(() => {\n tabRefs.current = tabRefs.current.slice(0, items.length);\n }, [items.length]);\n\n React.useEffect(() => {\n const previous = previousSelectedIndexRef.current;\n\n if (!hasMountedRef.current) {\n hasMountedRef.current = true;\n previousSelectedIndexRef.current = selectedIndex;\n return;\n }\n\n if (previous !== selectedIndex) {\n setHasInteracted(true);\n\n if (selectedIndex >= 0 && previous >= 0) {\n setPanelDirection(selectedIndex > previous ? \"forward\" : \"backward\");\n }\n }\n\n previousSelectedIndexRef.current = selectedIndex;\n }, [selectedIndex]);\n\n const focusTabIndex = React.useCallback((index: number) => {\n if (index < 0) return;\n setFocusedIndex(index);\n tabRefs.current[index]?.focus();\n }, []);\n\n const selectTab = React.useCallback(\n (index: number) => {\n const item = items[index];\n if (!item || item.disabled) return;\n if (index === selectedIndex) {\n setFocusedIndex(index);\n return;\n }\n\n setHasInteracted(true);\n if (selectedIndex >= 0) {\n setPanelDirection(index > selectedIndex ? \"forward\" : \"backward\");\n }\n\n if (!isControlled) {\n setUncontrolledValue(item.id);\n }\n\n setFocusedIndex(index);\n onValueChange?.(item.id, item, index);\n },\n [items, selectedIndex, isControlled, onValueChange]\n );\n\n const syncIndicator = React.useCallback(() => {\n if (!showSlidingIndicator) {\n setIndicator((previous) =>\n previous.ready || previous.width !== 0 || previous.x !== 0\n ? { x: 0, width: 0, ready: false }\n : previous\n );\n return;\n }\n\n const listElement = listRef.current;\n const selectedTab =\n selectedIndex >= 0 ? tabRefs.current[selectedIndex] ?? null : null;\n\n if (!listElement || !selectedTab) return;\n\n const listRect = listElement.getBoundingClientRect();\n const tabRect = selectedTab.getBoundingClientRect();\n const nextX = tabRect.left - listRect.left + listElement.scrollLeft;\n const nextWidth = tabRect.width;\n\n setIndicator((previous) => {\n const changedX = Math.abs(previous.x - nextX) > 0.5;\n const changedWidth = Math.abs(previous.width - nextWidth) > 0.5;\n if (!changedX && !changedWidth && previous.ready) {\n return previous;\n }\n\n return {\n x: nextX,\n width: nextWidth,\n ready: true\n };\n });\n }, [selectedIndex, showSlidingIndicator]);\n\n React.useEffect(() => {\n syncIndicator();\n }, [syncIndicator, items.length, size, fit]);\n\n React.useEffect(() => {\n if (!showSlidingIndicator) return;\n\n const listElement = listRef.current;\n if (!listElement) return;\n\n const onResize = () => syncIndicator();\n const onScroll = () => syncIndicator();\n\n const frame = requestAnimationFrame(syncIndicator);\n\n let observer: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(() => syncIndicator());\n observer.observe(listElement);\n tabRefs.current.forEach((tabElement) => {\n if (tabElement) observer?.observe(tabElement);\n });\n }\n\n listElement.addEventListener(\"scroll\", onScroll, { passive: true });\n window.addEventListener(\"resize\", onResize);\n\n return () => {\n cancelAnimationFrame(frame);\n listElement.removeEventListener(\"scroll\", onScroll);\n window.removeEventListener(\"resize\", onResize);\n observer?.disconnect();\n };\n }, [showSlidingIndicator, syncIndicator, items.length]);\n\n React.useEffect(() => {\n if (!hasInteracted || motionPreset === \"none\" || effectiveMotionDuration <= 0) {\n return;\n }\n\n const panelElement = activePanelRef.current;\n if (!panelElement || typeof panelElement.animate !== \"function\") {\n return;\n }\n\n if (\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches\n ) {\n return;\n }\n\n const offsetX =\n motionPreset === \"expressive\"\n ? panelDirection === \"forward\"\n ? 20\n : panelDirection === \"backward\"\n ? -20\n : 0\n : 0;\n\n const offsetY = motionPreset === \"expressive\" ? 10 : 6;\n const startScale = motionPreset === \"expressive\" ? 0.985 : 0.995;\n\n const animation = panelElement.animate(\n [\n {\n opacity: 0,\n transform: `translate3d(${offsetX}px, ${offsetY}px, 0) scale(${startScale})`,\n filter: \"blur(1px)\"\n },\n {\n opacity: 1,\n transform: \"translate3d(0, 0, 0) scale(1)\",\n filter: \"blur(0px)\"\n }\n ],\n {\n duration: effectiveMotionDuration,\n easing: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n fill: \"both\"\n }\n );\n\n return () => {\n animation.cancel();\n };\n }, [\n selectedIndex,\n hasInteracted,\n motionPreset,\n panelDirection,\n effectiveMotionDuration\n ]);\n\n const handleTabKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n if (!enabledIndices.length) return;\n\n switch (event.key) {\n case \"ArrowRight\": {\n event.preventDefault();\n const next = getNextEnabledIndex(enabledIndices, index, 1);\n if (next !== -1) {\n focusTabIndex(next);\n if (activationMode === \"automatic\") selectTab(next);\n }\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n const previous = getNextEnabledIndex(enabledIndices, index, -1);\n if (previous !== -1) {\n focusTabIndex(previous);\n if (activationMode === \"automatic\") selectTab(previous);\n }\n break;\n }\n case \"Home\": {\n event.preventDefault();\n const first = enabledIndices[0];\n if (first !== undefined) {\n focusTabIndex(first);\n if (activationMode === \"automatic\") selectTab(first);\n }\n break;\n }\n case \"End\": {\n event.preventDefault();\n const last = enabledIndices[enabledIndices.length - 1];\n if (last !== undefined) {\n focusTabIndex(last);\n if (activationMode === \"automatic\") selectTab(last);\n }\n break;\n }\n case \"Enter\":\n case \" \":\n case \"Spacebar\": {\n if (activationMode === \"manual\") {\n event.preventDefault();\n selectTab(index);\n }\n break;\n }\n default:\n break;\n }\n },\n [activationMode, enabledIndices, focusTabIndex, selectTab]\n );\n\n const themedStyle = React.useMemo<React.CSSProperties>(() => {\n const cssVars: CSSVarStyle = { ...style };\n\n if (radius !== undefined) {\n cssVars[\"--arc-radius\"] = `${radius}px`;\n }\n if (gap !== undefined) {\n cssVars[\"--arc-gap\"] = `${gap}px`;\n }\n\n const panelPaddingValue = toCssSize(panelPadding);\n if (panelPaddingValue !== undefined) {\n cssVars[\"--arc-panel-padding\"] = panelPaddingValue;\n }\n if (accentColor) {\n cssVars[\"--arc-accent\"] = accentColor;\n }\n if (tabBackground) {\n cssVars[\"--arc-tab-bg\"] = tabBackground;\n }\n if (tabHoverBackground) {\n cssVars[\"--arc-tab-hover-bg\"] = tabHoverBackground;\n }\n if (panelBackground) {\n cssVars[\"--arc-panel-bg\"] = panelBackground;\n }\n if (panelBorderColor) {\n cssVars[\"--arc-panel-border\"] = panelBorderColor;\n }\n cssVars[\"--arc-motion-duration\"] = `${effectiveMotionDuration}ms`;\n\n return cssVars;\n }, [\n style,\n radius,\n gap,\n panelPadding,\n accentColor,\n tabBackground,\n tabHoverBackground,\n panelBackground,\n panelBorderColor,\n effectiveMotionDuration\n ]);\n\n const rootClassName = joinClassNames(\n \"arc-tabs\",\n `arc-tabs--size-${size}`,\n `arc-tabs--fit-${fit}`,\n `arc-tabs--motion-${motionPreset}`,\n hasInteracted && \"arc-tabs--has-interacted\",\n panelDirection !== \"none\" && `arc-tabs--direction-${panelDirection}`,\n className\n );\n\n const indicatorStyle = React.useMemo<CSSVarStyle>(\n () => ({\n \"--arc-indicator-x\": `${indicator.x}px`,\n \"--arc-indicator-w\": `${indicator.width}px`\n }),\n [indicator.x, indicator.width]\n );\n\n const renderDefaultLabel = (item: ArcTabItem) => (\n <>\n {item.icon ? <span className=\"arc-tabs__icon\">{item.icon}</span> : null}\n <span className=\"arc-tabs__text\">{item.label}</span>\n {item.badge !== undefined ? (\n <span className=\"arc-tabs__badge\">{item.badge}</span>\n ) : null}\n </>\n );\n\n const renderPanelContent = (item: ArcTabItem, state: ArcTabsRenderState) =>\n renderPanel ? renderPanel(item, state) : item.content;\n\n return (\n <div className={rootClassName} style={themedStyle} {...rest}>\n <ul\n ref={listRef}\n className={joinClassNames(\"arc-tabs__list\", tabsClassName)}\n role=\"tablist\"\n aria-label={ariaLabel}\n id={`${baseId}-list`}\n >\n {showSlidingIndicator ? (\n <li\n aria-hidden=\"true\"\n role=\"presentation\"\n className={joinClassNames(\n \"arc-tabs__active-indicator\",\n indicator.ready && \"is-ready\"\n )}\n style={indicatorStyle}\n />\n ) : null}\n\n {items.map((item, index) => {\n const selected = index === selectedIndex;\n const disabled = Boolean(item.disabled);\n const tabId = `${baseId}-tab-${index}`;\n const panelId = `${baseId}-panel-${index}`;\n const state: ArcTabsRenderState = { index, selected, disabled };\n\n const tabIndexValue = disabled\n ? -1\n : focusedIndex === index || (focusedIndex === -1 && selected)\n ? 0\n : -1;\n\n return (\n <li className=\"arc-tabs__item\" key={item.id} role=\"presentation\">\n <button\n id={tabId}\n ref={(node) => {\n tabRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n aria-controls={panelId}\n tabIndex={tabIndexValue}\n disabled={disabled}\n className=\"arc-tabs__tab\"\n onFocus={() => setFocusedIndex(index)}\n onClick={() => selectTab(index)}\n onKeyDown={(event) => handleTabKeyDown(event, index)}\n >\n {renderTabLabel ? renderTabLabel(item, state) : renderDefaultLabel(item)}\n </button>\n </li>\n );\n })}\n </ul>\n\n <div className={joinClassNames(\"arc-tabs__panels\", panelClassName)}>\n {items.length === 0 && emptyState}\n\n {items.length > 0 && selectedItem === undefined && emptyState}\n\n {items.length > 0 && selectedItem !== undefined && keepMounted\n ? items.map((item, index) => {\n const selected = index === selectedIndex;\n const disabled = Boolean(item.disabled);\n const tabId = `${baseId}-tab-${index}`;\n const panelId = `${baseId}-panel-${index}`;\n const state: ArcTabsRenderState = { index, selected, disabled };\n\n return (\n <section\n key={item.id}\n ref={(node) => {\n if (selected) {\n activePanelRef.current = node;\n }\n }}\n id={panelId}\n className=\"arc-tabs__panel\"\n role=\"tabpanel\"\n aria-labelledby={tabId}\n aria-hidden={!selected}\n hidden={!selected}\n >\n {renderPanelContent(item, state)}\n </section>\n );\n })\n : null}\n\n {items.length > 0 && selectedItem !== undefined && !keepMounted ? (\n <section\n ref={(node) => {\n activePanelRef.current = node;\n }}\n id={`${baseId}-panel-${selectedIndex}`}\n className=\"arc-tabs__panel\"\n role=\"tabpanel\"\n aria-labelledby={`${baseId}-tab-${selectedIndex}`}\n aria-hidden={false}\n >\n {renderPanelContent(selectedItem, {\n index: selectedIndex,\n selected: true,\n disabled: Boolean(selectedItem.disabled)\n })}\n </section>\n ) : null}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type {\n ArcTabItem,\n ArcTabsProps,\n ArcTabsRenderState,\n ArcTabsSize\n} from \"./ArcTabs\";\n\ntype CSSVarStyle = React.CSSProperties & Record<`--${string}`, string | number>;\n\nexport type ArcTabsTailwindClassNames = {\n root?: string;\n list?: string;\n indicator?: string;\n item?: string;\n tab?: string;\n tabSelected?: string;\n tabUnselected?: string;\n tabDisabled?: string;\n icon?: string;\n text?: string;\n badge?: string;\n panels?: string;\n panel?: string;\n};\n\nexport interface ArcTabsTailwindProps extends ArcTabsProps {\n classNames?: ArcTabsTailwindClassNames;\n}\n\nconst joinClassNames = (...parts: Array<string | undefined | false | null>) =>\n parts.filter(Boolean).join(\" \");\n\nconst toCssSize = (value: number | string | undefined) =>\n typeof value === \"number\" ? `${value}px` : value;\n\nconst findFirstEnabledIndex = (items: ArcTabItem[]) =>\n items.findIndex((item) => !item.disabled);\n\nconst getEnabledIndices = (items: ArcTabItem[]) =>\n items.reduce<number[]>((acc, item, index) => {\n if (!item.disabled) acc.push(index);\n return acc;\n }, []);\n\nconst getNextEnabledIndex = (\n enabledIndices: number[],\n currentIndex: number,\n direction: 1 | -1\n) => {\n if (!enabledIndices.length) return -1;\n\n const currentPosition = enabledIndices.indexOf(currentIndex);\n if (currentPosition === -1) {\n return direction === 1\n ? (enabledIndices[0] ?? -1)\n : (enabledIndices[enabledIndices.length - 1] ?? -1);\n }\n\n const nextPosition =\n (currentPosition + direction + enabledIndices.length) % enabledIndices.length;\n return enabledIndices[nextPosition] ?? -1;\n};\n\nconst sizeClassMap: Record<ArcTabsSize, string> = {\n sm: \"min-h-9 px-3 py-1.5 text-sm\",\n md: \"min-h-10 px-4 py-2 text-[0.95rem]\",\n lg: \"min-h-12 px-5 py-2.5 text-base\"\n};\n\nexport function ArcTabsTailwind({\n items,\n value,\n defaultValue,\n onValueChange,\n activationMode = \"automatic\",\n keepMounted = true,\n size = \"md\",\n fit = \"content\",\n motionPreset = \"subtle\",\n motionDuration = 260,\n ariaLabel = \"Tabs\",\n listId,\n tabsClassName,\n panelClassName,\n radius,\n gap,\n panelPadding,\n accentColor,\n tabBackground,\n tabHoverBackground,\n panelBackground,\n panelBorderColor,\n emptyState = null,\n renderTabLabel,\n renderPanel,\n className,\n style,\n classNames,\n ...rest\n}: ArcTabsTailwindProps) {\n const reactId = React.useId();\n const baseId = React.useMemo(\n () => (listId ?? `arc-tabs-${reactId}`).replace(/:/g, \"\"),\n [listId, reactId]\n );\n\n const isControlled = value !== undefined;\n\n const firstEnabledIndex = React.useMemo(\n () => findFirstEnabledIndex(items),\n [items]\n );\n\n const [uncontrolledValue, setUncontrolledValue] = React.useState<\n string | undefined\n >(() => {\n const requested = defaultValue;\n const requestedMatch = items.find(\n (item) => !item.disabled && item.id === requested\n );\n if (requestedMatch) return requestedMatch.id;\n return firstEnabledIndex >= 0 ? items[firstEnabledIndex]?.id : undefined;\n });\n\n const rawValue = isControlled ? value : uncontrolledValue;\n\n const strictSelectedIndex = React.useMemo(\n () => items.findIndex((item) => !item.disabled && item.id === rawValue),\n [items, rawValue]\n );\n\n const selectedIndex =\n strictSelectedIndex >= 0 ? strictSelectedIndex : firstEnabledIndex;\n\n const selectedItem = selectedIndex >= 0 ? items[selectedIndex] : undefined;\n\n React.useEffect(() => {\n if (isControlled) return;\n if (strictSelectedIndex !== -1) return;\n\n if (firstEnabledIndex !== -1) {\n const fallbackId = items[firstEnabledIndex]?.id;\n setUncontrolledValue(fallbackId);\n } else {\n setUncontrolledValue(undefined);\n }\n }, [isControlled, strictSelectedIndex, firstEnabledIndex, items]);\n\n const [focusedIndex, setFocusedIndex] = React.useState<number>(selectedIndex);\n\n React.useEffect(() => {\n if (selectedIndex === -1) {\n setFocusedIndex(-1);\n return;\n }\n\n if (\n focusedIndex < 0 ||\n focusedIndex >= items.length ||\n items[focusedIndex]?.disabled\n ) {\n setFocusedIndex(selectedIndex);\n }\n }, [focusedIndex, selectedIndex, items]);\n\n const enabledIndices = React.useMemo(() => getEnabledIndices(items), [items]);\n\n const tabRefs = React.useRef<Array<HTMLButtonElement | null>>([]);\n const listRef = React.useRef<HTMLUListElement | null>(null);\n const activePanelRef = React.useRef<HTMLElement | null>(null);\n const hasMountedRef = React.useRef(false);\n const previousSelectedIndexRef = React.useRef(selectedIndex);\n\n const [hasInteracted, setHasInteracted] = React.useState(false);\n const [panelDirection, setPanelDirection] = React.useState<\n \"forward\" | \"backward\" | \"none\"\n >(\"none\");\n const [indicator, setIndicator] = React.useState({\n x: 0,\n width: 0,\n ready: false\n });\n\n const effectiveMotionDuration =\n motionPreset === \"none\" ? 0 : Math.max(0, motionDuration);\n const showSlidingIndicator =\n motionPreset === \"expressive\" && selectedIndex >= 0;\n\n React.useEffect(() => {\n tabRefs.current = tabRefs.current.slice(0, items.length);\n }, [items.length]);\n\n React.useEffect(() => {\n const previous = previousSelectedIndexRef.current;\n\n if (!hasMountedRef.current) {\n hasMountedRef.current = true;\n previousSelectedIndexRef.current = selectedIndex;\n return;\n }\n\n if (previous !== selectedIndex) {\n setHasInteracted(true);\n\n if (selectedIndex >= 0 && previous >= 0) {\n setPanelDirection(selectedIndex > previous ? \"forward\" : \"backward\");\n }\n }\n\n previousSelectedIndexRef.current = selectedIndex;\n }, [selectedIndex]);\n\n const focusTabIndex = React.useCallback((index: number) => {\n if (index < 0) return;\n setFocusedIndex(index);\n tabRefs.current[index]?.focus();\n }, []);\n\n const selectTab = React.useCallback(\n (index: number) => {\n const item = items[index];\n if (!item || item.disabled) return;\n if (index === selectedIndex) {\n setFocusedIndex(index);\n return;\n }\n\n setHasInteracted(true);\n if (selectedIndex >= 0) {\n setPanelDirection(index > selectedIndex ? \"forward\" : \"backward\");\n }\n\n if (!isControlled) {\n setUncontrolledValue(item.id);\n }\n\n setFocusedIndex(index);\n onValueChange?.(item.id, item, index);\n },\n [items, selectedIndex, isControlled, onValueChange]\n );\n\n const syncIndicator = React.useCallback(() => {\n if (!showSlidingIndicator) {\n setIndicator((previous) =>\n previous.ready || previous.width !== 0 || previous.x !== 0\n ? { x: 0, width: 0, ready: false }\n : previous\n );\n return;\n }\n\n const listElement = listRef.current;\n const selectedTab =\n selectedIndex >= 0 ? tabRefs.current[selectedIndex] ?? null : null;\n\n if (!listElement || !selectedTab) return;\n\n const listRect = listElement.getBoundingClientRect();\n const tabRect = selectedTab.getBoundingClientRect();\n const nextX = tabRect.left - listRect.left + listElement.scrollLeft;\n const nextWidth = tabRect.width;\n\n setIndicator((previous) => {\n const changedX = Math.abs(previous.x - nextX) > 0.5;\n const changedWidth = Math.abs(previous.width - nextWidth) > 0.5;\n if (!changedX && !changedWidth && previous.ready) {\n return previous;\n }\n\n return {\n x: nextX,\n width: nextWidth,\n ready: true\n };\n });\n }, [selectedIndex, showSlidingIndicator]);\n\n React.useEffect(() => {\n syncIndicator();\n }, [syncIndicator, items.length, size, fit]);\n\n React.useEffect(() => {\n if (!showSlidingIndicator) return;\n\n const listElement = listRef.current;\n if (!listElement) return;\n\n const onResize = () => syncIndicator();\n const onScroll = () => syncIndicator();\n\n const frame = requestAnimationFrame(syncIndicator);\n\n let observer: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n observer = new ResizeObserver(() => syncIndicator());\n observer.observe(listElement);\n tabRefs.current.forEach((tabElement) => {\n if (tabElement) observer?.observe(tabElement);\n });\n }\n\n listElement.addEventListener(\"scroll\", onScroll, { passive: true });\n window.addEventListener(\"resize\", onResize);\n\n return () => {\n cancelAnimationFrame(frame);\n listElement.removeEventListener(\"scroll\", onScroll);\n window.removeEventListener(\"resize\", onResize);\n observer?.disconnect();\n };\n }, [showSlidingIndicator, syncIndicator, items.length]);\n\n React.useEffect(() => {\n if (!hasInteracted || motionPreset === \"none\" || effectiveMotionDuration <= 0) {\n return;\n }\n\n const panelElement = activePanelRef.current;\n if (!panelElement || typeof panelElement.animate !== \"function\") {\n return;\n }\n\n if (\n typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches\n ) {\n return;\n }\n\n const offsetX =\n motionPreset === \"expressive\"\n ? panelDirection === \"forward\"\n ? 20\n : panelDirection === \"backward\"\n ? -20\n : 0\n : 0;\n\n const offsetY = motionPreset === \"expressive\" ? 10 : 6;\n const startScale = motionPreset === \"expressive\" ? 0.985 : 0.995;\n\n const animation = panelElement.animate(\n [\n {\n opacity: 0,\n transform: `translate3d(${offsetX}px, ${offsetY}px, 0) scale(${startScale})`,\n filter: \"blur(1px)\"\n },\n {\n opacity: 1,\n transform: \"translate3d(0, 0, 0) scale(1)\",\n filter: \"blur(0px)\"\n }\n ],\n {\n duration: effectiveMotionDuration,\n easing: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n fill: \"both\"\n }\n );\n\n return () => {\n animation.cancel();\n };\n }, [\n selectedIndex,\n hasInteracted,\n motionPreset,\n panelDirection,\n effectiveMotionDuration\n ]);\n\n const handleTabKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n if (!enabledIndices.length) return;\n\n switch (event.key) {\n case \"ArrowRight\": {\n event.preventDefault();\n const next = getNextEnabledIndex(enabledIndices, index, 1);\n if (next !== -1) {\n focusTabIndex(next);\n if (activationMode === \"automatic\") selectTab(next);\n }\n break;\n }\n case \"ArrowLeft\": {\n event.preventDefault();\n const previous = getNextEnabledIndex(enabledIndices, index, -1);\n if (previous !== -1) {\n focusTabIndex(previous);\n if (activationMode === \"automatic\") selectTab(previous);\n }\n break;\n }\n case \"Home\": {\n event.preventDefault();\n const first = enabledIndices[0];\n if (first !== undefined) {\n focusTabIndex(first);\n if (activationMode === \"automatic\") selectTab(first);\n }\n break;\n }\n case \"End\": {\n event.preventDefault();\n const last = enabledIndices[enabledIndices.length - 1];\n if (last !== undefined) {\n focusTabIndex(last);\n if (activationMode === \"automatic\") selectTab(last);\n }\n break;\n }\n case \"Enter\":\n case \" \":\n case \"Spacebar\": {\n if (activationMode === \"manual\") {\n event.preventDefault();\n selectTab(index);\n }\n break;\n }\n default:\n break;\n }\n },\n [activationMode, enabledIndices, focusTabIndex, selectTab]\n );\n\n const themedStyle = React.useMemo<React.CSSProperties>(() => {\n const cssVars: CSSVarStyle = { ...style };\n\n if (radius !== undefined) {\n cssVars[\"--arc-radius\"] = `${radius}px`;\n }\n if (gap !== undefined) {\n cssVars[\"--arc-gap\"] = `${gap}px`;\n }\n\n const panelPaddingValue = toCssSize(panelPadding);\n if (panelPaddingValue !== undefined) {\n cssVars[\"--arc-panel-padding\"] = panelPaddingValue;\n }\n if (accentColor) {\n cssVars[\"--arc-accent\"] = accentColor;\n }\n if (tabBackground) {\n cssVars[\"--arc-tab-bg\"] = tabBackground;\n }\n if (tabHoverBackground) {\n cssVars[\"--arc-tab-hover-bg\"] = tabHoverBackground;\n }\n if (panelBackground) {\n cssVars[\"--arc-panel-bg\"] = panelBackground;\n }\n if (panelBorderColor) {\n cssVars[\"--arc-panel-border\"] = panelBorderColor;\n }\n cssVars[\"--arc-motion-duration\"] = `${effectiveMotionDuration}ms`;\n\n return cssVars;\n }, [\n style,\n radius,\n gap,\n panelPadding,\n accentColor,\n tabBackground,\n tabHoverBackground,\n panelBackground,\n panelBorderColor,\n effectiveMotionDuration\n ]);\n\n const rootClassName = joinClassNames(\n \"arc-tabs-tw w-full text-[var(--arc-text)] [--arc-radius:14px] [--arc-gap:10px] [--arc-border-width:1px] [--arc-accent:#5b4ff1] [--arc-text:#171a2c] [--arc-tab-bg:#e7ebff] [--arc-tab-hover-bg:#dce3ff] [--arc-panel-bg:#ffffff] [--arc-panel-border:#cfd6f5] [--arc-panel-padding:1rem] [--arc-motion-duration:260ms] dark:[--arc-text:#edf1ff] dark:[--arc-tab-bg:#2c3555] dark:[--arc-tab-hover-bg:#374268] dark:[--arc-panel-bg:#1c243b] dark:[--arc-panel-border:#46527e]\",\n classNames?.root,\n className\n );\n\n const listClassName = joinClassNames(\n \"relative m-0 flex list-none items-end gap-[var(--arc-gap)] overflow-x-auto overflow-y-clip p-0 pb-[var(--arc-gap)] isolate\",\n classNames?.list,\n tabsClassName\n );\n\n const panelsClassName = joinClassNames(\n \"relative z-[2] mt-0 rounded-[var(--arc-radius)] border border-[var(--arc-panel-border)] bg-[var(--arc-panel-bg)] p-[var(--arc-panel-padding)] shadow-[0_12px_32px_rgba(15,23,42,0.12)]\",\n classNames?.panels,\n panelClassName\n );\n\n const renderDefaultLabel = (item: ArcTabItem) => (\n <>\n {item.icon ? (\n <span className={joinClassNames(\"inline-flex leading-none\", classNames?.icon)}>\n {item.icon}\n </span>\n ) : null}\n <span className={joinClassNames(\"inline-block\", classNames?.text)}>\n {item.label}\n </span>\n {item.badge !== undefined ? (\n <span\n className={joinClassNames(\n \"inline-flex min-w-5 items-center justify-center rounded-full bg-[var(--arc-accent)] px-1.5 py-0.5 text-[0.72em] font-bold text-white/95\",\n classNames?.badge\n )}\n >\n {item.badge}\n </span>\n ) : null}\n </>\n );\n\n const renderPanelContent = (item: ArcTabItem, state: ArcTabsRenderState) =>\n renderPanel ? renderPanel(item, state) : item.content;\n\n const indicatorStyle = React.useMemo<CSSVarStyle>(\n () => ({\n \"--arc-indicator-x\": `${indicator.x}px`,\n \"--arc-indicator-w\": `${indicator.width}px`\n }),\n [indicator.x, indicator.width]\n );\n\n const indicatorClassName = joinClassNames(\n \"pointer-events-none absolute left-0 top-0 z-[1] h-[calc(100%-var(--arc-gap))] w-[var(--arc-indicator-w)] translate-x-[var(--arc-indicator-x)] rounded-t-[var(--arc-radius)] rounded-b-none bg-[var(--arc-panel-bg)] opacity-0 [box-shadow:0_calc(var(--arc-gap)+var(--arc-border-width))_0_var(--arc-panel-bg)] transition-[transform,width,opacity] [transition-duration:var(--arc-motion-duration)] [transition-timing-function:cubic-bezier(0.22,1,0.36,1)]\",\n indicator.ready && \"opacity-100\",\n classNames?.indicator\n );\n\n return (\n <div className={rootClassName} style={themedStyle} data-slot=\"root\" {...rest}>\n <ul\n ref={listRef}\n className={listClassName}\n role=\"tablist\"\n aria-label={ariaLabel}\n id={`${baseId}-list`}\n data-slot=\"list\"\n >\n {showSlidingIndicator ? (\n <li\n aria-hidden=\"true\"\n role=\"presentation\"\n className={indicatorClassName}\n style={indicatorStyle}\n data-slot=\"indicator\"\n />\n ) : null}\n\n {items.map((item, index) => {\n const selected = index === selectedIndex;\n const disabled = Boolean(item.disabled);\n const tabId = `${baseId}-tab-${index}`;\n const panelId = `${baseId}-panel-${index}`;\n const state: ArcTabsRenderState = { index, selected, disabled };\n\n const tabIndexValue = disabled\n ? -1\n : focusedIndex === index || (focusedIndex === -1 && selected)\n ? 0\n : -1;\n\n const itemClassName = joinClassNames(\n fit === \"equal\" ? \"relative z-[2] min-w-0 flex-1\" : \"relative z-[2] shrink-0\",\n classNames?.item\n );\n\n const tabClassName = joinClassNames(\n \"relative inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--arc-radius)] border border-[var(--arc-panel-border)] bg-[var(--arc-tab-bg)] text-inherit font-semibold leading-none select-none transition-[background-color,color,transform,border-color,box-shadow] [transition-duration:var(--arc-motion-duration)] [transition-timing-function:cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--arc-accent)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--arc-panel-bg)] disabled:cursor-not-allowed disabled:opacity-45 before:pointer-events-none before:absolute before:bottom-0 before:left-[calc(var(--arc-border-width)*-1)] before:h-[calc(var(--arc-radius)*2)] before:w-[calc(var(--arc-radius)+var(--arc-border-width))] before:translate-y-[calc(var(--arc-gap)+var(--arc-border-width))] before:bg-transparent before:opacity-0 before:content-[''] before:[box-shadow:0_var(--arc-radius)_0_var(--arc-panel-bg)] before:transition-[opacity,transform] before:[transition-duration:var(--arc-motion-duration)] before:[transition-timing-function:cubic-bezier(0.22,1,0.36,1)] after:pointer-events-none after:absolute after:bottom-0 after:right-[calc(var(--arc-border-width)*-1)] after:h-[calc(var(--arc-radius)*2)] after:w-[calc(var(--arc-radius)+var(--arc-border-width))] after:translate-y-[calc(var(--arc-gap)+var(--arc-border-width))] after:bg-transparent after:opacity-0 after:content-[''] after:[box-shadow:0_var(--arc-radius)_0_var(--arc-panel-bg)] after:transition-[opacity,transform] after:[transition-duration:var(--arc-motion-duration)] after:[transition-timing-function:cubic-bezier(0.22,1,0.36,1)]\",\n sizeClassMap[size],\n fit === \"equal\" && \"w-full justify-center\",\n selected\n ? joinClassNames(\n \"z-[3] rounded-b-none border-[var(--arc-panel-bg)] text-[var(--arc-accent)] before:opacity-100 after:opacity-100 [box-shadow:0_calc(var(--arc-gap)+var(--arc-border-width))_0_var(--arc-panel-bg)]\",\n motionPreset === \"expressive\"\n ? \"bg-transparent\"\n : \"bg-[var(--arc-panel-bg)]\"\n )\n : \"enabled:hover:bg-[var(--arc-tab-hover-bg)] enabled:hover:translate-y-px enabled:active:translate-y-[2px]\",\n index > 0 &&\n \"before:-translate-x-full before:translate-y-[calc(var(--arc-gap)+var(--arc-border-width))] before:rounded-br-[var(--arc-radius)] before:[box-shadow:var(--arc-border-width)_var(--arc-radius)_0_var(--arc-panel-bg)]\",\n index < items.length - 1 &&\n \"after:translate-x-full after:translate-y-[calc(var(--arc-gap)+var(--arc-border-width))] after:rounded-bl-[var(--arc-radius)] after:[box-shadow:calc(var(--arc-border-width)*-1)_var(--arc-radius)_0_var(--arc-panel-bg)]\",\n selected ? classNames?.tabSelected : classNames?.tabUnselected,\n disabled && classNames?.tabDisabled,\n classNames?.tab\n );\n\n return (\n <li className={itemClassName} key={item.id} role=\"presentation\" data-slot=\"item\">\n <button\n id={tabId}\n ref={(node) => {\n tabRefs.current[index] = node;\n }}\n type=\"button\"\n role=\"tab\"\n aria-selected={selected}\n aria-controls={panelId}\n tabIndex={tabIndexValue}\n disabled={disabled}\n className={tabClassName}\n onFocus={() => setFocusedIndex(index)}\n onClick={() => selectTab(index)}\n onKeyDown={(event) => handleTabKeyDown(event, index)}\n data-slot=\"tab\"\n >\n {renderTabLabel ? renderTabLabel(item, state) : renderDefaultLabel(item)}\n </button>\n </li>\n );\n })}\n </ul>\n\n <div className={panelsClassName} data-slot=\"panels\">\n {items.length === 0 && emptyState}\n\n {items.length > 0 && selectedItem === undefined && emptyState}\n\n {items.length > 0 && selectedItem !== undefined && keepMounted\n ? items.map((item, index) => {\n const selected = index === selectedIndex;\n const disabled = Boolean(item.disabled);\n const tabId = `${baseId}-tab-${index}`;\n const panelId = `${baseId}-panel-${index}`;\n const state: ArcTabsRenderState = { index, selected, disabled };\n\n return (\n <section\n key={item.id}\n ref={(node) => {\n if (selected) {\n activePanelRef.current = node;\n }\n }}\n id={panelId}\n className={joinClassNames(\"outline-none\", classNames?.panel)}\n role=\"tabpanel\"\n aria-labelledby={tabId}\n aria-hidden={!selected}\n hidden={!selected}\n data-slot=\"panel\"\n >\n {renderPanelContent(item, state)}\n </section>\n );\n })\n : null}\n\n {items.length > 0 && selectedItem !== undefined && !keepMounted ? (\n <section\n ref={(node) => {\n activePanelRef.current = node;\n }}\n id={`${baseId}-panel-${selectedIndex}`}\n className={joinClassNames(\"outline-none\", classNames?.panel)}\n role=\"tabpanel\"\n aria-labelledby={`${baseId}-tab-${selectedIndex}`}\n aria-hidden={false}\n data-slot=\"panel\"\n >\n {renderPanelContent(selectedItem, {\n index: selectedIndex,\n selected: true,\n disabled: Boolean(selectedItem.disabled)\n })}\n </section>\n ) : null}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["React","Fragment","jsx","jsxs","joinClassNames","toCssSize","findFirstEnabledIndex","getEnabledIndices","getNextEnabledIndex"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@entro314labs/react-arc-tabs",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"public": true,
|
|
6
|
+
"description": "Reusable arc-style tabs component for React and Next.js projects",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": [
|
|
9
|
+
"**/*.css"
|
|
10
|
+
],
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"module": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"require": "./dist/index.cjs"
|
|
19
|
+
},
|
|
20
|
+
"./styles.css": "./dist/ArcTabs.css"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"peerDependencies": {
|
|
26
|
+
"react": "^19.0.0 || ^19.2.4",
|
|
27
|
+
"react-dom": "^19.0.0 || ^19.2.4"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/react": "^19.2.14",
|
|
31
|
+
"@types/react-dom": "^19.2.3",
|
|
32
|
+
"tsup": "^8.5.1",
|
|
33
|
+
"typescript": "beta"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && cp src/ArcTabs.css dist/ArcTabs.css",
|
|
37
|
+
"typecheck": "tsc --noEmit"
|
|
38
|
+
}
|
|
39
|
+
}
|