@lax-wp/design-system 0.13.33 → 0.13.34
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/button/Button.cjs.js +5 -5
- package/dist/components/button/Button.cjs.js.map +1 -1
- package/dist/components/button/Button.es.js +18 -18
- package/dist/components/button/Button.es.js.map +1 -1
- package/dist/components/button/IconButton.cjs.js +1 -1
- package/dist/components/button/IconButton.cjs.js.map +1 -1
- package/dist/components/button/IconButton.es.js +8 -8
- package/dist/components/button/IconButton.es.js.map +1 -1
- package/dist/components/buttons/option-button/OptionButton.cjs.js +1 -1
- package/dist/components/buttons/option-button/OptionButton.cjs.js.map +1 -1
- package/dist/components/buttons/option-button/OptionButton.es.js +1 -1
- package/dist/components/buttons/option-button/OptionButton.es.js.map +1 -1
- package/dist/components/data-display/comparison/components/Header.cjs.js +1 -1
- package/dist/components/data-display/comparison/components/Header.cjs.js.map +1 -1
- package/dist/components/data-display/comparison/components/Header.es.js +13 -13
- package/dist/components/data-display/comparison/components/Header.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.es.js +1 -1
- package/dist/components/data-display/infinite-table/body/cell/DataCell.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/body/rows/index.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/body/rows/index.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/body/rows/index.es.js +104 -101
- package/dist/components/data-display/infinite-table/body/rows/index.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/constants.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/constants.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/constants.d.ts +6 -0
- package/dist/components/data-display/infinite-table/constants.es.js +17 -16
- package/dist/components/data-display/infinite-table/constants.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/index.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/index.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/index.es.js +188 -187
- package/dist/components/data-display/infinite-table/index.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/useRowHeight.cjs.js +2 -0
- package/dist/components/data-display/infinite-table/useRowHeight.cjs.js.map +1 -0
- package/dist/components/data-display/infinite-table/useRowHeight.d.ts +15 -0
- package/dist/components/data-display/infinite-table/useRowHeight.es.js +24 -0
- package/dist/components/data-display/infinite-table/useRowHeight.es.js.map +1 -0
- package/dist/components/data-display/tag/Tag.cjs.js +1 -1
- package/dist/components/data-display/tag/Tag.cjs.js.map +1 -1
- package/dist/components/data-display/tag/Tag.es.js +11 -9
- package/dist/components/data-display/tag/Tag.es.js.map +1 -1
- 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 +9 -9
- package/dist/components/floating-bar/FloatingBar.es.js.map +1 -1
- package/dist/components/forms/base-input-field/BaseInputField.cjs.js +2 -2
- package/dist/components/forms/base-input-field/BaseInputField.cjs.js.map +1 -1
- package/dist/components/forms/base-input-field/BaseInputField.es.js +40 -42
- package/dist/components/forms/base-input-field/BaseInputField.es.js.map +1 -1
- package/dist/components/forms/creatable-select/CreatableSelect.cjs.js +1 -1
- package/dist/components/forms/creatable-select/CreatableSelect.cjs.js.map +1 -1
- package/dist/components/forms/creatable-select/CreatableSelect.es.js +14 -15
- package/dist/components/forms/creatable-select/CreatableSelect.es.js.map +1 -1
- package/dist/components/forms/currency-input/CurrencyInputField.cjs.js +1 -1
- package/dist/components/forms/currency-input/CurrencyInputField.cjs.js.map +1 -1
- package/dist/components/forms/currency-input/CurrencyInputField.es.js +57 -65
- package/dist/components/forms/currency-input/CurrencyInputField.es.js.map +1 -1
- package/dist/components/forms/date-time-field/DateTimeField.cjs.js +1 -1
- package/dist/components/forms/date-time-field/DateTimeField.cjs.js.map +1 -1
- package/dist/components/forms/date-time-field/DateTimeField.es.js +33 -33
- package/dist/components/forms/date-time-field/DateTimeField.es.js.map +1 -1
- package/dist/components/forms/debounce-input/DebounceInputField.cjs.js +1 -1
- package/dist/components/forms/debounce-input/DebounceInputField.cjs.js.map +1 -1
- package/dist/components/forms/debounce-input/DebounceInputField.es.js +2 -2
- package/dist/components/forms/debounce-input/DebounceInputField.es.js.map +1 -1
- package/dist/components/forms/dynamic-data-input/DynamicDataInput.cjs.js +1 -1
- package/dist/components/forms/dynamic-data-input/DynamicDataInput.cjs.js.map +1 -1
- package/dist/components/forms/dynamic-data-input/DynamicDataInput.es.js +7 -7
- package/dist/components/forms/dynamic-data-input/DynamicDataInput.es.js.map +1 -1
- package/dist/components/forms/dynamic-data-input/DynamicDataInputField.cjs.js +1 -1
- package/dist/components/forms/dynamic-data-input/DynamicDataInputField.cjs.js.map +1 -1
- package/dist/components/forms/dynamic-data-input/DynamicDataInputField.es.js +17 -19
- package/dist/components/forms/dynamic-data-input/DynamicDataInputField.es.js.map +1 -1
- package/dist/components/forms/field-options/Item.cjs.js +1 -1
- package/dist/components/forms/field-options/Item.cjs.js.map +1 -1
- package/dist/components/forms/field-options/Item.es.js +5 -5
- package/dist/components/forms/field-options/Item.es.js.map +1 -1
- package/dist/components/forms/formula-input/FormulaInput.cjs.js +1 -1
- package/dist/components/forms/formula-input/FormulaInput.cjs.js.map +1 -1
- package/dist/components/forms/formula-input/FormulaInput.es.js +10 -10
- package/dist/components/forms/formula-input/FormulaInput.es.js.map +1 -1
- package/dist/components/forms/icon-picker/IconPicker.cjs.js +1 -1
- package/dist/components/forms/icon-picker/IconPicker.cjs.js.map +1 -1
- package/dist/components/forms/icon-picker/IconPicker.es.js +42 -57
- package/dist/components/forms/icon-picker/IconPicker.es.js.map +1 -1
- package/dist/components/forms/input-field/InputField.cjs.js.map +1 -1
- package/dist/components/forms/input-field/InputField.es.js.map +1 -1
- package/dist/components/forms/master-data-input/MasterDataInputField.cjs.js +1 -1
- package/dist/components/forms/master-data-input/MasterDataInputField.cjs.js.map +1 -1
- package/dist/components/forms/master-data-input/MasterDataInputField.es.js +54 -60
- package/dist/components/forms/master-data-input/MasterDataInputField.es.js.map +1 -1
- package/dist/components/forms/md-input/RichMarkdownInput.cjs.js +3 -3
- package/dist/components/forms/md-input/RichMarkdownInput.cjs.js.map +1 -1
- package/dist/components/forms/md-input/RichMarkdownInput.es.js +63 -63
- package/dist/components/forms/md-input/RichMarkdownInput.es.js.map +1 -1
- package/dist/components/forms/number-input-field/NumberInputField.cjs.js +1 -1
- package/dist/components/forms/number-input-field/NumberInputField.cjs.js.map +1 -1
- package/dist/components/forms/number-input-field/NumberInputField.es.js +5 -5
- package/dist/components/forms/number-input-field/NumberInputField.es.js.map +1 -1
- package/dist/components/forms/percentage-input/PercentageInputField.cjs.js +2 -2
- package/dist/components/forms/percentage-input/PercentageInputField.cjs.js.map +1 -1
- package/dist/components/forms/percentage-input/PercentageInputField.es.js +20 -20
- package/dist/components/forms/percentage-input/PercentageInputField.es.js.map +1 -1
- package/dist/components/forms/search-bar/SearchBar.cjs.js +1 -1
- package/dist/components/forms/search-bar/SearchBar.cjs.js.map +1 -1
- package/dist/components/forms/search-bar/SearchBar.es.js +16 -16
- package/dist/components/forms/search-bar/SearchBar.es.js.map +1 -1
- package/dist/components/forms/select-field/SelectField.cjs.js +2 -2
- package/dist/components/forms/select-field/SelectField.cjs.js.map +1 -1
- package/dist/components/forms/select-field/SelectField.d.ts +4 -0
- package/dist/components/forms/select-field/SelectField.es.js +202 -203
- package/dist/components/forms/select-field/SelectField.es.js.map +1 -1
- package/dist/components/forms/text-area-field/TextAreaField.cjs.js +1 -1
- package/dist/components/forms/text-area-field/TextAreaField.cjs.js.map +1 -1
- package/dist/components/forms/text-area-field/TextAreaField.es.js +14 -14
- package/dist/components/forms/text-area-field/TextAreaField.es.js.map +1 -1
- package/dist/components/forms/toggle/Toggle.cjs.js +1 -1
- package/dist/components/forms/toggle/Toggle.cjs.js.map +1 -1
- package/dist/components/forms/toggle/Toggle.es.js +65 -59
- package/dist/components/forms/toggle/Toggle.es.js.map +1 -1
- package/dist/components/navigation/accordion/Accordion.cjs.js +1 -1
- package/dist/components/navigation/accordion/Accordion.cjs.js.map +1 -1
- package/dist/components/navigation/accordion/Accordion.es.js +5 -5
- package/dist/components/navigation/accordion/Accordion.es.js.map +1 -1
- package/dist/components/navigation/stepper/Stepper.cjs.js +1 -1
- package/dist/components/navigation/stepper/Stepper.cjs.js.map +1 -1
- package/dist/components/navigation/stepper/Stepper.es.js +1 -1
- package/dist/components/navigation/stepper/Stepper.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 +15 -15
- package/dist/components/navigation/tabs/TabOptions.es.js.map +1 -1
- package/dist/components/navigation/tabs/TabSwitch.cjs.js +1 -1
- package/dist/components/navigation/tabs/TabSwitch.cjs.js.map +1 -1
- package/dist/components/navigation/tabs/TabSwitch.es.js +7 -7
- package/dist/components/navigation/tabs/TabSwitch.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 +1 -1
- package/dist/components/navigation/tabs/Tabs.es.js.map +1 -1
- package/dist/components/tooltip/Tooltip.cjs.js +1 -1
- package/dist/components/tooltip/Tooltip.cjs.js.map +1 -1
- package/dist/components/tooltip/Tooltip.es.js +19 -19
- package/dist/components/tooltip/Tooltip.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.d.ts +1 -1
- package/dist/components/user-avatar/UserAvatar.es.js +40 -38
- package/dist/components/user-avatar/UserAvatar.es.js.map +1 -1
- package/dist/components/user-avatar/constants.cjs.js +1 -1
- package/dist/components/user-avatar/constants.cjs.js.map +1 -1
- package/dist/components/user-avatar/constants.d.ts +1 -0
- package/dist/components/user-avatar/constants.es.js +10 -9
- package/dist/components/user-avatar/constants.es.js.map +1 -1
- package/dist/design-system.css +1 -1
- package/package.json +2 -3
|
@@ -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-3',\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 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,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),p=require("react"),w=require("antd"),
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),p=require("react"),w=require("antd"),c=require("../../hooks/useOS.cjs.js");;/* empty css */const N={auto:"top","auto-start":"topLeft","auto-end":"topRight",top:"top","top-start":"topLeft","top-end":"topRight",bottom:"bottom","bottom-start":"bottomLeft","bottom-end":"bottomRight",right:"right","right-start":"rightTop","right-end":"rightBottom",left:"left","left-start":"leftTop","left-end":"leftBottom"},R=({children:d,title:s,hideTooltip:m=!1,delayShow:x=!1,whiteSpace:f="initial",placement:u="top",className:g,shortcuts:r,open:b,onOpenChange:h})=>{const i=c.useOS(),n=p.useMemo(()=>r?c.mapShortcutKeys(r,i):void 0,[r,i]),y=N[u],a=p.useMemo(()=>{if(!n)return[];const t={};return n.map(o=>(t[o]=(t[o]??0)+1,{id:`${o}-${t[o]}`,label:o}))},[n]),j=e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"flex-1 min-w-0",children:s}),a.length>0&&e.jsx("span",{className:"flex items-center gap-0.5 flex-shrink-0",children:a.map(t=>e.jsx("kbd",{className:"inline-flex items-center justify-center min-w-[20px] h-5 px-1 rounded text-[11px] font-medium leading-none",style:{backgroundColor:"rgba(255, 255, 255, 0.1)",border:"1px solid rgba(255, 255, 255, 0.2)",color:"rgba(255, 255, 255, 0.8)"},children:t.label},t.id))})]}),l=e.jsx("span",{className:g,children:d});return m?l:e.jsx(w.Tooltip,{title:s?j:null,placement:y,trigger:["hover"],mouseEnterDelay:x?1:0,mouseLeaveDelay:0,color:"#101828",open:b,onOpenChange:h,classNames:{body:"lax-tooltip-body-important-whitespace flex items-center justify-center"},styles:{body:{"--lax-tooltip-white-space":f,borderRadius:8,border:"1px solid #252525",boxShadow:"0 2px 4px rgba(0, 0, 0, 0.18)",color:"#fff",maxWidth:"40ch",fontSize:12,fontWeight:500,wordWrap:"break-word",padding:"4px 8px"}},children:l})};module.exports=R;
|
|
2
2
|
//# sourceMappingURL=Tooltip.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.cjs.js","sources":["../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useMemo } from 'react';\nimport { Tooltip as AntdTooltip } from 'antd';\nimport type { TooltipProps as AntdTooltipProps } from 'antd';\nimport { mapShortcutKeys, useOS } from '../../hooks/useOS';\nimport './Tooltip.css';\n\nexport type TooltipPlacement =\n | 'auto'\n | 'auto-start'\n | 'auto-end'\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end';\n\nexport interface TooltipProps {\n title: React.ReactNode;\n placement?: TooltipPlacement;\n children: React.ReactNode;\n className?: string;\n hideTooltip?: boolean;\n delayShow?: boolean;\n whiteSpace?: 'normal' | 'nowrap' | 'pre' | 'pre-wrap' | 'pre-line' | 'initial' | 'inherit';\n /** Array of keyboard shortcut keys to display (e.g., ['Cmd', 'S'] or ['Ctrl', 'Enter']) */\n shortcuts?: string[];\n /** Controlled visibility state */\n open?: boolean;\n /** Callback fired when visibility changes */\n onOpenChange?: (open: boolean) => void;\n}\n\nconst placementMap: Record<TooltipPlacement, AntdTooltipProps['placement']> = {\n auto: 'top',\n 'auto-start': 'topLeft',\n 'auto-end': 'topRight',\n top: 'top',\n 'top-start': 'topLeft',\n 'top-end': 'topRight',\n bottom: 'bottom',\n 'bottom-start': 'bottomLeft',\n 'bottom-end': 'bottomRight',\n right: 'right',\n 'right-start': 'rightTop',\n 'right-end': 'rightBottom',\n left: 'left',\n 'left-start': 'leftTop',\n 'left-end': 'leftBottom',\n};\n\nconst Tooltip = ({\n children,\n title,\n hideTooltip = false,\n delayShow = false,\n whiteSpace = 'initial',\n placement = 'top',\n className,\n shortcuts,\n open,\n onOpenChange,\n}: TooltipProps) => {\n const os = useOS();\n const mappedShortcuts = useMemo(\n () => (shortcuts ? mapShortcutKeys(shortcuts, os) : undefined),\n [shortcuts, os]\n );\n const tooltipPlacement = placementMap[placement];\n const shortcutKeys = useMemo(() => {\n if (!mappedShortcuts) return [];\n const counts: Record<string, number> = {};\n return mappedShortcuts.map((shortcut) => {\n counts[shortcut] = (counts[shortcut] ?? 0) + 1;\n return { id: `${shortcut}-${counts[shortcut]}`, label: shortcut };\n });\n }, [mappedShortcuts]);\n\n const tooltipContent = (\n <div className=\"flex items-center gap-2\">\n <span className=\"flex-1 min-w-0\">{title}</span>\n {shortcutKeys.length > 0 && (\n <span className=\"flex items-center gap-0.5 flex-shrink-0\">\n {shortcutKeys.map((shortcut) => (\n <kbd\n key={shortcut.id}\n className=\"inline-flex items-center justify-center min-w-[20px] h-5 px-1 rounded text-[11px] font-medium leading-none\"\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n color: 'rgba(255, 255, 255, 0.8)',\n }}\n >\n {shortcut.label}\n </kbd>\n ))}\n </span>\n )}\n </div>\n );\n\n const triggerNode = <span className={className}>{children}</span>;\n\n if (hideTooltip) {\n return triggerNode;\n }\n\n return (\n <AntdTooltip\n title={title ? tooltipContent : null}\n placement={tooltipPlacement}\n trigger={['hover']}\n mouseEnterDelay={delayShow ? 1 : 0}\n mouseLeaveDelay={0}\n color=\"#101828\"\n open={open}\n onOpenChange={onOpenChange}\n classNames={{\n body: 'lax-tooltip-body-important-whitespace',\n }}\n styles={{\n body: ({\n ['--lax-tooltip-white-space' as string]: whiteSpace,\n borderRadius: 8,\n border: '1px solid #252525',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.18)',\n color: '#fff',\n maxWidth: '40ch',\n fontSize: 12,\n fontWeight: 500,\n wordWrap: 'break-word',\n padding: '4px 8px',\n } as React.CSSProperties),\n }}\n >\n {triggerNode}\n </AntdTooltip>\n );\n};\n\nexport default Tooltip;"],"names":["placementMap","Tooltip","children","title","hideTooltip","delayShow","whiteSpace","placement","className","shortcuts","open","onOpenChange","os","useOS","mappedShortcuts","useMemo","mapShortcutKeys","tooltipPlacement","shortcutKeys","counts","shortcut","tooltipContent","jsxs","jsx","triggerNode","AntdTooltip"],"mappings":"6JAwCA,MAAMA,EAAwE,CAC5E,KAAM,MACN,aAAc,UACd,WAAY,WACZ,IAAK,MACL,YAAa,UACb,UAAW,WACX,OAAQ,SACR,eAAgB,aAChB,aAAc,cACd,MAAO,QACP,cAAe,WACf,YAAa,cACb,KAAM,OACN,aAAc,UACd,WAAY,YACd,EAEMC,EAAU,CAAC,CACf,SAAAC,EACA,MAAAC,EACA,YAAAC,EAAc,GACd,UAAAC,EAAY,GACZ,WAAAC,EAAa,UACb,UAAAC,EAAY,MACZ,UAAAC,EACA,UAAAC,EACA,KAAAC,EACA,aAAAC,CACF,IAAoB,CAClB,MAAMC,EAAKC,EAAAA,MAAA,EACLC,EAAkBC,EAAAA,QACtB,IAAON,EAAYO,EAAAA,gBAAgBP,EAAWG,CAAE,EAAI,OACpD,CAACH,EAAWG,CAAE,CAAA,EAEVK,EAAmBjB,EAAaO,CAAS,EACzCW,EAAeH,EAAAA,QAAQ,IAAM,CACjC,GAAI,CAACD,EAAiB,MAAO,CAAA,EAC7B,MAAMK,EAAiC,CAAA,EACvC,OAAOL,EAAgB,IAAKM,IAC1BD,EAAOC,CAAQ,GAAKD,EAAOC,CAAQ,GAAK,GAAK,EACtC,CAAE,GAAI,GAAGA,CAAQ,IAAID,EAAOC,CAAQ,CAAC,GAAI,MAAOA,CAAA,EACxD,CACH,EAAG,CAACN,CAAe,CAAC,EAEdO,EACJC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,iBAAkB,SAAApB,EAAM,EACvCe,EAAa,OAAS,GACrBK,EAAAA,IAAC,OAAA,CAAK,UAAU,0CACb,SAAAL,EAAa,IAAKE,GACjBG,EAAAA,IAAC,MAAA,CAEC,UAAU,6GACV,MAAO,CACL,gBAAiB,2BACjB,OAAQ,qCACR,MAAO,0BAAA,EAGR,SAAAH,EAAS,KAAA,EARLA,EAAS,EAAA,CAUjB,CAAA,CACH,CAAA,EAEJ,EAGII,EAAcD,EAAAA,IAAC,OAAA,CAAK,UAAAf,EAAuB,SAAAN,CAAA,CAAS,EAE1D,OAAIE,EACKoB,EAIPD,EAAAA,IAACE,EAAAA,QAAA,CACC,MAAOtB,EAAQkB,EAAiB,KAChC,UAAWJ,EACX,QAAS,CAAC,OAAO,EACjB,gBAAiBZ,EAAY,EAAI,EACjC,gBAAiB,EACjB,MAAM,UACN,KAAAK,EACA,aAAAC,EACA,WAAY,CACV,KAAM,
|
|
1
|
+
{"version":3,"file":"Tooltip.cjs.js","sources":["../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useMemo } from 'react';\nimport { Tooltip as AntdTooltip } from 'antd';\nimport type { TooltipProps as AntdTooltipProps } from 'antd';\nimport { mapShortcutKeys, useOS } from '../../hooks/useOS';\nimport './Tooltip.css';\n\nexport type TooltipPlacement =\n | 'auto'\n | 'auto-start'\n | 'auto-end'\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end';\n\nexport interface TooltipProps {\n title: React.ReactNode;\n placement?: TooltipPlacement;\n children: React.ReactNode;\n className?: string;\n hideTooltip?: boolean;\n delayShow?: boolean;\n whiteSpace?: 'normal' | 'nowrap' | 'pre' | 'pre-wrap' | 'pre-line' | 'initial' | 'inherit';\n /** Array of keyboard shortcut keys to display (e.g., ['Cmd', 'S'] or ['Ctrl', 'Enter']) */\n shortcuts?: string[];\n /** Controlled visibility state */\n open?: boolean;\n /** Callback fired when visibility changes */\n onOpenChange?: (open: boolean) => void;\n}\n\nconst placementMap: Record<TooltipPlacement, AntdTooltipProps['placement']> = {\n auto: 'top',\n 'auto-start': 'topLeft',\n 'auto-end': 'topRight',\n top: 'top',\n 'top-start': 'topLeft',\n 'top-end': 'topRight',\n bottom: 'bottom',\n 'bottom-start': 'bottomLeft',\n 'bottom-end': 'bottomRight',\n right: 'right',\n 'right-start': 'rightTop',\n 'right-end': 'rightBottom',\n left: 'left',\n 'left-start': 'leftTop',\n 'left-end': 'leftBottom',\n};\n\nconst Tooltip = ({\n children,\n title,\n hideTooltip = false,\n delayShow = false,\n whiteSpace = 'initial',\n placement = 'top',\n className,\n shortcuts,\n open,\n onOpenChange,\n}: TooltipProps) => {\n const os = useOS();\n const mappedShortcuts = useMemo(\n () => (shortcuts ? mapShortcutKeys(shortcuts, os) : undefined),\n [shortcuts, os]\n );\n const tooltipPlacement = placementMap[placement];\n const shortcutKeys = useMemo(() => {\n if (!mappedShortcuts) return [];\n const counts: Record<string, number> = {};\n return mappedShortcuts.map((shortcut) => {\n counts[shortcut] = (counts[shortcut] ?? 0) + 1;\n return { id: `${shortcut}-${counts[shortcut]}`, label: shortcut };\n });\n }, [mappedShortcuts]);\n\n const tooltipContent = (\n <div className=\"flex items-center gap-2\">\n <span className=\"flex-1 min-w-0\">{title}</span>\n {shortcutKeys.length > 0 && (\n <span className=\"flex items-center gap-0.5 flex-shrink-0\">\n {shortcutKeys.map((shortcut) => (\n <kbd\n key={shortcut.id}\n className=\"inline-flex items-center justify-center min-w-[20px] h-5 px-1 rounded text-[11px] font-medium leading-none\"\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n color: 'rgba(255, 255, 255, 0.8)',\n }}\n >\n {shortcut.label}\n </kbd>\n ))}\n </span>\n )}\n </div>\n );\n\n const triggerNode = <span className={className}>{children}</span>;\n\n if (hideTooltip) {\n return triggerNode;\n }\n\n return (\n <AntdTooltip\n title={title ? tooltipContent : null}\n placement={tooltipPlacement}\n trigger={['hover']}\n mouseEnterDelay={delayShow ? 1 : 0}\n mouseLeaveDelay={0}\n color=\"#101828\"\n open={open}\n onOpenChange={onOpenChange}\n classNames={{\n body: 'lax-tooltip-body-important-whitespace flex items-center justify-center',\n }}\n styles={{\n body: ({\n ['--lax-tooltip-white-space' as string]: whiteSpace,\n borderRadius: 8,\n border: '1px solid #252525',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.18)',\n color: '#fff',\n maxWidth: '40ch',\n fontSize: 12,\n fontWeight: 500,\n wordWrap: 'break-word',\n padding: '4px 8px',\n } as React.CSSProperties),\n }}\n >\n {triggerNode}\n </AntdTooltip>\n );\n};\n\nexport default Tooltip;"],"names":["placementMap","Tooltip","children","title","hideTooltip","delayShow","whiteSpace","placement","className","shortcuts","open","onOpenChange","os","useOS","mappedShortcuts","useMemo","mapShortcutKeys","tooltipPlacement","shortcutKeys","counts","shortcut","tooltipContent","jsxs","jsx","triggerNode","AntdTooltip"],"mappings":"6JAwCA,MAAMA,EAAwE,CAC5E,KAAM,MACN,aAAc,UACd,WAAY,WACZ,IAAK,MACL,YAAa,UACb,UAAW,WACX,OAAQ,SACR,eAAgB,aAChB,aAAc,cACd,MAAO,QACP,cAAe,WACf,YAAa,cACb,KAAM,OACN,aAAc,UACd,WAAY,YACd,EAEMC,EAAU,CAAC,CACf,SAAAC,EACA,MAAAC,EACA,YAAAC,EAAc,GACd,UAAAC,EAAY,GACZ,WAAAC,EAAa,UACb,UAAAC,EAAY,MACZ,UAAAC,EACA,UAAAC,EACA,KAAAC,EACA,aAAAC,CACF,IAAoB,CAClB,MAAMC,EAAKC,EAAAA,MAAA,EACLC,EAAkBC,EAAAA,QACtB,IAAON,EAAYO,EAAAA,gBAAgBP,EAAWG,CAAE,EAAI,OACpD,CAACH,EAAWG,CAAE,CAAA,EAEVK,EAAmBjB,EAAaO,CAAS,EACzCW,EAAeH,EAAAA,QAAQ,IAAM,CACjC,GAAI,CAACD,EAAiB,MAAO,CAAA,EAC7B,MAAMK,EAAiC,CAAA,EACvC,OAAOL,EAAgB,IAAKM,IAC1BD,EAAOC,CAAQ,GAAKD,EAAOC,CAAQ,GAAK,GAAK,EACtC,CAAE,GAAI,GAAGA,CAAQ,IAAID,EAAOC,CAAQ,CAAC,GAAI,MAAOA,CAAA,EACxD,CACH,EAAG,CAACN,CAAe,CAAC,EAEdO,EACJC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,iBAAkB,SAAApB,EAAM,EACvCe,EAAa,OAAS,GACrBK,EAAAA,IAAC,OAAA,CAAK,UAAU,0CACb,SAAAL,EAAa,IAAKE,GACjBG,EAAAA,IAAC,MAAA,CAEC,UAAU,6GACV,MAAO,CACL,gBAAiB,2BACjB,OAAQ,qCACR,MAAO,0BAAA,EAGR,SAAAH,EAAS,KAAA,EARLA,EAAS,EAAA,CAUjB,CAAA,CACH,CAAA,EAEJ,EAGII,EAAcD,EAAAA,IAAC,OAAA,CAAK,UAAAf,EAAuB,SAAAN,CAAA,CAAS,EAE1D,OAAIE,EACKoB,EAIPD,EAAAA,IAACE,EAAAA,QAAA,CACC,MAAOtB,EAAQkB,EAAiB,KAChC,UAAWJ,EACX,QAAS,CAAC,OAAO,EACjB,gBAAiBZ,EAAY,EAAI,EACjC,gBAAiB,EACjB,MAAM,UACN,KAAAK,EACA,aAAAC,EACA,WAAY,CACV,KAAM,wEAAA,EAER,OAAQ,CACN,KAAO,CACJ,4BAAwCL,EACzC,aAAc,EACd,OAAQ,oBACR,UAAW,gCACX,MAAO,OACP,SAAU,OACV,SAAU,GACV,WAAY,IACZ,SAAU,aACV,QAAS,SAAA,CACX,EAGD,SAAAkB,CAAA,CAAA,CAGP"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { jsxs as w, jsx as
|
|
1
|
+
import { jsxs as w, jsx as o } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo as s } from "react";
|
|
3
3
|
import { Tooltip as N } from "antd";
|
|
4
4
|
import { useOS as S, mapShortcutKeys as T } from "../../hooks/useOS.es.js";
|
|
5
5
|
/* empty css */
|
|
6
|
-
const
|
|
6
|
+
const j = {
|
|
7
7
|
auto: "top",
|
|
8
8
|
"auto-start": "topLeft",
|
|
9
9
|
"auto-end": "topRight",
|
|
@@ -21,26 +21,26 @@ const k = {
|
|
|
21
21
|
"left-end": "leftBottom"
|
|
22
22
|
}, $ = ({
|
|
23
23
|
children: m,
|
|
24
|
-
title:
|
|
24
|
+
title: a,
|
|
25
25
|
hideTooltip: d = !1,
|
|
26
26
|
delayShow: c = !1,
|
|
27
27
|
whiteSpace: f = "initial",
|
|
28
28
|
placement: g = "top",
|
|
29
|
-
className:
|
|
29
|
+
className: x,
|
|
30
30
|
shortcuts: r,
|
|
31
|
-
open:
|
|
31
|
+
open: b,
|
|
32
32
|
onOpenChange: h
|
|
33
33
|
}) => {
|
|
34
|
-
const
|
|
35
|
-
() => r ? T(r,
|
|
36
|
-
[r,
|
|
37
|
-
), u =
|
|
38
|
-
if (!
|
|
34
|
+
const n = S(), i = s(
|
|
35
|
+
() => r ? T(r, n) : void 0,
|
|
36
|
+
[r, n]
|
|
37
|
+
), u = j[g], l = s(() => {
|
|
38
|
+
if (!i) return [];
|
|
39
39
|
const t = {};
|
|
40
|
-
return
|
|
41
|
-
}, [
|
|
42
|
-
/* @__PURE__ */
|
|
43
|
-
|
|
40
|
+
return i.map((e) => (t[e] = (t[e] ?? 0) + 1, { id: `${e}-${t[e]}`, label: e }));
|
|
41
|
+
}, [i]), y = /* @__PURE__ */ w("div", { className: "flex items-center gap-2", children: [
|
|
42
|
+
/* @__PURE__ */ o("span", { className: "flex-1 min-w-0", children: a }),
|
|
43
|
+
l.length > 0 && /* @__PURE__ */ o("span", { className: "flex items-center gap-0.5 flex-shrink-0", children: l.map((t) => /* @__PURE__ */ o(
|
|
44
44
|
"kbd",
|
|
45
45
|
{
|
|
46
46
|
className: "inline-flex items-center justify-center min-w-[20px] h-5 px-1 rounded text-[11px] font-medium leading-none",
|
|
@@ -53,20 +53,20 @@ const k = {
|
|
|
53
53
|
},
|
|
54
54
|
t.id
|
|
55
55
|
)) })
|
|
56
|
-
] }), p = /* @__PURE__ */
|
|
57
|
-
return d ? p : /* @__PURE__ */
|
|
56
|
+
] }), p = /* @__PURE__ */ o("span", { className: x, children: m });
|
|
57
|
+
return d ? p : /* @__PURE__ */ o(
|
|
58
58
|
N,
|
|
59
59
|
{
|
|
60
|
-
title:
|
|
60
|
+
title: a ? y : null,
|
|
61
61
|
placement: u,
|
|
62
62
|
trigger: ["hover"],
|
|
63
63
|
mouseEnterDelay: c ? 1 : 0,
|
|
64
64
|
mouseLeaveDelay: 0,
|
|
65
65
|
color: "#101828",
|
|
66
|
-
open:
|
|
66
|
+
open: b,
|
|
67
67
|
onOpenChange: h,
|
|
68
68
|
classNames: {
|
|
69
|
-
body: "lax-tooltip-body-important-whitespace"
|
|
69
|
+
body: "lax-tooltip-body-important-whitespace flex items-center justify-center"
|
|
70
70
|
},
|
|
71
71
|
styles: {
|
|
72
72
|
body: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.es.js","sources":["../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useMemo } from 'react';\nimport { Tooltip as AntdTooltip } from 'antd';\nimport type { TooltipProps as AntdTooltipProps } from 'antd';\nimport { mapShortcutKeys, useOS } from '../../hooks/useOS';\nimport './Tooltip.css';\n\nexport type TooltipPlacement =\n | 'auto'\n | 'auto-start'\n | 'auto-end'\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end';\n\nexport interface TooltipProps {\n title: React.ReactNode;\n placement?: TooltipPlacement;\n children: React.ReactNode;\n className?: string;\n hideTooltip?: boolean;\n delayShow?: boolean;\n whiteSpace?: 'normal' | 'nowrap' | 'pre' | 'pre-wrap' | 'pre-line' | 'initial' | 'inherit';\n /** Array of keyboard shortcut keys to display (e.g., ['Cmd', 'S'] or ['Ctrl', 'Enter']) */\n shortcuts?: string[];\n /** Controlled visibility state */\n open?: boolean;\n /** Callback fired when visibility changes */\n onOpenChange?: (open: boolean) => void;\n}\n\nconst placementMap: Record<TooltipPlacement, AntdTooltipProps['placement']> = {\n auto: 'top',\n 'auto-start': 'topLeft',\n 'auto-end': 'topRight',\n top: 'top',\n 'top-start': 'topLeft',\n 'top-end': 'topRight',\n bottom: 'bottom',\n 'bottom-start': 'bottomLeft',\n 'bottom-end': 'bottomRight',\n right: 'right',\n 'right-start': 'rightTop',\n 'right-end': 'rightBottom',\n left: 'left',\n 'left-start': 'leftTop',\n 'left-end': 'leftBottom',\n};\n\nconst Tooltip = ({\n children,\n title,\n hideTooltip = false,\n delayShow = false,\n whiteSpace = 'initial',\n placement = 'top',\n className,\n shortcuts,\n open,\n onOpenChange,\n}: TooltipProps) => {\n const os = useOS();\n const mappedShortcuts = useMemo(\n () => (shortcuts ? mapShortcutKeys(shortcuts, os) : undefined),\n [shortcuts, os]\n );\n const tooltipPlacement = placementMap[placement];\n const shortcutKeys = useMemo(() => {\n if (!mappedShortcuts) return [];\n const counts: Record<string, number> = {};\n return mappedShortcuts.map((shortcut) => {\n counts[shortcut] = (counts[shortcut] ?? 0) + 1;\n return { id: `${shortcut}-${counts[shortcut]}`, label: shortcut };\n });\n }, [mappedShortcuts]);\n\n const tooltipContent = (\n <div className=\"flex items-center gap-2\">\n <span className=\"flex-1 min-w-0\">{title}</span>\n {shortcutKeys.length > 0 && (\n <span className=\"flex items-center gap-0.5 flex-shrink-0\">\n {shortcutKeys.map((shortcut) => (\n <kbd\n key={shortcut.id}\n className=\"inline-flex items-center justify-center min-w-[20px] h-5 px-1 rounded text-[11px] font-medium leading-none\"\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n color: 'rgba(255, 255, 255, 0.8)',\n }}\n >\n {shortcut.label}\n </kbd>\n ))}\n </span>\n )}\n </div>\n );\n\n const triggerNode = <span className={className}>{children}</span>;\n\n if (hideTooltip) {\n return triggerNode;\n }\n\n return (\n <AntdTooltip\n title={title ? tooltipContent : null}\n placement={tooltipPlacement}\n trigger={['hover']}\n mouseEnterDelay={delayShow ? 1 : 0}\n mouseLeaveDelay={0}\n color=\"#101828\"\n open={open}\n onOpenChange={onOpenChange}\n classNames={{\n body: 'lax-tooltip-body-important-whitespace',\n }}\n styles={{\n body: ({\n ['--lax-tooltip-white-space' as string]: whiteSpace,\n borderRadius: 8,\n border: '1px solid #252525',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.18)',\n color: '#fff',\n maxWidth: '40ch',\n fontSize: 12,\n fontWeight: 500,\n wordWrap: 'break-word',\n padding: '4px 8px',\n } as React.CSSProperties),\n }}\n >\n {triggerNode}\n </AntdTooltip>\n );\n};\n\nexport default Tooltip;"],"names":["placementMap","Tooltip","children","title","hideTooltip","delayShow","whiteSpace","placement","className","shortcuts","open","onOpenChange","os","useOS","mappedShortcuts","useMemo","mapShortcutKeys","tooltipPlacement","shortcutKeys","counts","shortcut","tooltipContent","jsxs","jsx","triggerNode","AntdTooltip"],"mappings":";;;;;AAwCA,MAAMA,IAAwE;AAAA,EAC5E,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,eAAe;AAAA,EACf,aAAa;AAAA,EACb,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AACd,GAEMC,IAAU,CAAC;AAAA,EACf,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AAAA,EACZ,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,MAAAC;AAAA,EACA,cAAAC;AACF,MAAoB;AAClB,QAAMC,IAAKC,EAAA,GACLC,IAAkBC;AAAA,IACtB,MAAON,IAAYO,EAAgBP,GAAWG,CAAE,IAAI;AAAA,IACpD,CAACH,GAAWG,CAAE;AAAA,EAAA,GAEVK,IAAmBjB,EAAaO,CAAS,GACzCW,IAAeH,EAAQ,MAAM;AACjC,QAAI,CAACD,EAAiB,QAAO,CAAA;AAC7B,UAAMK,IAAiC,CAAA;AACvC,WAAOL,EAAgB,IAAI,CAACM,OAC1BD,EAAOC,CAAQ,KAAKD,EAAOC,CAAQ,KAAK,KAAK,GACtC,EAAE,IAAI,GAAGA,CAAQ,IAAID,EAAOC,CAAQ,CAAC,IAAI,OAAOA,EAAA,EACxD;AAAA,EACH,GAAG,CAACN,CAAe,CAAC,GAEdO,IACJ,gBAAAC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAApB,GAAM;AAAA,IACvCe,EAAa,SAAS,KACrB,gBAAAK,EAAC,QAAA,EAAK,WAAU,2CACb,UAAAL,EAAa,IAAI,CAACE,MACjB,gBAAAG;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,OAAO;AAAA,QAAA;AAAA,QAGR,UAAAH,EAAS;AAAA,MAAA;AAAA,MARLA,EAAS;AAAA,IAAA,CAUjB,EAAA,CACH;AAAA,EAAA,GAEJ,GAGII,IAAc,gBAAAD,EAAC,QAAA,EAAK,WAAAf,GAAuB,UAAAN,EAAA,CAAS;AAE1D,SAAIE,IACKoB,IAIP,gBAAAD;AAAA,IAACE;AAAAA,IAAA;AAAA,MACC,OAAOtB,IAAQkB,IAAiB;AAAA,MAChC,WAAWJ;AAAA,MACX,SAAS,CAAC,OAAO;AAAA,MACjB,iBAAiBZ,IAAY,IAAI;AAAA,MACjC,iBAAiB;AAAA,MACjB,OAAM;AAAA,MACN,MAAAK;AAAA,MACA,cAAAC;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,MAAA;AAAA,MAER,QAAQ;AAAA,QACN,MAAO;AAAA,UACJ,6BAAwCL;AAAA,UACzC,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,MAGD,UAAAkB;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
1
|
+
{"version":3,"file":"Tooltip.es.js","sources":["../../../src/components/tooltip/Tooltip.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useMemo } from 'react';\nimport { Tooltip as AntdTooltip } from 'antd';\nimport type { TooltipProps as AntdTooltipProps } from 'antd';\nimport { mapShortcutKeys, useOS } from '../../hooks/useOS';\nimport './Tooltip.css';\n\nexport type TooltipPlacement =\n | 'auto'\n | 'auto-start'\n | 'auto-end'\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'left'\n | 'left-start'\n | 'left-end';\n\nexport interface TooltipProps {\n title: React.ReactNode;\n placement?: TooltipPlacement;\n children: React.ReactNode;\n className?: string;\n hideTooltip?: boolean;\n delayShow?: boolean;\n whiteSpace?: 'normal' | 'nowrap' | 'pre' | 'pre-wrap' | 'pre-line' | 'initial' | 'inherit';\n /** Array of keyboard shortcut keys to display (e.g., ['Cmd', 'S'] or ['Ctrl', 'Enter']) */\n shortcuts?: string[];\n /** Controlled visibility state */\n open?: boolean;\n /** Callback fired when visibility changes */\n onOpenChange?: (open: boolean) => void;\n}\n\nconst placementMap: Record<TooltipPlacement, AntdTooltipProps['placement']> = {\n auto: 'top',\n 'auto-start': 'topLeft',\n 'auto-end': 'topRight',\n top: 'top',\n 'top-start': 'topLeft',\n 'top-end': 'topRight',\n bottom: 'bottom',\n 'bottom-start': 'bottomLeft',\n 'bottom-end': 'bottomRight',\n right: 'right',\n 'right-start': 'rightTop',\n 'right-end': 'rightBottom',\n left: 'left',\n 'left-start': 'leftTop',\n 'left-end': 'leftBottom',\n};\n\nconst Tooltip = ({\n children,\n title,\n hideTooltip = false,\n delayShow = false,\n whiteSpace = 'initial',\n placement = 'top',\n className,\n shortcuts,\n open,\n onOpenChange,\n}: TooltipProps) => {\n const os = useOS();\n const mappedShortcuts = useMemo(\n () => (shortcuts ? mapShortcutKeys(shortcuts, os) : undefined),\n [shortcuts, os]\n );\n const tooltipPlacement = placementMap[placement];\n const shortcutKeys = useMemo(() => {\n if (!mappedShortcuts) return [];\n const counts: Record<string, number> = {};\n return mappedShortcuts.map((shortcut) => {\n counts[shortcut] = (counts[shortcut] ?? 0) + 1;\n return { id: `${shortcut}-${counts[shortcut]}`, label: shortcut };\n });\n }, [mappedShortcuts]);\n\n const tooltipContent = (\n <div className=\"flex items-center gap-2\">\n <span className=\"flex-1 min-w-0\">{title}</span>\n {shortcutKeys.length > 0 && (\n <span className=\"flex items-center gap-0.5 flex-shrink-0\">\n {shortcutKeys.map((shortcut) => (\n <kbd\n key={shortcut.id}\n className=\"inline-flex items-center justify-center min-w-[20px] h-5 px-1 rounded text-[11px] font-medium leading-none\"\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n color: 'rgba(255, 255, 255, 0.8)',\n }}\n >\n {shortcut.label}\n </kbd>\n ))}\n </span>\n )}\n </div>\n );\n\n const triggerNode = <span className={className}>{children}</span>;\n\n if (hideTooltip) {\n return triggerNode;\n }\n\n return (\n <AntdTooltip\n title={title ? tooltipContent : null}\n placement={tooltipPlacement}\n trigger={['hover']}\n mouseEnterDelay={delayShow ? 1 : 0}\n mouseLeaveDelay={0}\n color=\"#101828\"\n open={open}\n onOpenChange={onOpenChange}\n classNames={{\n body: 'lax-tooltip-body-important-whitespace flex items-center justify-center',\n }}\n styles={{\n body: ({\n ['--lax-tooltip-white-space' as string]: whiteSpace,\n borderRadius: 8,\n border: '1px solid #252525',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.18)',\n color: '#fff',\n maxWidth: '40ch',\n fontSize: 12,\n fontWeight: 500,\n wordWrap: 'break-word',\n padding: '4px 8px',\n } as React.CSSProperties),\n }}\n >\n {triggerNode}\n </AntdTooltip>\n );\n};\n\nexport default Tooltip;"],"names":["placementMap","Tooltip","children","title","hideTooltip","delayShow","whiteSpace","placement","className","shortcuts","open","onOpenChange","os","useOS","mappedShortcuts","useMemo","mapShortcutKeys","tooltipPlacement","shortcutKeys","counts","shortcut","tooltipContent","jsxs","jsx","triggerNode","AntdTooltip"],"mappings":";;;;;AAwCA,MAAMA,IAAwE;AAAA,EAC5E,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,eAAe;AAAA,EACf,aAAa;AAAA,EACb,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY;AACd,GAEMC,IAAU,CAAC;AAAA,EACf,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AAAA,EACZ,YAAAC,IAAa;AAAA,EACb,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,MAAAC;AAAA,EACA,cAAAC;AACF,MAAoB;AAClB,QAAMC,IAAKC,EAAA,GACLC,IAAkBC;AAAA,IACtB,MAAON,IAAYO,EAAgBP,GAAWG,CAAE,IAAI;AAAA,IACpD,CAACH,GAAWG,CAAE;AAAA,EAAA,GAEVK,IAAmBjB,EAAaO,CAAS,GACzCW,IAAeH,EAAQ,MAAM;AACjC,QAAI,CAACD,EAAiB,QAAO,CAAA;AAC7B,UAAMK,IAAiC,CAAA;AACvC,WAAOL,EAAgB,IAAI,CAACM,OAC1BD,EAAOC,CAAQ,KAAKD,EAAOC,CAAQ,KAAK,KAAK,GACtC,EAAE,IAAI,GAAGA,CAAQ,IAAID,EAAOC,CAAQ,CAAC,IAAI,OAAOA,EAAA,EACxD;AAAA,EACH,GAAG,CAACN,CAAe,CAAC,GAEdO,IACJ,gBAAAC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,QAAA,EAAK,WAAU,kBAAkB,UAAApB,GAAM;AAAA,IACvCe,EAAa,SAAS,KACrB,gBAAAK,EAAC,QAAA,EAAK,WAAU,2CACb,UAAAL,EAAa,IAAI,CAACE,MACjB,gBAAAG;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,OAAO;AAAA,QAAA;AAAA,QAGR,UAAAH,EAAS;AAAA,MAAA;AAAA,MARLA,EAAS;AAAA,IAAA,CAUjB,EAAA,CACH;AAAA,EAAA,GAEJ,GAGII,IAAc,gBAAAD,EAAC,QAAA,EAAK,WAAAf,GAAuB,UAAAN,EAAA,CAAS;AAE1D,SAAIE,IACKoB,IAIP,gBAAAD;AAAA,IAACE;AAAAA,IAAA;AAAA,MACC,OAAOtB,IAAQkB,IAAiB;AAAA,MAChC,WAAWJ;AAAA,MACX,SAAS,CAAC,OAAO;AAAA,MACjB,iBAAiBZ,IAAY,IAAI;AAAA,MACjC,iBAAiB;AAAA,MACjB,OAAM;AAAA,MACN,MAAAK;AAAA,MACA,cAAAC;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,MAAA;AAAA,MAER,QAAQ;AAAA,QACN,MAAO;AAAA,UACJ,6BAAwCL;AAAA,UACzC,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,MAGD,UAAAkB;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -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"),n=require("react"),d=require("../data-display/typography/Typography.cjs.js"),g=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"),x=require("./constants.cjs.js"),se=require("./PersonIcon.cjs.js"),ne=require("./useDynamicPosition.cjs.js"),j=({label:t,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:t}),l]}),H=({firstName:t,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(t==="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]=n.useState(!1),[M,i]=n.useState(!1),J=x.sizeClasses[N],{triggerRef:K,dropdownRef:Q,position:f,isVisible:X,show:S,hide:q}=ne.useDynamicPosition(),k=n.useRef({}),I=n.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"};n.useEffect(()=>{if(c)if(k.current[c])i(!0);else{i(!1);const a=new Image,p=R||(typeof localStorage<"u"?localStorage.getItem("token"):null);a.src=c+(p?"?token="+p:""),a.onload=()=>{k.current[c]=a.src,i(!0)},a.onerror=()=>{i(!1)}}else i(!1)},[c,R]),n.useEffect(()=>()=>{s.current&&clearTimeout(s.current)},[]);const y=c?k.current[c]:void 0,s=n.useRef(null),w=n.useRef(null),Z=()=>{G?.(),t&&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",x.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:x.getInitials((t||"")+" "+(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:[t||""," ",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(g.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(g.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,p)=>e.jsx("div",{className:"my-2",children:e.jsx(g.Tag,{label:a?.name,color:a?.color||"#4A5568",size:"md",isHashColor:!0,className:"w-fit"},a?.id)},a?.id||p))})]})]})}),r?.group&&e.jsx(j,{label:"Role",content:e.jsx(g.Tag,{label:r?.group,color:"#004094",size:"md",isHashColor:!0},r?.group)}),r?.clearanceLevel&&e.jsx(j,{label:"Clearance Level",content:e.jsx(g.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=n.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)}):t&&l?e.jsx("div",{className:o("bg-primary-100 text-primary-600 flex items-center justify-center rounded-full border dark:bg-black-700",x.sizeClasses[N],b),children:x.getInitials((t||"")+" "+(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
|