@lax-wp/design-system 0.13.75 → 0.13.76

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.
Files changed (25) hide show
  1. package/dist/components/data-display/infinite-table/body/cell/DataCell.cjs.js +1 -1
  2. package/dist/components/data-display/infinite-table/body/cell/DataCell.cjs.js.map +1 -1
  3. package/dist/components/data-display/infinite-table/body/cell/DataCell.es.js +24 -24
  4. package/dist/components/data-display/infinite-table/body/cell/DataCell.es.js.map +1 -1
  5. package/dist/components/data-display/infinite-table/body/cell/InlineCurrencyField.cjs.js +1 -1
  6. package/dist/components/data-display/infinite-table/body/cell/InlineCurrencyField.cjs.js.map +1 -1
  7. package/dist/components/data-display/infinite-table/body/cell/InlineCurrencyField.es.js +2 -2
  8. package/dist/components/data-display/infinite-table/body/cell/InlineCurrencyField.es.js.map +1 -1
  9. package/dist/components/navigation/tabs/TabSwitch.cjs.js +1 -1
  10. package/dist/components/navigation/tabs/TabSwitch.cjs.js.map +1 -1
  11. package/dist/components/navigation/tabs/TabSwitch.es.js +57 -60
  12. package/dist/components/navigation/tabs/TabSwitch.es.js.map +1 -1
  13. package/dist/components/navigation/tabs/Tabs.cjs.js +1 -1
  14. package/dist/components/navigation/tabs/Tabs.cjs.js.map +1 -1
  15. package/dist/components/navigation/tabs/Tabs.es.js +381 -402
  16. package/dist/components/navigation/tabs/Tabs.es.js.map +1 -1
  17. package/dist/hooks/useTextWidth.cjs.js +1 -1
  18. package/dist/hooks/useTextWidth.cjs.js.map +1 -1
  19. package/dist/hooks/useTextWidth.es.js +14 -11
  20. package/dist/hooks/useTextWidth.es.js.map +1 -1
  21. package/dist/utils/countryFlags.cjs.js +2 -2
  22. package/dist/utils/countryFlags.cjs.js.map +1 -1
  23. package/dist/utils/countryFlags.es.js +11 -12
  24. package/dist/utils/countryFlags.es.js.map +1 -1
  25. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.es.js","sources":["../../../../src/components/navigation/tabs/Tabs.tsx"],"sourcesContent":["import {\n DndContext,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport type { DragEndEvent, DragOverEvent, DragStartEvent } from '@dnd-kit/core';\nimport { SortableContext, horizontalListSortingStrategy, arrayMove } from '@dnd-kit/sortable';\nimport { Dropdown } from 'antd';\nimport classNames from 'classnames';\nimport { useCallback, useEffect, useLayoutEffect, 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\n// ── Overflow-math geometry ──\n// These mirror the classes rendered by TabSwitch / MoreButton / TabOptions.\n// The responsive calculation is exact, so if any of those classes change,\n// the matching constant here must change with them.\n/** Count badge box: pl-2 + pr-2 (16) + 1px border per side (2) + ml-2 (8) */\nconst BADGE_BOX_WIDTH = 26;\n/** `gap-1.5` between a tab's icon / title / badge */\nconst TAB_CONTENT_GAP = 6;\n/** Icon slot: PinIcon and tab icons render at 20px */\nconst TAB_ICON_WIDTH = 20;\n/** Active tab's three-dot menu: ghost IconButton p-1 (8) + 20px icon + gap-1 (4) */\nconst ACTIVE_TAB_MENU_WIDTH = 32;\n/** Overflow-pulled active tab's three-dot: bare 20px icon + gap-1 (4) */\nconst PULLED_TAB_MENU_WIDTH = 24;\n/** TabOptions gear: border-l (1) + pl-2 (8) + IconButton p-1 (8) + 20px icon */\nconst TAB_OPTIONS_GEAR_WIDTH = 37;\n/** Breakpoint behind the `sm:` paddings / margins used by tabs and the More button */\nconst SM_MEDIA_QUERY = '(min-width: 640px)';\n/** Slack for canvas-vs-layout subpixel rounding across the row */\nconst WIDTH_SAFETY_PX = 2;\n/** Tailwind's default `font-sans` stack — fallback until a tab is rendered */\nconst TAILWIND_SANS_STACK =\n 'ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif';\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 fontsSettledRef = useRef(false);\n const tabFontFamilyRef = useRef('');\n const { measureText, clearCache } = 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 // Icon presence changes a tab's width. Key on the names that actually have\n // an icon (not the ReactNode identities) so an inline `tabIcons` object\n // doesn't re-trigger the overflow calculation on every render.\n const tabIconNamesKey = JSON.stringify(\n Object.entries(tabIcons ?? {})\n .filter(([, node]) => node != null)\n .map(([name]) => name)\n .sort(),\n );\n const iconTabNames = useMemo(\n () => new Set<string>(JSON.parse(tabIconNamesKey)),\n [tabIconNamesKey],\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 // Exactly the items the More dropdown lists: overflowed visible tabs (minus\n // the pulled-out active one) plus hidden tabs.\n const moreButtonTabCounts =\n Math.max(0, sortedVisibleTabs.length - visibleTabSlice - (isActiveTabInsideMore ? 1 : 0)) +\n hiddenTabs.length;\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 // The tab text renders with `font-sans`, which resolves per consuming app —\n // read the computed stack from a rendered tab once so canvas measurement\n // uses exactly the rendered typeface.\n const resolveTabFontFamily = useCallback((): string => {\n if (tabFontFamilyRef.current) return tabFontFamilyRef.current;\n const span = tabsRef.current?.querySelector<HTMLElement>('[id^=\"btn-tabs-tabswitch-\"] span');\n const family = span ? getComputedStyle(span).fontFamily : '';\n if (family) tabFontFamilyRef.current = family;\n return family || TAILWIND_SANS_STACK;\n }, []);\n\n // Computes how many tabs fit by exact accounting of every flex child of the\n // <ul> — tabs, the pulled-out active tab, the More button, the options gear\n // and the right section — plus the flex gap between them. Two passes: all\n // tabs without a More button first (only possible when nothing is hidden),\n // otherwise the largest prefix that fits alongside the More button.\n const calculateVisibleTabs = useCallback(\n (containerWidth: number) => {\n if (!containerWidth) return;\n const tabCount = sortedVisibleTabs.length;\n if (showAllItems) {\n setVisibleTabCounts(tabCount);\n return;\n }\n\n const smUp = typeof window === 'undefined' || window.matchMedia(SM_MEDIA_QUERY).matches;\n const fontFamily = resolveTabFontFamily();\n const titleFont = { fontSize: '14px', fontWeight: '600', fontFamily }; // text-sm font-semibold\n const badgeFont = { fontSize: '12px', fontWeight: '400', fontFamily }; // text-xs font-normal\n\n // Width of one rendered tab: content + paddings + right margin. Mirrors\n // the classes in TabSwitch / getClasses(). `pulledOut` is the active tab\n // re-rendered from overflow (bare three-dot icon, always `sm:mr-2`).\n const measureTabWidth = (item: Tab<T>, pulledOut = false): number => {\n // Rendered uppercase (CSS `uppercase`) and translated by TabSwitch\n const titleWidth = iconsOnly ? 0 : measureText(t(item.name).toUpperCase(), titleFont);\n\n const suffixValue = suffixRecord?.[item.name];\n const badgeWidth =\n showCounts && suffixValue !== undefined\n ? measureText(String(suffixValue), badgeFont) +\n BADGE_BOX_WIDTH +\n (iconsOnly ? 0 : TAB_CONTENT_GAP)\n : 0;\n\n const hasIcon = (allowPin && item.is_pinned) || iconTabNames.has(item.name);\n const iconWidth = hasIcon ? TAB_ICON_WIDTH + (iconsOnly ? 0 : TAB_CONTENT_GAP) : 0;\n\n const menuWidth =\n draggable && item.name === activeTab\n ? pulledOut\n ? PULLED_TAB_MENU_WIDTH\n : ACTIVE_TAB_MENU_WIDTH\n : 0;\n\n // default: pl-3 pr-2 / sm:px-2 — secondary: px-3 (sm) / px-4\n const paddingX = variant === 'secondary' ? (size === 'sm' ? 24 : 32) : smUp ? 16 : 20;\n const marginRight = smUp && (pulledOut || !isFullWidth) ? 8 : 0; // li sm:mr-2\n\n return titleWidth + badgeWidth + iconWidth + menuWidth + paddingX + marginRight;\n };\n\n const available = containerWidth - WIDTH_SAFETY_PX;\n const flexGap = isFullWidth ? 0 : size === 'sm' ? 4 : 8; // ul gap-0 / gap-1 / gap-2\n const prefixWidths = [0];\n sortedVisibleTabs.forEach((item, index) => {\n prefixWidths.push(prefixWidths[index] + measureTabWidth(item));\n });\n\n const activeIndex = sortedVisibleTabs.findIndex((item) => item.name === activeTab);\n const pulledActiveWidth =\n activeIndex >= 0 ? measureTabWidth(sortedVisibleTabs[activeIndex], true) : 0;\n\n // \"N MORE...\" at text-sm font-semibold — measured with the exact count\n // that candidate row would display (deterministic per candidate, so no\n // feedback loop with the result).\n const morePaddingX = variant === 'secondary' ? (size === 'sm' ? 24 : 32) : smUp ? 32 : 48;\n const moreWidth = (moreItems: number): number =>\n measureText(showCounts ? `${moreItems} MORE...` : 'MORE...', titleFont) +\n morePaddingX +\n (smUp ? 8 : 0);\n\n const gearWidth = draggable && showTabOptions && tabs.length > 0 ? TAB_OPTIONS_GEAR_WIDTH : 0;\n const rightWidth = rightSection?.width || 0;\n\n const rowWidth = (visibleCount: number, withMore: boolean): number => {\n let total = prefixWidths[visibleCount];\n let children = visibleCount;\n const activePulled = withMore && activeIndex >= visibleCount;\n if (activePulled) {\n total += pulledActiveWidth;\n children += 1;\n }\n if (withMore) {\n // Mirrors moreButtonTabCounts: when the only overflowed tab is the\n // pulled-out active one (and nothing is hidden), no More renders.\n const moreItems =\n Math.max(0, tabCount - visibleCount - (activePulled ? 1 : 0)) + hiddenTabs.length;\n if (moreItems > 0) {\n total += moreWidth(moreItems);\n children += 1;\n }\n }\n if (gearWidth) {\n total += gearWidth;\n children += 1;\n }\n if (rightWidth) {\n total += rightWidth;\n children += 1;\n }\n return total + flexGap * Math.max(children - 1, 0);\n };\n\n let next = 0;\n if (hiddenTabs.length === 0 && rowWidth(tabCount, false) <= available) {\n next = tabCount;\n } else {\n for (let count = tabCount; count >= 0; count--) {\n if (rowWidth(count, true) <= available) {\n next = count;\n break;\n }\n }\n }\n\n setVisibleTabCounts(next);\n },\n [\n sortedVisibleTabs,\n hiddenTabs.length,\n tabs.length,\n showAllItems,\n activeTab,\n variant,\n size,\n iconsOnly,\n isFullWidth,\n showCounts,\n suffixRecord,\n allowPin,\n iconTabNames,\n draggable,\n showTabOptions,\n rightSection?.width,\n measureText,\n resolveTabFontFamily,\n t,\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 // Responsive overflow: recompute the visible tab count from the measured\n // width budget. Layout effect so the first count is committed before paint.\n useLayoutEffect(() => {\n const container = tabsRef.current;\n if (!container || variant === 'switch') return;\n\n // With fitContentWidth the container shrink-wraps its content, so its own\n // width can never report room to grow — measure the parent (the actual\n // budget) to avoid permanently ratcheting the tab count down.\n const target = (fitContentWidth ? container.parentElement : container) ?? container;\n\n const readContentWidth = (element: HTMLElement) => {\n const style = getComputedStyle(element);\n return (\n element.clientWidth -\n (parseFloat(style.paddingLeft) || 0) -\n (parseFloat(style.paddingRight) || 0)\n );\n };\n\n let disposed = false;\n const resizeObserver = new ResizeObserver((entries) => {\n calculateVisibleTabs(entries[0].contentRect.width);\n });\n\n resizeObserver.observe(target);\n calculateVisibleTabs(readContentWidth(target));\n\n // Widths measured before the webfont loads come from the fallback font —\n // drop that cache and remeasure once fonts settle.\n if (!fontsSettledRef.current && typeof document !== 'undefined' && document.fonts) {\n document.fonts.ready.then(() => {\n if (disposed || fontsSettledRef.current) return;\n fontsSettledRef.current = true;\n clearCache();\n calculateVisibleTabs(readContentWidth(target));\n });\n }\n\n return () => {\n disposed = true;\n resizeObserver.disconnect();\n };\n }, [calculateVisibleTabs, variant, fitContentWidth, clearCache]);\n\n // Stable stringified keys to avoid re-init when prop references change but values don't\n const tabsKey = JSON.stringify(tabs);\n const initialTabsKey = JSON.stringify(initialTabs?.map(({ name }) => name));\n\n // Initialize allTabs from props or initialTabs\n useEffect(() => {\n if (initialTabs?.length) {\n let _tabs = [...initialTabs];\n tabs.forEach((tab) => {\n if (!_tabs.find((item) => item.name === tab)) {\n _tabs.push({ name: tab, is_default: false, is_hidden: false, is_pinned: false });\n }\n });\n _tabs = _tabs.filter(\n (item, index, self) =>\n tabs.includes(item.name) && index === self.findIndex((_t) => _t.name === item.name),\n );\n setAllTabs(_tabs);\n } else {\n setAllTabs(\n tabs\n .map((item) => ({ name: item, is_default: false, is_hidden: false, is_pinned: false }))\n .filter((item, index, self) => index === self.findIndex((_t) => _t.name === item.name)),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tabsKey, initialTabsKey]);\n\n // Sync tabConfig prop\n useEffect(() => {\n if (tabConfig) {\n setSavedTabOptionConfig(tabConfig);\n }\n }, [tabConfig]);\n\n // Sort tabs\n useEffect(() => {\n if (!allTabs.length) return;\n const _sortedTabs = [...allTabs];\n if (sortOrder === 'asc') {\n _sortedTabs.sort((a, b) => a.name.localeCompare(b.name));\n } else if (sortOrder === 'desc') {\n _sortedTabs.sort((a, b) => b.name.localeCompare(a.name));\n }\n setSortedTabs(_sortedTabs);\n }, [allTabs, sortOrder]);\n\n // Focus first menu item when More dropdown opens\n useEffect(() => {\n handleDropdownOpen(showMoreDropdown);\n }, [showMoreDropdown]);\n\n // ── Variant: switch ──\n if (variant === 'switch') {\n return (\n <div className={classNames('inline', className)}>\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'inline-flex grow-0 p-1 rounded-lg',\n color === 'dark'\n ? 'border-[1.5px] border-neutral-800 bg-neutral-800 dark:border-black-800'\n : 'bg-neutral-100 dark:bg-black-700',\n fullWidth ? 'w-full' : 'w-auto',\n )}\n >\n {tabs.map((title: T) => {\n const isSelected = activeTab === title;\n const icon = tabIcons?.[title];\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = allowPin && tab?.is_pinned;\n\n return (\n <li key={title} role=\"presentation\" className={classNames('inline-flex', fullWidth ? 'w-full' : 'w-auto')}>\n <TabSwitch\n title={title}\n showCounts={showCounts}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n icon={\n isPinned ? (\n <Tooltip title=\"Unpin\">\n <span onClick={() => togglePinTab(title)}>\n <PinIcon className='rotate-45 w-icon h-icon text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n icon\n )\n }\n iconsOnly={iconsOnly}\n classValue={classNames(\n 'relative py-0.5 border-gray-200',\n height,\n fullWidth ? 'w-full flex items-center justify-center' : 'px-2',\n )}\n selectedClassValue={classNames(\n 'absolute inset-0 rounded-md z-0',\n color === 'dark' ? 'bg-neutral-900' : 'bg-white dark:bg-black-800',\n )}\n textClassValue={classNames(\n 'relative text-xs font-semibold font-sans whitespace-nowrap',\n isSelected\n ? 'text-neutral-900 dark:text-neutral-100'\n : 'text-neutral-700 dark:text-neutral-100',\n )}\n isSelected={isSelected}\n href={resolveTabHref(title)}\n onClick={!isDisabled ? () => handleSelectTab(title) : undefined}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n color={color}\n disableAnimation={disableAnimation}\n />\n </li>\n );\n })}\n </ul>\n </div>\n );\n }\n\n // ── Variant: default / secondary ──\n return (\n <div\n ref={tabsRef}\n className={classNames(fitContentWidth ? 'w-fit' : 'w-full')}\n onMouseEnter={() => setIsHoveringTabOptions(true)}\n onMouseLeave={() => setIsHoveringTabOptions(false)}\n >\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n collisionDetection={closestCenter}\n onDragOver={handleDragOver}\n >\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'flex items-center w-full',\n className,\n isFullWidth ? 'gap-0' : size === 'sm' ? 'gap-1' : 'gap-2',\n )}\n ref={ulRef}\n >\n {isLoading ? (\n <div className=\"skeleton bg-neutral-300 dark:bg-black-700 animate-pulse h-10 min-w-[100px] w-full rounded\" />\n ) : (\n <SortableContext\n items={sortedVisibleTabs.map(({ name }) => name)}\n strategy={horizontalListSortingStrategy}\n id=\"sortable\"\n disabled={!draggable || lockOrder}\n >\n {sortedVisibleTabs.slice(0, visibleTabSlice).map(({ name, is_pinned }) => {\n const isSelected = activeTab === name && !showMoreDropdown;\n const isPinned = allowPin && is_pinned;\n\n return (\n <SortableTab\n key={name}\n title={name}\n isDragging={draggingTab === name}\n className={isFullWidth ? 'flex-1 flex justify-center' : ''}\n >\n <li key={name} role=\"presentation\" className={classNames(isFullWidth ? 'w-full flex' : 'sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={name}\n iconsOnly={iconsOnly}\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 iconsOnly={iconsOnly}\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} ` : ''}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 && tabs.length > 0 ? (\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 ) : null}\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","BADGE_BOX_WIDTH","TAB_CONTENT_GAP","TAB_ICON_WIDTH","ACTIVE_TAB_MENU_WIDTH","PULLED_TAB_MENU_WIDTH","TAB_OPTIONS_GEAR_WIDTH","SM_MEDIA_QUERY","WIDTH_SAFETY_PX","TAILWIND_SANS_STACK","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","fontsSettledRef","tabFontFamilyRef","measureText","clearCache","useTextWidth","selectedId","useMemo","sensors","useSensors","useSensor","MouseSensor","TouchSensor","suffixRecord","name","value","formatCount","visibleTabs","is_hidden","hiddenTabs","filteredVisibleTabs","tabName","searchValue","sortedVisibleTabs","a","b","tabIconNamesKey","node","iconTabNames","isTabOverflow","visibleTabSlice","isActiveTabInsideMore","item","moreButtonTabCounts","updateTabs","useCallback","newTabs","updateTabConfig","config","resolveTabFontFamily","span","family","calculateVisibleTabs","containerWidth","tabCount","smUp","fontFamily","titleFont","badgeFont","measureTabWidth","pulledOut","titleWidth","suffixValue","badgeWidth","iconWidth","menuWidth","paddingX","marginRight","available","flexGap","prefixWidths","index","activeIndex","pulledActiveWidth","morePaddingX","moreWidth","moreItems","gearWidth","rightWidth","rowWidth","visibleCount","withMore","total","children","activePulled","next","count","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","useLayoutEffect","container","target","readContentWidth","element","style","disposed","resizeObserver","entries","tabsKey","initialTabsKey","useEffect","tab","self","_sortedTabs","icon","TabSwitch","Tooltip","jsxs","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","is_pinned","SortableTab","Dropdown","IconButton","MoreHorizOutlinedIcon","DropableWrapper","SearchBar","trigger","MoreButton","TabOptions","TabDragOverlay"],"mappings":"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"}
1
+ {"version":3,"file":"Tabs.es.js","sources":["../../../../src/components/navigation/tabs/Tabs.tsx"],"sourcesContent":["import {\n DndContext,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport type { DragEndEvent, DragOverEvent, DragStartEvent } from '@dnd-kit/core';\nimport { SortableContext, horizontalListSortingStrategy, arrayMove } from '@dnd-kit/sortable';\nimport { Dropdown } from 'antd';\nimport classNames from 'classnames';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport MoreHorizOutlinedIcon from '@mui/icons-material/MoreHorizOutlined';\n\nimport { DropableWrapper, MoreButton, SortableTab, TabDragOverlay, TabOptions, TabSwitch } from '.';\nimport type { SuffixRecord, Tab, TabOptionConfig, TabsProps } from './types';\nimport { INITIAL_TAB_OPTION_CONFIG } from './types';\n\nimport { formatCount } from '../../../utils/formatters';\n\nimport { useTabConfig } from '../../../providers/design-system-provider/hooks';\nimport { useTextWidth } from '../../../hooks/useTextWidth';\nimport IconButton from '../../button/IconButton';\nimport { OptionButton } from '../../buttons/option-button/OptionButton';\nimport { SearchBar } from '../../forms/search-bar/SearchBar';\nimport Tooltip from '../../tooltip/Tooltip';\nimport { EditIcon } from '../../icons/EditIcon';\nimport { toast } from 'react-toastify';\nimport { ArrowDownwardIcon, ArrowOutwardIcon, ArrowUpwardIcon, ContentCopyIcon, DeleteIcon, PinIcon, UnpinFilledIcon, VisibilityIcon, VisibilityOffIcon } from '../../icon';\n\nconst randomHex = () => Math.random().toString(16).slice(2, 13);\n\nconst TAB_MENU_CLASS = [\n '[&_.ant-dropdown-menu-item]:!outline-none',\n '[&_.ant-dropdown-menu-submenu-title]:!outline-none',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-item:focus-visible_.option-button-inner]:dark:bg-black-600',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-2',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:ring-primary-500',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:bg-gray-50',\n '[&_.ant-dropdown-menu-submenu-title:focus-visible_.option-button-inner]:dark:bg-black-600',\n].join(' ');\n\nlet dropdownTrigger: HTMLElement | null = null;\n\nconst handleDropdownOpen = (open: boolean) => {\n if (open) {\n dropdownTrigger = document.activeElement as HTMLElement;\n setTimeout(() => {\n const item = document.querySelector<HTMLElement>(\n '.row-option-cell .ant-dropdown-menu-item:not(.ant-dropdown-menu-item-disabled), .row-option-cell .ant-dropdown-menu-submenu-title',\n );\n item?.focus();\n }, 50);\n } else {\n setTimeout(() => {\n dropdownTrigger?.focus();\n dropdownTrigger = null;\n }, 0);\n }\n};\n\nconst ACTIONS = {\n SELECT: 'Select',\n MOVE_LEFT: 'MoveLeft',\n MOVE_RIGHT: 'MoveRight',\n HIDE: 'Hide',\n UNHIDE: 'Unhide',\n COPY_LINK: 'CopyLink',\n DELETE: 'Delete',\n PIN: 'Pin',\n UNPIN: 'Unpin',\n EDIT: 'Edit',\n} as const;\n\nexport const Tabs = <T extends string>({\n variant = 'default',\n tabs = [],\n activeTab,\n onTabClick,\n suffixRecord: suffixRecordProp,\n isLoading,\n size = 'md',\n className,\n draggable = false,\n showAllItems = false,\n copyLink = false,\n isDisabled = false,\n color = 'light',\n iconsOnly = false,\n tabIcons = {},\n height = 'h-6',\n fullWidth = false,\n fitContentWidth = false,\n disableAnimation = false,\n onEdit,\n onDelete,\n onCopyLink,\n allowPin = false,\n isFullWidth = false,\n rightSection,\n initialTabs: initialTabsProp,\n tabConfig: tabConfigProp,\n onTabConfigChange,\n onTabsChange,\n parentContainer = document.body,\n tabKey,\n linkConfig,\n showTabOptions = true,\n}: TabsProps<T>) => {\n // ── Provider integration ──\n const providerTabConfig = useTabConfig();\n const providerSettings = tabKey ? providerTabConfig?.getTabSettings(tabKey) : undefined;\n\n // Provider-sourced values are used only when the direct props are not passed\n const initialTabs = initialTabsProp ?? (providerSettings?.tab_items as Tab<T>[] | undefined);\n const tabConfig = tabConfigProp ?? providerSettings?.tab_options;\n // ── State ──\n const [search, setSearch] = useState('');\n const [showMoreDropdown, setShowMoreDropdown] = useState(false);\n const [visibleTabCounts, setVisibleTabCounts] = useState(0);\n const [allTabs, setAllTabs] = useState<Tab<T>[]>([]);\n const [sortedTabs, setSortedTabs] = useState<Tab<T>[]>([]);\n const [draggingOver, setDraggingOver] = useState<string | null>(null);\n const [draggingTab, setDraggingTab] = useState<string | null>(null);\n const [isHoveringTabOptions, setIsHoveringTabOptions] = useState(false);\n const [savedTabOptionConfig, setSavedTabOptionConfig] = useState<TabOptionConfig>(\n tabConfig ?? INITIAL_TAB_OPTION_CONFIG,\n );\n const [tabSearchFilter, setTabSearchFilter] = useState('');\n const [tabSearchFilterType, setTabSearchFilterType] = useState<'contains' | 'does-not-contain'>('contains');\n\n const { showCounts, lockOrder, sortOrder } = savedTabOptionConfig;\n\n // ── Refs & Hooks ──\n const { t } = useTranslation();\n const tabsRef = useRef<HTMLDivElement | null>(null);\n const ulRef = useRef<HTMLUListElement | null>(null);\n const visibleTabCountsRef = useRef(visibleTabCounts);\n const { measureText } = useTextWidth();\n const selectedId = useMemo(() => randomHex(), []);\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 5 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 300, tolerance: 5 } }),\n );\n\n // ── Derived values ──\n // Counts are formatted once here (1000 -> \"1,000\") so the rendered badges and\n // the overflow width measurement always agree.\n const suffixRecord = useMemo(() => {\n if (!suffixRecordProp) return suffixRecordProp;\n return Object.fromEntries(\n Object.entries(suffixRecordProp).map(([name, value]) => [\n name,\n formatCount(value as string | number),\n ]),\n ) as SuffixRecord<T>;\n }, [suffixRecordProp]);\n\n const visibleTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => !is_hidden), [sortedTabs]);\n const hiddenTabs = useMemo(() => sortedTabs.filter(({ is_hidden }) => is_hidden), [sortedTabs]);\n\n const filteredVisibleTabs = useMemo(\n () =>\n visibleTabs.filter(({ name }) => {\n if (!tabSearchFilter) return true;\n const tabName = (name ?? '').toLowerCase();\n const searchValue = tabSearchFilter.toLowerCase();\n return tabSearchFilterType === 'contains'\n ? tabName.includes(searchValue)\n : !tabName.includes(searchValue);\n }),\n [visibleTabs, tabSearchFilter, tabSearchFilterType],\n );\n\n const sortedVisibleTabs = useMemo(\n () =>\n [...filteredVisibleTabs].sort((a, b) => {\n if (a.is_pinned && !b.is_pinned) return -1;\n if (!a.is_pinned && b.is_pinned) return 1;\n return 0;\n }),\n [filteredVisibleTabs],\n );\n\n const isTabOverflow = visibleTabCounts < sortedVisibleTabs.length;\n const visibleTabSlice = showAllItems\n ? sortedVisibleTabs.length\n : isTabOverflow\n ? visibleTabCounts\n : sortedVisibleTabs.length;\n const isActiveTabInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= visibleTabSlice;\n const moreButtonTabCounts =\n allTabs.length - visibleTabSlice - (isActiveTabInsideMore ? 1 : 0);\n\n visibleTabCountsRef.current = visibleTabCounts;\n\n // ── Helpers ──\n const updateTabs = useCallback(\n (newTabs: Tab<T>[]) => {\n setAllTabs(newTabs);\n onTabsChange?.(newTabs);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_items: newTabs });\n }\n },\n [onTabsChange, tabKey, providerTabConfig],\n );\n\n const updateTabConfig = useCallback(\n (config: TabOptionConfig) => {\n setSavedTabOptionConfig(config);\n onTabConfigChange?.(config);\n if (tabKey && providerTabConfig?.persistTabSettings) {\n providerTabConfig.persistTabSettings({ tab_type: tabKey, tab_options: config });\n }\n },\n [onTabConfigChange, tabKey, providerTabConfig],\n );\n\n const calculateIconWidth = (item: Tab<T>): number => (item.is_pinned ? 32 : 0);\n\n const calculateVisibleTabs = useCallback(\n (clientWidth: number) => {\n if (!clientWidth) return;\n const tabOptionsWidth = draggable ? 30 : 0;\n const moreWidth = showCounts ? 190 : 84;\n const tabGap = size === 'sm' ? 4 : 8;\n const basePadding = 32;\n let tabWidth = 0;\n let activeTabWidth = 0;\n let newVisibleTabCounts = 0;\n const availableWidth = clientWidth - (rightSection?.width || 0) - tabOptionsWidth;\n const currentCount = visibleTabCountsRef.current;\n const hasOverflow = currentCount < sortedVisibleTabs.length;\n const hasHidden = hiddenTabs.length > 0;\n\n for (let index = 0; index < sortedVisibleTabs.length; index++) {\n const item = sortedVisibleTabs[index];\n\n const suffixText = suffixRecord?.[item.name] ? String(suffixRecord?.[item.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n\n const tabTitleWidth = measureText(item?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n\n const iconWidth = allowPin ? calculateIconWidth(item) : 0;\n const currentTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n\n if (item.name === activeTab) {\n activeTabWidth = currentTabWidth;\n }\n\n tabWidth += currentTabWidth;\n\n if (\n availableWidth >\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0) + index * 25\n ) {\n newVisibleTabCounts = index + 1;\n } else {\n break;\n }\n }\n\n const remainingVisibleTabs = sortedVisibleTabs.length - newVisibleTabCounts;\n const totalRemainingTabs = remainingVisibleTabs + hiddenTabs.length;\n\n if (\n totalRemainingTabs === 1 &&\n hiddenTabs.length === 0 &&\n remainingVisibleTabs === 1 &&\n newVisibleTabCounts < sortedVisibleTabs.length\n ) {\n const lastTab = sortedVisibleTabs[newVisibleTabCounts];\n if (lastTab) {\n const suffixText = suffixRecord?.[lastTab.name] ? String(suffixRecord?.[lastTab.name]) : '';\n const suffixWidth =\n showCounts && suffixText\n ? measureText(suffixText, {\n fontSize: '16px',\n fontWeight: '500',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n }) +\n 18 +\n 2\n : 0;\n const tabTitleWidth = measureText(lastTab?.name || '', {\n fontSize: '16px',\n fontWeight: '600',\n fontFamily: 'Inter, system-ui, -apple-system, sans-serif',\n });\n const iconWidth = allowPin ? calculateIconWidth(lastTab) : 0;\n const lastTabWidth = tabTitleWidth + suffixWidth + basePadding + tabGap + iconWidth;\n if (availableWidth >= tabWidth + lastTabWidth) {\n newVisibleTabCounts += 1;\n }\n }\n }\n\n const newVisibleSlice = showAllItems ? sortedVisibleTabs.length : newVisibleTabCounts;\n const activeInsideMore =\n sortedVisibleTabs.findIndex((item) => item.name === activeTab) >= newVisibleSlice;\n\n if (activeInsideMore) {\n tabWidth += activeTabWidth;\n if (\n availableWidth <\n tabWidth + (hasOverflow || hasHidden ? moreWidth : 0)\n ) {\n newVisibleTabCounts = Math.max(newVisibleTabCounts - 1, 0);\n }\n }\n\n if (newVisibleTabCounts !== currentCount) {\n setVisibleTabCounts(newVisibleTabCounts);\n }\n },\n [\n sortedVisibleTabs,\n showCounts,\n showAllItems,\n allowPin,\n suffixRecord,\n rightSection?.width,\n activeTab,\n size,\n draggable,\n hiddenTabs.length,\n measureText,\n ],\n );\n\n // ── Search params helper (uses provider abstraction when available) ──\n const getCurrentSearchParams = useCallback(\n () => {\n if (typeof window !== 'undefined') {\n return new URLSearchParams(window.location.search);\n }\n if (linkConfig && providerTabConfig?.getSearchParam) {\n const params = new URLSearchParams();\n const currentValue = providerTabConfig.getSearchParam(linkConfig.key);\n if (currentValue) params.set(linkConfig.key, currentValue);\n return params;\n }\n return new URLSearchParams();\n },\n [linkConfig, providerTabConfig],\n );\n\n const applyTabToSearchParams = useCallback(\n (params: URLSearchParams, tabName: string) => {\n if (!linkConfig) return params;\n if (tabName === linkConfig.defaultLink) {\n params.delete(linkConfig.key);\n } else {\n params.set(linkConfig.key, tabName);\n }\n linkConfig.onResolve?.(params);\n return params;\n },\n [linkConfig],\n );\n\n // ── Link href resolution ──\n const resolveTabHref = useCallback(\n (tabName: string): string | undefined => {\n if (!linkConfig) return undefined;\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n return `?${params.toString()}`;\n },\n [applyTabToSearchParams, getCurrentSearchParams, linkConfig],\n );\n\n // ── Copy link ──\n const showCopyLink = copyLink || Boolean(linkConfig);\n\n const handleCopyLink = useCallback(\n async (tabName: T) => {\n const search = resolveTabHref(tabName);\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n const pathname = typeof window !== 'undefined' ? window.location.pathname : '';\n const href = search\n ? `${origin}${pathname}${search}`\n : `${origin}${pathname}`;\n await navigator.clipboard.writeText(href);\n toast.success(t(\"Link copied to clipboard\"), {\n toastId: 'Link copied to clipboard',\n });\n onCopyLink?.(tabName, href);\n },\n [resolveTabHref, t, onCopyLink],\n );\n\n // ── Tab actions ──\n const handleSelectTab = (tabName: T) => {\n setShowMoreDropdown(false);\n onTabClick?.(tabName);\n if (linkConfig && providerTabConfig?.navigate) {\n const params = applyTabToSearchParams(getCurrentSearchParams(), tabName);\n providerTabConfig.navigate(`?${params.toString()}`);\n }\n };\n\n const hideTab = (tabName: T) => {\n if (sortedVisibleTabs.length <= 1) return;\n\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: true } : item,\n );\n\n const visibleIndex = sortedVisibleTabs.findIndex((item) => item.name === tabName);\n const nextIndex = visibleIndex === 0 ? 1 : visibleIndex - 1;\n handleSelectTab(sortedVisibleTabs[nextIndex].name);\n\n updateTabs(_tabs);\n };\n\n const unhideTab = (tabName: T) => {\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_hidden: false } : item,\n );\n\n setShowMoreDropdown(false);\n updateTabs(_tabs);\n };\n\n const togglePinTab = (tabName: T) => {\n if (!allowPin) return;\n const _tabs = allTabs.map((item) =>\n item.name === tabName ? { ...item, is_pinned: !item.is_pinned } : item,\n );\n updateTabs(_tabs);\n };\n\n const moveTab = (tabName: T, direction: 'left' | 'right') => {\n const oldIndex = allTabs.findIndex(({ name }) => name === tabName);\n const newIndex =\n direction === 'left'\n ? oldIndex - (allTabs[oldIndex - 1]?.name === activeTab ? 2 : 1)\n : oldIndex + 1;\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n };\n\n const handleShowMoreDropdown = () => setShowMoreDropdown(!showMoreDropdown);\n\n // ── Drag handlers ──\n const handleDragStart = (event: DragStartEvent) => setDraggingTab(event.active.id as string);\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (over?.id === 'more-tabs') {\n hideTab(active.id as T);\n setDraggingTab(null);\n setDraggingOver(null);\n return;\n }\n const oldIndex = allTabs.findIndex(({ name }) => name === active.id);\n const newIndex = allTabs.findIndex(({ name }) => name === over?.id);\n updateTabs(arrayMove(allTabs, oldIndex, newIndex));\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragCancel = () => {\n setDraggingTab(null);\n setDraggingOver(null);\n };\n\n const handleDragOver = (event: DragOverEvent) => {\n setDraggingOver(event.over?.id === 'more-tabs' ? 'more-tabs' : null);\n };\n\n const handleTabSort = () => {\n // Sorting is handled via sortedTabs effect — no direct allTabs mutation\n };\n\n const handleSearchFilterChange = (\n searchValue: string,\n filterType: 'contains' | 'does-not-contain',\n ) => {\n setTabSearchFilter(searchValue);\n setTabSearchFilterType(filterType);\n };\n\n // ── Tab context menu options ──\n const getTabOptions = (title: T, isHidden = false, isSoftHidden = false) => {\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = tab?.is_pinned;\n\n const options = [\n {\n label: (\n <OptionButton\n icon={<ArrowOutwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Select Tab\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.SELECT,\n onClick: () => handleSelectTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowUpwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Up\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_LEFT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'left'),\n },\n {\n label: (\n <OptionButton\n icon={<ArrowDownwardIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Move Down\")}\n isDisabled={lockOrder}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.MOVE_RIGHT,\n disabled: lockOrder,\n onClick: () => moveTab(title, 'right'),\n },\n {\n label: (\n <OptionButton\n icon={<ContentCopyIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Copy Link\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.COPY_LINK,\n onClick: () => handleCopyLink(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityOffIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Hide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.HIDE,\n onClick: () => hideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={<VisibilityIcon size={18} className='text-inherit dark:text-inherit' />}\n text={t(\"Unhide\")}\n className=\"text-black-900 dark:text-white\"\n />\n ),\n key: ACTIONS.UNHIDE,\n onClick: () => unhideTab(title),\n },\n {\n label: (\n <OptionButton\n icon={isPinned ? <UnpinFilledIcon size={20} className='rotate-12 text-inherit dark:text-inherit'/> : <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />}\n text={isPinned ? t(\"Unpin\") : t(\"Pin\")}\n className=\"text-black-900 dark:text-white\"\n notVisible={!allowPin}\n />\n ),\n key: isPinned ? ACTIONS.UNPIN : ACTIONS.PIN,\n onClick: () => togglePinTab(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-black-900 dark:text-white\"\n icon={<EditIcon />}\n text={t('Edit')}\n notVisible={!onEdit}\n />\n ),\n key: ACTIONS.EDIT,\n onClick: () => onEdit?.(title),\n },\n {\n label: (\n <OptionButton\n className=\"text-error-600 dark:text-error-600\"\n icon={<DeleteIcon size={18} className='text-error-600 dark:text-error-600' />}\n text={t(\"Delete\")}\n notVisible={!onDelete}\n />\n ),\n key: ACTIONS.DELETE,\n onClick: () => onDelete?.(title),\n },\n ];\n\n const hiddenFilter: string[] = [ACTIONS.HIDE, ACTIONS.UNHIDE];\n const defaultFilter: string[] = [ACTIONS.SELECT, ACTIONS.MOVE_LEFT, ACTIONS.MOVE_RIGHT, ACTIONS.UNHIDE];\n\n return options\n .filter((item) =>\n isHidden\n ? item.key === ACTIONS.UNHIDE\n : isSoftHidden\n ? !hiddenFilter.includes(item.key)\n : !defaultFilter.includes(item.key),\n )\n .filter((item) => (showCopyLink ? true : item.key !== ACTIONS.COPY_LINK))\n .filter((item) => (sortedVisibleTabs.length === 1 ? item.key !== ACTIONS.HIDE : true));\n };\n\n // ── Class maps ──\n const getClasses = (\n classType: 'classValue' | 'selectedClassValue' | 'textClassValue',\n isSelected: boolean,\n ) => {\n const classes = {\n classValue: {\n default: classNames('relative inline-flex pt-2 pb-3 px-2 pl-3 sm:px-2 rounded-t-sm group'),\n secondary: classNames(\n 'flex w-full sm:w-auto relative rounded-lg font-sans font-semibold text-center cursor-pointer uppercase',\n size === 'sm' ? 'py-1 px-3 text-sm' : 'py-2 px-4 text-base',\n ),\n },\n selectedClassValue: {\n default: classNames('absolute left-0 bottom-0 w-full h-[3px] bg-primary-600'),\n secondary: classNames('absolute inset-0 bg-primary-50 dark:bg-primary-975 rounded-lg'),\n },\n textClassValue: {\n default: classNames(\n 'relative uppercase font-sans font-semibold text-sm whitespace-nowrap',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 hover:text-neutral-500 dark:text-neutral-100 dark:hover:text-white',\n ),\n secondary: classNames(\n 'relative whitespace-nowrap text-sm',\n isSelected\n ? 'text-primary-600 dark:text-primary-500'\n : 'text-neutral-400 dark:text-neutral-400',\n ),\n },\n };\n return classes[classType][variant as 'default' | 'secondary'];\n };\n\n // ── Effects ──\n // ResizeObserver for responsive overflow\n useEffect(() => {\n if (!tabsRef.current || variant === 'switch') return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const containerWidth = entries[0].contentRect.width;\n calculateVisibleTabs(containerWidth);\n });\n\n resizeObserver.observe(tabsRef.current);\n calculateVisibleTabs(tabsRef.current.clientWidth);\n\n return () => resizeObserver.disconnect();\n }, [calculateVisibleTabs, variant]);\n\n // Stable stringified keys to avoid re-init when prop references change but values don't\n const tabsKey = JSON.stringify(tabs);\n const initialTabsKey = JSON.stringify(initialTabs?.map(({ name }) => name));\n\n // Initialize allTabs from props or initialTabs\n useEffect(() => {\n if (initialTabs?.length) {\n let _tabs = [...initialTabs];\n tabs.forEach((tab) => {\n if (!_tabs.find((item) => item.name === tab)) {\n _tabs.push({ name: tab, is_default: false, is_hidden: false, is_pinned: false });\n }\n });\n _tabs = _tabs.filter(\n (item, index, self) =>\n tabs.includes(item.name) && index === self.findIndex((_t) => _t.name === item.name),\n );\n setAllTabs(_tabs);\n } else {\n setAllTabs(\n tabs\n .map((item) => ({ name: item, is_default: false, is_hidden: false, is_pinned: false }))\n .filter((item, index, self) => index === self.findIndex((_t) => _t.name === item.name)),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [tabsKey, initialTabsKey]);\n\n // Sync tabConfig prop\n useEffect(() => {\n if (tabConfig) {\n setSavedTabOptionConfig(tabConfig);\n }\n }, [tabConfig]);\n\n // Sort tabs\n useEffect(() => {\n if (!allTabs.length) return;\n const _sortedTabs = [...allTabs];\n if (sortOrder === 'asc') {\n _sortedTabs.sort((a, b) => a.name.localeCompare(b.name));\n } else if (sortOrder === 'desc') {\n _sortedTabs.sort((a, b) => b.name.localeCompare(a.name));\n }\n setSortedTabs(_sortedTabs);\n }, [allTabs, sortOrder]);\n\n // Focus first menu item when More dropdown opens\n useEffect(() => {\n handleDropdownOpen(showMoreDropdown);\n }, [showMoreDropdown]);\n\n // ── Variant: switch ──\n if (variant === 'switch') {\n return (\n <div className={classNames('inline', className)}>\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'inline-flex grow-0 p-1 rounded-lg',\n color === 'dark'\n ? 'border-[1.5px] border-neutral-800 bg-neutral-800 dark:border-black-800'\n : 'bg-neutral-100 dark:bg-black-700',\n fullWidth ? 'w-full' : 'w-auto',\n )}\n >\n {tabs.map((title: T) => {\n const isSelected = activeTab === title;\n const icon = tabIcons?.[title];\n const tab = allTabs.find((_t) => _t.name === title);\n const isPinned = allowPin && tab?.is_pinned;\n\n return (\n <li key={title} role=\"presentation\" className={classNames('inline-flex', fullWidth ? 'w-full' : 'w-auto')}>\n <TabSwitch\n title={title}\n showCounts={showCounts}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n icon={\n isPinned ? (\n <Tooltip title=\"Unpin\">\n <span onClick={() => togglePinTab(title)}>\n <PinIcon className='rotate-45 w-icon h-icon text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n icon\n )\n }\n iconsOnly={iconsOnly}\n classValue={classNames(\n 'relative py-0.5 border-gray-200',\n height,\n fullWidth ? 'w-full flex items-center justify-center' : 'px-2',\n )}\n selectedClassValue={classNames(\n 'absolute inset-0 rounded-md z-0',\n color === 'dark' ? 'bg-neutral-900' : 'bg-white dark:bg-black-800',\n )}\n textClassValue={classNames(\n 'relative text-xs font-semibold font-sans whitespace-nowrap',\n isSelected\n ? 'text-neutral-900 dark:text-neutral-100'\n : 'text-neutral-700 dark:text-neutral-100',\n )}\n isSelected={isSelected}\n href={resolveTabHref(title)}\n onClick={!isDisabled ? () => handleSelectTab(title) : undefined}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n color={color}\n disableAnimation={disableAnimation}\n />\n </li>\n );\n })}\n </ul>\n </div>\n );\n }\n\n // ── Variant: default / secondary ──\n return (\n <div\n ref={tabsRef}\n className={classNames(fitContentWidth ? 'w-fit' : 'w-full')}\n onMouseEnter={() => setIsHoveringTabOptions(true)}\n onMouseLeave={() => setIsHoveringTabOptions(false)}\n >\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n collisionDetection={closestCenter}\n onDragOver={handleDragOver}\n >\n <ul\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n className={classNames(\n 'flex items-center w-full',\n className,\n isFullWidth ? 'gap-0' : size === 'sm' ? 'gap-1' : 'gap-2',\n )}\n ref={ulRef}\n >\n {isLoading ? (\n <div className=\"skeleton bg-neutral-300 dark:bg-black-700 animate-pulse h-10 min-w-[100px] w-full rounded\" />\n ) : (\n <SortableContext\n items={sortedVisibleTabs.map(({ name }) => name)}\n strategy={horizontalListSortingStrategy}\n id=\"sortable\"\n disabled={!draggable || lockOrder}\n >\n {sortedVisibleTabs.slice(0, visibleTabSlice).map(({ name, is_pinned }) => {\n const isSelected = activeTab === name && !showMoreDropdown;\n const isPinned = allowPin && is_pinned;\n\n return (\n <SortableTab\n key={name}\n title={name}\n isDragging={draggingTab === name}\n className={isFullWidth ? 'flex-1 flex justify-center' : ''}\n >\n <li key={name} role=\"presentation\" className={classNames(isFullWidth ? 'w-full flex' : 'sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={name}\n role=\"tab\"\n ariaSelected={isSelected}\n tabIndex={0}\n classValue={classNames(\n getClasses('classValue', isSelected),\n isFullWidth ? 'w-full justify-center' : '',\n )}\n selectedClassValue={getClasses('selectedClassValue', isSelected)}\n textClassValue={getClasses('textClassValue', isSelected)}\n isSelected={isSelected}\n tabOptions={\n isSelected && draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(name as T),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <IconButton\n tooltip={t(\"More\")}\n variant=\"ghost\"\n className=\"!text-primary-500 hover:!bg-primary-100 dark:hover:!bg-primary-900\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} />\n </IconButton>\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === name}\n href={resolveTabHref(name)}\n onClick={() => handleSelectTab(name as T)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n isPinned ? (\n <Tooltip title={t(\"Unpin\")}>\n <span onClick={() => togglePinTab(name as T)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[name] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n );\n })}\n\n {/* Active tab pulled from overflow */}\n {activeTab && isActiveTabInsideMore ? (\n <SortableTab key={activeTab} title={activeTab} isDragging={draggingTab === activeTab}>\n <li key={activeTab} role=\"presentation\" className={classNames('sm:mr-2')}>\n <TabSwitch\n showCounts={showCounts}\n title={activeTab}\n role=\"tab\"\n ariaSelected={true}\n tabIndex={0}\n classValue={getClasses('classValue', true)}\n selectedClassValue={getClasses('selectedClassValue', true)}\n textClassValue={getClasses('textClassValue', true)}\n isSelected={true}\n tabOptions={\n draggable ? (\n <Dropdown\n menu={{\n items: getTabOptions(activeTab),\n className: TAB_MENU_CLASS,\n }}\n trigger={['click']}\n onOpenChange={handleDropdownOpen}\n overlayClassName=\"row-option-cell\"\n rootClassName=\"\"\n openClassName=\"max-h-[350px] overflow-y-auto\"\n placement=\"bottom\"\n >\n <MoreHorizOutlinedIcon sx={{ fontSize: 20 }} className=\"text-primary-600\" />\n </Dropdown>\n ) : null\n }\n draggingTab={draggingTab === activeTab}\n href={resolveTabHref(activeTab)}\n suffixRecord={suffixRecord}\n selectedId={selectedId}\n icon={\n allowPin && allTabs.find((tab) => tab.name === activeTab)?.is_pinned ? (\n <Tooltip title={t(\"Pinned\")}>\n <span onClick={() => togglePinTab(activeTab)}>\n <PinIcon size={20} className='rotate-45 text-inherit dark:text-inherit' />\n </span>\n </Tooltip>\n ) : (\n tabIcons?.[activeTab] ?? null\n )\n }\n />\n </li>\n </SortableTab>\n ) : null}\n\n {/* More dropdown */}\n {((visibleTabCounts < sortedVisibleTabs.length && !showAllItems) ||\n hiddenTabs.length > 0) &&\n moreButtonTabCounts > 0 ? (\n <DropableWrapper id=\"more-tabs\">\n <Dropdown\n overlayStyle={{\n maxHeight: 'calc(100vh - 350px)',\n overflow: 'auto',\n marginTop: '8px',\n scrollbarWidth: 'none',\n borderRadius: 8,\n boxShadow:\n '0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 9px 28px 8px rgba(0, 0, 0, 0.05)',\n }}\n onOpenChange={() => handleShowMoreDropdown()}\n open={showMoreDropdown}\n menu={{\n items: [\n {\n key: 'Search',\n disabled: true,\n style: { minWidth: '190px', marginBottom: '8px' },\n label: (\n <div className=\"px-2 bg-white dark:bg-black-800\">\n <SearchBar\n id=\"search-bar-more-tabs\"\n value={search}\n classValues=\"!rounded-lg\"\n onChange={(e) => setSearch(e)}\n />\n </div>\n ),\n },\n ...sortedVisibleTabs\n .slice(visibleTabSlice)\n .filter((item) => item.name !== activeTab)\n .concat(hiddenTabs)\n .filter(\n ({ name }) =>\n typeof name === 'string' &&\n (name ?? '').toLowerCase().includes(search.toLowerCase()),\n )\n .map(({ name, is_hidden }) => ({\n key: name,\n label: (\n <OptionButton\n className={classNames(\n 'uppercase',\n is_hidden\n ? 'text-neutral-400 dark:text-neutral-500'\n : 'text-black-900 dark:text-black-200',\n )}\n text={name}\n suffixRecord={showCounts ? suffixRecord : {}}\n highlight={search}\n truncateText={true}\n isDisabled={is_hidden}\n onClick={is_hidden ? undefined : () => {\n handleSelectTab(name as T);\n setShowMoreDropdown(false);\n }}\n />\n ),\n popupClassName: TAB_MENU_CLASS,\n children: showMoreDropdown ? getTabOptions(name as T, is_hidden, true) : null,\n })),\n ],\n className: TAB_MENU_CLASS,\n }}\n openClassName=\"max-h-[350px] overflow-y-auto\"\n trigger={['click']}\n overlayClassName=\"row-option-cell\"\n placement=\"bottomRight\"\n getPopupContainer={(trigger) => trigger.parentElement as HTMLElement}\n >\n <MoreButton\n title={`${showCounts ? moreButtonTabCounts : ''} ${showCounts ? '' : ''}MORE...`}\n variant={variant}\n size={size}\n draggingOver={draggingOver}\n suffixRecord={suffixRecord}\n handleShowMoreDropdown={handleShowMoreDropdown}\n selectedId={selectedId}\n showMoreDropdown={showMoreDropdown}\n />\n </Dropdown>\n </DropableWrapper>\n ) : null}\n </SortableContext>\n )}\n {rightSection ? (\n <div className={classNames(rightSection?.className)}>\n <li>{rightSection.component}</li>\n </div>\n ) : null}\n {draggable && showTabOptions && (\n <li\n className={classNames(\n isHoveringTabOptions ? 'opacity-100' : 'opacity-0',\n 'transition-opacity duration-300',\n )}\n >\n <TabOptions\n hasSuffixRecord={Boolean(\n suffixRecord && Object.keys(suffixRecord).length > 0,\n )}\n savedConfig={savedTabOptionConfig}\n onApplyFilter={(config) => updateTabConfig(config)}\n setUnsavedChanges={() => {\n /* handled by onTabsChange / onTabConfigChange */\n }}\n handleTabSort={handleTabSort}\n onSearchChange={handleSearchFilterChange}\n />\n </li>\n )}\n </ul>\n {draggingTab ? (\n <TabDragOverlay\n draggingTab={draggingTab}\n suffixRecord={suffixRecord}\n size={size}\n variant={variant}\n selectedId={selectedId}\n parentContainer={parentContainer}\n />\n ) : null}\n </DndContext>\n </div>\n );\n};\n"],"names":["randomHex","TAB_MENU_CLASS","dropdownTrigger","handleDropdownOpen","open","ACTIONS","Tabs","variant","tabs","activeTab","onTabClick","suffixRecordProp","isLoading","size","className","draggable","showAllItems","copyLink","isDisabled","color","iconsOnly","tabIcons","height","fullWidth","fitContentWidth","disableAnimation","onEdit","onDelete","onCopyLink","allowPin","isFullWidth","rightSection","initialTabsProp","tabConfigProp","onTabConfigChange","onTabsChange","parentContainer","tabKey","linkConfig","showTabOptions","providerTabConfig","useTabConfig","providerSettings","initialTabs","tabConfig","search","setSearch","useState","showMoreDropdown","setShowMoreDropdown","visibleTabCounts","setVisibleTabCounts","allTabs","setAllTabs","sortedTabs","setSortedTabs","draggingOver","setDraggingOver","draggingTab","setDraggingTab","isHoveringTabOptions","setIsHoveringTabOptions","savedTabOptionConfig","setSavedTabOptionConfig","INITIAL_TAB_OPTION_CONFIG","tabSearchFilter","setTabSearchFilter","tabSearchFilterType","setTabSearchFilterType","showCounts","lockOrder","sortOrder","t","useTranslation","tabsRef","useRef","ulRef","visibleTabCountsRef","measureText","useTextWidth","selectedId","useMemo","sensors","useSensors","useSensor","MouseSensor","TouchSensor","suffixRecord","name","value","formatCount","visibleTabs","is_hidden","hiddenTabs","filteredVisibleTabs","tabName","searchValue","sortedVisibleTabs","a","b","isTabOverflow","visibleTabSlice","isActiveTabInsideMore","item","moreButtonTabCounts","updateTabs","useCallback","newTabs","updateTabConfig","config","calculateIconWidth","calculateVisibleTabs","clientWidth","tabOptionsWidth","moreWidth","tabGap","basePadding","tabWidth","activeTabWidth","newVisibleTabCounts","availableWidth","currentCount","hasOverflow","hasHidden","index","suffixText","suffixWidth","tabTitleWidth","iconWidth","currentTabWidth","remainingVisibleTabs","lastTab","lastTabWidth","newVisibleSlice","getCurrentSearchParams","params","currentValue","applyTabToSearchParams","resolveTabHref","showCopyLink","handleCopyLink","origin","pathname","href","toast","handleSelectTab","hideTab","_tabs","visibleIndex","nextIndex","unhideTab","togglePinTab","moveTab","direction","oldIndex","newIndex","arrayMove","handleShowMoreDropdown","handleDragStart","event","handleDragEnd","active","over","handleDragCancel","handleDragOver","handleTabSort","handleSearchFilterChange","filterType","getTabOptions","title","isHidden","isSoftHidden","isPinned","_t","options","jsx","OptionButton","ArrowOutwardIcon","ArrowUpwardIcon","ArrowDownwardIcon","ContentCopyIcon","VisibilityOffIcon","VisibilityIcon","UnpinFilledIcon","PinIcon","EditIcon","DeleteIcon","hiddenFilter","defaultFilter","getClasses","classType","isSelected","classNames","useEffect","resizeObserver","entries","containerWidth","tabsKey","initialTabsKey","tab","self","_sortedTabs","icon","TabSwitch","Tooltip","jsxs","DndContext","closestCenter","SortableContext","horizontalListSortingStrategy","is_pinned","SortableTab","Dropdown","IconButton","MoreHorizOutlinedIcon","DropableWrapper","SearchBar","trigger","MoreButton","TabOptions","TabDragOverlay"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react"),p=()=>{const r=n.useRef(null),t=n.useRef(new Map),h=n.useCallback((e,m={})=>{if(!e)return 0;const{fontSize:u="14px",fontWeight:o="600",fontFamily:i="Inter, system-ui, -apple-system, sans-serif",letterSpacing:c="normal"}=m,s=`${e}-${u}-${o}-${i}-${c}`;if(t.current.has(s))return t.current.get(s);!r.current&&typeof document<"u"&&(r.current=document.createElement("canvas"));const a=r.current?.getContext("2d");if(!a)return e.length*8;a.font=`${o} ${u} ${i}`;const g=a.measureText(e),l=Math.ceil(g.width),f=c!=="normal"?l+(parseFloat(c)||0)*(e.length-1):l;return t.current.set(s,f),f},[]),d=n.useCallback(()=>{t.current.clear()},[]);return{measureText:h,clearCache:d}};exports.useTextWidth=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react"),g=()=>{const n=a.useRef(null),t=a.useRef(new Map);return a.useEffect(()=>{n.current||(n.current=document.createElement("canvas"))},[]),{measureText:(e,m={})=>{if(!e)return 0;const{fontSize:u="14px",fontWeight:o="600",fontFamily:i="Inter, system-ui, -apple-system, sans-serif",letterSpacing:r="normal"}=m,c=`${e}-${u}-${o}-${i}-${r}`;if(t.current.has(c))return t.current.get(c);const l=n.current;if(!l)return e.length*8;const s=l.getContext("2d");if(!s)return e.length*8;s.font=`${o} ${u} ${i}`;const d=s.measureText(e),f=Math.ceil(d.width),h=r!=="normal"?f+(parseFloat(r)||0)*(e.length-1):f;return t.current.set(c,h),h},clearCache:()=>{t.current.clear()}}};exports.useTextWidth=g;
2
2
  //# sourceMappingURL=useTextWidth.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTextWidth.cjs.js","sources":["../../src/hooks/useTextWidth.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\ninterface MeasureTextOptions {\n fontSize?: string;\n fontWeight?: string;\n fontFamily?: string;\n letterSpacing?: string;\n}\n\nexport const useTextWidth = () => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const cacheRef = useRef<Map<string, number>>(new Map());\n\n // The canvas is created lazily on first measurement (instead of in an\n // effect) so callers inside useLayoutEffect get real measurements too —\n // layout effects run before this hook's passive effects would.\n const measureText = useCallback((text: string, options: MeasureTextOptions = {}): number => {\n if (!text) return 0;\n\n const {\n fontSize = '14px',\n fontWeight = '600',\n fontFamily = 'Inter, system-ui, -apple-system, sans-serif',\n letterSpacing = 'normal',\n } = options;\n\n const cacheKey = `${text}-${fontSize}-${fontWeight}-${fontFamily}-${letterSpacing}`;\n\n if (cacheRef.current.has(cacheKey)) {\n return cacheRef.current.get(cacheKey)!;\n }\n\n if (!canvasRef.current && typeof document !== 'undefined') {\n canvasRef.current = document.createElement('canvas');\n }\n\n const context = canvasRef.current?.getContext('2d');\n if (!context) return text.length * 8;\n\n context.font = `${fontWeight} ${fontSize} ${fontFamily}`;\n\n const metrics = context.measureText(text);\n const width = Math.ceil(metrics.width);\n\n const finalWidth =\n letterSpacing !== 'normal'\n ? width + (parseFloat(letterSpacing) || 0) * (text.length - 1)\n : width;\n\n cacheRef.current.set(cacheKey, finalWidth);\n\n return finalWidth;\n }, []);\n\n const clearCache = useCallback(() => {\n cacheRef.current.clear();\n }, []);\n\n return { measureText, clearCache };\n};\n"],"names":["useTextWidth","canvasRef","useRef","cacheRef","measureText","useCallback","text","options","fontSize","fontWeight","fontFamily","letterSpacing","cacheKey","context","metrics","width","finalWidth","clearCache"],"mappings":"yGASaA,EAAe,IAAM,CAChC,MAAMC,EAAYC,EAAAA,OAAiC,IAAI,EACjDC,EAAWD,EAAAA,OAA4B,IAAI,GAAK,EAKhDE,EAAcC,EAAAA,YAAY,CAACC,EAAcC,EAA8B,CAAA,IAAe,CAC1F,GAAI,CAACD,EAAM,MAAO,GAElB,KAAM,CACJ,SAAAE,EAAW,OACX,WAAAC,EAAa,MACb,WAAAC,EAAa,8CACb,cAAAC,EAAgB,QAAA,EACdJ,EAEEK,EAAW,GAAGN,CAAI,IAAIE,CAAQ,IAAIC,CAAU,IAAIC,CAAU,IAAIC,CAAa,GAEjF,GAAIR,EAAS,QAAQ,IAAIS,CAAQ,EAC/B,OAAOT,EAAS,QAAQ,IAAIS,CAAQ,EAGlC,CAACX,EAAU,SAAW,OAAO,SAAa,MAC5CA,EAAU,QAAU,SAAS,cAAc,QAAQ,GAGrD,MAAMY,EAAUZ,EAAU,SAAS,WAAW,IAAI,EAClD,GAAI,CAACY,EAAS,OAAOP,EAAK,OAAS,EAEnCO,EAAQ,KAAO,GAAGJ,CAAU,IAAID,CAAQ,IAAIE,CAAU,GAEtD,MAAMI,EAAUD,EAAQ,YAAYP,CAAI,EAClCS,EAAQ,KAAK,KAAKD,EAAQ,KAAK,EAE/BE,EACJL,IAAkB,SACdI,GAAS,WAAWJ,CAAa,GAAK,IAAML,EAAK,OAAS,GAC1DS,EAEN,OAAAZ,EAAS,QAAQ,IAAIS,EAAUI,CAAU,EAElCA,CACT,EAAG,CAAA,CAAE,EAECC,EAAaZ,EAAAA,YAAY,IAAM,CACnCF,EAAS,QAAQ,MAAA,CACnB,EAAG,CAAA,CAAE,EAEL,MAAO,CAAE,YAAAC,EAAa,WAAAa,CAAA,CACxB"}
1
+ {"version":3,"file":"useTextWidth.cjs.js","sources":["../../src/hooks/useTextWidth.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\ninterface MeasureTextOptions {\n fontSize?: string;\n fontWeight?: string;\n fontFamily?: string;\n letterSpacing?: string;\n}\n\nexport const useTextWidth = () => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const cacheRef = useRef<Map<string, number>>(new Map());\n\n useEffect(() => {\n if (!canvasRef.current) {\n canvasRef.current = document.createElement('canvas');\n }\n }, []);\n\n const measureText = (text: string, options: MeasureTextOptions = {}): number => {\n if (!text) return 0;\n\n const {\n fontSize = '14px',\n fontWeight = '600',\n fontFamily = 'Inter, system-ui, -apple-system, sans-serif',\n letterSpacing = 'normal',\n } = options;\n\n const cacheKey = `${text}-${fontSize}-${fontWeight}-${fontFamily}-${letterSpacing}`;\n\n if (cacheRef.current.has(cacheKey)) {\n return cacheRef.current.get(cacheKey)!;\n }\n\n const canvas = canvasRef.current;\n if (!canvas) return text.length * 8;\n\n const context = canvas.getContext('2d');\n if (!context) return text.length * 8;\n\n context.font = `${fontWeight} ${fontSize} ${fontFamily}`;\n\n const metrics = context.measureText(text);\n const width = Math.ceil(metrics.width);\n\n const finalWidth =\n letterSpacing !== 'normal'\n ? width + (parseFloat(letterSpacing) || 0) * (text.length - 1)\n : width;\n\n cacheRef.current.set(cacheKey, finalWidth);\n\n return finalWidth;\n };\n\n const clearCache = () => {\n cacheRef.current.clear();\n };\n\n return { measureText, clearCache };\n};\n"],"names":["useTextWidth","canvasRef","useRef","cacheRef","useEffect","text","options","fontSize","fontWeight","fontFamily","letterSpacing","cacheKey","canvas","context","metrics","width","finalWidth"],"mappings":"yGASaA,EAAe,IAAM,CAChC,MAAMC,EAAYC,EAAAA,OAAiC,IAAI,EACjDC,EAAWD,EAAAA,OAA4B,IAAI,GAAK,EAEtDE,OAAAA,EAAAA,UAAU,IAAM,CACTH,EAAU,UACbA,EAAU,QAAU,SAAS,cAAc,QAAQ,EAEvD,EAAG,CAAA,CAAE,EA2CE,CAAE,YAzCW,CAACI,EAAcC,EAA8B,CAAA,IAAe,CAC9E,GAAI,CAACD,EAAM,MAAO,GAElB,KAAM,CACJ,SAAAE,EAAW,OACX,WAAAC,EAAa,MACb,WAAAC,EAAa,8CACb,cAAAC,EAAgB,QAAA,EACdJ,EAEEK,EAAW,GAAGN,CAAI,IAAIE,CAAQ,IAAIC,CAAU,IAAIC,CAAU,IAAIC,CAAa,GAEjF,GAAIP,EAAS,QAAQ,IAAIQ,CAAQ,EAC/B,OAAOR,EAAS,QAAQ,IAAIQ,CAAQ,EAGtC,MAAMC,EAASX,EAAU,QACzB,GAAI,CAACW,EAAQ,OAAOP,EAAK,OAAS,EAElC,MAAMQ,EAAUD,EAAO,WAAW,IAAI,EACtC,GAAI,CAACC,EAAS,OAAOR,EAAK,OAAS,EAEnCQ,EAAQ,KAAO,GAAGL,CAAU,IAAID,CAAQ,IAAIE,CAAU,GAEtD,MAAMK,EAAUD,EAAQ,YAAYR,CAAI,EAClCU,EAAQ,KAAK,KAAKD,EAAQ,KAAK,EAE/BE,EACJN,IAAkB,SACdK,GAAS,WAAWL,CAAa,GAAK,IAAML,EAAK,OAAS,GAC1DU,EAEN,OAAAZ,EAAS,QAAQ,IAAIQ,EAAUK,CAAU,EAElCA,CACT,EAMsB,WAJH,IAAM,CACvBb,EAAS,QAAQ,MAAA,CACnB,CAEsB,CACxB"}
@@ -1,27 +1,30 @@
1
- import { useRef as f, useCallback as m } from "react";
2
- const y = () => {
3
- const n = f(null), t = f(/* @__PURE__ */ new Map()), h = m((e, p = {}) => {
1
+ import { useRef as h, useEffect as $ } from "react";
2
+ const T = () => {
3
+ const n = h(null), t = h(/* @__PURE__ */ new Map());
4
+ return $(() => {
5
+ n.current || (n.current = document.createElement("canvas"));
6
+ }, []), { measureText: (e, m = {}) => {
4
7
  if (!e) return 0;
5
8
  const {
6
9
  fontSize: a = "14px",
7
10
  fontWeight: o = "600",
8
11
  fontFamily: u = "Inter, system-ui, -apple-system, sans-serif",
9
12
  letterSpacing: r = "normal"
10
- } = p, c = `${e}-${a}-${o}-${u}-${r}`;
13
+ } = m, c = `${e}-${a}-${o}-${u}-${r}`;
11
14
  if (t.current.has(c))
12
15
  return t.current.get(c);
13
- !n.current && typeof document < "u" && (n.current = document.createElement("canvas"));
14
- const s = n.current?.getContext("2d");
16
+ const i = n.current;
17
+ if (!i) return e.length * 8;
18
+ const s = i.getContext("2d");
15
19
  if (!s) return e.length * 8;
16
20
  s.font = `${o} ${a} ${u}`;
17
- const $ = s.measureText(e), i = Math.ceil($.width), l = r !== "normal" ? i + (parseFloat(r) || 0) * (e.length - 1) : i;
21
+ const p = s.measureText(e), f = Math.ceil(p.width), l = r !== "normal" ? f + (parseFloat(r) || 0) * (e.length - 1) : f;
18
22
  return t.current.set(c, l), l;
19
- }, []), d = m(() => {
23
+ }, clearCache: () => {
20
24
  t.current.clear();
21
- }, []);
22
- return { measureText: h, clearCache: d };
25
+ } };
23
26
  };
24
27
  export {
25
- y as useTextWidth
28
+ T as useTextWidth
26
29
  };
27
30
  //# sourceMappingURL=useTextWidth.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTextWidth.es.js","sources":["../../src/hooks/useTextWidth.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\ninterface MeasureTextOptions {\n fontSize?: string;\n fontWeight?: string;\n fontFamily?: string;\n letterSpacing?: string;\n}\n\nexport const useTextWidth = () => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const cacheRef = useRef<Map<string, number>>(new Map());\n\n // The canvas is created lazily on first measurement (instead of in an\n // effect) so callers inside useLayoutEffect get real measurements too —\n // layout effects run before this hook's passive effects would.\n const measureText = useCallback((text: string, options: MeasureTextOptions = {}): number => {\n if (!text) return 0;\n\n const {\n fontSize = '14px',\n fontWeight = '600',\n fontFamily = 'Inter, system-ui, -apple-system, sans-serif',\n letterSpacing = 'normal',\n } = options;\n\n const cacheKey = `${text}-${fontSize}-${fontWeight}-${fontFamily}-${letterSpacing}`;\n\n if (cacheRef.current.has(cacheKey)) {\n return cacheRef.current.get(cacheKey)!;\n }\n\n if (!canvasRef.current && typeof document !== 'undefined') {\n canvasRef.current = document.createElement('canvas');\n }\n\n const context = canvasRef.current?.getContext('2d');\n if (!context) return text.length * 8;\n\n context.font = `${fontWeight} ${fontSize} ${fontFamily}`;\n\n const metrics = context.measureText(text);\n const width = Math.ceil(metrics.width);\n\n const finalWidth =\n letterSpacing !== 'normal'\n ? width + (parseFloat(letterSpacing) || 0) * (text.length - 1)\n : width;\n\n cacheRef.current.set(cacheKey, finalWidth);\n\n return finalWidth;\n }, []);\n\n const clearCache = useCallback(() => {\n cacheRef.current.clear();\n }, []);\n\n return { measureText, clearCache };\n};\n"],"names":["useTextWidth","canvasRef","useRef","cacheRef","measureText","useCallback","text","options","fontSize","fontWeight","fontFamily","letterSpacing","cacheKey","context","metrics","width","finalWidth","clearCache"],"mappings":";AASO,MAAMA,IAAe,MAAM;AAChC,QAAMC,IAAYC,EAAiC,IAAI,GACjDC,IAAWD,EAA4B,oBAAI,KAAK,GAKhDE,IAAcC,EAAY,CAACC,GAAcC,IAA8B,CAAA,MAAe;AAC1F,QAAI,CAACD,EAAM,QAAO;AAElB,UAAM;AAAA,MACJ,UAAAE,IAAW;AAAA,MACX,YAAAC,IAAa;AAAA,MACb,YAAAC,IAAa;AAAA,MACb,eAAAC,IAAgB;AAAA,IAAA,IACdJ,GAEEK,IAAW,GAAGN,CAAI,IAAIE,CAAQ,IAAIC,CAAU,IAAIC,CAAU,IAAIC,CAAa;AAEjF,QAAIR,EAAS,QAAQ,IAAIS,CAAQ;AAC/B,aAAOT,EAAS,QAAQ,IAAIS,CAAQ;AAGtC,IAAI,CAACX,EAAU,WAAW,OAAO,WAAa,QAC5CA,EAAU,UAAU,SAAS,cAAc,QAAQ;AAGrD,UAAMY,IAAUZ,EAAU,SAAS,WAAW,IAAI;AAClD,QAAI,CAACY,EAAS,QAAOP,EAAK,SAAS;AAEnC,IAAAO,EAAQ,OAAO,GAAGJ,CAAU,IAAID,CAAQ,IAAIE,CAAU;AAEtD,UAAMI,IAAUD,EAAQ,YAAYP,CAAI,GAClCS,IAAQ,KAAK,KAAKD,EAAQ,KAAK,GAE/BE,IACJL,MAAkB,WACdI,KAAS,WAAWJ,CAAa,KAAK,MAAML,EAAK,SAAS,KAC1DS;AAEN,WAAAZ,EAAS,QAAQ,IAAIS,GAAUI,CAAU,GAElCA;AAAA,EACT,GAAG,CAAA,CAAE,GAECC,IAAaZ,EAAY,MAAM;AACnC,IAAAF,EAAS,QAAQ,MAAA;AAAA,EACnB,GAAG,CAAA,CAAE;AAEL,SAAO,EAAE,aAAAC,GAAa,YAAAa,EAAA;AACxB;"}
1
+ {"version":3,"file":"useTextWidth.es.js","sources":["../../src/hooks/useTextWidth.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\ninterface MeasureTextOptions {\n fontSize?: string;\n fontWeight?: string;\n fontFamily?: string;\n letterSpacing?: string;\n}\n\nexport const useTextWidth = () => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const cacheRef = useRef<Map<string, number>>(new Map());\n\n useEffect(() => {\n if (!canvasRef.current) {\n canvasRef.current = document.createElement('canvas');\n }\n }, []);\n\n const measureText = (text: string, options: MeasureTextOptions = {}): number => {\n if (!text) return 0;\n\n const {\n fontSize = '14px',\n fontWeight = '600',\n fontFamily = 'Inter, system-ui, -apple-system, sans-serif',\n letterSpacing = 'normal',\n } = options;\n\n const cacheKey = `${text}-${fontSize}-${fontWeight}-${fontFamily}-${letterSpacing}`;\n\n if (cacheRef.current.has(cacheKey)) {\n return cacheRef.current.get(cacheKey)!;\n }\n\n const canvas = canvasRef.current;\n if (!canvas) return text.length * 8;\n\n const context = canvas.getContext('2d');\n if (!context) return text.length * 8;\n\n context.font = `${fontWeight} ${fontSize} ${fontFamily}`;\n\n const metrics = context.measureText(text);\n const width = Math.ceil(metrics.width);\n\n const finalWidth =\n letterSpacing !== 'normal'\n ? width + (parseFloat(letterSpacing) || 0) * (text.length - 1)\n : width;\n\n cacheRef.current.set(cacheKey, finalWidth);\n\n return finalWidth;\n };\n\n const clearCache = () => {\n cacheRef.current.clear();\n };\n\n return { measureText, clearCache };\n};\n"],"names":["useTextWidth","canvasRef","useRef","cacheRef","useEffect","text","options","fontSize","fontWeight","fontFamily","letterSpacing","cacheKey","canvas","context","metrics","width","finalWidth"],"mappings":";AASO,MAAMA,IAAe,MAAM;AAChC,QAAMC,IAAYC,EAAiC,IAAI,GACjDC,IAAWD,EAA4B,oBAAI,KAAK;AAEtD,SAAAE,EAAU,MAAM;AACd,IAAKH,EAAU,YACbA,EAAU,UAAU,SAAS,cAAc,QAAQ;AAAA,EAEvD,GAAG,CAAA,CAAE,GA2CE,EAAE,aAzCW,CAACI,GAAcC,IAA8B,CAAA,MAAe;AAC9E,QAAI,CAACD,EAAM,QAAO;AAElB,UAAM;AAAA,MACJ,UAAAE,IAAW;AAAA,MACX,YAAAC,IAAa;AAAA,MACb,YAAAC,IAAa;AAAA,MACb,eAAAC,IAAgB;AAAA,IAAA,IACdJ,GAEEK,IAAW,GAAGN,CAAI,IAAIE,CAAQ,IAAIC,CAAU,IAAIC,CAAU,IAAIC,CAAa;AAEjF,QAAIP,EAAS,QAAQ,IAAIQ,CAAQ;AAC/B,aAAOR,EAAS,QAAQ,IAAIQ,CAAQ;AAGtC,UAAMC,IAASX,EAAU;AACzB,QAAI,CAACW,EAAQ,QAAOP,EAAK,SAAS;AAElC,UAAMQ,IAAUD,EAAO,WAAW,IAAI;AACtC,QAAI,CAACC,EAAS,QAAOR,EAAK,SAAS;AAEnC,IAAAQ,EAAQ,OAAO,GAAGL,CAAU,IAAID,CAAQ,IAAIE,CAAU;AAEtD,UAAMK,IAAUD,EAAQ,YAAYR,CAAI,GAClCU,IAAQ,KAAK,KAAKD,EAAQ,KAAK,GAE/BE,IACJN,MAAkB,WACdK,KAAS,WAAWL,CAAa,KAAK,MAAML,EAAK,SAAS,KAC1DU;AAEN,WAAAZ,EAAS,QAAQ,IAAIQ,GAAUK,CAAU,GAElCA;AAAA,EACT,GAMsB,YAJH,MAAM;AACvB,IAAAb,EAAS,QAAQ,MAAA;AAAA,EACnB,EAEsB;AACxB;"}
@@ -1,5 +1,5 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),a=require("country-flag-icons/react/1x1");require("react");function s(t){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const o=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(n,e,o.get?o:{enumerable:!0,get:()=>t[e]})}}return n.default=t,Object.freeze(n)}const l=s(a),i=(t,n)=>{const e=t.slice(0,2),o=l[e];return o?r.jsx("div",{className:`
2
- w-5 h-5 rounded-full overflow-hidden border-[0.9px] flex items-center justify-center relative
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react/jsx-runtime"),a=require("country-flag-icons/react/1x1");function s(t){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const e in t)if(e!=="default"){const o=Object.getOwnPropertyDescriptor(t,e);Object.defineProperty(n,e,o.get?o:{enumerable:!0,get:()=>t[e]})}}return n.default=t,Object.freeze(n)}const l=s(a),i=(t,n)=>{const e=t.slice(0,2),o=l[e];return o?r.jsx("div",{className:`
2
+ w-icon h-icon rounded-full overflow-hidden border-[0.9px] flex items-center justify-center relative
3
3
  ${n?"border-neutral-100 dark:border-neutral-100":"border-neutral-400 dark:border-neutral-500"}
4
4
  `,children:r.jsx(o,{style:{width:"110%",height:"110%",transform:"translate(-50%, -50%)",position:"absolute",top:"50%",left:"50%"}})}):null},d=t=>{const n=t.slice(0,2),e=l[n];return e?r.jsx("div",{className:"w-4 h-4 rounded-full overflow-hidden flex items-center justify-center relative",children:r.jsx(e,{style:{width:"120%",height:"120%",transform:"translate(-50%, -50%)",position:"absolute",top:"50%",left:"50%"}})}):null},c=t=>{const n=t.slice(0,2),e=l[n];return e?r.jsx("div",{className:"w-7 h-5 rounded-md overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative",children:r.jsx(e,{style:{width:"110%",height:"110%",transform:"translate(-50%, -50%)",position:"absolute",top:"50%",left:"50%"}})}):null},u=t=>{const n=t.slice(0,2),e=l[n];return e?r.jsx("div",{className:"w-4 h-3 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative",children:r.jsx(e,{style:{width:"120%",height:"120%",transform:"translate(-50%, -50%)",position:"absolute",top:"50%",left:"50%"}})}):null},g=t=>{const n=t.slice(0,2),e=l[n];return e?r.jsx("div",{className:"w-5 h-4 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative",children:r.jsx(e,{style:{width:"115%",height:"115%",transform:"translate(-50%, -50%)",position:"absolute",top:"50%",left:"50%"}})}):null};exports.getFlagComponent=i;exports.getFlagComponentRectangle=c;exports.getFlagComponentRectangleMd=g;exports.getFlagComponentRectangleSm=u;exports.getFlagComponentSm=d;
5
5
  //# sourceMappingURL=countryFlags.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"countryFlags.cjs.js","sources":["../../src/utils/countryFlags.tsx"],"sourcesContent":["import * as Flags from 'country-flag-icons/react/1x1';\nimport React from 'react';\n\nexport const getFlagComponent = (countryCode: string, isHovering?: boolean) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n \n return FlagComponent ? (\n <div\n className={`\n w-5 h-5 rounded-full overflow-hidden border-[0.9px] flex items-center justify-center relative\n ${isHovering ? 'border-neutral-100 dark:border-neutral-100' : 'border-neutral-400 dark:border-neutral-500'}\n `}\n >\n <FlagComponent\n style={{\n width: '110%',\n height: '110%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n ) : null;\n};\n\nexport const getFlagComponentSm = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-4 h-4 rounded-full overflow-hidden flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '120%',\n height: '120%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangle = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-7 h-5 rounded-md overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '110%',\n height: '110%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangleSm = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-4 h-3 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '120%',\n height: '120%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangleMd = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-5 h-4 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '115%',\n height: '115%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\n"],"names":["getFlagComponent","countryCode","isHovering","flagCode","FlagComponent","Flags","jsx","getFlagComponentSm","getFlagComponentRectangle","getFlagComponentRectangleSm","getFlagComponentRectangleMd"],"mappings":"0cAGaA,EAAmB,CAACC,EAAqBC,IAAyB,CAC7E,MAAMC,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAOC,EACLE,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPJ,EAAa,6CAA+C,4CAA4C;AAAA,QAG5G,SAAAI,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,CACF,CAAA,EAEA,IACN,EAEaG,EAAsBN,GAAwB,CACzD,MAAME,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAKC,EAGHE,EAAAA,IAAC,MAAA,CAAI,UAAU,iFACb,SAAAA,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,EAEJ,EAdyB,IAgB7B,EAEaI,EAA6BP,GAAwB,CAChE,MAAME,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAKC,EAGHE,EAAAA,IAAC,MAAA,CAAI,UAAU,iIACb,SAAAA,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,EAEJ,EAdyB,IAgB7B,EAEaK,EAA+BR,GAAwB,CAClE,MAAME,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAKC,EAGHE,EAAAA,IAAC,MAAA,CAAI,UAAU,iIACb,SAAAA,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,EAEJ,EAdyB,IAgB7B,EAEaM,EAA+BT,GAAwB,CAClE,MAAME,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAKC,EAGHE,EAAAA,IAAC,MAAA,CAAI,UAAU,iIACb,SAAAA,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,EAEJ,EAdyB,IAgB7B"}
1
+ {"version":3,"file":"countryFlags.cjs.js","sources":["../../src/utils/countryFlags.tsx"],"sourcesContent":["import * as Flags from 'country-flag-icons/react/1x1';\n\nexport const getFlagComponent = (countryCode: string, isHovering?: boolean) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n \n return FlagComponent ? (\n <div\n className={`\n w-icon h-icon rounded-full overflow-hidden border-[0.9px] flex items-center justify-center relative\n ${isHovering ? 'border-neutral-100 dark:border-neutral-100' : 'border-neutral-400 dark:border-neutral-500'}\n `}\n >\n <FlagComponent\n style={{\n width: '110%',\n height: '110%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n ) : null;\n};\n\nexport const getFlagComponentSm = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-4 h-4 rounded-full overflow-hidden flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '120%',\n height: '120%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangle = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-7 h-5 rounded-md overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '110%',\n height: '110%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangleSm = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-4 h-3 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '120%',\n height: '120%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangleMd = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-5 h-4 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '115%',\n height: '115%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\n"],"names":["getFlagComponent","countryCode","isHovering","flagCode","FlagComponent","Flags","jsx","getFlagComponentSm","getFlagComponentRectangle","getFlagComponentRectangleSm","getFlagComponentRectangleMd"],"mappings":"ybAEaA,EAAmB,CAACC,EAAqBC,IAAyB,CAC7E,MAAMC,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAOC,EACLE,EAAAA,IAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPJ,EAAa,6CAA+C,4CAA4C;AAAA,QAG5G,SAAAI,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,CACF,CAAA,EAEA,IACN,EAEaG,EAAsBN,GAAwB,CACzD,MAAME,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAKC,EAGHE,EAAAA,IAAC,MAAA,CAAI,UAAU,iFACb,SAAAA,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,EAEJ,EAdyB,IAgB7B,EAEaI,EAA6BP,GAAwB,CAChE,MAAME,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAKC,EAGHE,EAAAA,IAAC,MAAA,CAAI,UAAU,iIACb,SAAAA,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,EAEJ,EAdyB,IAgB7B,EAEaK,EAA+BR,GAAwB,CAClE,MAAME,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAKC,EAGHE,EAAAA,IAAC,MAAA,CAAI,UAAU,iIACb,SAAAA,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,EAEJ,EAdyB,IAgB7B,EAEaM,EAA+BT,GAAwB,CAClE,MAAME,EAAWF,EAAY,MAAM,EAAG,CAAC,EACjCG,EAAgBC,EAAMF,CAA8B,EAE1D,OAAKC,EAGHE,EAAAA,IAAC,MAAA,CAAI,UAAU,iIACb,SAAAA,EAAAA,IAACF,EAAA,CACC,MAAO,CACL,MAAO,OACP,OAAQ,OACR,UAAW,wBACX,SAAU,WACV,IAAK,MACL,KAAM,KAAA,CACR,CAAA,EAEJ,EAdyB,IAgB7B"}
@@ -1,13 +1,12 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
2
  import * as o from "country-flag-icons/react/1x1";
3
- import "react";
4
- const i = (r, n) => {
3
+ const s = (r, n) => {
5
4
  const e = r.slice(0, 2), l = o[e];
6
5
  return l ? /* @__PURE__ */ t(
7
6
  "div",
8
7
  {
9
8
  className: `
10
- w-5 h-5 rounded-full overflow-hidden border-[0.9px] flex items-center justify-center relative
9
+ w-icon h-icon rounded-full overflow-hidden border-[0.9px] flex items-center justify-center relative
11
10
  ${n ? "border-neutral-100 dark:border-neutral-100" : "border-neutral-400 dark:border-neutral-500"}
12
11
  `,
13
12
  children: /* @__PURE__ */ t(
@@ -25,7 +24,7 @@ const i = (r, n) => {
25
24
  )
26
25
  }
27
26
  ) : null;
28
- }, d = (r) => {
27
+ }, i = (r) => {
29
28
  const n = r.slice(0, 2), e = o[n];
30
29
  return e ? /* @__PURE__ */ t("div", { className: "w-4 h-4 rounded-full overflow-hidden flex items-center justify-center relative", children: /* @__PURE__ */ t(
31
30
  e,
@@ -40,7 +39,7 @@ const i = (r, n) => {
40
39
  }
41
40
  }
42
41
  ) }) : null;
43
- }, c = (r) => {
42
+ }, d = (r) => {
44
43
  const n = r.slice(0, 2), e = o[n];
45
44
  return e ? /* @__PURE__ */ t("div", { className: "w-7 h-5 rounded-md overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative", children: /* @__PURE__ */ t(
46
45
  e,
@@ -55,7 +54,7 @@ const i = (r, n) => {
55
54
  }
56
55
  }
57
56
  ) }) : null;
58
- }, u = (r) => {
57
+ }, c = (r) => {
59
58
  const n = r.slice(0, 2), e = o[n];
60
59
  return e ? /* @__PURE__ */ t("div", { className: "w-4 h-3 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative", children: /* @__PURE__ */ t(
61
60
  e,
@@ -70,7 +69,7 @@ const i = (r, n) => {
70
69
  }
71
70
  }
72
71
  ) }) : null;
73
- }, f = (r) => {
72
+ }, u = (r) => {
74
73
  const n = r.slice(0, 2), e = o[n];
75
74
  return e ? /* @__PURE__ */ t("div", { className: "w-5 h-4 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative", children: /* @__PURE__ */ t(
76
75
  e,
@@ -87,10 +86,10 @@ const i = (r, n) => {
87
86
  ) }) : null;
88
87
  };
89
88
  export {
90
- i as getFlagComponent,
91
- c as getFlagComponentRectangle,
92
- f as getFlagComponentRectangleMd,
93
- u as getFlagComponentRectangleSm,
94
- d as getFlagComponentSm
89
+ s as getFlagComponent,
90
+ d as getFlagComponentRectangle,
91
+ u as getFlagComponentRectangleMd,
92
+ c as getFlagComponentRectangleSm,
93
+ i as getFlagComponentSm
95
94
  };
96
95
  //# sourceMappingURL=countryFlags.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"countryFlags.es.js","sources":["../../src/utils/countryFlags.tsx"],"sourcesContent":["import * as Flags from 'country-flag-icons/react/1x1';\nimport React from 'react';\n\nexport const getFlagComponent = (countryCode: string, isHovering?: boolean) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n \n return FlagComponent ? (\n <div\n className={`\n w-5 h-5 rounded-full overflow-hidden border-[0.9px] flex items-center justify-center relative\n ${isHovering ? 'border-neutral-100 dark:border-neutral-100' : 'border-neutral-400 dark:border-neutral-500'}\n `}\n >\n <FlagComponent\n style={{\n width: '110%',\n height: '110%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n ) : null;\n};\n\nexport const getFlagComponentSm = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-4 h-4 rounded-full overflow-hidden flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '120%',\n height: '120%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangle = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-7 h-5 rounded-md overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '110%',\n height: '110%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangleSm = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-4 h-3 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '120%',\n height: '120%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangleMd = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-5 h-4 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '115%',\n height: '115%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\n"],"names":["getFlagComponent","countryCode","isHovering","flagCode","FlagComponent","Flags","jsx","getFlagComponentSm","getFlagComponentRectangle","getFlagComponentRectangleSm","getFlagComponentRectangleMd"],"mappings":";;;AAGO,MAAMA,IAAmB,CAACC,GAAqBC,MAAyB;AAC7E,QAAMC,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAOC,IACL,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA;AAAA,UAEPJ,IAAa,+CAA+C,4CAA4C;AAAA;AAAA,MAG5G,UAAA,gBAAAI;AAAA,QAACF;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,UAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAM;AAAA,UAAA;AAAA,QACR;AAAA,MAAA;AAAA,IACF;AAAA,EAAA,IAEA;AACN,GAEaG,IAAqB,CAACN,MAAwB;AACzD,QAAME,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAKC,IAGH,gBAAAE,EAAC,OAAA,EAAI,WAAU,kFACb,UAAA,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA,GAEJ,IAdyB;AAgB7B,GAEaI,IAA4B,CAACP,MAAwB;AAChE,QAAME,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAKC,IAGH,gBAAAE,EAAC,OAAA,EAAI,WAAU,kIACb,UAAA,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA,GAEJ,IAdyB;AAgB7B,GAEaK,IAA8B,CAACR,MAAwB;AAClE,QAAME,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAKC,IAGH,gBAAAE,EAAC,OAAA,EAAI,WAAU,kIACb,UAAA,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA,GAEJ,IAdyB;AAgB7B,GAEaM,IAA8B,CAACT,MAAwB;AAClE,QAAME,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAKC,IAGH,gBAAAE,EAAC,OAAA,EAAI,WAAU,kIACb,UAAA,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA,GAEJ,IAdyB;AAgB7B;"}
1
+ {"version":3,"file":"countryFlags.es.js","sources":["../../src/utils/countryFlags.tsx"],"sourcesContent":["import * as Flags from 'country-flag-icons/react/1x1';\n\nexport const getFlagComponent = (countryCode: string, isHovering?: boolean) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n \n return FlagComponent ? (\n <div\n className={`\n w-icon h-icon rounded-full overflow-hidden border-[0.9px] flex items-center justify-center relative\n ${isHovering ? 'border-neutral-100 dark:border-neutral-100' : 'border-neutral-400 dark:border-neutral-500'}\n `}\n >\n <FlagComponent\n style={{\n width: '110%',\n height: '110%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n ) : null;\n};\n\nexport const getFlagComponentSm = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-4 h-4 rounded-full overflow-hidden flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '120%',\n height: '120%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangle = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-7 h-5 rounded-md overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '110%',\n height: '110%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangleSm = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-4 h-3 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '120%',\n height: '120%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\nexport const getFlagComponentRectangleMd = (countryCode: string) => {\n const flagCode = countryCode.slice(0, 2);\n const FlagComponent = Flags[flagCode as keyof typeof Flags];\n\n if (!FlagComponent) return null;\n\n return (\n <div className='w-5 h-4 rounded-sm overflow-hidden border border-neutral-300 dark:border-neutral-300 flex items-center justify-center relative'>\n <FlagComponent\n style={{\n width: '115%',\n height: '115%',\n transform: 'translate(-50%, -50%)',\n position: 'absolute',\n top: '50%',\n left: '50%',\n }}\n />\n </div>\n );\n};\n\n"],"names":["getFlagComponent","countryCode","isHovering","flagCode","FlagComponent","Flags","jsx","getFlagComponentSm","getFlagComponentRectangle","getFlagComponentRectangleSm","getFlagComponentRectangleMd"],"mappings":";;AAEO,MAAMA,IAAmB,CAACC,GAAqBC,MAAyB;AAC7E,QAAMC,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAOC,IACL,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA;AAAA,UAEPJ,IAAa,+CAA+C,4CAA4C;AAAA;AAAA,MAG5G,UAAA,gBAAAI;AAAA,QAACF;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,UAAU;AAAA,YACV,KAAK;AAAA,YACL,MAAM;AAAA,UAAA;AAAA,QACR;AAAA,MAAA;AAAA,IACF;AAAA,EAAA,IAEA;AACN,GAEaG,IAAqB,CAACN,MAAwB;AACzD,QAAME,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAKC,IAGH,gBAAAE,EAAC,OAAA,EAAI,WAAU,kFACb,UAAA,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA,GAEJ,IAdyB;AAgB7B,GAEaI,IAA4B,CAACP,MAAwB;AAChE,QAAME,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAKC,IAGH,gBAAAE,EAAC,OAAA,EAAI,WAAU,kIACb,UAAA,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA,GAEJ,IAdyB;AAgB7B,GAEaK,IAA8B,CAACR,MAAwB;AAClE,QAAME,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAKC,IAGH,gBAAAE,EAAC,OAAA,EAAI,WAAU,kIACb,UAAA,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA,GAEJ,IAdyB;AAgB7B,GAEaM,IAA8B,CAACT,MAAwB;AAClE,QAAME,IAAWF,EAAY,MAAM,GAAG,CAAC,GACjCG,IAAgBC,EAAMF,CAA8B;AAE1D,SAAKC,IAGH,gBAAAE,EAAC,OAAA,EAAI,WAAU,kIACb,UAAA,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EAAA,GAEJ,IAdyB;AAgB7B;"}