@lax-wp/design-system 0.13.46 → 0.13.48
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/dist/components/floating-bar/FloatingBar.cjs.js +1 -1
- package/dist/components/floating-bar/FloatingBar.cjs.js.map +1 -1
- package/dist/components/floating-bar/FloatingBar.es.js +12 -12
- package/dist/components/floating-bar/FloatingBar.es.js.map +1 -1
- package/dist/components/forms/checkbox/Checkbox.cjs.js +1 -1
- package/dist/components/forms/checkbox/Checkbox.cjs.js.map +1 -1
- package/dist/components/forms/checkbox/Checkbox.es.js +56 -52
- package/dist/components/forms/checkbox/Checkbox.es.js.map +1 -1
- package/dist/components/forms/date-range/DateRange.cjs.js +7 -7
- package/dist/components/forms/date-range/DateRange.cjs.js.map +1 -1
- package/dist/components/forms/date-range/DateRange.es.js +41 -40
- package/dist/components/forms/date-range/DateRange.es.js.map +1 -1
- package/dist/components/navigation/tabs/TabOptions.cjs.js +1 -1
- package/dist/components/navigation/tabs/TabOptions.cjs.js.map +1 -1
- package/dist/components/navigation/tabs/TabOptions.es.js +2 -2
- package/dist/components/navigation/tabs/TabOptions.es.js.map +1 -1
- package/dist/components/navigation/tabs/Tabs.cjs.js +1 -1
- package/dist/components/navigation/tabs/Tabs.cjs.js.map +1 -1
- package/dist/components/navigation/tabs/Tabs.es.js +66 -66
- package/dist/components/navigation/tabs/Tabs.es.js.map +1 -1
- package/dist/components/user-avatar/UserAvatar.cjs.js +1 -1
- package/dist/components/user-avatar/UserAvatar.cjs.js.map +1 -1
- package/dist/components/user-avatar/UserAvatar.es.js +1 -1
- package/dist/components/user-avatar/UserAvatar.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.es.js","sources":["../../../../src/components/navigation/tabs/Tabs.tsx"],"sourcesContent":["import {\n DndContext,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport type { DragEndEvent, DragOverEvent, DragStartEvent } from '@dnd-kit/core';\nimport { SortableContext, horizontalListSortingStrategy, arrayMove } from '@dnd-kit/sortable';\nimport { Dropdown } from 'antd';\nimport classNames from 'classnames';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport MoreHorizOutlinedIcon from '@mui/icons-material/MoreHorizOutlined';\n\nimport { DropableWrapper, MoreButton, SortableTab, TabDragOverlay, TabOptions, TabSwitch } from '.';\nimport type { SuffixRecord, Tab, TabOptionConfig, TabsProps } from './types';\nimport { INITIAL_TAB_OPTION_CONFIG } from './types';\n\nimport { formatCount } from '../../../utils/formatters';\n\nimport { useTabConfig } from '../../../providers/design-system-provider/hooks';\nimport { useTextWidth } from '../../../hooks/useTextWidth';\nimport IconButton from '../../button/IconButton';\nimport { OptionButton } from '../../buttons/option-button/OptionButton';\nimport { SearchBar } from '../../forms/search-bar/SearchBar';\nimport Tooltip from '../../tooltip/Tooltip';\nimport { EditIcon } from '../../icons/EditIcon';\nimport { toast } from 'react-toastify';\nimport { ArrowDownwardIcon, ArrowOutwardIcon, ArrowUpwardIcon, ContentCopyIcon, DeleteIcon, PinIcon, UnpinFilledIcon, VisibilityIcon, VisibilityOffIcon } from '../../icon';\n\nconst randomHex = () => Math.random().toString(16).slice(2, 13);\n\nconst TAB_MENU_CLASS = [\n '[&_.ant-dropdown-menu-item]:!outline-none',\n '[&_.ant-dropdown-menu-submenu-title]:!outline-none',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:dark:bg-black-600',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:dark:bg-black-600',\n].join(' ');\n\nlet dropdownTrigger: HTMLElement | null = null;\n\nconst handleDropdownOpen = (open: boolean) => {\n if (open) {\n dropdownTrigger = document.activeElement as HTMLElement;\n setTimeout(() => {\n const item = document.querySelector<HTMLElement>(\n '.row-option-cell .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled), .row-option-cell .ant-dropdown-menu-submenu-title',\n );\n item?.focus();\n }, 50);\n } else {\n setTimeout(() => {\n dropdownTrigger?.focus();\n dropdownTrigger = null;\n }, 0);\n }\n};\n\nconst ACTIONS = {\n SELECT: 'Select',\n MOVE_LEFT: 'MoveLeft',\n MOVE_RIGHT: 'MoveRight',\n HIDE: 'Hide',\n UNHIDE: 'Unhide',\n COPY_LINK: 'CopyLink',\n DELETE: 'Delete',\n PIN: 'Pin',\n UNPIN: 'Unpin',\n EDIT: 'Edit',\n} as const;\n\nexport const Tabs = <T extends string>({\n variant = 'default',\n tabs = [],\n activeTab,\n onTabClick,\n suffixRecord: suffixRecordProp,\n isLoading,\n size = 'md',\n className,\n draggable = false,\n showAllItems = false,\n copyLink = false,\n isDisabled = false,\n color = 'light',\n iconsOnly = false,\n tabIcons = {},\n height = 'h-6',\n fullWidth = false,\n fitContentWidth = false,\n disableAnimation = false,\n onEdit,\n onDelete,\n onCopyLink,\n allowPin = false,\n isFullWidth = false,\n rightSection,\n initialTabs: initialTabsProp,\n tabConfig: tabConfigProp,\n onTabConfigChange,\n onTabsChange,\n parentContainer = document.body,\n tabKey,\n linkConfig,\n showTabOptions = true,\n}: TabsProps<T>) => {\n // ── Provider integration ──\n const providerTabConfig = useTabConfig();\n const providerSettings = tabKey ? providerTabConfig?.getTabSettings(tabKey) : undefined;\n\n // Provider-sourced values are used only when the direct props are not passed\n const initialTabs = initialTabsProp ?? (providerSettings?.tab_items as Tab<T>[] | undefined);\n const tabConfig = tabConfigProp ?? providerSettings?.tab_options;\n // ── State ──\n const [search, setSearch] = useState('');\n const [showMoreDropdown, setShowMoreDropdown] = useState(false);\n const [visibleTabCounts, setVisibleTabCounts] = useState(0);\n const [allTabs, setAllTabs] = useState<Tab<T>[]>([]);\n const [sortedTabs, setSortedTabs] = useState<Tab<T>[]>([]);\n const [draggingOver, setDraggingOver] = useState<string | null>(null);\n const [draggingTab, setDraggingTab] = useState<string | null>(null);\n const [isHoveringTabOptions, setIsHoveringTabOptions] = useState(false);\n const [savedTabOptionConfig, setSavedTabOptionConfig] = useState<TabOptionConfig>(\n tabConfig ?? INITIAL_TAB_OPTION_CONFIG,\n );\n const [tabSearchFilter, setTabSearchFilter] = useState('');\n const [tabSearchFilterType, setTabSearchFilterType] = useState<'contains' | 'does-not-contain'>('contains');\n\n const { showCounts, lockOrder, sortOrder } = savedTabOptionConfig;\n\n // ── Refs & Hooks ──\n const { t } = useTranslation();\n const tabsRef = useRef<HTMLDivElement | null>(null);\n const ulRef = useRef<HTMLUListElement | null>(null);\n const visibleTabCountsRef = useRef(visibleTabCounts);\n const { measureText } = useTextWidth();\n const selectedId = useMemo(() => randomHex(), []);\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 5 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 300, tolerance: 5 } }),\n );\n\n // ── Derived values ──\n // Counts are formatted once here (1000 -> \"1,000\") so the rendered badges and\n // the overflow width measurement always agree.\n const suffixRecord = useMemo(() => {\n if (!suffixRecordProp) return suffixRecordProp;\n return Object.fromEntries(\n Object.entries(suffixRecordProp).map(([name, value]) => [\n name,\n formatCount(value as string | number),\n ]),\n ) as SuffixRecord<T>;\n }, [suffixRecordProp]);\n\n const visibleTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => !is_hidden), [sortedTabs]);\n const hiddenTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => is_hidden), [sortedTabs]);\n\n const filteredVisibleTabs = useMemo(\n () =>\n visibleTabs.filter(({ name }) => {\n if (!tabSearchFilter) return true;\n const tabName = (name ?? '').toLowerCase();\n const searchValue = tabSearchFilter.toLowerCase();\n return tabSearchFilterType === 'contains'\n ? tabName.includes(searchValue)\n : !tabName.includes(searchValue);\n }),\n [visibleTabs, tabSearchFilter, tabSearchFilterType],\n );\n\n const sortedVisibleTabs = useMemo(\n () =>\n [...filteredVisibleTabs].sort((a, b) => {\n if (a.is_pinned && !b.is_pinned) return -1;\n if (!a.is_pinned && b.is_pinned) return 1;\n return 0;\n }),\n [filteredVisibleTabs],\n );\n\n const isTabOverflow = visibleTabCounts < sortedVisibleTabs.length;\n const visibleTabSlice = showAllItems\n ? sortedVisibleTabs.length\n : isTabOverflow\n ? visibleTabCounts\n : sortedVisibleTabs.length;\n const isActiveTabInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= visibleTabSlice;\n const moreButtonTabCounts =\n allTabs.length - visibleTabSlice - (isActiveTabInsideMore ? 1 : 0);\n\n visibleTabCountsRef.current = visibleTabCounts;\n\n // ── Helpers ──\n const updateTabs = useCallback(\n (newTabs: Tab<T>[]) => {\n setAllTabs(newTabs);\n onTabsChange?.(newTabs);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_items: newTabs });\n }\n },\n [onTabsChange, tabKey, providerTabConfig],\n );\n\n const updateTabConfig = useCallback(\n (config: TabOptionConfig) => {\n setSavedTabOptionConfig(config);\n onTabConfigChange?.(config);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_options: config });\n }\n },\n [onTabConfigChange, tabKey, providerTabConfig],\n );\n\n const calculateIconWidth = (item: Tab<T>): number => (item.is_pinned ? 32 : 0);\n\n const calculateVisibleTabs = useCallback(\n (clientWidth: number) => {\n if (!clientWidth) return;\n const tabOptionsWidth = draggable ? 30 : 0;\n const moreWidth = showCounts ? 190 : 84;\n const tabGap = size === 'sm' ? 4 : 8;\n const basePadding = 32;\n let tabWidth = 0;\n let activeTabWidth = 0;\n let newVisibleTabCounts = 0;\n const availableWidth = clientWidth - (rightSection?.width || 0) - tabOptionsWidth;\n const currentCount = visibleTabCountsRef.current;\n const hasOverflow = currentCount < sortedVisibleTabs.length;\n const hasHidden = hiddenTabs.length > 0;\n\n for (let index = 0; index < sortedVisibleTabs.length; index++) {\n const item = sortedVisibleTabs[index];\n\n const suffixText = suffixRecord?.[item.name] ? String(suffixRecord?.[item.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n\n const tabTitleWidth = measureText(item?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n\n const iconWidth = allowPin ? calculateIconWidth(item) : 0;\n const currentTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n\n if (item.name === activeTab) {\n activeTabWidth = currentTabWidth;\n }\n\n tabWidth += currentTabWidth;\n\n if (\n availableWidth >\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0) + index * 25\n ) {\n newVisibleTabCounts = index + 1;\n } else {\n break;\n }\n }\n\n const remainingVisibleTabs = sortedVisibleTabs.length - newVisibleTabCounts;\n const totalRemainingTabs = remainingVisibleTabs + hiddenTabs.length;\n\n if (\n totalRemainingTabs === 1 &&\n hiddenTabs.length === 0 &&\n remainingVisibleTabs === 1 &&\n newVisibleTabCounts < sortedVisibleTabs.length\n ) {\n const lastTab = sortedVisibleTabs[newVisibleTabCounts];\n if (lastTab) {\n const suffixText = suffixRecord?.[lastTab.name] ? String(suffixRecord?.[lastTab.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n const tabTitleWidth = measureText(lastTab?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n const iconWidth = allowPin ? calculateIconWidth(lastTab) : 0;\n const lastTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n if (availableWidth >= tabWidth + lastTabWidth) {\n newVisibleTabCounts += 1;\n }\n }\n }\n\n const newVisibleSlice = showAllItems ? sortedVisibleTabs.length : newVisibleTabCounts;\n const activeInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= newVisibleSlice;\n\n if (activeInsideMore) {\n tabWidth += activeTabWidth;\n if (\n availableWidth <\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0)\n ) {\n newVisibleTabCounts = Math.max(newVisibleTabCounts - 1, 0);\n }\n }\n\n if (newVisibleTabCounts !== currentCount) {\n setVisibleTabCounts(newVisibleTabCounts);\n }\n },\n [\n sortedVisibleTabs,\n showCounts,\n showAllItems,\n allowPin,\n suffixRecord,\n rightSection?.width,\n activeTab,\n size,\n draggable,\n hiddenTabs.length,\n measureText,\n ],\n );\n\n // ── Search params helper (uses provider abstraction when available) ──\n const getCurrentSearchParams = useCallback(\n () => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n if (linkConfig && providerTabConfig?.getSearchParam) {\n const params = new URLSearchParams();\n const currentValue = providerTabConfig.getSearchParam(linkConfig.key);\n if (currentValue) params.set(linkConfig.key, currentValue);\n return params;\n }\n return new URLSearchParams();\n },\n [linkConfig, providerTabConfig],\n );\n\n const applyTabToSearchParams = useCallback(\n (params: URLSearchParams, tabName: string) => {\n if (!linkConfig) return params;\n if (tabName === linkConfig.defaultLink) {\n params.delete(linkConfig.key);\n } else {\n params.set(linkConfig.key, tabName);\n }\n linkConfig.onResolve?.(params);\n return params;\n },\n [linkConfig],\n );\n\n // ── Link href resolution ──\n const resolveTabHref = useCallback(\n (tabName: string): string | undefined => {\n if (!linkConfig) return undefined;\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n return `?${params.toString()}`;\n },\n [applyTabToSearchParams, getCurrentSearchParams, linkConfig],\n );\n\n // ── Copy link ──\n const showCopyLink = copyLink || Boolean(linkConfig);\n\n const handleCopyLink = useCallback(\n async (tabName: T) => {\n const search = resolveTabHref(tabName);\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n const pathname = typeof window !== 'undefined' ? window.location.pathname : '';\n const href = search\n ? `${origin}${pathname}${search}`\n : `${origin}${pathname}`;\n await navigator.clipboard.writeText(href);\n toast.success(t(\"Link copied to clipboard\"), {\n toastId: 'Link copied to clipboard',\n });\n onCopyLink?.(tabName, href);\n },\n [resolveTabHref, t, onCopyLink],\n );\n\n // ── Tab actions ──\n const handleSelectTab = (tabName: T) => {\n setShowMoreDropdown(false);\n onTabClick?.(tabName);\n if (linkConfig && providerTabConfig?.navigate) {\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n providerTabConfig.navigate(`?${params.toString()}`);\n }\n };\n\n const hideTab = (tabName: T) => {\n if (sortedVisibleTabs.length <= 1) return;\n\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: true } : item,\n );\n\n const visibleIndex = sortedVisibleTabs.findIndex((item) => item.name === tabName);\n const nextIndex = visibleIndex === 0 ? 1 : visibleIndex - 1;\n handleSelectTab(sortedVisibleTabs[nextIndex].name);\n\n updateTabs(_tabs);\n };\n\n const unhideTab = (tabName: T) => {\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: false } : item,\n );\n\n setShowMoreDropdown(false);\n updateTabs(_tabs);\n };\n\n const togglePinTab = (tabName: T) => {\n if (!allowPin) return;\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_pinned: !item.is_pinned } : item,\n );\n updateTabs(_tabs);\n };\n\n const moveTab = (tabName: T, direction: 'left' | 'right') => {\n const oldIndex = allTabs.findIndex(({ name }) => name === tabName);\n const newIndex =\n direction === 'left'\n ? oldIndex - (allTabs[oldIndex - 1]?.name === activeTab ? 2 : 1)\n : oldIndex + 1;\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n };\n\n const handleShowMoreDropdown = () => setShowMoreDropdown(!showMoreDropdown);\n\n // ── Drag handlers ──\n const handleDragStart = (event: DragStartEvent) => setDraggingTab(event.active.id as string);\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (over?.id === 'more-tabs') {\n hideTab(active.id as T);\n setDraggingTab(null);\n setDraggingOver(null);\n return;\n }\n const oldIndex = allTabs.findIndex(({ name }) => name === active.id);\n const newIndex = allTabs.findIndex(({ name }) => name === over?.id);\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragCancel = () => {\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragOver = (event: DragOverEvent) => {\n setDraggingOver(event.over?.id === 'more-tabs' ? 'more-tabs' : null);\n };\n\n const handleTabSort = () => {\n // Sorting is handled via sortedTabs effect — no direct allTabs mutation\n };\n\n const handleSearchFilterChange = (\n searchValue: string,\n filterType: 'contains' | 'does-not-contain',\n ) => {\n setTabSearchFilter(searchValue);\n setTabSearchFilterType(filterType);\n };\n\n // ── Tab context menu options ──\n const getTabOptions = (title: T, isHidden = false, isSoftHidden = false) => {\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = tab?.is_pinned;\n\n const options = [\n {\n label: (\n <OptionButton\n icon={<ArrowOutwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Select Tab\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.SELECT,\n onClick: () => handleSelectTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowUpwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Up\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_LEFT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'left'),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowDownwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Down\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_RIGHT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'right'),\n },\n {\n label: (\n <OptionButton\n icon={<ContentCopyIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Copy Link\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.COPY_LINK,\n onClick: () => handleCopyLink(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityOffIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Hide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.HIDE,\n onClick: () => hideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Unhide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.UNHIDE,\n onClick: () => unhideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={isPinned ? <UnpinFilledIcon size={20} className='rotate-12 text-inherit dark:text-inherit'/> : <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />}\n text={isPinned ? t(\"Unpin\") : t(\"Pin\")}\n className=\"text-black-900 dark:text-white\"\n notVisible={!allowPin}\n />\n ),\n key: isPinned ? ACTIONS.UNPIN : ACTIONS.PIN,\n onClick: () => togglePinTab(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-black-900 dark:text-white\"\n icon={<EditIcon />}\n text={t('Edit')}\n notVisible={!onEdit}\n />\n ),\n key: ACTIONS.EDIT,\n onClick: () => onEdit?.(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-error-600 dark:text-error-600\"\n icon={<DeleteIcon size={18} className='text-error-600 dark:text-error-600' />}\n text={t(\"Delete\")}\n notVisible={!onDelete}\n />\n ),\n key: ACTIONS.DELETE,\n onClick: () => onDelete?.(title),\n },\n ];\n\n const hiddenFilter: string[] = [ACTIONS.HIDE, ACTIONS.UNHIDE];\n const defaultFilter: string[] = [ACTIONS.SELECT, ACTIONS.MOVE_LEFT, ACTIONS.MOVE_RIGHT, ACTIONS.UNHIDE];\n\n return options\n .filter((item) =>\n isHidden\n ? item.key === ACTIONS.UNHIDE\n : isSoftHidden\n ? !hiddenFilter.includes(item.key)\n : !defaultFilter.includes(item.key),\n )\n .filter((item) => (showCopyLink ? true : item.key !== ACTIONS.COPY_LINK))\n .filter((item) => (sortedVisibleTabs.length === 1 ? item.key !== ACTIONS.HIDE : true));\n };\n\n // ── Class maps ──\n const getClasses = (\n classType: 'classValue' | 'selectedClassValue' | 'textClassValue',\n isSelected: boolean,\n ) => {\n const classes = {\n classValue: {\n default: classNames('relative inline-flex pt-2 pb-3 px-2 pl-3 sm:px-2 rounded-t-sm group'),\n secondary: classNames(\n 'flex w-full sm:w-auto relative rounded-lg font-sans font-semibold text-center cursor-pointer uppercase',\n size === 'sm' ? 'py-1 px-3 text-sm' : 'py-2 px-4 text-base',\n ),\n },\n selectedClassValue: {\n default: classNames('absolute left-0 bottom-0 w-full h-[3px] bg-primary-600'),\n secondary: classNames('absolute inset-0 bg-primary-50 dark:bg-primary-975 rounded-lg'),\n },\n textClassValue: {\n default: classNames(\n 'relative uppercase font-sans font-semibold text-sm whitespace-nowrap',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 hover:text-neutral-500 dark:text-neutral-100 dark:hover:text-white',\n ),\n secondary: classNames(\n 'relative whitespace-nowrap text-sm',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 dark:text-neutral-400',\n ),\n },\n };\n return classes[classType][variant as 'default' | 'secondary'];\n };\n\n // ── Effects ──\n // ResizeObserver for responsive overflow\n useEffect(() => {\n if (!tabsRef.current || variant === 'switch') return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const containerWidth = entries[0].contentRect.width;\n calculateVisibleTabs(containerWidth);\n });\n\n resizeObserver.observe(tabsRef.current);\n calculateVisibleTabs(tabsRef.current.clientWidth);\n\n return () => resizeObserver.disconnect();\n }, [calculateVisibleTabs, variant]);\n\n // Stable stringified keys to avoid re-init when prop references change but values don't\n const tabsKey = JSON.stringify(tabs);\n const initialTabsKey = JSON.stringify(initialTabs?.map(({ name }) => name));\n\n // Initialize allTabs from props or initialTabs\n useEffect(() => {\n if (initialTabs?.length) {\n let _tabs = [...initialTabs];\n tabs.forEach((tab) => {\n if (!_tabs.find((item) => item.name === tab)) {\n _tabs.push({ name: tab, is_default: false, is_hidden: false, is_pinned: false });\n }\n });\n _tabs = _tabs.filter(\n (item, index, self) =>\n tabs.includes(item.name) && index === self.findIndex((_t) => _t.name === item.name),\n );\n setAllTabs(_tabs);\n } else {\n setAllTabs(\n tabs\n .map((item) => ({ name: item, is_default: false, is_hidden: false, is_pinned: false }))\n .filter((item, index, self) => index === self.findIndex((_t) => _t.name === item.name)),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tabsKey, initialTabsKey]);\n\n // Sync tabConfig prop\n useEffect(() => {\n if (tabConfig) {\n setSavedTabOptionConfig(tabConfig);\n }\n }, [tabConfig]);\n\n // Sort tabs\n useEffect(() => {\n if (!allTabs.length) return;\n const _sortedTabs = [...allTabs];\n if (sortOrder === 'asc') {\n _sortedTabs.sort((a, b) => a.name.localeCompare(b.name));\n } else if (sortOrder === 'desc') {\n _sortedTabs.sort((a, b) => b.name.localeCompare(a.name));\n }\n setSortedTabs(_sortedTabs);\n }, [allTabs, sortOrder]);\n\n // Focus first menu item when More dropdown opens\n useEffect(() => {\n handleDropdownOpen(showMoreDropdown);\n }, [showMoreDropdown]);\n\n // ── Variant: switch ──\n if (variant === 'switch') {\n return (\n <div className={classNames('inline', className)}>\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'inline-flex grow-0 p-1 rounded-lg',\n color === 'dark'\n ? 'border-[1.5px] border-neutral-800 bg-neutral-800 dark:border-black-800'\n : 'bg-neutral-100 dark:bg-black-700',\n fullWidth ? 'w-full' : 'w-auto',\n )}\n >\n {tabs.map((title: T) => {\n const isSelected = activeTab === title;\n const icon = tabIcons?.[title];\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = allowPin && tab?.is_pinned;\n\n return (\n <li key={title} role=\"presentation\" className={classNames('inline-flex', fullWidth ? 'w-full' : 'w-auto')}>\n <TabSwitch\n title={title}\n showCounts={showCounts}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n icon={\n isPinned ? (\n <Tooltip title=\"Unpin\">\n <span onClick={() => togglePinTab(title)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n icon\n )\n }\n iconsOnly={iconsOnly}\n classValue={classNames(\n 'relative py-0.5 border-gray-200',\n height,\n fullWidth ? 'w-full flex items-center justify-center' : 'px-2',\n )}\n selectedClassValue={classNames(\n 'absolute inset-0 rounded-md z-0',\n color === 'dark' ? 'bg-neutral-900' : 'bg-white dark:bg-black-800',\n )}\n textClassValue={classNames(\n 'relative text-xs font-semibold font-sans whitespace-nowrap',\n isSelected\n ? 'text-neutral-900 dark:text-neutral-100'\n : 'text-neutral-700 dark:text-neutral-100',\n )}\n isSelected={isSelected}\n href={resolveTabHref(title)}\n onClick={!isDisabled ? () => handleSelectTab(title) : undefined}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n color={color}\n disableAnimation={disableAnimation}\n />\n </li>\n );\n })}\n </ul>\n </div>\n );\n }\n\n // ── Variant: default / secondary ──\n return (\n <div\n ref={tabsRef}\n className={classNames(fitContentWidth ? 'w-fit' : 'w-full')}\n onMouseEnter={() => setIsHoveringTabOptions(true)}\n onMouseLeave={() => setIsHoveringTabOptions(false)}\n >\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n collisionDetection={closestCenter}\n onDragOver={handleDragOver}\n >\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'flex items-center w-full',\n className,\n isFullWidth ? 'gap-0' : size === 'sm' ? 'gap-1' : 'gap-2',\n )}\n ref={ulRef}\n >\n {isLoading ? (\n <div className=\"skeleton bg-neutral-300 dark:bg-black-700 animate-pulse h-10 min-w-[100px] w-full rounded\" />\n ) : (\n <SortableContext\n items={sortedVisibleTabs.map(({ name }) => name)}\n strategy={horizontalListSortingStrategy}\n id=\"sortable\"\n disabled={!draggable || lockOrder}\n >\n {sortedVisibleTabs.slice(0, visibleTabSlice).map(({ name, is_pinned }) => {\n const isSelected = activeTab === name && !showMoreDropdown;\n const isPinned = allowPin && is_pinned;\n\n return (\n <SortableTab\n key={name}\n title={name}\n isDragging={draggingTab === name}\n className={isFullWidth ? 'flex-1 flex justify-center' : ''}\n >\n <li key={name} role=\"presentation\" className={classNames(isFullWidth ? 'w-full flex' : 'sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={name}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n classValue={classNames(\n getClasses('classValue', isSelected),\n isFullWidth ? 'w-full justify-center' : '',\n )}\n selectedClassValue={getClasses('selectedClassValue', isSelected)}\n textClassValue={getClasses('textClassValue', isSelected)}\n isSelected={isSelected}\n tabOptions={\n isSelected && draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(name as T),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <IconButton\n tooltip={t(\"More\")}\n variant=\"ghost\"\n className=\"!text-primary-500 hover:!bg-primary-100 dark:hover:!bg-primary-900\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} />\n </IconButton>\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === name}\n href={resolveTabHref(name)}\n onClick={() => handleSelectTab(name as T)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n isPinned ? (\n <Tooltip title={t(\"Unpin\")}>\n <span onClick={() => togglePinTab(name as T)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[name] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n );\n })}\n\n {/* Active tab pulled from overflow */}\n {activeTab && isActiveTabInsideMore ? (\n <SortableTab key={activeTab} title={activeTab} isDragging={draggingTab === activeTab}>\n <li key={activeTab} role=\"presentation\" className={classNames('sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={activeTab}\n role=\"tab\"\n ariaSelected={true}\n tabIndex={0}\n classValue={getClasses('classValue', true)}\n selectedClassValue={getClasses('selectedClassValue', true)}\n textClassValue={getClasses('textClassValue', true)}\n isSelected={true}\n tabOptions={\n draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(activeTab),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} className=\"text-primary-600\" />\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === activeTab}\n href={resolveTabHref(activeTab)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n allowPin && allTabs.find((tab) => tab.name === activeTab)?.is_pinned ? (\n <Tooltip title={t(\"Pinned\")}>\n <span onClick={() => togglePinTab(activeTab)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[activeTab] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n ) : null}\n\n {/* More dropdown */}\n {((visibleTabCounts < sortedVisibleTabs.length && !showAllItems) ||\n hiddenTabs.length > 0) &&\n moreButtonTabCounts > 0 ? (\n <DropableWrapper id=\"more-tabs\">\n <Dropdown\n overlayStyle={{\n maxHeight: 'calc(100vh - 350px)',\n overflow: 'auto',\n marginTop: '8px',\n scrollbarWidth: 'none',\n borderRadius: 8,\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)',\n }}\n onOpenChange={() => handleShowMoreDropdown()}\n open={showMoreDropdown}\n menu={{\n items: [\n {\n key: 'Search',\n disabled: true,\n style: { minWidth: '190px', marginBottom: '8px' },\n label: (\n <div className=\"px-2 bg-white dark:bg-black-800\">\n <SearchBar\n id=\"search-bar-more-tabs\"\n value={search}\n classValues=\"!rounded-lg\"\n onChange={(e) => setSearch(e)}\n />\n </div>\n ),\n },\n ...sortedVisibleTabs\n .slice(visibleTabSlice)\n .filter((item) => item.name !== activeTab)\n .concat(hiddenTabs)\n .filter(\n ({ name }) =>\n typeof name === 'string' &&\n (name ?? '').toLowerCase().includes(search.toLowerCase()),\n )\n .map(({ name, is_hidden }) => ({\n key: name,\n label: (\n <OptionButton\n className={classNames(\n 'uppercase',\n is_hidden\n ? 'text-neutral-400 dark:text-neutral-500'\n : 'text-black-900 dark:text-black-200',\n )}\n text={name}\n suffixRecord={showCounts ? suffixRecord : {}}\n highlight={search}\n truncateText={true}\n isDisabled={is_hidden}\n onClick={is_hidden ? undefined : () => {\n handleSelectTab(name as T);\n setShowMoreDropdown(false);\n }}\n />\n ),\n popupClassName: TAB_MENU_CLASS,\n children: showMoreDropdown ? getTabOptions(name as T, is_hidden, true) : null,\n })),\n ],\n className: TAB_MENU_CLASS,\n }}\n openClassName=\"max-h-[350px] overflow-y-auto\"\n trigger={['click']}\n overlayClassName=\"row-option-cell\"\n placement=\"bottomRight\"\n getPopupContainer={(trigger) => trigger.parentElement as HTMLElement}\n >\n <MoreButton\n title={`${showCounts ? moreButtonTabCounts : ''} ${showCounts ? '' : ''}MORE...`}\n variant={variant}\n size={size}\n draggingOver={draggingOver}\n suffixRecord={suffixRecord}\n handleShowMoreDropdown={handleShowMoreDropdown}\n selectedId={selectedId}\n showMoreDropdown={showMoreDropdown}\n />\n </Dropdown>\n </DropableWrapper>\n ) : null}\n </SortableContext>\n )}\n {rightSection ? (\n <div className={classNames(rightSection?.className)}>\n <li>{rightSection.component}</li>\n </div>\n ) : null}\n {draggable && showTabOptions && (\n <li\n className={classNames(\n isHoveringTabOptions ? 'opacity-100' : 'opacity-0',\n 'transition-opacity duration-300',\n )}\n >\n <TabOptions\n hasSuffixRecord={Boolean(\n suffixRecord && Object.keys(suffixRecord).length > 0,\n )}\n savedConfig={savedTabOptionConfig}\n onApplyFilter={(config) => updateTabConfig(config)}\n setUnsavedChanges={() => {\n /* handled by onTabsChange / onTabConfigChange */\n }}\n handleTabSort={handleTabSort}\n onSearchChange={handleSearchFilterChange}\n />\n </li>\n )}\n </ul>\n {draggingTab ? (\n <TabDragOverlay\n draggingTab={draggingTab}\n suffixRecord={suffixRecord}\n size={size}\n variant={variant}\n selectedId={selectedId}\n parentContainer={parentContainer}\n />\n ) : null}\n </DndContext>\n </div>\n );\n};\n"],"names":["randomHex","TAB_MENU_CLASS","dropdownTrigger","handleDropdownOpen","open","ACTIONS","Tabs","variant","tabs","activeTab","onTabClick","suffixRecordProp","isLoading","size","className","draggable","showAllItems","copyLink","isDisabled","color","iconsOnly","tabIcons","height","fullWidth","fitContentWidth","disableAnimation","onEdit","onDelete","onCopyLink","allowPin","isFullWidth","rightSection","initialTabsProp","tabConfigProp","onTabConfigChange","onTabsChange","parentContainer","tabKey","linkConfig","showTabOptions","providerTabConfig","useTabConfig","providerSettings","initialTabs","tabConfig","search","setSearch","useState","showMoreDropdown","setShowMoreDropdown","visibleTabCounts","setVisibleTabCounts","allTabs","setAllTabs","sortedTabs","setSortedTabs","draggingOver","setDraggingOver","draggingTab","setDraggingTab","isHoveringTabOptions","setIsHoveringTabOptions","savedTabOptionConfig","setSavedTabOptionConfig","INITIAL_TAB_OPTION_CONFIG","tabSearchFilter","setTabSearchFilter","tabSearchFilterType","setTabSearchFilterType","showCounts","lockOrder","sortOrder","t","useTranslation","tabsRef","useRef","ulRef","visibleTabCountsRef","measureText","useTextWidth","selectedId","useMemo","sensors","useSensors","useSensor","MouseSensor","TouchSensor","suffixRecord","name","value","formatCount","visibleTabs","is_hidden","hiddenTabs","filteredVisibleTabs","tabName","searchValue","sortedVisibleTabs","a","b","isTabOverflow","visibleTabSlice","isActiveTabInsideMore","item","moreButtonTabCounts","updateTabs","useCallback","newTabs","updateTabConfig","config","calculateIconWidth","calculateVisibleTabs","clientWidth","tabOptionsWidth","moreWidth","tabGap","basePadding","tabWidth","activeTabWidth","newVisibleTabCounts","availableWidth","currentCount","hasOverflow","hasHidden","index","suffixText","suffixWidth","tabTitleWidth","iconWidth","currentTabWidth","remainingVisibleTabs","lastTab","lastTabWidth","newVisibleSlice","getCurrentSearchParams","params","currentValue","applyTabToSearchParams","resolveTabHref","showCopyLink","handleCopyLink","origin","pathname","href","toast","handleSelectTab","hideTab","_tabs","visibleIndex","nextIndex","unhideTab","togglePinTab","moveTab","direction","oldIndex","newIndex","arrayMove","handleShowMoreDropdown","handleDragStart","event","handleDragEnd","active","over","handleDragCancel","handleDragOver","handleTabSort","handleSearchFilterChange","filterType","getTabOptions","title","isHidden","isSoftHidden","isPinned","_t","options","jsx","OptionButton","ArrowOutwardIcon","ArrowUpwardIcon","ArrowDownwardIcon","ContentCopyIcon","VisibilityOffIcon","VisibilityIcon","UnpinFilledIcon","PinIcon","EditIcon","DeleteIcon","hiddenFilter","defaultFilter","getClasses","classType","isSelected","classNames","useEffect","resizeObserver","entries","containerWidth","tabsKey","initialTabsKey","tab","self","_sortedTabs","icon","TabSwitch","Tooltip","jsxs","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","is_pinned","SortableTab","Dropdown","IconButton","MoreHorizOutlinedIcon","DropableWrapper","SearchBar","trigger","MoreButton","TabOptions","TabDragOverlay"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tabs.es.js","sources":["../../../../src/components/navigation/tabs/Tabs.tsx"],"sourcesContent":["import {\n DndContext,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport type { DragEndEvent, DragOverEvent, DragStartEvent } from '@dnd-kit/core';\nimport { SortableContext, horizontalListSortingStrategy, arrayMove } from '@dnd-kit/sortable';\nimport { Dropdown } from 'antd';\nimport classNames from 'classnames';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport MoreHorizOutlinedIcon from '@mui/icons-material/MoreHorizOutlined';\n\nimport { DropableWrapper, MoreButton, SortableTab, TabDragOverlay, TabOptions, TabSwitch } from '.';\nimport type { SuffixRecord, Tab, TabOptionConfig, TabsProps } from './types';\nimport { INITIAL_TAB_OPTION_CONFIG } from './types';\n\nimport { formatCount } from '../../../utils/formatters';\n\nimport { useTabConfig } from '../../../providers/design-system-provider/hooks';\nimport { useTextWidth } from '../../../hooks/useTextWidth';\nimport IconButton from '../../button/IconButton';\nimport { OptionButton } from '../../buttons/option-button/OptionButton';\nimport { SearchBar } from '../../forms/search-bar/SearchBar';\nimport Tooltip from '../../tooltip/Tooltip';\nimport { EditIcon } from '../../icons/EditIcon';\nimport { toast } from 'react-toastify';\nimport { ArrowDownwardIcon, ArrowOutwardIcon, ArrowUpwardIcon, ContentCopyIcon, DeleteIcon, PinIcon, UnpinFilledIcon, VisibilityIcon, VisibilityOffIcon } from '../../icon';\n\nconst randomHex = () => Math.random().toString(16).slice(2, 13);\n\nconst TAB_MENU_CLASS = [\n '[&_.ant-dropdown-menu-item]:!outline-none',\n '[&_.ant-dropdown-menu-submenu-title]:!outline-none',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:dark:bg-black-600',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:dark:bg-black-600',\n].join(' ');\n\nlet dropdownTrigger: HTMLElement | null = null;\n\nconst handleDropdownOpen = (open: boolean) => {\n if (open) {\n dropdownTrigger = document.activeElement as HTMLElement;\n setTimeout(() => {\n const item = document.querySelector<HTMLElement>(\n '.row-option-cell .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled), .row-option-cell .ant-dropdown-menu-submenu-title',\n );\n item?.focus();\n }, 50);\n } else {\n setTimeout(() => {\n dropdownTrigger?.focus();\n dropdownTrigger = null;\n }, 0);\n }\n};\n\nconst ACTIONS = {\n SELECT: 'Select',\n MOVE_LEFT: 'MoveLeft',\n MOVE_RIGHT: 'MoveRight',\n HIDE: 'Hide',\n UNHIDE: 'Unhide',\n COPY_LINK: 'CopyLink',\n DELETE: 'Delete',\n PIN: 'Pin',\n UNPIN: 'Unpin',\n EDIT: 'Edit',\n} as const;\n\nexport const Tabs = <T extends string>({\n variant = 'default',\n tabs = [],\n activeTab,\n onTabClick,\n suffixRecord: suffixRecordProp,\n isLoading,\n size = 'md',\n className,\n draggable = false,\n showAllItems = false,\n copyLink = false,\n isDisabled = false,\n color = 'light',\n iconsOnly = false,\n tabIcons = {},\n height = 'h-6',\n fullWidth = false,\n fitContentWidth = false,\n disableAnimation = false,\n onEdit,\n onDelete,\n onCopyLink,\n allowPin = false,\n isFullWidth = false,\n rightSection,\n initialTabs: initialTabsProp,\n tabConfig: tabConfigProp,\n onTabConfigChange,\n onTabsChange,\n parentContainer = document.body,\n tabKey,\n linkConfig,\n showTabOptions = true,\n}: TabsProps<T>) => {\n // ── Provider integration ──\n const providerTabConfig = useTabConfig();\n const providerSettings = tabKey ? providerTabConfig?.getTabSettings(tabKey) : undefined;\n\n // Provider-sourced values are used only when the direct props are not passed\n const initialTabs = initialTabsProp ?? (providerSettings?.tab_items as Tab<T>[] | undefined);\n const tabConfig = tabConfigProp ?? providerSettings?.tab_options;\n // ── State ──\n const [search, setSearch] = useState('');\n const [showMoreDropdown, setShowMoreDropdown] = useState(false);\n const [visibleTabCounts, setVisibleTabCounts] = useState(0);\n const [allTabs, setAllTabs] = useState<Tab<T>[]>([]);\n const [sortedTabs, setSortedTabs] = useState<Tab<T>[]>([]);\n const [draggingOver, setDraggingOver] = useState<string | null>(null);\n const [draggingTab, setDraggingTab] = useState<string | null>(null);\n const [isHoveringTabOptions, setIsHoveringTabOptions] = useState(false);\n const [savedTabOptionConfig, setSavedTabOptionConfig] = useState<TabOptionConfig>(\n tabConfig ?? INITIAL_TAB_OPTION_CONFIG,\n );\n const [tabSearchFilter, setTabSearchFilter] = useState('');\n const [tabSearchFilterType, setTabSearchFilterType] = useState<'contains' | 'does-not-contain'>('contains');\n\n const { showCounts, lockOrder, sortOrder } = savedTabOptionConfig;\n\n // ── Refs & Hooks ──\n const { t } = useTranslation();\n const tabsRef = useRef<HTMLDivElement | null>(null);\n const ulRef = useRef<HTMLUListElement | null>(null);\n const visibleTabCountsRef = useRef(visibleTabCounts);\n const { measureText } = useTextWidth();\n const selectedId = useMemo(() => randomHex(), []);\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 5 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 300, tolerance: 5 } }),\n );\n\n // ── Derived values ──\n // Counts are formatted once here (1000 -> \"1,000\") so the rendered badges and\n // the overflow width measurement always agree.\n const suffixRecord = useMemo(() => {\n if (!suffixRecordProp) return suffixRecordProp;\n return Object.fromEntries(\n Object.entries(suffixRecordProp).map(([name, value]) => [\n name,\n formatCount(value as string | number),\n ]),\n ) as SuffixRecord<T>;\n }, [suffixRecordProp]);\n\n const visibleTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => !is_hidden), [sortedTabs]);\n const hiddenTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => is_hidden), [sortedTabs]);\n\n const filteredVisibleTabs = useMemo(\n () =>\n visibleTabs.filter(({ name }) => {\n if (!tabSearchFilter) return true;\n const tabName = (name ?? '').toLowerCase();\n const searchValue = tabSearchFilter.toLowerCase();\n return tabSearchFilterType === 'contains'\n ? tabName.includes(searchValue)\n : !tabName.includes(searchValue);\n }),\n [visibleTabs, tabSearchFilter, tabSearchFilterType],\n );\n\n const sortedVisibleTabs = useMemo(\n () =>\n [...filteredVisibleTabs].sort((a, b) => {\n if (a.is_pinned && !b.is_pinned) return -1;\n if (!a.is_pinned && b.is_pinned) return 1;\n return 0;\n }),\n [filteredVisibleTabs],\n );\n\n const isTabOverflow = visibleTabCounts < sortedVisibleTabs.length;\n const visibleTabSlice = showAllItems\n ? sortedVisibleTabs.length\n : isTabOverflow\n ? visibleTabCounts\n : sortedVisibleTabs.length;\n const isActiveTabInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= visibleTabSlice;\n const moreButtonTabCounts =\n allTabs.length - visibleTabSlice - (isActiveTabInsideMore ? 1 : 0);\n\n visibleTabCountsRef.current = visibleTabCounts;\n\n // ── Helpers ──\n const updateTabs = useCallback(\n (newTabs: Tab<T>[]) => {\n setAllTabs(newTabs);\n onTabsChange?.(newTabs);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_items: newTabs });\n }\n },\n [onTabsChange, tabKey, providerTabConfig],\n );\n\n const updateTabConfig = useCallback(\n (config: TabOptionConfig) => {\n setSavedTabOptionConfig(config);\n onTabConfigChange?.(config);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_options: config });\n }\n },\n [onTabConfigChange, tabKey, providerTabConfig],\n );\n\n const calculateIconWidth = (item: Tab<T>): number => (item.is_pinned ? 32 : 0);\n\n const calculateVisibleTabs = useCallback(\n (clientWidth: number) => {\n if (!clientWidth) return;\n const tabOptionsWidth = draggable ? 30 : 0;\n const moreWidth = showCounts ? 190 : 84;\n const tabGap = size === 'sm' ? 4 : 8;\n const basePadding = 32;\n let tabWidth = 0;\n let activeTabWidth = 0;\n let newVisibleTabCounts = 0;\n const availableWidth = clientWidth - (rightSection?.width || 0) - tabOptionsWidth;\n const currentCount = visibleTabCountsRef.current;\n const hasOverflow = currentCount < sortedVisibleTabs.length;\n const hasHidden = hiddenTabs.length > 0;\n\n for (let index = 0; index < sortedVisibleTabs.length; index++) {\n const item = sortedVisibleTabs[index];\n\n const suffixText = suffixRecord?.[item.name] ? String(suffixRecord?.[item.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n\n const tabTitleWidth = measureText(item?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n\n const iconWidth = allowPin ? calculateIconWidth(item) : 0;\n const currentTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n\n if (item.name === activeTab) {\n activeTabWidth = currentTabWidth;\n }\n\n tabWidth += currentTabWidth;\n\n if (\n availableWidth >\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0) + index * 25\n ) {\n newVisibleTabCounts = index + 1;\n } else {\n break;\n }\n }\n\n const remainingVisibleTabs = sortedVisibleTabs.length - newVisibleTabCounts;\n const totalRemainingTabs = remainingVisibleTabs + hiddenTabs.length;\n\n if (\n totalRemainingTabs === 1 &&\n hiddenTabs.length === 0 &&\n remainingVisibleTabs === 1 &&\n newVisibleTabCounts < sortedVisibleTabs.length\n ) {\n const lastTab = sortedVisibleTabs[newVisibleTabCounts];\n if (lastTab) {\n const suffixText = suffixRecord?.[lastTab.name] ? String(suffixRecord?.[lastTab.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n const tabTitleWidth = measureText(lastTab?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n const iconWidth = allowPin ? calculateIconWidth(lastTab) : 0;\n const lastTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n if (availableWidth >= tabWidth + lastTabWidth) {\n newVisibleTabCounts += 1;\n }\n }\n }\n\n const newVisibleSlice = showAllItems ? sortedVisibleTabs.length : newVisibleTabCounts;\n const activeInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= newVisibleSlice;\n\n if (activeInsideMore) {\n tabWidth += activeTabWidth;\n if (\n availableWidth <\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0)\n ) {\n newVisibleTabCounts = Math.max(newVisibleTabCounts - 1, 0);\n }\n }\n\n if (newVisibleTabCounts !== currentCount) {\n setVisibleTabCounts(newVisibleTabCounts);\n }\n },\n [\n sortedVisibleTabs,\n showCounts,\n showAllItems,\n allowPin,\n suffixRecord,\n rightSection?.width,\n activeTab,\n size,\n draggable,\n hiddenTabs.length,\n measureText,\n ],\n );\n\n // ── Search params helper (uses provider abstraction when available) ──\n const getCurrentSearchParams = useCallback(\n () => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n if (linkConfig && providerTabConfig?.getSearchParam) {\n const params = new URLSearchParams();\n const currentValue = providerTabConfig.getSearchParam(linkConfig.key);\n if (currentValue) params.set(linkConfig.key, currentValue);\n return params;\n }\n return new URLSearchParams();\n },\n [linkConfig, providerTabConfig],\n );\n\n const applyTabToSearchParams = useCallback(\n (params: URLSearchParams, tabName: string) => {\n if (!linkConfig) return params;\n if (tabName === linkConfig.defaultLink) {\n params.delete(linkConfig.key);\n } else {\n params.set(linkConfig.key, tabName);\n }\n linkConfig.onResolve?.(params);\n return params;\n },\n [linkConfig],\n );\n\n // ── Link href resolution ──\n const resolveTabHref = useCallback(\n (tabName: string): string | undefined => {\n if (!linkConfig) return undefined;\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n return `?${params.toString()}`;\n },\n [applyTabToSearchParams, getCurrentSearchParams, linkConfig],\n );\n\n // ── Copy link ──\n const showCopyLink = copyLink || Boolean(linkConfig);\n\n const handleCopyLink = useCallback(\n async (tabName: T) => {\n const search = resolveTabHref(tabName);\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n const pathname = typeof window !== 'undefined' ? window.location.pathname : '';\n const href = search\n ? `${origin}${pathname}${search}`\n : `${origin}${pathname}`;\n await navigator.clipboard.writeText(href);\n toast.success(t(\"Link copied to clipboard\"), {\n toastId: 'Link copied to clipboard',\n });\n onCopyLink?.(tabName, href);\n },\n [resolveTabHref, t, onCopyLink],\n );\n\n // ── Tab actions ──\n const handleSelectTab = (tabName: T) => {\n setShowMoreDropdown(false);\n onTabClick?.(tabName);\n if (linkConfig && providerTabConfig?.navigate) {\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n providerTabConfig.navigate(`?${params.toString()}`);\n }\n };\n\n const hideTab = (tabName: T) => {\n if (sortedVisibleTabs.length <= 1) return;\n\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: true } : item,\n );\n\n const visibleIndex = sortedVisibleTabs.findIndex((item) => item.name === tabName);\n const nextIndex = visibleIndex === 0 ? 1 : visibleIndex - 1;\n handleSelectTab(sortedVisibleTabs[nextIndex].name);\n\n updateTabs(_tabs);\n };\n\n const unhideTab = (tabName: T) => {\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: false } : item,\n );\n\n setShowMoreDropdown(false);\n updateTabs(_tabs);\n };\n\n const togglePinTab = (tabName: T) => {\n if (!allowPin) return;\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_pinned: !item.is_pinned } : item,\n );\n updateTabs(_tabs);\n };\n\n const moveTab = (tabName: T, direction: 'left' | 'right') => {\n const oldIndex = allTabs.findIndex(({ name }) => name === tabName);\n const newIndex =\n direction === 'left'\n ? oldIndex - (allTabs[oldIndex - 1]?.name === activeTab ? 2 : 1)\n : oldIndex + 1;\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n };\n\n const handleShowMoreDropdown = () => setShowMoreDropdown(!showMoreDropdown);\n\n // ── Drag handlers ──\n const handleDragStart = (event: DragStartEvent) => setDraggingTab(event.active.id as string);\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (over?.id === 'more-tabs') {\n hideTab(active.id as T);\n setDraggingTab(null);\n setDraggingOver(null);\n return;\n }\n const oldIndex = allTabs.findIndex(({ name }) => name === active.id);\n const newIndex = allTabs.findIndex(({ name }) => name === over?.id);\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragCancel = () => {\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragOver = (event: DragOverEvent) => {\n setDraggingOver(event.over?.id === 'more-tabs' ? 'more-tabs' : null);\n };\n\n const handleTabSort = () => {\n // Sorting is handled via sortedTabs effect — no direct allTabs mutation\n };\n\n const handleSearchFilterChange = (\n searchValue: string,\n filterType: 'contains' | 'does-not-contain',\n ) => {\n setTabSearchFilter(searchValue);\n setTabSearchFilterType(filterType);\n };\n\n // ── Tab context menu options ──\n const getTabOptions = (title: T, isHidden = false, isSoftHidden = false) => {\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = tab?.is_pinned;\n\n const options = [\n {\n label: (\n <OptionButton\n icon={<ArrowOutwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Select Tab\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.SELECT,\n onClick: () => handleSelectTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowUpwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Up\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_LEFT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'left'),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowDownwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Down\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_RIGHT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'right'),\n },\n {\n label: (\n <OptionButton\n icon={<ContentCopyIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Copy Link\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.COPY_LINK,\n onClick: () => handleCopyLink(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityOffIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Hide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.HIDE,\n onClick: () => hideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Unhide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.UNHIDE,\n onClick: () => unhideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={isPinned ? <UnpinFilledIcon size={20} className='rotate-12 text-inherit dark:text-inherit'/> : <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />}\n text={isPinned ? t(\"Unpin\") : t(\"Pin\")}\n className=\"text-black-900 dark:text-white\"\n notVisible={!allowPin}\n />\n ),\n key: isPinned ? ACTIONS.UNPIN : ACTIONS.PIN,\n onClick: () => togglePinTab(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-black-900 dark:text-white\"\n icon={<EditIcon />}\n text={t('Edit')}\n notVisible={!onEdit}\n />\n ),\n key: ACTIONS.EDIT,\n onClick: () => onEdit?.(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-error-600 dark:text-error-600\"\n icon={<DeleteIcon size={18} className='text-error-600 dark:text-error-600' />}\n text={t(\"Delete\")}\n notVisible={!onDelete}\n />\n ),\n key: ACTIONS.DELETE,\n onClick: () => onDelete?.(title),\n },\n ];\n\n const hiddenFilter: string[] = [ACTIONS.HIDE, ACTIONS.UNHIDE];\n const defaultFilter: string[] = [ACTIONS.SELECT, ACTIONS.MOVE_LEFT, ACTIONS.MOVE_RIGHT, ACTIONS.UNHIDE];\n\n return options\n .filter((item) =>\n isHidden\n ? item.key === ACTIONS.UNHIDE\n : isSoftHidden\n ? !hiddenFilter.includes(item.key)\n : !defaultFilter.includes(item.key),\n )\n .filter((item) => (showCopyLink ? true : item.key !== ACTIONS.COPY_LINK))\n .filter((item) => (sortedVisibleTabs.length === 1 ? item.key !== ACTIONS.HIDE : true));\n };\n\n // ── Class maps ──\n const getClasses = (\n classType: 'classValue' | 'selectedClassValue' | 'textClassValue',\n isSelected: boolean,\n ) => {\n const classes = {\n classValue: {\n default: classNames('relative inline-flex pt-2 pb-3 px-2 pl-3 sm:px-2 rounded-t-sm group'),\n secondary: classNames(\n 'flex w-full sm:w-auto relative rounded-lg font-sans font-semibold text-center cursor-pointer uppercase',\n size === 'sm' ? 'py-1 px-3 text-sm' : 'py-2 px-4 text-base',\n ),\n },\n selectedClassValue: {\n default: classNames('absolute left-0 bottom-0 w-full h-[3px] bg-primary-600'),\n secondary: classNames('absolute inset-0 bg-primary-50 dark:bg-primary-975 rounded-lg'),\n },\n textClassValue: {\n default: classNames(\n 'relative uppercase font-sans font-semibold text-sm whitespace-nowrap',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 hover:text-neutral-500 dark:text-neutral-100 dark:hover:text-white',\n ),\n secondary: classNames(\n 'relative whitespace-nowrap text-sm',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 dark:text-neutral-400',\n ),\n },\n };\n return classes[classType][variant as 'default' | 'secondary'];\n };\n\n // ── Effects ──\n // ResizeObserver for responsive overflow\n useEffect(() => {\n if (!tabsRef.current || variant === 'switch') return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const containerWidth = entries[0].contentRect.width;\n calculateVisibleTabs(containerWidth);\n });\n\n resizeObserver.observe(tabsRef.current);\n calculateVisibleTabs(tabsRef.current.clientWidth);\n\n return () => resizeObserver.disconnect();\n }, [calculateVisibleTabs, variant]);\n\n // Stable stringified keys to avoid re-init when prop references change but values don't\n const tabsKey = JSON.stringify(tabs);\n const initialTabsKey = JSON.stringify(initialTabs?.map(({ name }) => name));\n\n // Initialize allTabs from props or initialTabs\n useEffect(() => {\n if (initialTabs?.length) {\n let _tabs = [...initialTabs];\n tabs.forEach((tab) => {\n if (!_tabs.find((item) => item.name === tab)) {\n _tabs.push({ name: tab, is_default: false, is_hidden: false, is_pinned: false });\n }\n });\n _tabs = _tabs.filter(\n (item, index, self) =>\n tabs.includes(item.name) && index === self.findIndex((_t) => _t.name === item.name),\n );\n setAllTabs(_tabs);\n } else {\n setAllTabs(\n tabs\n .map((item) => ({ name: item, is_default: false, is_hidden: false, is_pinned: false }))\n .filter((item, index, self) => index === self.findIndex((_t) => _t.name === item.name)),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tabsKey, initialTabsKey]);\n\n // Sync tabConfig prop\n useEffect(() => {\n if (tabConfig) {\n setSavedTabOptionConfig(tabConfig);\n }\n }, [tabConfig]);\n\n // Sort tabs\n useEffect(() => {\n if (!allTabs.length) return;\n const _sortedTabs = [...allTabs];\n if (sortOrder === 'asc') {\n _sortedTabs.sort((a, b) => a.name.localeCompare(b.name));\n } else if (sortOrder === 'desc') {\n _sortedTabs.sort((a, b) => b.name.localeCompare(a.name));\n }\n setSortedTabs(_sortedTabs);\n }, [allTabs, sortOrder]);\n\n // Focus first menu item when More dropdown opens\n useEffect(() => {\n handleDropdownOpen(showMoreDropdown);\n }, [showMoreDropdown]);\n\n // ── Variant: switch ──\n if (variant === 'switch') {\n return (\n <div className={classNames('inline', className)}>\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'inline-flex grow-0 p-1 rounded-lg',\n color === 'dark'\n ? 'border-[1.5px] border-neutral-800 bg-neutral-800 dark:border-black-800'\n : 'bg-neutral-100 dark:bg-black-700',\n fullWidth ? 'w-full' : 'w-auto',\n )}\n >\n {tabs.map((title: T) => {\n const isSelected = activeTab === title;\n const icon = tabIcons?.[title];\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = allowPin && tab?.is_pinned;\n\n return (\n <li key={title} role=\"presentation\" className={classNames('inline-flex', fullWidth ? 'w-full' : 'w-auto')}>\n <TabSwitch\n title={title}\n showCounts={showCounts}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n icon={\n isPinned ? (\n <Tooltip title=\"Unpin\">\n <span onClick={() => togglePinTab(title)}>\n <PinIcon className='rotate-45 w-icon h-icon text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n icon\n )\n }\n iconsOnly={iconsOnly}\n classValue={classNames(\n 'relative py-0.5 border-gray-200',\n height,\n fullWidth ? 'w-full flex items-center justify-center' : 'px-2',\n )}\n selectedClassValue={classNames(\n 'absolute inset-0 rounded-md z-0',\n color === 'dark' ? 'bg-neutral-900' : 'bg-white dark:bg-black-800',\n )}\n textClassValue={classNames(\n 'relative text-xs font-semibold font-sans whitespace-nowrap',\n isSelected\n ? 'text-neutral-900 dark:text-neutral-100'\n : 'text-neutral-700 dark:text-neutral-100',\n )}\n isSelected={isSelected}\n href={resolveTabHref(title)}\n onClick={!isDisabled ? () => handleSelectTab(title) : undefined}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n color={color}\n disableAnimation={disableAnimation}\n />\n </li>\n );\n })}\n </ul>\n </div>\n );\n }\n\n // ── Variant: default / secondary ──\n return (\n <div\n ref={tabsRef}\n className={classNames(fitContentWidth ? 'w-fit' : 'w-full')}\n onMouseEnter={() => setIsHoveringTabOptions(true)}\n onMouseLeave={() => setIsHoveringTabOptions(false)}\n >\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n collisionDetection={closestCenter}\n onDragOver={handleDragOver}\n >\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'flex items-center w-full',\n className,\n isFullWidth ? 'gap-0' : size === 'sm' ? 'gap-1' : 'gap-2',\n )}\n ref={ulRef}\n >\n {isLoading ? (\n <div className=\"skeleton bg-neutral-300 dark:bg-black-700 animate-pulse h-10 min-w-[100px] w-full rounded\" />\n ) : (\n <SortableContext\n items={sortedVisibleTabs.map(({ name }) => name)}\n strategy={horizontalListSortingStrategy}\n id=\"sortable\"\n disabled={!draggable || lockOrder}\n >\n {sortedVisibleTabs.slice(0, visibleTabSlice).map(({ name, is_pinned }) => {\n const isSelected = activeTab === name && !showMoreDropdown;\n const isPinned = allowPin && is_pinned;\n\n return (\n <SortableTab\n key={name}\n title={name}\n isDragging={draggingTab === name}\n className={isFullWidth ? 'flex-1 flex justify-center' : ''}\n >\n <li key={name} role=\"presentation\" className={classNames(isFullWidth ? 'w-full flex' : 'sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={name}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n classValue={classNames(\n getClasses('classValue', isSelected),\n isFullWidth ? 'w-full justify-center' : '',\n )}\n selectedClassValue={getClasses('selectedClassValue', isSelected)}\n textClassValue={getClasses('textClassValue', isSelected)}\n isSelected={isSelected}\n tabOptions={\n isSelected && draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(name as T),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <IconButton\n tooltip={t(\"More\")}\n variant=\"ghost\"\n className=\"!text-primary-500 hover:!bg-primary-100 dark:hover:!bg-primary-900\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} />\n </IconButton>\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === name}\n href={resolveTabHref(name)}\n onClick={() => handleSelectTab(name as T)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n isPinned ? (\n <Tooltip title={t(\"Unpin\")}>\n <span onClick={() => togglePinTab(name as T)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[name] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n );\n })}\n\n {/* Active tab pulled from overflow */}\n {activeTab && isActiveTabInsideMore ? (\n <SortableTab key={activeTab} title={activeTab} isDragging={draggingTab === activeTab}>\n <li key={activeTab} role=\"presentation\" className={classNames('sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={activeTab}\n role=\"tab\"\n ariaSelected={true}\n tabIndex={0}\n classValue={getClasses('classValue', true)}\n selectedClassValue={getClasses('selectedClassValue', true)}\n textClassValue={getClasses('textClassValue', true)}\n isSelected={true}\n tabOptions={\n draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(activeTab),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} className=\"text-primary-600\" />\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === activeTab}\n href={resolveTabHref(activeTab)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n allowPin && allTabs.find((tab) => tab.name === activeTab)?.is_pinned ? (\n <Tooltip title={t(\"Pinned\")}>\n <span onClick={() => togglePinTab(activeTab)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[activeTab] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n ) : null}\n\n {/* More dropdown */}\n {((visibleTabCounts < sortedVisibleTabs.length && !showAllItems) ||\n hiddenTabs.length > 0) &&\n moreButtonTabCounts > 0 ? (\n <DropableWrapper id=\"more-tabs\">\n <Dropdown\n overlayStyle={{\n maxHeight: 'calc(100vh - 350px)',\n overflow: 'auto',\n marginTop: '8px',\n scrollbarWidth: 'none',\n borderRadius: 8,\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)',\n }}\n onOpenChange={() => handleShowMoreDropdown()}\n open={showMoreDropdown}\n menu={{\n items: [\n {\n key: 'Search',\n disabled: true,\n style: { minWidth: '190px', marginBottom: '8px' },\n label: (\n <div className=\"px-2 bg-white dark:bg-black-800\">\n <SearchBar\n id=\"search-bar-more-tabs\"\n value={search}\n classValues=\"!rounded-lg\"\n onChange={(e) => setSearch(e)}\n />\n </div>\n ),\n },\n ...sortedVisibleTabs\n .slice(visibleTabSlice)\n .filter((item) => item.name !== activeTab)\n .concat(hiddenTabs)\n .filter(\n ({ name }) =>\n typeof name === 'string' &&\n (name ?? '').toLowerCase().includes(search.toLowerCase()),\n )\n .map(({ name, is_hidden }) => ({\n key: name,\n label: (\n <OptionButton\n className={classNames(\n 'uppercase',\n is_hidden\n ? 'text-neutral-400 dark:text-neutral-500'\n : 'text-black-900 dark:text-black-200',\n )}\n text={name}\n suffixRecord={showCounts ? suffixRecord : {}}\n highlight={search}\n truncateText={true}\n isDisabled={is_hidden}\n onClick={is_hidden ? undefined : () => {\n handleSelectTab(name as T);\n setShowMoreDropdown(false);\n }}\n />\n ),\n popupClassName: TAB_MENU_CLASS,\n children: showMoreDropdown ? getTabOptions(name as T, is_hidden, true) : null,\n })),\n ],\n className: TAB_MENU_CLASS,\n }}\n openClassName=\"max-h-[350px] overflow-y-auto\"\n trigger={['click']}\n overlayClassName=\"row-option-cell\"\n placement=\"bottomRight\"\n getPopupContainer={(trigger) => trigger.parentElement as HTMLElement}\n >\n <MoreButton\n title={`${showCounts ? moreButtonTabCounts : ''} ${showCounts ? '' : ''}MORE...`}\n variant={variant}\n size={size}\n draggingOver={draggingOver}\n suffixRecord={suffixRecord}\n handleShowMoreDropdown={handleShowMoreDropdown}\n selectedId={selectedId}\n showMoreDropdown={showMoreDropdown}\n />\n </Dropdown>\n </DropableWrapper>\n ) : null}\n </SortableContext>\n )}\n {rightSection ? (\n <div className={classNames(rightSection?.className)}>\n <li>{rightSection.component}</li>\n </div>\n ) : null}\n {draggable && showTabOptions && (\n <li\n className={classNames(\n isHoveringTabOptions ? 'opacity-100' : 'opacity-0',\n 'transition-opacity duration-300',\n )}\n >\n <TabOptions\n hasSuffixRecord={Boolean(\n suffixRecord && Object.keys(suffixRecord).length > 0,\n )}\n savedConfig={savedTabOptionConfig}\n onApplyFilter={(config) => updateTabConfig(config)}\n setUnsavedChanges={() => {\n /* handled by onTabsChange / onTabConfigChange */\n }}\n handleTabSort={handleTabSort}\n onSearchChange={handleSearchFilterChange}\n />\n </li>\n )}\n </ul>\n {draggingTab ? (\n <TabDragOverlay\n draggingTab={draggingTab}\n suffixRecord={suffixRecord}\n size={size}\n variant={variant}\n selectedId={selectedId}\n parentContainer={parentContainer}\n />\n ) : null}\n </DndContext>\n </div>\n );\n};\n"],"names":["randomHex","TAB_MENU_CLASS","dropdownTrigger","handleDropdownOpen","open","ACTIONS","Tabs","variant","tabs","activeTab","onTabClick","suffixRecordProp","isLoading","size","className","draggable","showAllItems","copyLink","isDisabled","color","iconsOnly","tabIcons","height","fullWidth","fitContentWidth","disableAnimation","onEdit","onDelete","onCopyLink","allowPin","isFullWidth","rightSection","initialTabsProp","tabConfigProp","onTabConfigChange","onTabsChange","parentContainer","tabKey","linkConfig","showTabOptions","providerTabConfig","useTabConfig","providerSettings","initialTabs","tabConfig","search","setSearch","useState","showMoreDropdown","setShowMoreDropdown","visibleTabCounts","setVisibleTabCounts","allTabs","setAllTabs","sortedTabs","setSortedTabs","draggingOver","setDraggingOver","draggingTab","setDraggingTab","isHoveringTabOptions","setIsHoveringTabOptions","savedTabOptionConfig","setSavedTabOptionConfig","INITIAL_TAB_OPTION_CONFIG","tabSearchFilter","setTabSearchFilter","tabSearchFilterType","setTabSearchFilterType","showCounts","lockOrder","sortOrder","t","useTranslation","tabsRef","useRef","ulRef","visibleTabCountsRef","measureText","useTextWidth","selectedId","useMemo","sensors","useSensors","useSensor","MouseSensor","TouchSensor","suffixRecord","name","value","formatCount","visibleTabs","is_hidden","hiddenTabs","filteredVisibleTabs","tabName","searchValue","sortedVisibleTabs","a","b","isTabOverflow","visibleTabSlice","isActiveTabInsideMore","item","moreButtonTabCounts","updateTabs","useCallback","newTabs","updateTabConfig","config","calculateIconWidth","calculateVisibleTabs","clientWidth","tabOptionsWidth","moreWidth","tabGap","basePadding","tabWidth","activeTabWidth","newVisibleTabCounts","availableWidth","currentCount","hasOverflow","hasHidden","index","suffixText","suffixWidth","tabTitleWidth","iconWidth","currentTabWidth","remainingVisibleTabs","lastTab","lastTabWidth","newVisibleSlice","getCurrentSearchParams","params","currentValue","applyTabToSearchParams","resolveTabHref","showCopyLink","handleCopyLink","origin","pathname","href","toast","handleSelectTab","hideTab","_tabs","visibleIndex","nextIndex","unhideTab","togglePinTab","moveTab","direction","oldIndex","newIndex","arrayMove","handleShowMoreDropdown","handleDragStart","event","handleDragEnd","active","over","handleDragCancel","handleDragOver","handleTabSort","handleSearchFilterChange","filterType","getTabOptions","title","isHidden","isSoftHidden","isPinned","_t","options","jsx","OptionButton","ArrowOutwardIcon","ArrowUpwardIcon","ArrowDownwardIcon","ContentCopyIcon","VisibilityOffIcon","VisibilityIcon","UnpinFilledIcon","PinIcon","EditIcon","DeleteIcon","hiddenFilter","defaultFilter","getClasses","classType","isSelected","classNames","useEffect","resizeObserver","entries","containerWidth","tabsKey","initialTabsKey","tab","self","_sortedTabs","icon","TabSwitch","Tooltip","jsxs","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","is_pinned","SortableTab","Dropdown","IconButton","MoreHorizOutlinedIcon","DropableWrapper","SearchBar","trigger","MoreButton","TabOptions","TabDragOverlay"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),O=require("@mui/icons-material"),V=require("@mui/icons-material/EditOutlined"),D=require("@mui/icons-material/WarningRounded"),o=require("../../_virtual/index.cjs.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),O=require("@mui/icons-material"),V=require("@mui/icons-material/EditOutlined"),D=require("@mui/icons-material/WarningRounded"),o=require("../../_virtual/index.cjs.js"),t=require("react"),d=require("../data-display/typography/Typography.cjs.js"),p=require("../data-display/tag/Tag.cjs.js"),ee=require("../data-display/skeleton/Skeleton.cjs.js"),re=require("../../utils/countryFlags.cjs.js"),ae=require("./UserAvatarPopper.cjs.js"),oe=require("./StatusInfoRow.cjs.js"),g=require("./constants.cjs.js"),se=require("./PersonIcon.cjs.js"),te=require("./useDynamicPosition.cjs.js"),j=({label:n,content:l})=>e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx(d.Typography,{size:"small",variant:"medium",className:"mr-5",appearance:"body",children:n}),l]}),H=({firstName:n,lastName:l,email:U,profilePic:c,size:N="md",hoverSize:T="lg",containerClassName:A="",enablePopper:P=!0,className:B,userId:C,lastViewedOn:u,isActive:m,statusIndicator:F=!1,userDetails:r,isFetchingUserDetails:$=!1,authToken:R,onHover:G,currentlyEditing:z})=>{if(n==="All"&&l==="Users")return e.jsx("div",{className:"p-1 rounded-full bg-primary-100 dark:bg-black-600 flex items-center justify-center",children:e.jsx(O.GroupsOutlined,{sx:{fontSize:16},className:"text-primary-600 dark:text-primary-600"})});const[W,v]=t.useState(!1),[M,i]=t.useState(!1),J=g.sizeClasses[N],{triggerRef:K,dropdownRef:Q,position:f,isVisible:X,show:S,hide:q}=te.useDynamicPosition(),k=t.useRef({}),I=t.useMemo(()=>{if(m||!u)return!1;const a=new Date(u);return(new Date().getTime()-a.getTime())/(1e3*60*60)<24},[m,u]),h=m?"bg-primary-600 dark:bg-primary-600":I?"bg-primary-300 dark:bg-primary-300":u?"bg-neutral-400 dark:bg-neutral-400":null,b=m?"border-primary-600 dark:border-primary-600":I?"border-primary-300 dark:border-primary-300":u?"border-neutral-400 dark:border-neutral-400":"border-primary-200 dark:border-neutral-800",Y={"2xs":"w-1.5 h-1.5",xs:"w-2 h-2",sm:"w-2.5 h-2.5",md:"w-3 h-3",lg:"w-3.5 h-3.5",xl:"w-4 h-4"};t.useEffect(()=>{if(c)if(k.current[c])i(!0);else{i(!1);const a=new Image,x=R||(typeof localStorage<"u"?localStorage.getItem("token"):null);a.src=c+(x?"?token="+x:""),a.onload=()=>{k.current[c]=a.src,i(!0)},a.onerror=()=>{i(!1)}}else i(!1)},[c,R]),t.useEffect(()=>()=>{s.current&&clearTimeout(s.current)},[]);const y=c?k.current[c]:void 0,s=t.useRef(null),w=t.useRef(null),Z=()=>{G?.(),n&&l&&P&&(s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{v(!0)},300))},L=a=>{s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{w.current&&!w.current.contains(a.relatedTarget)&&v(!1)},200)},_=e.jsxs("div",{ref:w,className:"bg-white dark:bg-black-800 shadow rounded-lg border border-neutral-200 dark:border-black-700 min-w-[280px]",onMouseEnter:()=>{s.current&&clearTimeout(s.current)},onMouseLeave:a=>L(a),children:[e.jsxs("div",{className:"flex flex-col gap-1 items-center p-5",children:[e.jsxs("div",{className:o("relative",g.sizeClasses[T]),children:[y&&M?e.jsx("img",{src:y,alt:"Profile",className:o("rounded-full border-2 object-cover w-full h-full",b),onError:()=>i(!1)}):e.jsx("div",{className:o("bg-primary-100 dark:bg-primary-950 text-primary-600 border-2 flex items-center justify-center rounded-full w-full h-full",b),children:g.getInitials((n||"")+" "+(l||""))}),h&&e.jsx("div",{className:o("absolute bottom-0 right-0 rounded-full border-2 border-white dark:border-black-800",Y[T],h)})]}),e.jsxs("div",{className:"flex flex-row gap-1 items-center justify-center",children:[e.jsxs(d.Typography,{size:"medium",variant:"semibold",className:"w-full text-center",children:[n||""," ",l||""]}),r?.region&&e.jsx("span",{children:re.getFlagComponentRectangleMd(r?.region)})]}),e.jsx(d.Typography,{size:"small",variant:"medium",appearance:"body",children:U||r?.email||""})]}),z?e.jsx("div",{className:"px-5 pb-3",children:e.jsxs("div",{className:"flex items-center gap-3 rounded-lg border border-primary-100 dark:border-primary-900 bg-[rgba(230,241,252,0.60)] dark:bg-primary-950/40 px-[13px] py-[7px]",children:[e.jsx("div",{className:"flex items-center justify-center shrink-0 w-7 h-7 rounded-[5px] border-[0.4px] border-primary-100 dark:border-primary-900 bg-primary-50 dark:bg-primary-950",children:e.jsx(V,{sx:{width:13,height:13},className:"text-primary-600 dark:text-primary-500"})}),e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsx(d.Typography,{size:"extra-small",variant:"semibold",appearance:"custom",className:"text-2xs leading-4 uppercase tracking-[0.2px] text-primary-600 dark:text-primary-500",children:"Currently editing"}),e.jsx(d.Typography,{size:"extra-small",variant:"semibold",className:"truncate",children:z})]})]})}):null,C&&($?e.jsx("div",{className:"p-5",children:e.jsx(ee.Skeleton,{})}):C&&(r?.teams||r?.clearanceLevel||r?.group)?e.jsxs("div",{className:"flex flex-col gap-4 bg-neutral-50 border-t border-neutral-200 dark:bg-black-700 dark:border-none p-5 rounded-b-lg",children:[e.jsx(oe.StatusInfoRow,{isActive:m,lastViewedOn:u}),r.username&&e.jsx(j,{label:"Username",content:e.jsx("div",{className:"flex gap-2",children:e.jsx(d.Typography,{size:"small",variant:"medium",appearance:"body",children:r.username})})}),r?.teams&&r?.teams?.length>0&&e.jsx(j,{label:"Team",content:e.jsxs("div",{className:"flex gap-2",children:[r?.teams?.length>0&&e.jsx(p.Tag,{label:r?.teams[0]?.name,color:r?.teams[0]?.color||"#e38715",size:"md",isHashColor:!0},r?.teams[0]?.id),r?.teams?.length>=2&&e.jsxs("div",{ref:K,className:"relative cursor-pointer",onMouseEnter:S,onMouseLeave:q,onClick:a=>a.stopPropagation(),children:[e.jsx(p.Tag,{label:`+ ${r?.teams?.length-1} More`,color:"#004f08",size:"md",isHashColor:!0},1),X&&e.jsx("div",{ref:Q,className:o("absolute w-max bg-white dark:text-black-200 dark:bg-black-800 shadow-md border border-neutral-200 dark:border-black-800 rounded-md px-2 z-10 overflow-y-auto max-h-60",{"top-full":f.vertical==="bottom","bottom-full":f.vertical==="top","left-0":f.horizontal==="left","right-0":f.horizontal==="right"}),onMouseEnter:S,onMouseLeave:q,children:r?.teams?.slice(1)?.map((a,x)=>e.jsx("div",{className:"my-2",children:e.jsx(p.Tag,{label:a?.name,color:a?.color||"#4A5568",size:"md",isHashColor:!0,className:"w-fit"},a?.id)},a?.id||x))})]})]})}),r?.group&&e.jsx(j,{label:"Role",content:e.jsx(p.Tag,{label:r?.group,color:"#004094",size:"md",isHashColor:!0},r?.group)}),r?.clearanceLevel&&e.jsx(j,{label:"Clearance Level",content:e.jsx(p.Tag,{label:`Level ${r?.clearanceLevel}`,color:"#b30000",size:"md",isHashColor:!0},String(r?.clearanceLevel))})]}):e.jsx("div",{className:"flex items-center justify-center bg-neutral-50 dark:bg-black-700 border-t border-neutral-200 dark:border-black-700 p-5 rounded-b-lg",children:e.jsxs(d.Typography,{className:"flex items-center justify-center gap-1",size:"extra-small",variant:"medium",appearance:"body",children:[e.jsx(D,{sx:{height:"16px",width:"16px",color:"#F04438"}}),"No other information found!"]})}))]}),E=t.useRef(null);return e.jsxs("div",{onMouseEnter:Z,onMouseLeave:L,className:o("inline-block relative cursor-pointer",B),ref:E,children:[e.jsxs("div",{className:o("relative",A||J),children:[y&&M?e.jsx("img",{src:y,alt:"Profile",className:o("rounded-full border object-cover w-full h-full",b),onError:()=>i(!1)}):n&&l?e.jsx("div",{className:o(" bg-primary-100 text-primary-600 flex items-center justify-center rounded-full border dark:bg-black-700 text-2xs",g.sizeClasses[N],b),children:g.getInitials((n||"")+" "+(l||""))}):e.jsx("div",{className:o(b,"p-1 rounded-full bg-neutral-200 dark:bg-black-600 flex items-center justify-center border w-full h-full"),children:e.jsx(se.PersonIcon,{fill:"#98A2B3"})}),F&&h&&e.jsx("div",{className:o("absolute bottom-0 right-0 rounded-full border border-white dark:border-black-800 w-2 h-2",h)})]}),e.jsx(ae.UserAvatarPopper,{isOpen:W,onClose:()=>v(!1),anchorEl:E.current,className:"bg-white dark:bg-black-700 shadow rounded-lg border border-neutral-200 dark:border-black-600",children:_})]})};H.displayName="UserAvatar";exports.UserAvatar=H;
|
|
2
2
|
//# sourceMappingURL=UserAvatar.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserAvatar.cjs.js","sources":["../../../src/components/user-avatar/UserAvatar.tsx"],"sourcesContent":["import { GroupsOutlined } from '@mui/icons-material';\nimport EditOutlinedIcon from '@mui/icons-material/EditOutlined';\nimport WarningRoundedIcon from '@mui/icons-material/WarningRounded';\nimport cn from 'classnames';\nimport { type FC, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Typography } from '../data-display/typography/Typography';\nimport { Tag } from '../data-display/tag/Tag';\nimport { Skeleton } from '../data-display/skeleton/Skeleton';\nimport { getFlagComponentRectangleMd } from '../../utils/countryFlags';\nimport { UserAvatarPopper } from './UserAvatarPopper';\nimport { StatusInfoRow } from './StatusInfoRow';\nimport { sizeClasses, getInitials } from './constants';\nimport { PersonIcon } from './PersonIcon';\nimport { useDynamicPosition } from './useDynamicPosition';\n\nexport type UserAvatarSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type UserDetailsTeam = {\n id?: string;\n name: string;\n color?: string;\n};\n\nexport type UserDetails = {\n email?: string;\n username?: string;\n teams?: UserDetailsTeam[];\n group?: string;\n clearanceLevel?: number | string;\n region?: string;\n};\n\nexport type UserAvatarProps = {\n firstName?: string;\n lastName?: string;\n email?: string;\n enablePopper?: boolean;\n profilePic?: string;\n size?: UserAvatarSize;\n hoverSize?: UserAvatarSize;\n containerClassName?: string;\n className?: string;\n userId?: string;\n lastViewedOn?: string;\n isActive?: boolean;\n statusIndicator?: boolean;\n /** User details to display in the popper - replaces the useTeamMemberFilter hook */\n userDetails?: UserDetails | null;\n /** Whether user details are being fetched */\n isFetchingUserDetails?: boolean;\n /** Optional token for authenticated image loading */\n authToken?: string;\n /** Callback triggered when mouse enters the avatar */\n onHover?: () => void;\n /** Name of the clause / line item the user is currently editing. When set, a highlighted \"Currently editing\" card is shown in the popper. */\n currentlyEditing?: string;\n};\n\nconst InfoRow = ({ label, content }: { label: string; content: React.ReactNode }) => (\n <div className='flex justify-between items-center'>\n <Typography size='small' variant='medium' className='mr-5' appearance='body'>\n {label}\n </Typography>\n {content}\n </div>\n);\n\n/**\n * UserAvatar component for displaying user profile pictures with hover popper\n *\n * @example\n * ```tsx\n * <UserAvatar\n * firstName=\"John\"\n * lastName=\"Doe\"\n * email=\"john@example.com\"\n * profilePic=\"/avatar.jpg\"\n * userDetails={{ teams: [{ name: 'Engineering', color: '#0066cc' }], group: 'Admin' }}\n * />\n * ```\n */\nexport const UserAvatar: FC<UserAvatarProps> = ({\n firstName,\n lastName,\n email,\n profilePic,\n size = 'md',\n hoverSize = 'lg',\n containerClassName = '',\n enablePopper = true,\n className,\n userId,\n lastViewedOn,\n isActive,\n statusIndicator = false,\n userDetails,\n isFetchingUserDetails = false,\n authToken,\n onHover,\n currentlyEditing,\n}) => {\n if (firstName === 'All' && lastName === 'Users') {\n return (\n <div className='p-1 rounded-full bg-primary-100 dark:bg-black-600 flex items-center justify-center'>\n <GroupsOutlined sx={{ fontSize: 16 }} className='text-primary-600 dark:text-primary-600' />\n </div>\n );\n }\n\n const [visible, setVisible] = useState<boolean>(false);\n const [imageLoaded, setImageLoaded] = useState<boolean>(false);\n\n const avatarSizeClass = sizeClasses[size];\n\n const {\n triggerRef: moreTagRef,\n dropdownRef,\n position: dropdownPosition,\n isVisible: showMore,\n show: handleShowMore,\n hide: handleHideMore,\n } = useDynamicPosition();\n\n const imageCacheRef = useRef<{ [key: string]: string }>({});\n\n const isRecent = useMemo(() => {\n if (isActive || !lastViewedOn) return false;\n const date = new Date(lastViewedOn);\n const now = new Date();\n const diffInHours = (now.getTime() - date.getTime()) / (1000 * 60 * 60);\n return diffInHours < 24;\n }, [isActive, lastViewedOn]);\n\n const getStatusColor = () => {\n if (isActive) return 'bg-primary-600 dark:bg-primary-600';\n if (isRecent) return 'bg-primary-300 dark:bg-primary-300';\n if (lastViewedOn) return 'bg-neutral-400 dark:bg-neutral-400';\n return null;\n };\n\n const statusColor = getStatusColor();\n\n const getBorderColor = () => {\n if (isActive) return 'border-primary-600 dark:border-primary-600';\n if (isRecent) return 'border-primary-300 dark:border-primary-300';\n if (lastViewedOn) return 'border-neutral-400 dark:border-neutral-400';\n return 'border-primary-200 dark:border-neutral-800';\n };\n\n const borderColor = getBorderColor();\n\n const indicatorSizes = {\n '2xs': 'w-1.5 h-1.5',\n xs: 'w-2 h-2',\n sm: 'w-2.5 h-2.5',\n md: 'w-3 h-3',\n lg: 'w-3.5 h-3.5',\n xl: 'w-4 h-4',\n };\n\n useEffect(() => {\n if (profilePic) {\n if (imageCacheRef.current[profilePic]) {\n setImageLoaded(true);\n } else {\n setImageLoaded(false);\n const img = new Image();\n const token = authToken || (typeof localStorage !== 'undefined' ? localStorage.getItem('token') : null);\n img.src = profilePic + (token ? '?token=' + token : '');\n img.onload = () => {\n imageCacheRef.current[profilePic] = img.src;\n setImageLoaded(true);\n };\n img.onerror = () => {\n setImageLoaded(false);\n };\n }\n } else {\n setImageLoaded(false);\n }\n }, [profilePic, authToken]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const cachedSrc = profilePic ? imageCacheRef.current[profilePic] : undefined;\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const popperRef = useRef<HTMLDivElement | null>(null);\n\n const handleMouseEnter = () => {\n onHover?.();\n if (firstName && lastName && enablePopper) {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n setVisible(true);\n }, 300);\n }\n };\n\n const handleMouseLeave = (event: React.MouseEvent) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n if (popperRef.current && !popperRef.current.contains(event.relatedTarget as Node)) {\n setVisible(false);\n }\n }, 200);\n };\n\n const popperContent = (\n <div\n ref={popperRef}\n className='bg-white dark:bg-black-800 shadow rounded-lg border border-neutral-200 dark:border-black-700 min-w-[280px]'\n onMouseEnter={() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n }}\n onMouseLeave={(event) => handleMouseLeave(event)}\n >\n <div className='flex flex-col gap-1 items-center p-5'>\n <div className={cn('relative', sizeClasses[hoverSize])}>\n {cachedSrc && imageLoaded ? (\n <img\n src={cachedSrc}\n alt='Profile'\n className={cn('rounded-full border-2 object-cover w-full h-full', borderColor)}\n onError={() => setImageLoaded(false)}\n />\n ) : (\n <div\n className={cn(\n 'bg-primary-100 dark:bg-primary-950 text-primary-600 border-2 flex items-center justify-center rounded-full w-full h-full',\n borderColor,\n )}\n >\n {getInitials((firstName || '') + ' ' + (lastName || ''))}\n </div>\n )}\n\n {statusColor && (\n <div\n className={cn(\n 'absolute bottom-0 right-0 rounded-full border-2 border-white dark:border-black-800',\n indicatorSizes[hoverSize],\n statusColor,\n )}\n />\n )}\n </div>\n <div className='flex flex-row gap-1 items-center justify-center'>\n <Typography size='medium' variant='semibold' className='w-full text-center'>\n {firstName || ''} {lastName || ''}\n </Typography>\n {userDetails?.region && <span>{getFlagComponentRectangleMd(userDetails?.region)}</span>}\n </div>\n\n <Typography size='small' variant='medium' appearance='body'>\n {email || userDetails?.email || ''}\n </Typography>\n </div>\n\n {currentlyEditing ? (\n <div className='px-5 pb-3'>\n <div className='flex items-center gap-3 rounded-lg border border-primary-100 dark:border-primary-900 bg-[rgba(230,241,252,0.60)] dark:bg-primary-950/40 px-[13px] py-[7px]'>\n <div className='flex items-center justify-center shrink-0 w-7 h-7 rounded-[5px] border-[0.4px] border-primary-100 dark:border-primary-900 bg-primary-50 dark:bg-primary-950'>\n <EditOutlinedIcon sx={{ width: 13, height: 13 }} className='text-primary-600 dark:text-primary-500' />\n </div>\n <div className='flex flex-col min-w-0'>\n <Typography\n size='extra-small'\n variant='semibold'\n appearance='custom'\n className='text-2xs leading-4 uppercase tracking-[0.2px] text-primary-600 dark:text-primary-500'\n >\n Currently editing\n </Typography>\n <Typography size='extra-small' variant='semibold' className='truncate'>\n {currentlyEditing}\n </Typography>\n </div>\n </div>\n </div>\n ) : null}\n\n {userId &&\n (isFetchingUserDetails ? (\n <div className='p-5'>\n <Skeleton />\n </div>\n ) : userId && (userDetails?.teams || userDetails?.clearanceLevel || userDetails?.group) ? (\n <div className='flex flex-col gap-4 bg-neutral-50 border-t border-neutral-200 dark:bg-black-700 dark:border-none p-5 rounded-b-lg'>\n <StatusInfoRow isActive={isActive} lastViewedOn={lastViewedOn} />\n {userDetails.username && (\n <InfoRow\n label='Username'\n content={\n <div className='flex gap-2'>\n <Typography size='small' variant='medium' appearance='body'>\n {userDetails.username}\n </Typography>\n </div>\n }\n />\n )}\n\n {userDetails?.teams && userDetails?.teams?.length > 0 && (\n <InfoRow\n label='Team'\n content={\n <div className='flex gap-2'>\n {userDetails?.teams?.length > 0 && (\n <Tag\n key={userDetails?.teams[0]?.id}\n label={userDetails?.teams[0]?.name}\n color={userDetails?.teams[0]?.color || '#e38715'}\n size='md'\n isHashColor\n />\n )}\n {userDetails?.teams?.length >= 2 && (\n <div\n ref={moreTagRef}\n className='relative cursor-pointer'\n onMouseEnter={handleShowMore}\n onMouseLeave={handleHideMore}\n onClick={(e) => e.stopPropagation()}\n >\n <Tag key={1} label={`+ ${userDetails?.teams?.length - 1} More`} color='#004f08' size='md' isHashColor />\n\n {showMore && (\n <div\n ref={dropdownRef}\n className={cn(\n 'absolute w-max bg-white dark:text-black-200 dark:bg-black-800 shadow-md border border-neutral-200 dark:border-black-800 rounded-md px-2 z-10 overflow-y-auto max-h-60',\n {\n 'top-full': dropdownPosition.vertical === 'bottom',\n 'bottom-full': dropdownPosition.vertical === 'top',\n 'left-0': dropdownPosition.horizontal === 'left',\n 'right-0': dropdownPosition.horizontal === 'right',\n },\n )}\n onMouseEnter={handleShowMore}\n onMouseLeave={handleHideMore}\n >\n {userDetails?.teams?.slice(1)?.map((team, index) => (\n <div key={team?.id || index} className='my-2'>\n <Tag key={team?.id} label={team?.name} color={team?.color || '#4A5568'} size='md' isHashColor className='w-fit' />\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n }\n />\n )}\n\n {userDetails?.group && (\n <InfoRow\n label='Role'\n content={<Tag key={userDetails?.group} label={userDetails?.group} color='#004094' size='md' isHashColor />}\n />\n )}\n\n {userDetails?.clearanceLevel && (\n <InfoRow\n label='Clearance Level'\n content={\n <Tag\n key={String(userDetails?.clearanceLevel)}\n label={`Level ${userDetails?.clearanceLevel}`}\n color='#b30000'\n size='md'\n isHashColor\n />\n }\n />\n )}\n </div>\n ) : (\n <div className='flex items-center justify-center bg-neutral-50 dark:bg-black-700 border-t border-neutral-200 dark:border-black-700 p-5 rounded-b-lg'>\n <Typography className='flex items-center justify-center gap-1' size='extra-small' variant='medium' appearance='body'>\n <WarningRoundedIcon\n sx={{\n height: '16px',\n width: '16px',\n color: '#F04438',\n }}\n />\n No other information found!\n </Typography>\n </div>\n ))}\n </div>\n );\n const containerRef = useRef<HTMLDivElement>(null);\n return (\n <div\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={cn('inline-block relative cursor-pointer', className)}\n ref={containerRef}\n >\n <div className={cn('relative', containerClassName || avatarSizeClass)}>\n {cachedSrc && imageLoaded ? (\n <img\n src={cachedSrc}\n alt='Profile'\n className={cn('rounded-full border object-cover w-full h-full', borderColor)}\n onError={() => setImageLoaded(false)}\n />\n ) : firstName && lastName ? (\n <div\n className={cn(\n ' bg-primary-100 text-primary-600 flex items-center justify-center rounded-full border dark:bg-black-700', \n sizeClasses[size],\n borderColor,\n )}\n >\n {getInitials((firstName || '') + ' ' + (lastName || ''))}\n </div>\n ) : (\n <div className={cn(borderColor, 'p-1 rounded-full bg-neutral-200 dark:bg-black-600 flex items-center justify-center border w-full h-full')}>\n <PersonIcon fill='#98A2B3' />\n </div>\n )}\n\n {statusIndicator && statusColor && (\n <div\n className={cn(\n 'absolute bottom-0 right-0 rounded-full border border-white dark:border-black-800 w-2 h-2',\n\n statusColor,\n )}\n />\n )}\n </div>\n <UserAvatarPopper\n isOpen={visible}\n onClose={() => setVisible(false)}\n anchorEl={containerRef.current}\n className='bg-white dark:bg-black-700 shadow rounded-lg border border-neutral-200 dark:border-black-600'\n >\n {popperContent}\n </UserAvatarPopper>\n </div>\n );\n};\n\nUserAvatar.displayName = 'UserAvatar';\n\n"],"names":["InfoRow","label","content","jsxs","jsx","Typography","UserAvatar","firstName","lastName","email","profilePic","size","hoverSize","containerClassName","enablePopper","className","userId","lastViewedOn","isActive","statusIndicator","userDetails","isFetchingUserDetails","authToken","onHover","currentlyEditing","GroupsOutlined","visible","setVisible","useState","imageLoaded","setImageLoaded","avatarSizeClass","sizeClasses","moreTagRef","dropdownRef","dropdownPosition","showMore","handleShowMore","handleHideMore","useDynamicPosition","imageCacheRef","useRef","isRecent","useMemo","date","statusColor","borderColor","indicatorSizes","useEffect","img","token","timerRef","cachedSrc","popperRef","handleMouseEnter","handleMouseLeave","event","popperContent","cn","getInitials","getFlagComponentRectangleMd","EditOutlinedIcon","Skeleton","StatusInfoRow","Tag","e","team","index","WarningRoundedIcon","containerRef","PersonIcon","UserAvatarPopper"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserAvatar.cjs.js","sources":["../../../src/components/user-avatar/UserAvatar.tsx"],"sourcesContent":["import { GroupsOutlined } from '@mui/icons-material';\nimport EditOutlinedIcon from '@mui/icons-material/EditOutlined';\nimport WarningRoundedIcon from '@mui/icons-material/WarningRounded';\nimport cn from 'classnames';\nimport { type FC, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Typography } from '../data-display/typography/Typography';\nimport { Tag } from '../data-display/tag/Tag';\nimport { Skeleton } from '../data-display/skeleton/Skeleton';\nimport { getFlagComponentRectangleMd } from '../../utils/countryFlags';\nimport { UserAvatarPopper } from './UserAvatarPopper';\nimport { StatusInfoRow } from './StatusInfoRow';\nimport { sizeClasses, getInitials } from './constants';\nimport { PersonIcon } from './PersonIcon';\nimport { useDynamicPosition } from './useDynamicPosition';\n\nexport type UserAvatarSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport type UserDetailsTeam = {\n id?: string;\n name: string;\n color?: string;\n};\n\nexport type UserDetails = {\n email?: string;\n username?: string;\n teams?: UserDetailsTeam[];\n group?: string;\n clearanceLevel?: number | string;\n region?: string;\n};\n\nexport type UserAvatarProps = {\n firstName?: string;\n lastName?: string;\n email?: string;\n enablePopper?: boolean;\n profilePic?: string;\n size?: UserAvatarSize;\n hoverSize?: UserAvatarSize;\n containerClassName?: string;\n className?: string;\n userId?: string;\n lastViewedOn?: string;\n isActive?: boolean;\n statusIndicator?: boolean;\n /** User details to display in the popper - replaces the useTeamMemberFilter hook */\n userDetails?: UserDetails | null;\n /** Whether user details are being fetched */\n isFetchingUserDetails?: boolean;\n /** Optional token for authenticated image loading */\n authToken?: string;\n /** Callback triggered when mouse enters the avatar */\n onHover?: () => void;\n /** Name of the clause / line item the user is currently editing. When set, a highlighted \"Currently editing\" card is shown in the popper. */\n currentlyEditing?: string;\n};\n\nconst InfoRow = ({ label, content }: { label: string; content: React.ReactNode }) => (\n <div className='flex justify-between items-center'>\n <Typography size='small' variant='medium' className='mr-5' appearance='body'>\n {label}\n </Typography>\n {content}\n </div>\n);\n\n/**\n * UserAvatar component for displaying user profile pictures with hover popper\n *\n * @example\n * ```tsx\n * <UserAvatar\n * firstName=\"John\"\n * lastName=\"Doe\"\n * email=\"john@example.com\"\n * profilePic=\"/avatar.jpg\"\n * userDetails={{ teams: [{ name: 'Engineering', color: '#0066cc' }], group: 'Admin' }}\n * />\n * ```\n */\nexport const UserAvatar: FC<UserAvatarProps> = ({\n firstName,\n lastName,\n email,\n profilePic,\n size = 'md',\n hoverSize = 'lg',\n containerClassName = '',\n enablePopper = true,\n className,\n userId,\n lastViewedOn,\n isActive,\n statusIndicator = false,\n userDetails,\n isFetchingUserDetails = false,\n authToken,\n onHover,\n currentlyEditing,\n}) => {\n if (firstName === 'All' && lastName === 'Users') {\n return (\n <div className='p-1 rounded-full bg-primary-100 dark:bg-black-600 flex items-center justify-center'>\n <GroupsOutlined sx={{ fontSize: 16 }} className='text-primary-600 dark:text-primary-600' />\n </div>\n );\n }\n\n const [visible, setVisible] = useState<boolean>(false);\n const [imageLoaded, setImageLoaded] = useState<boolean>(false);\n\n const avatarSizeClass = sizeClasses[size];\n\n const {\n triggerRef: moreTagRef,\n dropdownRef,\n position: dropdownPosition,\n isVisible: showMore,\n show: handleShowMore,\n hide: handleHideMore,\n } = useDynamicPosition();\n\n const imageCacheRef = useRef<{ [key: string]: string }>({});\n\n const isRecent = useMemo(() => {\n if (isActive || !lastViewedOn) return false;\n const date = new Date(lastViewedOn);\n const now = new Date();\n const diffInHours = (now.getTime() - date.getTime()) / (1000 * 60 * 60);\n return diffInHours < 24;\n }, [isActive, lastViewedOn]);\n\n const getStatusColor = () => {\n if (isActive) return 'bg-primary-600 dark:bg-primary-600';\n if (isRecent) return 'bg-primary-300 dark:bg-primary-300';\n if (lastViewedOn) return 'bg-neutral-400 dark:bg-neutral-400';\n return null;\n };\n\n const statusColor = getStatusColor();\n\n const getBorderColor = () => {\n if (isActive) return 'border-primary-600 dark:border-primary-600';\n if (isRecent) return 'border-primary-300 dark:border-primary-300';\n if (lastViewedOn) return 'border-neutral-400 dark:border-neutral-400';\n return 'border-primary-200 dark:border-neutral-800';\n };\n\n const borderColor = getBorderColor();\n\n const indicatorSizes = {\n '2xs': 'w-1.5 h-1.5',\n xs: 'w-2 h-2',\n sm: 'w-2.5 h-2.5',\n md: 'w-3 h-3',\n lg: 'w-3.5 h-3.5',\n xl: 'w-4 h-4',\n };\n\n useEffect(() => {\n if (profilePic) {\n if (imageCacheRef.current[profilePic]) {\n setImageLoaded(true);\n } else {\n setImageLoaded(false);\n const img = new Image();\n const token = authToken || (typeof localStorage !== 'undefined' ? localStorage.getItem('token') : null);\n img.src = profilePic + (token ? '?token=' + token : '');\n img.onload = () => {\n imageCacheRef.current[profilePic] = img.src;\n setImageLoaded(true);\n };\n img.onerror = () => {\n setImageLoaded(false);\n };\n }\n } else {\n setImageLoaded(false);\n }\n }, [profilePic, authToken]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const cachedSrc = profilePic ? imageCacheRef.current[profilePic] : undefined;\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const popperRef = useRef<HTMLDivElement | null>(null);\n\n const handleMouseEnter = () => {\n onHover?.();\n if (firstName && lastName && enablePopper) {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n setVisible(true);\n }, 300);\n }\n };\n\n const handleMouseLeave = (event: React.MouseEvent) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n if (popperRef.current && !popperRef.current.contains(event.relatedTarget as Node)) {\n setVisible(false);\n }\n }, 200);\n };\n\n const popperContent = (\n <div\n ref={popperRef}\n className='bg-white dark:bg-black-800 shadow rounded-lg border border-neutral-200 dark:border-black-700 min-w-[280px]'\n onMouseEnter={() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n }}\n onMouseLeave={(event) => handleMouseLeave(event)}\n >\n <div className='flex flex-col gap-1 items-center p-5'>\n <div className={cn('relative', sizeClasses[hoverSize])}>\n {cachedSrc && imageLoaded ? (\n <img\n src={cachedSrc}\n alt='Profile'\n className={cn('rounded-full border-2 object-cover w-full h-full', borderColor)}\n onError={() => setImageLoaded(false)}\n />\n ) : (\n <div\n className={cn(\n 'bg-primary-100 dark:bg-primary-950 text-primary-600 border-2 flex items-center justify-center rounded-full w-full h-full',\n borderColor,\n )}\n >\n {getInitials((firstName || '') + ' ' + (lastName || ''))}\n </div>\n )}\n\n {statusColor && (\n <div\n className={cn(\n 'absolute bottom-0 right-0 rounded-full border-2 border-white dark:border-black-800',\n indicatorSizes[hoverSize],\n statusColor,\n )}\n />\n )}\n </div>\n <div className='flex flex-row gap-1 items-center justify-center'>\n <Typography size='medium' variant='semibold' className='w-full text-center'>\n {firstName || ''} {lastName || ''}\n </Typography>\n {userDetails?.region && <span>{getFlagComponentRectangleMd(userDetails?.region)}</span>}\n </div>\n\n <Typography size='small' variant='medium' appearance='body'>\n {email || userDetails?.email || ''}\n </Typography>\n </div>\n\n {currentlyEditing ? (\n <div className='px-5 pb-3'>\n <div className='flex items-center gap-3 rounded-lg border border-primary-100 dark:border-primary-900 bg-[rgba(230,241,252,0.60)] dark:bg-primary-950/40 px-[13px] py-[7px]'>\n <div className='flex items-center justify-center shrink-0 w-7 h-7 rounded-[5px] border-[0.4px] border-primary-100 dark:border-primary-900 bg-primary-50 dark:bg-primary-950'>\n <EditOutlinedIcon sx={{ width: 13, height: 13 }} className='text-primary-600 dark:text-primary-500' />\n </div>\n <div className='flex flex-col min-w-0'>\n <Typography\n size='extra-small'\n variant='semibold'\n appearance='custom'\n className='text-2xs leading-4 uppercase tracking-[0.2px] text-primary-600 dark:text-primary-500'\n >\n Currently editing\n </Typography>\n <Typography size='extra-small' variant='semibold' className='truncate'>\n {currentlyEditing}\n </Typography>\n </div>\n </div>\n </div>\n ) : null}\n\n {userId &&\n (isFetchingUserDetails ? (\n <div className='p-5'>\n <Skeleton />\n </div>\n ) : userId && (userDetails?.teams || userDetails?.clearanceLevel || userDetails?.group) ? (\n <div className='flex flex-col gap-4 bg-neutral-50 border-t border-neutral-200 dark:bg-black-700 dark:border-none p-5 rounded-b-lg'>\n <StatusInfoRow isActive={isActive} lastViewedOn={lastViewedOn} />\n {userDetails.username && (\n <InfoRow\n label='Username'\n content={\n <div className='flex gap-2'>\n <Typography size='small' variant='medium' appearance='body'>\n {userDetails.username}\n </Typography>\n </div>\n }\n />\n )}\n\n {userDetails?.teams && userDetails?.teams?.length > 0 && (\n <InfoRow\n label='Team'\n content={\n <div className='flex gap-2'>\n {userDetails?.teams?.length > 0 && (\n <Tag\n key={userDetails?.teams[0]?.id}\n label={userDetails?.teams[0]?.name}\n color={userDetails?.teams[0]?.color || '#e38715'}\n size='md'\n isHashColor\n />\n )}\n {userDetails?.teams?.length >= 2 && (\n <div\n ref={moreTagRef}\n className='relative cursor-pointer'\n onMouseEnter={handleShowMore}\n onMouseLeave={handleHideMore}\n onClick={(e) => e.stopPropagation()}\n >\n <Tag key={1} label={`+ ${userDetails?.teams?.length - 1} More`} color='#004f08' size='md' isHashColor />\n\n {showMore && (\n <div\n ref={dropdownRef}\n className={cn(\n 'absolute w-max bg-white dark:text-black-200 dark:bg-black-800 shadow-md border border-neutral-200 dark:border-black-800 rounded-md px-2 z-10 overflow-y-auto max-h-60',\n {\n 'top-full': dropdownPosition.vertical === 'bottom',\n 'bottom-full': dropdownPosition.vertical === 'top',\n 'left-0': dropdownPosition.horizontal === 'left',\n 'right-0': dropdownPosition.horizontal === 'right',\n },\n )}\n onMouseEnter={handleShowMore}\n onMouseLeave={handleHideMore}\n >\n {userDetails?.teams?.slice(1)?.map((team, index) => (\n <div key={team?.id || index} className='my-2'>\n <Tag key={team?.id} label={team?.name} color={team?.color || '#4A5568'} size='md' isHashColor className='w-fit' />\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n }\n />\n )}\n\n {userDetails?.group && (\n <InfoRow\n label='Role'\n content={<Tag key={userDetails?.group} label={userDetails?.group} color='#004094' size='md' isHashColor />}\n />\n )}\n\n {userDetails?.clearanceLevel && (\n <InfoRow\n label='Clearance Level'\n content={\n <Tag\n key={String(userDetails?.clearanceLevel)}\n label={`Level ${userDetails?.clearanceLevel}`}\n color='#b30000'\n size='md'\n isHashColor\n />\n }\n />\n )}\n </div>\n ) : (\n <div className='flex items-center justify-center bg-neutral-50 dark:bg-black-700 border-t border-neutral-200 dark:border-black-700 p-5 rounded-b-lg'>\n <Typography className='flex items-center justify-center gap-1' size='extra-small' variant='medium' appearance='body'>\n <WarningRoundedIcon\n sx={{\n height: '16px',\n width: '16px',\n color: '#F04438',\n }}\n />\n No other information found!\n </Typography>\n </div>\n ))}\n </div>\n );\n const containerRef = useRef<HTMLDivElement>(null);\n return (\n <div\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={cn('inline-block relative cursor-pointer', className)}\n ref={containerRef}\n >\n <div className={cn('relative', containerClassName || avatarSizeClass)}>\n {cachedSrc && imageLoaded ? (\n <img\n src={cachedSrc}\n alt='Profile'\n className={cn('rounded-full border object-cover w-full h-full', borderColor)}\n onError={() => setImageLoaded(false)}\n />\n ) : firstName && lastName ? (\n <div\n className={cn(\n ' bg-primary-100 text-primary-600 flex items-center justify-center rounded-full border dark:bg-black-700 text-2xs', \n sizeClasses[size],\n borderColor,\n )}\n >\n {getInitials((firstName || '') + ' ' + (lastName || ''))}\n </div>\n ) : (\n <div className={cn(borderColor, 'p-1 rounded-full bg-neutral-200 dark:bg-black-600 flex items-center justify-center border w-full h-full')}>\n <PersonIcon fill='#98A2B3' />\n </div>\n )}\n\n {statusIndicator && statusColor && (\n <div\n className={cn(\n 'absolute bottom-0 right-0 rounded-full border border-white dark:border-black-800 w-2 h-2',\n\n statusColor,\n )}\n />\n )}\n </div>\n <UserAvatarPopper\n isOpen={visible}\n onClose={() => setVisible(false)}\n anchorEl={containerRef.current}\n className='bg-white dark:bg-black-700 shadow rounded-lg border border-neutral-200 dark:border-black-600'\n >\n {popperContent}\n </UserAvatarPopper>\n </div>\n );\n};\n\nUserAvatar.displayName = 'UserAvatar';\n\n"],"names":["InfoRow","label","content","jsxs","jsx","Typography","UserAvatar","firstName","lastName","email","profilePic","size","hoverSize","containerClassName","enablePopper","className","userId","lastViewedOn","isActive","statusIndicator","userDetails","isFetchingUserDetails","authToken","onHover","currentlyEditing","GroupsOutlined","visible","setVisible","useState","imageLoaded","setImageLoaded","avatarSizeClass","sizeClasses","moreTagRef","dropdownRef","dropdownPosition","showMore","handleShowMore","handleHideMore","useDynamicPosition","imageCacheRef","useRef","isRecent","useMemo","date","statusColor","borderColor","indicatorSizes","useEffect","img","token","timerRef","cachedSrc","popperRef","handleMouseEnter","handleMouseLeave","event","popperContent","cn","getInitials","getFlagComponentRectangleMd","EditOutlinedIcon","Skeleton","StatusInfoRow","Tag","e","team","index","WarningRoundedIcon","containerRef","PersonIcon","UserAvatarPopper"],"mappings":"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"}
|
|
@@ -268,7 +268,7 @@ const v = ({ label: n, content: d }) => /* @__PURE__ */ a("div", { className: "f
|
|
|
268
268
|
"div",
|
|
269
269
|
{
|
|
270
270
|
className: l(
|
|
271
|
-
" bg-primary-100 text-primary-600 flex items-center justify-center rounded-full border dark:bg-black-700",
|
|
271
|
+
" bg-primary-100 text-primary-600 flex items-center justify-center rounded-full border dark:bg-black-700 text-2xs",
|
|
272
272
|
C[z],
|
|
273
273
|
b
|
|
274
274
|
),
|