@sqlrooms/ui 0.27.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/badge.js +1 -1
- package/dist/components/badge.js.map +1 -1
- package/dist/components/breadcrumb.js +1 -1
- package/dist/components/breadcrumb.js.map +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/button.js.map +1 -1
- package/dist/components/checkbox.d.ts.map +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/command.js +5 -5
- package/dist/components/command.js.map +1 -1
- package/dist/components/context-menu.js +6 -6
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/dialog.d.ts.map +1 -1
- package/dist/components/dialog.js +2 -2
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/dropdown-menu.js +6 -6
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editable-text.js +3 -3
- package/dist/components/editable-text.js.map +1 -1
- package/dist/components/input.js +1 -1
- package/dist/components/input.js.map +1 -1
- package/dist/components/menu-bar.js +7 -7
- package/dist/components/menu-bar.js.map +1 -1
- package/dist/components/popover.js +1 -1
- package/dist/components/popover.js.map +1 -1
- package/dist/components/progress-modal.js +1 -1
- package/dist/components/progress-modal.js.map +1 -1
- package/dist/components/radio-group.js +1 -1
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/resizable.js +1 -1
- package/dist/components/resizable.js.map +1 -1
- package/dist/components/scroll-area.js +3 -3
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/scrollable-row.js +8 -8
- package/dist/components/scrollable-row.js.map +1 -1
- package/dist/components/select.js +4 -4
- package/dist/components/select.js.map +1 -1
- package/dist/components/separator.js +1 -1
- package/dist/components/separator.js.map +1 -1
- package/dist/components/sheet.js +1 -1
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/slider.js +1 -1
- package/dist/components/slider.js.map +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/switch.js.map +1 -1
- package/dist/components/tab-strip.d.ts.map +1 -1
- package/dist/components/tab-strip.js +18 -18
- package/dist/components/tab-strip.js.map +1 -1
- package/dist/components/table.d.ts +1 -1
- package/dist/components/table.d.ts.map +1 -1
- package/dist/components/table.js +2 -2
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.js +2 -2
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/textarea.d.ts.map +1 -1
- package/dist/components/textarea.js +5 -1
- package/dist/components/textarea.js.map +1 -1
- package/dist/components/theme-switch.d.ts.map +1 -1
- package/dist/components/theme-switch.js +4 -4
- package/dist/components/theme-switch.js.map +1 -1
- package/dist/components/toast.js +4 -4
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/toggle.js.map +1 -1
- package/dist/components/tree.js +1 -1
- package/dist/components/tree.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
- package/tailwind-preset.css +196 -56
- package/dist/tailwind-preset.d.ts +0 -3
- package/dist/tailwind-preset.d.ts.map +0 -1
- package/dist/tailwind-preset.js +0 -152
- package/dist/tailwind-preset.js.map +0 -1
|
@@ -35,23 +35,23 @@ function SortableTab({ tab, tabClassName, editingTabId, hideCloseButton, onClose
|
|
|
35
35
|
opacity: isDragging ? 0.5 : 1,
|
|
36
36
|
};
|
|
37
37
|
const menuContent = renderTabMenu?.(tab);
|
|
38
|
-
return (_jsx("div", { ref: setNodeRef, className: "h-full
|
|
38
|
+
return (_jsx("div", { ref: setNodeRef, className: "h-full shrink-0", style: style, "data-tab-id": tab.id, ...attributes, ...listeners, tabIndex: -1, children: _jsx("div", { "data-state": editingTabId === tab.id ? 'editing' : undefined, className: cn('data-[state=inactive]:hover:bg-primary/5', 'group flex h-full max-w-[200px] min-w-[100px] shrink-0 cursor-grab', 'items-center justify-between gap-1 overflow-hidden rounded-b-none', 'py-0 pr-1 pl-4 font-normal data-[state=active]:shadow-none', tabClassName, editingTabId === tab.id && 'focus-visible:ring-0'), children: _jsxs("div", { className: "relative flex h-full min-w-0 flex-1 items-center", children: [_jsx(TabsTrigger, { value: tab.id, tabIndex: editingTabId === tab.id ? -1 : undefined, "data-editing": editingTabId === tab.id ? '' : undefined, className: cn('flex h-full min-w-0 flex-1 items-center justify-start gap-1', 'hover:bg-primary/10 overflow-hidden px-6 py-1 font-normal', 'min-h-7', 'data-[state=active]:bg-primary/10 data-[state=active]:text-foreground data-[state=active]:shadow-none', 'focus-visible:ring-primary focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-inset', editingTabId === tab.id && 'focus-visible:ring-0'), onDoubleClick: () => onStartEditing(tab.id), children: editingTabId !== tab.id ? (_jsx("div", { className: "truncate text-sm", children: renderTabLabel ? renderTabLabel(tab) : tab.name })) : (_jsx(EditableText, { value: tab.name, onChange: (newName) => onInlineRename(tab.id, newName), className: "h-6 min-w-0 flex-1 truncate text-sm shadow-none", isEditing: true, autoFocus: true, selectOnFocus: true, allowTabFocusWhenNotEditing: false, onEditingChange: (isEditing) => {
|
|
39
39
|
if (!isEditing) {
|
|
40
40
|
onStopEditing();
|
|
41
41
|
}
|
|
42
|
-
} })) }), menuContent && (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Tab options", className: "hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-primary absolute
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
42
|
+
} })) }), _jsxs("div", { className: "flex shrink-0 items-center", children: [menuContent && (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Tab options", className: "hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-primary absolute top-1/2 left-1 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded p-1 opacity-0 outline-hidden group-hover:opacity-100 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-0 data-[state=open]:opacity-100", onMouseDown: (event) => {
|
|
43
|
+
event.stopPropagation();
|
|
44
|
+
event.preventDefault();
|
|
45
|
+
}, onClick: (event) => {
|
|
46
|
+
event.stopPropagation();
|
|
47
|
+
}, children: _jsx(EllipsisVerticalIcon, { className: "h-3 w-3" }) }) }), _jsx(DropdownMenuContent, { align: "start", children: menuContent })] })), !hideCloseButton && (_jsx("button", { type: "button", "aria-label": "Close tab", className: "hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-primary absolute top-1/2 right-1 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded p-1 opacity-0 outline-hidden group-hover:opacity-100 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-0", onMouseDown: (event) => {
|
|
48
|
+
event.stopPropagation();
|
|
49
|
+
event.preventDefault();
|
|
50
|
+
}, onClick: (event) => {
|
|
51
|
+
event.stopPropagation();
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
onClose(tab.id);
|
|
54
|
+
}, children: _jsx(XIcon, { className: "h-4 w-4" }) }))] })] }) }) }));
|
|
55
55
|
}
|
|
56
56
|
/**
|
|
57
57
|
* A menu item for the tab's dropdown menu.
|
|
@@ -157,8 +157,8 @@ function TabStripSearchDropdown({ className, triggerClassName, autoFocus = true,
|
|
|
157
157
|
const disableClose = preventCloseLastTab && (openTabsList.length ?? 0) <= 1;
|
|
158
158
|
return (_jsxs(_Fragment, { children: [renderSearchItemActions?.(tab), _jsx(TabStripSearchItemAction, { icon: _jsx(XIcon, { className: "h-3 w-3" }), "aria-label": `Close ${tab.name}`, onClick: disableClose ? undefined : () => handleClose(tab.id), className: cn(disableClose && 'pointer-events-none opacity-40') })] }));
|
|
159
159
|
};
|
|
160
|
-
const triggerButton = (_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", "aria-label": "Browse tabs", className: cn('hover:bg-primary/10 h-full
|
|
161
|
-
return (_jsxs(DropdownMenu, { open: isOpen, onOpenChange: handleOpenChange, children: [tooltip ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: triggerButton }), _jsx(TooltipContent, { children: tooltip })] }) })) : (triggerButton), _jsxs(DropdownMenuContent, { align: "start", onCloseAutoFocus: (event) => event.preventDefault(), className: cn('flex max-h-[400px] max-w-[240px] flex-col overflow-x-hidden', className), children: [_jsxs("div", { className: "flex
|
|
160
|
+
const triggerButton = (_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", "aria-label": "Browse tabs", className: cn('hover:bg-primary/10 h-full shrink-0', triggerClassName), children: triggerIcon ?? _jsx(ListCollapseIcon, { className: "h-4 w-4" }) }) }));
|
|
161
|
+
return (_jsxs(DropdownMenu, { open: isOpen, onOpenChange: handleOpenChange, children: [tooltip ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: triggerButton }), _jsx(TooltipContent, { children: tooltip })] }) })) : (triggerButton), _jsxs(DropdownMenuContent, { align: "start", onCloseAutoFocus: (event) => event.preventDefault(), className: cn('flex max-h-[400px] max-w-[240px] flex-col overflow-x-hidden', className), children: [_jsxs("div", { className: "flex shrink-0 items-center gap-1 px-2", children: [_jsx(SearchIcon, { className: "text-muted-foreground", size: 14 }), _jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), onKeyDown: (event) => {
|
|
162
162
|
if (event.key === 'ArrowDown' || event.key === 'Tab') {
|
|
163
163
|
event.preventDefault();
|
|
164
164
|
const firstItem = event.currentTarget
|
|
@@ -169,7 +169,7 @@ function TabStripSearchDropdown({ className, triggerClassName, autoFocus = true,
|
|
|
169
169
|
else {
|
|
170
170
|
event.stopPropagation();
|
|
171
171
|
}
|
|
172
|
-
}, onKeyUp: (event) => event.stopPropagation(), className: "border-none text-xs shadow-none focus-visible:ring-0", placeholder: "Search...", "aria-label": "Search", autoFocus: autoFocus })] }), _jsx(DropdownMenuSeparator, { className: "
|
|
172
|
+
}, onKeyUp: (event) => event.stopPropagation(), className: "border-none text-xs shadow-none focus-visible:ring-0", placeholder: "Search...", "aria-label": "Search", autoFocus: autoFocus })] }), _jsx(DropdownMenuSeparator, { className: "shrink-0" }), _jsx("div", { className: "overflow-x-hidden overflow-y-auto", children: isSearching ? (filteredTabs.length === 0 ? (_jsx(DropdownTabItems, { tabs: filteredTabs, emptyMessage: searchEmptyMessage, onTabClick: handleTabClick, renderActions: renderSearchItemActions })) : (_jsxs(_Fragment, { children: [_jsx(DropdownTabItems, { tabs: filteredOpenTabs, onTabClick: handleTabClick, renderActions: renderOpenTabActions }), filteredClosedTabs.length > 0 && (_jsxs(_Fragment, { children: [filteredOpenTabs.length > 0 && _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuLabel, { className: "text-muted-foreground py-1 text-xs font-medium", children: closedTabsLabel }), _jsx(DropdownTabItems, { tabs: filteredClosedTabs, onTabClick: handleTabClick, renderActions: renderSearchItemActions, getItemClassName: () => 'text-muted-foreground' })] }))] }))) : (_jsx(_Fragment, { children: hasAnyTabs ? (_jsxs(_Fragment, { children: [_jsx(DropdownTabItems, { tabs: openTabsList, onTabClick: handleTabClick, renderActions: renderOpenTabActions }), closedTabsList.length > 0 && (_jsxs(_Fragment, { children: [openTabsList.length > 0 && _jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuLabel, { className: "text-muted-foreground py-1 text-xs font-medium", children: closedTabsLabel }), _jsx(DropdownTabItems, { tabs: closedTabsList, onTabClick: handleTabClick, renderActions: renderSearchItemActions, getItemClassName: () => 'text-muted-foreground' })] }))] })) : (_jsx(DropdownTabItems, { tabs: [], emptyMessage: emptyMessage, onTabClick: handleTabClick, renderActions: renderSearchItemActions })) })) })] })] }));
|
|
173
173
|
}
|
|
174
174
|
function DropdownTabItems({ tabs, emptyMessage, onTabClick, renderActions, getItemClassName, }) {
|
|
175
175
|
if (tabs.length === 0) {
|
|
@@ -187,7 +187,7 @@ function TabStripNewButton({ className, tooltip }) {
|
|
|
187
187
|
if (!onCreate) {
|
|
188
188
|
return null;
|
|
189
189
|
}
|
|
190
|
-
const button = (_jsx(Button, { size: "icon", variant: "ghost", "aria-label": "Create new tab", onClick: () => onCreate(), className: cn('hover:bg-primary/10 h-full
|
|
190
|
+
const button = (_jsx(Button, { size: "icon", variant: "ghost", "aria-label": "Create new tab", onClick: () => onCreate(), className: cn('hover:bg-primary/10 h-full shrink-0', className), children: _jsx(PlusIcon, { className: "h-4 w-4" }) }));
|
|
191
191
|
if (tooltip) {
|
|
192
192
|
return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: button }), _jsx(TooltipContent, { children: tooltip })] }) }));
|
|
193
193
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-strip.js","sourceRoot":"","sources":["../../src/components/tab-strip.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DndContext,\n DragEndEvent,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport {\n restrictToHorizontalAxis,\n restrictToParentElement,\n} from '@dnd-kit/modifiers';\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n useSortable,\n} from '@dnd-kit/sortable';\nimport {\n EllipsisVerticalIcon,\n ListCollapseIcon,\n PlusIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport React, {\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nconst DRAG_MODIFIERS = [restrictToHorizontalAxis, restrictToParentElement];\n\nimport {cn} from '../lib/utils';\nimport {Button} from './button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from './dropdown-menu';\nimport {EditableText} from './editable-text';\nimport {Input} from './input';\nimport {ScrollableRow} from './scrollable-row';\nimport {Tabs, TabsList, TabsTrigger} from './tabs';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from './tooltip';\n\nexport interface TabDescriptor {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n// -----------------------------------------------------------------------------\n// Context\n// -----------------------------------------------------------------------------\n\ninterface TabStripContextValue {\n // Data\n openTabItems: TabDescriptor[];\n closedTabs: TabDescriptor[];\n closedTabIds: Set<string>;\n filteredTabs: TabDescriptor[];\n editingTabId: string | null;\n search: string;\n scrollContainerRef: React.RefObject<HTMLDivElement>;\n selectedTabId?: string | null;\n openTabs?: string[];\n preventCloseLastTab: boolean;\n getLastOpenedAt: (tabId: string) => number | undefined;\n\n // Callbacks\n onOpenTabsChange?: (tabIds: string[]) => void;\n onSelect?: (tabId: string) => void;\n onCreate?: () => void;\n onRename?: (tabId: string, newName: string) => void;\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n renderSearchItemActions?: (tab: TabDescriptor) => React.ReactNode;\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n\n // Internal handlers\n setSearch: (value: string) => void;\n handleStartEditing: (tabId: string) => void;\n handleStopEditing: () => void;\n handleInlineRename: (tabId: string, newName: string) => void;\n handleClose: (tabId: string) => void;\n}\n\nconst TabStripContext = createContext<TabStripContextValue | null>(null);\n\nfunction useTabStripContext() {\n const context = useContext(TabStripContext);\n if (!context) {\n throw new Error('TabStrip subcomponents must be used within a TabStrip');\n }\n return context;\n}\n\n// -----------------------------------------------------------------------------\n// Subcomponents\n// -----------------------------------------------------------------------------\n\ninterface TabStripTabsProps {\n className?: string;\n /** Custom className for individual tab triggers. */\n tabClassName?: string;\n}\n\ninterface SortableTabProps {\n tab: TabDescriptor;\n tabClassName?: string;\n editingTabId: string | null;\n hideCloseButton?: boolean;\n onClose: (tabId: string) => void;\n onStartEditing: (tabId: string) => void;\n onStopEditing: () => void;\n onInlineRename: (tabId: string, newName: string) => void;\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n}\n\n/**\n * A single sortable tab item.\n */\nfunction SortableTab({\n tab,\n tabClassName,\n editingTabId,\n hideCloseButton,\n onClose,\n onStartEditing,\n onStopEditing,\n onInlineRename,\n renderTabMenu,\n renderTabLabel,\n}: SortableTabProps) {\n const {attributes, listeners, setNodeRef, transform, transition, isDragging} =\n useSortable({id: tab.id});\n\n const style: React.CSSProperties = {\n // Use Translate instead of Transform to avoid scale changes that squeeze the tab\n transform: transform\n ? `translate3d(${transform.x}px, ${transform.y}px, 0)`\n : undefined,\n transition,\n opacity: isDragging ? 0.5 : 1,\n };\n\n const menuContent = renderTabMenu?.(tab);\n\n return (\n <div\n ref={setNodeRef}\n className=\"h-full flex-shrink-0\"\n style={style}\n data-tab-id={tab.id}\n {...attributes}\n {...listeners}\n tabIndex={-1}\n >\n <div\n data-state={editingTabId === tab.id ? 'editing' : undefined}\n className={cn(\n 'data-[state=inactive]:hover:bg-primary/5',\n 'group flex h-full min-w-[100px] max-w-[200px] flex-shrink-0 cursor-grab',\n 'items-center gap-0.5 overflow-visible rounded-b-none',\n 'py-0 pl-0 pr-0 font-normal data-[state=active]:shadow-none',\n tabClassName,\n editingTabId === tab.id && 'focus-visible:ring-0',\n )}\n >\n <div className=\"relative flex h-full min-w-0 flex-1 items-center\">\n <TabsTrigger\n value={tab.id}\n tabIndex={editingTabId === tab.id ? -1 : undefined}\n data-editing={editingTabId === tab.id ? '' : undefined}\n className={cn(\n 'flex h-full min-w-0 flex-1 items-center justify-start gap-1',\n 'hover:bg-primary/10 overflow-hidden px-6 py-1 font-normal',\n 'min-h-7',\n 'data-[state=active]:bg-primary/10 data-[state=active]:text-foreground data-[state=active]:shadow-none',\n 'focus-visible:ring-primary focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-offset-0',\n editingTabId === tab.id && 'focus-visible:ring-0',\n )}\n onDoubleClick={() => onStartEditing(tab.id)}\n >\n {editingTabId !== tab.id ? (\n <div className=\"truncate text-sm\">\n {renderTabLabel ? renderTabLabel(tab) : tab.name}\n </div>\n ) : (\n <EditableText\n value={tab.name}\n onChange={(newName) => onInlineRename(tab.id, newName)}\n className=\"h-6 min-w-0 flex-1 truncate text-sm shadow-none\"\n isEditing\n autoFocus\n selectOnFocus\n allowTabFocusWhenNotEditing={false}\n onEditingChange={(isEditing) => {\n if (!isEditing) {\n onStopEditing();\n }\n }}\n />\n )}\n </TabsTrigger>\n\n {menuContent && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Tab options\"\n className=\"hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-primary absolute left-1 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded p-1 opacity-0 outline-none focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-0 group-hover:opacity-100 data-[state=open]:opacity-100\"\n onMouseDown={(event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <EllipsisVerticalIcon className=\"h-3 w-3\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {menuContent}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {!hideCloseButton && (\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n className=\"hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-primary absolute right-1 top-1/2 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded p-1 opacity-0 outline-none focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-0 group-hover:opacity-100\"\n onMouseDown={(event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n onClick={(event) => {\n event.stopPropagation();\n event.preventDefault();\n onClose(tab.id);\n }}\n >\n <XIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab Menu Components (for use with renderTabMenu)\n// -----------------------------------------------------------------------------\n\ninterface TabStripMenuItemProps {\n children: React.ReactNode;\n onClick?: () => void;\n variant?: 'default' | 'destructive';\n className?: string;\n disabled?: boolean;\n}\n\n/**\n * A menu item for the tab's dropdown menu.\n */\nfunction TabStripMenuItem({\n children,\n onClick,\n variant = 'default',\n className,\n disabled,\n}: TabStripMenuItemProps) {\n return (\n <DropdownMenuItem\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.();\n }}\n className={cn(\n variant === 'destructive' && 'text-destructive focus:text-destructive',\n className,\n )}\n >\n {children}\n </DropdownMenuItem>\n );\n}\n\ninterface TabStripMenuSeparatorProps {\n className?: string;\n}\n\n/**\n * A separator for the tab's dropdown menu.\n */\nfunction TabStripMenuSeparator({className}: TabStripMenuSeparatorProps) {\n return <DropdownMenuSeparator className={className} />;\n}\n\ninterface TabStripSearchItemActionProps {\n icon: React.ReactNode;\n onClick?: () => void;\n 'aria-label': string;\n className?: string;\n}\n\n/**\n * An action button for search dropdown items.\n */\nfunction TabStripSearchItemAction({\n icon,\n onClick,\n 'aria-label': ariaLabel,\n className,\n}: TabStripSearchItemActionProps) {\n return (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label={ariaLabel}\n className={cn(\n 'text-muted-foreground hover:text-foreground flex h-4 w-4 cursor-pointer items-center justify-center rounded',\n className,\n )}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.();\n }}\n >\n {icon}\n </span>\n );\n}\n\n/**\n * Renders the scrollable row of open tabs with drag-to-reorder support.\n */\nfunction TabStripTabs({className, tabClassName}: TabStripTabsProps) {\n const {\n openTabItems,\n editingTabId,\n scrollContainerRef,\n onOpenTabsChange,\n renderTabMenu,\n renderTabLabel,\n preventCloseLastTab,\n handleStartEditing,\n handleStopEditing,\n handleInlineRename,\n handleClose,\n } = useTabStripContext();\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5, // 5px movement before drag starts (allows clicks)\n },\n }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const {active, over} = event;\n if (!over || active.id === over.id || !onOpenTabsChange) return;\n\n const oldIndex = openTabItems.findIndex((tab) => tab.id === active.id);\n const newIndex = openTabItems.findIndex((tab) => tab.id === over.id);\n\n if (oldIndex !== -1 && newIndex !== -1) {\n const newOrder = arrayMove(\n openTabItems.map((t) => t.id),\n oldIndex,\n newIndex,\n );\n onOpenTabsChange(newOrder);\n }\n };\n\n const tabIds = useMemo(() => openTabItems.map((t) => t.id), [openTabItems]);\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={DRAG_MODIFIERS}\n autoScroll={true}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={tabIds} strategy={horizontalListSortingStrategy}>\n <ScrollableRow\n className=\"h-full min-w-0 flex-1\"\n scrollRef={scrollContainerRef}\n scrollClassName={cn(\n 'flex h-full min-w-0 items-center gap-1 overflow-x-auto overflow-y-visible',\n 'py-1 pl-1 pr-1 scroll-pl-7 scroll-pr-7 [&::-webkit-scrollbar]:hidden',\n className,\n )}\n arrowVisibility=\"always\"\n arrowClassName=\"w-7\"\n arrowIconClassName=\"h-4 w-4 opacity-60\"\n >\n {openTabItems.map((tab) => (\n <SortableTab\n key={tab.id}\n tab={tab}\n tabClassName={tabClassName}\n editingTabId={editingTabId}\n hideCloseButton={preventCloseLastTab && openTabItems.length === 1}\n onClose={handleClose}\n onStartEditing={handleStartEditing}\n onStopEditing={handleStopEditing}\n onInlineRename={handleInlineRename}\n renderTabMenu={renderTabMenu}\n renderTabLabel={renderTabLabel}\n />\n ))}\n </ScrollableRow>\n </SortableContext>\n </DndContext>\n );\n}\n\ninterface TabStripSearchDropdownProps {\n className?: string;\n triggerClassName?: string;\n /** Whether to auto-focus the search input when dropdown opens. Defaults to true. */\n autoFocus?: boolean;\n /** Optional tooltip content for the trigger button. */\n tooltip?: React.ReactNode;\n /** Optional custom icon for the trigger button. */\n triggerIcon?: React.ReactNode;\n /** Message shown when there are no tabs at all. */\n emptyMessage?: React.ReactNode;\n /** Message shown when searching and there are no matching tabs. */\n searchEmptyMessage?: React.ReactNode;\n /** Label for the closed tabs group. */\n closedTabsLabel?: React.ReactNode;\n /** Sorting mode for search dropdown items. */\n sortSearchItems?: 'none' | 'recent';\n /** Optional accessor for tab recency timestamps. */\n getTabLastOpenedAt?: (tab: TabDescriptor) => number | undefined;\n}\n\n/**\n * Renders the dropdown with search for browsing tabs.\n * Shows open tabs first and closed tabs second (dimmed). When searching, shows all matching tabs.\n */\nfunction TabStripSearchDropdown({\n className,\n triggerClassName,\n autoFocus = true,\n tooltip,\n triggerIcon,\n emptyMessage = 'No tabs',\n searchEmptyMessage = 'No matching tabs',\n closedTabsLabel = 'Recently closed',\n sortSearchItems = 'recent',\n getTabLastOpenedAt,\n}: TabStripSearchDropdownProps) {\n const {\n openTabItems,\n search,\n setSearch,\n closedTabs,\n filteredTabs,\n closedTabIds,\n openTabs,\n preventCloseLastTab,\n onOpenTabsChange,\n onSelect,\n renderSearchItemActions,\n getLastOpenedAt,\n handleClose,\n } = useTabStripContext();\n\n const [isOpen, setIsOpen] = useState(false);\n\n const isSearching = search.trim().length > 0;\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n if (!open) {\n setSearch('');\n }\n };\n\n const handleTabClick = (tabId: string) => {\n if (closedTabIds.has(tabId)) {\n // Opening a closed tab: add to openTabs and select it\n onOpenTabsChange?.([...(openTabs ?? []), tabId]);\n onSelect?.(tabId);\n } else {\n // Already open: just select it\n onSelect?.(tabId);\n }\n setIsOpen(false);\n };\n\n const sortByRecency = (tabsToSort: TabDescriptor[]) => {\n if (sortSearchItems !== 'recent') {\n return tabsToSort;\n }\n\n const withIndex = tabsToSort.map((tab, index) => ({\n tab,\n index,\n ts: getTabLastOpenedAt?.(tab) ?? getLastOpenedAt(tab.id),\n }));\n\n return withIndex\n .slice()\n .sort((a, b) => {\n const aTs = a.ts ?? -1;\n const bTs = b.ts ?? -1;\n if (aTs === bTs) {\n return a.index - b.index;\n }\n return bTs - aTs;\n })\n .map((item) => item.tab);\n };\n\n const openTabsList = sortByRecency(openTabItems);\n const closedTabsList = sortByRecency(closedTabs);\n const hasAnyTabs = openTabsList.length + closedTabsList.length > 0;\n\n const filteredOpenTabs = sortByRecency(\n filteredTabs.filter((tab) => !closedTabIds.has(tab.id)),\n );\n const filteredClosedTabs = sortByRecency(\n filteredTabs.filter((tab) => closedTabIds.has(tab.id)),\n );\n\n const renderOpenTabActions = (tab: TabDescriptor) => {\n const disableClose = preventCloseLastTab && (openTabsList.length ?? 0) <= 1;\n return (\n <>\n {renderSearchItemActions?.(tab)}\n <TabStripSearchItemAction\n icon={<XIcon className=\"h-3 w-3\" />}\n aria-label={`Close ${tab.name}`}\n onClick={disableClose ? undefined : () => handleClose(tab.id)}\n className={cn(disableClose && 'pointer-events-none opacity-40')}\n />\n </>\n );\n };\n\n const triggerButton = (\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n aria-label=\"Browse tabs\"\n className={cn(\n 'hover:bg-primary/10 h-full flex-shrink-0',\n triggerClassName,\n )}\n >\n {triggerIcon ?? <ListCollapseIcon className=\"h-4 w-4\" />}\n </Button>\n </DropdownMenuTrigger>\n );\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOpenChange}>\n {tooltip ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{triggerButton}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n triggerButton\n )}\n\n <DropdownMenuContent\n align=\"start\"\n onCloseAutoFocus={(event) => event.preventDefault()}\n className={cn(\n 'flex max-h-[400px] max-w-[240px] flex-col overflow-x-hidden',\n className,\n )}\n >\n <div className=\"flex flex-shrink-0 items-center gap-1 px-2\">\n <SearchIcon className=\"text-muted-foreground\" size={14} />\n <Input\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown' || event.key === 'Tab') {\n event.preventDefault();\n const firstItem = event.currentTarget\n .closest('[role=\"menu\"]')\n ?.querySelector<HTMLElement>(\n '[role=\"menuitem\"]:not([disabled])',\n );\n firstItem?.focus();\n } else {\n event.stopPropagation();\n }\n }}\n onKeyUp={(event) => event.stopPropagation()}\n className=\"border-none text-xs shadow-none focus-visible:ring-0\"\n placeholder=\"Search...\"\n aria-label=\"Search\"\n autoFocus={autoFocus}\n />\n </div>\n <DropdownMenuSeparator className=\"flex-shrink-0\" />\n\n <div className=\"overflow-y-auto overflow-x-hidden\">\n {isSearching ? (\n filteredTabs.length === 0 ? (\n <DropdownTabItems\n tabs={filteredTabs}\n emptyMessage={searchEmptyMessage}\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n />\n ) : (\n <>\n <DropdownTabItems\n tabs={filteredOpenTabs}\n onTabClick={handleTabClick}\n renderActions={renderOpenTabActions}\n />\n {filteredClosedTabs.length > 0 && (\n <>\n {filteredOpenTabs.length > 0 && <DropdownMenuSeparator />}\n <DropdownMenuLabel className=\"text-muted-foreground py-1 text-xs font-medium\">\n {closedTabsLabel}\n </DropdownMenuLabel>\n <DropdownTabItems\n tabs={filteredClosedTabs}\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n getItemClassName={() => 'text-muted-foreground'}\n />\n </>\n )}\n </>\n )\n ) : (\n <>\n {hasAnyTabs ? (\n <>\n <DropdownTabItems\n tabs={openTabsList}\n onTabClick={handleTabClick}\n renderActions={renderOpenTabActions}\n />\n {closedTabsList.length > 0 && (\n <>\n {openTabsList.length > 0 && <DropdownMenuSeparator />}\n <DropdownMenuLabel className=\"text-muted-foreground py-1 text-xs font-medium\">\n {closedTabsLabel}\n </DropdownMenuLabel>\n <DropdownTabItems\n tabs={closedTabsList}\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n getItemClassName={() => 'text-muted-foreground'}\n />\n </>\n )}\n </>\n ) : (\n <DropdownTabItems\n tabs={[]}\n emptyMessage={emptyMessage}\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n />\n )}\n </>\n )}\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\ninterface DropdownTabItemsProps {\n tabs: TabDescriptor[];\n emptyMessage?: React.ReactNode;\n onTabClick?: (tabId: string) => void;\n renderActions?: (tab: TabDescriptor) => React.ReactNode;\n getItemClassName?: (tab: TabDescriptor) => string | undefined;\n}\n\nfunction DropdownTabItems({\n tabs,\n emptyMessage,\n onTabClick,\n renderActions,\n getItemClassName,\n}: DropdownTabItemsProps) {\n if (tabs.length === 0) {\n if (!emptyMessage) return null;\n return (\n <DropdownMenuLabel className=\"items-center justify-center text-xs\">\n {emptyMessage}\n </DropdownMenuLabel>\n );\n }\n\n return (\n <>\n {tabs.map((tab) => (\n <DropdownMenuItem\n key={tab.id}\n onClick={() => onTabClick?.(tab.id)}\n className={cn(\n 'flex h-7 cursor-pointer items-center justify-between truncate',\n getItemClassName?.(tab),\n )}\n >\n <span className=\"xs truncate pl-1\">{tab.name}</span>\n {renderActions && (\n <div className=\"flex items-center gap-2\">{renderActions(tab)}</div>\n )}\n </DropdownMenuItem>\n ))}\n </>\n );\n}\n\ninterface TabStripNewButtonProps {\n className?: string;\n /** Optional tooltip content for the button. */\n tooltip?: React.ReactNode;\n}\n\n/**\n * Renders a button to create a new tab.\n */\nfunction TabStripNewButton({className, tooltip}: TabStripNewButtonProps) {\n const {onCreate} = useTabStripContext();\n\n if (!onCreate) {\n return null;\n }\n\n const button = (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Create new tab\"\n onClick={() => onCreate()}\n className={cn('hover:bg-primary/10 h-full flex-shrink-0', className)}\n >\n <PlusIcon className=\"h-4 w-4\" />\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n}\n\n// -----------------------------------------------------------------------------\n// Main Component\n// -----------------------------------------------------------------------------\n\nexport interface TabStripProps {\n className?: string;\n tabsListClassName?: string;\n children?: React.ReactNode;\n /** All available tabs. */\n tabs: TabDescriptor[];\n /** IDs of tabs that are currently open. */\n openTabs?: string[];\n /** ID of the currently selected tab. */\n selectedTabId?: string | null;\n /** If true, hides the close button when only one tab remains open. */\n preventCloseLastTab?: boolean;\n /** Called when a tab is closed (hidden, can be reopened). */\n onClose?: (tabId: string) => void;\n /** Called when the list of open tabs changes (open from dropdown or reorder). */\n onOpenTabsChange?: (tabIds: string[]) => void;\n /** Called when a tab is selected. */\n onSelect?: (tabId: string) => void;\n /** Called when a new tab should be created. */\n onCreate?: () => void;\n /** Called when a tab is renamed inline. */\n onRename?: (tabId: string, newName: string) => void;\n /** Render function for the tab's dropdown menu. Use TabStrip.MenuItem and TabStrip.MenuSeparator. */\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n /** Render function for search dropdown item actions. Use TabStrip.SearchItemAction. */\n renderSearchItemActions?: (tab: TabDescriptor) => React.ReactNode;\n /** Render function for custom tab content. Receives the tab and returns the content to display. */\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n}\n\n/**\n * A composable tab strip component with search dropdown and tab management.\n *\n * @example\n * // Default layout\n * <TabStrip\n * tabs={tabs}\n * openTabs={openTabs}\n * onClose={closeTab}\n * onOpen={openTab}\n * onCreate={createTab}\n * />\n *\n * @example\n * // Custom layout with subcomponents\n * <TabStrip tabs={tabs} openTabs={openTabs} onClose={closeTab}>\n * <TabStrip.Tabs className=\"flex-1\" />\n * <TabStrip.SearchDropdown />\n * <TabStrip.NewButton />\n * </TabStrip>\n */\nfunction TabStripRoot({\n className,\n tabsListClassName,\n children,\n tabs,\n openTabs,\n selectedTabId,\n preventCloseLastTab = false,\n onClose,\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabMenu,\n renderSearchItemActions,\n renderTabLabel,\n}: TabStripProps) {\n const [search, setSearch] = useState('');\n const [editingTabId, setEditingTabId] = useState<string | null>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null!);\n const prevSelectedIdRef = useRef<string | null>(null);\n const prevOpenTabIdsRef = useRef<Set<string>>(new Set());\n const lastOpenedAtRef = useRef<Map<string, number>>(new Map());\n\n const openTabsSet = useMemo(() => new Set(openTabs), [openTabs]);\n\n // Build openTabItems in the order of openTabs (for drag-to-reorder)\n const openTabItems = useMemo(() => {\n const tabsById = new Map(tabs.map((tab) => [tab.id, tab]));\n return (openTabs ?? [])\n .map((id) => tabsById.get(id))\n .filter((tab): tab is TabDescriptor => tab !== undefined);\n }, [tabs, openTabs]);\n\n const closedTabs = useMemo(\n () => tabs.filter((tab) => !openTabsSet.has(tab.id)),\n [tabs, openTabsSet],\n );\n\n const closedTabIds = useMemo(\n () => new Set(closedTabs.map((tab) => tab.id)),\n [closedTabs],\n );\n\n const trimmedSearch = search.trim().toLowerCase();\n\n const filteredTabs = useMemo(\n () =>\n trimmedSearch\n ? tabs.filter((tab) => tab.name.toLowerCase().includes(trimmedSearch))\n : [],\n [tabs, trimmedSearch],\n );\n\n useEffect(() => {\n if (!selectedTabId) return;\n lastOpenedAtRef.current.set(selectedTabId, Date.now());\n }, [selectedTabId]);\n\n useEffect(() => {\n const ids = new Set(tabs.map((tab) => tab.id));\n const next = new Map<string, number>();\n for (const [id, ts] of lastOpenedAtRef.current.entries()) {\n if (ids.has(id)) {\n next.set(id, ts);\n }\n }\n lastOpenedAtRef.current = next;\n }, [tabs]);\n\n // Auto-scroll to selected tab\n useLayoutEffect(() => {\n if (!selectedTabId) return;\n if (prevSelectedIdRef.current === selectedTabId) return;\n prevSelectedIdRef.current = selectedTabId;\n\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const isOpen = openTabItems.some((tab) => tab.id === selectedTabId);\n if (!isOpen) return;\n\n // Use queueMicrotask to defer scroll until after Radix UI updates the DOM\n queueMicrotask(() => {\n const activeTab = container.querySelector<HTMLElement>(\n '[data-state=\"active\"]',\n );\n if (!activeTab) return;\n\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest',\n });\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTabId]);\n\n // Auto-scroll to newly added tab\n useLayoutEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n // Find newly added tabs (in openTabs but not in prevOpenTabIdsRef)\n const newTabIds = (openTabs ?? []).filter(\n (id) => !prevOpenTabIdsRef.current.has(id),\n );\n\n // Update ref for next comparison\n prevOpenTabIdsRef.current = new Set(openTabs);\n\n if (newTabIds.length > 0) {\n const now = Date.now();\n for (const id of newTabIds) {\n lastOpenedAtRef.current.set(id, now);\n }\n }\n\n // Skip scroll on initial render (when ref was empty, all tabs appear \"new\")\n if (newTabIds.length === (openTabs?.length ?? 0)) return;\n\n // If there are new tabs, scroll to the last one added\n if (newTabIds.length === 0) return;\n const newTabId = newTabIds[newTabIds.length - 1];\n\n queueMicrotask(() => {\n const newTabElement = container.querySelector<HTMLElement>(\n `[data-tab-id=\"${newTabId}\"]`,\n );\n if (!newTabElement) return;\n\n newTabElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest',\n });\n });\n }, [openTabs]);\n\n const handleInlineRename = (tabId: string, newName: string) => {\n if (!onRename) return;\n const tab = tabs.find((t) => t.id === tabId);\n const trimmed = newName.trim();\n if (!trimmed || trimmed === tab?.name) {\n setEditingTabId(null);\n return;\n }\n onRename(tabId, trimmed);\n setEditingTabId(null);\n };\n\n const handleStartEditing = (tabId: string) => {\n if (!onRename) return;\n setEditingTabId(tabId);\n };\n\n const handleStopEditing = () => {\n setEditingTabId(null);\n };\n\n const handleClose = (tabId: string) => {\n // If closing the selected tab, select the one to the left (or right if leftmost)\n if (selectedTabId === tabId && openTabItems.length > 1) {\n const closingIndex = openTabItems.findIndex((t) => t.id === tabId);\n // If closing the leftmost, select the next; otherwise select the previous\n const newIndex = closingIndex === 0 ? 1 : closingIndex - 1;\n const newSelectedId = openTabItems[newIndex]?.id;\n if (newSelectedId) {\n onSelect?.(newSelectedId);\n }\n }\n onClose?.(tabId);\n };\n\n const contextValue: TabStripContextValue = {\n openTabItems,\n closedTabs,\n closedTabIds,\n filteredTabs,\n editingTabId,\n search,\n scrollContainerRef,\n selectedTabId,\n openTabs,\n preventCloseLastTab,\n getLastOpenedAt: (tabId) => lastOpenedAtRef.current.get(tabId),\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabMenu,\n renderSearchItemActions,\n renderTabLabel,\n setSearch,\n handleStartEditing,\n handleStopEditing,\n handleInlineRename,\n handleClose,\n };\n\n const handleValueChange = (value: string) => {\n onSelect?.(value);\n };\n\n return (\n <Tabs\n value={selectedTabId ?? undefined}\n onValueChange={handleValueChange}\n activationMode=\"manual\"\n className={cn('bg-muted w-full min-w-0', className)}\n >\n <TabStripContext.Provider value={contextValue}>\n <TabsList\n className={cn(\n 'flex h-9 w-full min-w-0 items-center justify-start gap-2 overflow-visible bg-transparent p-0',\n tabsListClassName,\n )}\n >\n {children ?? (\n <>\n <TabStripSearchDropdown />\n <TabStripTabs />\n <TabStripNewButton />\n </>\n )}\n </TabsList>\n </TabStripContext.Provider>\n </Tabs>\n );\n}\n\n// Attach subcomponents\nexport const TabStrip = Object.assign(TabStripRoot, {\n Tabs: TabStripTabs,\n SearchDropdown: TabStripSearchDropdown,\n NewButton: TabStripNewButton,\n MenuItem: TabStripMenuItem,\n MenuSeparator: TabStripMenuSeparator,\n SearchItemAction: TabStripSearchItemAction,\n});\n\nexport type {\n TabStripMenuItemProps,\n TabStripMenuSeparatorProps,\n TabStripNewButtonProps,\n TabStripSearchDropdownProps,\n TabStripSearchItemActionProps,\n TabStripTabsProps,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"tab-strip.js","sourceRoot":"","sources":["../../src/components/tab-strip.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DndContext,\n DragEndEvent,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport {\n restrictToHorizontalAxis,\n restrictToParentElement,\n} from '@dnd-kit/modifiers';\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n useSortable,\n} from '@dnd-kit/sortable';\nimport {\n EllipsisVerticalIcon,\n ListCollapseIcon,\n PlusIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport React, {\n createContext,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nconst DRAG_MODIFIERS = [restrictToHorizontalAxis, restrictToParentElement];\n\nimport {cn} from '../lib/utils';\nimport {Button} from './button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from './dropdown-menu';\nimport {EditableText} from './editable-text';\nimport {Input} from './input';\nimport {ScrollableRow} from './scrollable-row';\nimport {Tabs, TabsList, TabsTrigger} from './tabs';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from './tooltip';\n\nexport interface TabDescriptor {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n// -----------------------------------------------------------------------------\n// Context\n// -----------------------------------------------------------------------------\n\ninterface TabStripContextValue {\n // Data\n openTabItems: TabDescriptor[];\n closedTabs: TabDescriptor[];\n closedTabIds: Set<string>;\n filteredTabs: TabDescriptor[];\n editingTabId: string | null;\n search: string;\n scrollContainerRef: React.RefObject<HTMLDivElement>;\n selectedTabId?: string | null;\n openTabs?: string[];\n preventCloseLastTab: boolean;\n getLastOpenedAt: (tabId: string) => number | undefined;\n\n // Callbacks\n onOpenTabsChange?: (tabIds: string[]) => void;\n onSelect?: (tabId: string) => void;\n onCreate?: () => void;\n onRename?: (tabId: string, newName: string) => void;\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n renderSearchItemActions?: (tab: TabDescriptor) => React.ReactNode;\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n\n // Internal handlers\n setSearch: (value: string) => void;\n handleStartEditing: (tabId: string) => void;\n handleStopEditing: () => void;\n handleInlineRename: (tabId: string, newName: string) => void;\n handleClose: (tabId: string) => void;\n}\n\nconst TabStripContext = createContext<TabStripContextValue | null>(null);\n\nfunction useTabStripContext() {\n const context = useContext(TabStripContext);\n if (!context) {\n throw new Error('TabStrip subcomponents must be used within a TabStrip');\n }\n return context;\n}\n\n// -----------------------------------------------------------------------------\n// Subcomponents\n// -----------------------------------------------------------------------------\n\ninterface TabStripTabsProps {\n className?: string;\n /** Custom className for individual tab triggers. */\n tabClassName?: string;\n}\n\ninterface SortableTabProps {\n tab: TabDescriptor;\n tabClassName?: string;\n editingTabId: string | null;\n hideCloseButton?: boolean;\n onClose: (tabId: string) => void;\n onStartEditing: (tabId: string) => void;\n onStopEditing: () => void;\n onInlineRename: (tabId: string, newName: string) => void;\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n}\n\n/**\n * A single sortable tab item.\n */\nfunction SortableTab({\n tab,\n tabClassName,\n editingTabId,\n hideCloseButton,\n onClose,\n onStartEditing,\n onStopEditing,\n onInlineRename,\n renderTabMenu,\n renderTabLabel,\n}: SortableTabProps) {\n const {attributes, listeners, setNodeRef, transform, transition, isDragging} =\n useSortable({id: tab.id});\n\n const style: React.CSSProperties = {\n // Use Translate instead of Transform to avoid scale changes that squeeze the tab\n transform: transform\n ? `translate3d(${transform.x}px, ${transform.y}px, 0)`\n : undefined,\n transition,\n opacity: isDragging ? 0.5 : 1,\n };\n\n const menuContent = renderTabMenu?.(tab);\n\n return (\n <div\n ref={setNodeRef}\n className=\"h-full shrink-0\"\n style={style}\n data-tab-id={tab.id}\n {...attributes}\n {...listeners}\n tabIndex={-1}\n >\n <div\n data-state={editingTabId === tab.id ? 'editing' : undefined}\n className={cn(\n 'data-[state=inactive]:hover:bg-primary/5',\n 'group flex h-full max-w-[200px] min-w-[100px] shrink-0 cursor-grab',\n 'items-center justify-between gap-1 overflow-hidden rounded-b-none',\n 'py-0 pr-1 pl-4 font-normal data-[state=active]:shadow-none',\n tabClassName,\n editingTabId === tab.id && 'focus-visible:ring-0',\n )}\n >\n <div className=\"relative flex h-full min-w-0 flex-1 items-center\">\n <TabsTrigger\n value={tab.id}\n tabIndex={editingTabId === tab.id ? -1 : undefined}\n data-editing={editingTabId === tab.id ? '' : undefined}\n className={cn(\n 'flex h-full min-w-0 flex-1 items-center justify-start gap-1',\n 'hover:bg-primary/10 overflow-hidden px-6 py-1 font-normal',\n 'min-h-7',\n 'data-[state=active]:bg-primary/10 data-[state=active]:text-foreground data-[state=active]:shadow-none',\n 'focus-visible:ring-primary focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-inset',\n editingTabId === tab.id && 'focus-visible:ring-0',\n )}\n onDoubleClick={() => onStartEditing(tab.id)}\n >\n {editingTabId !== tab.id ? (\n <div className=\"truncate text-sm\">\n {renderTabLabel ? renderTabLabel(tab) : tab.name}\n </div>\n ) : (\n <EditableText\n value={tab.name}\n onChange={(newName) => onInlineRename(tab.id, newName)}\n className=\"h-6 min-w-0 flex-1 truncate text-sm shadow-none\"\n isEditing\n autoFocus\n selectOnFocus\n allowTabFocusWhenNotEditing={false}\n onEditingChange={(isEditing) => {\n if (!isEditing) {\n onStopEditing();\n }\n }}\n />\n )}\n </TabsTrigger>\n\n <div className=\"flex shrink-0 items-center\">\n {menuContent && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Tab options\"\n className=\"hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-primary absolute top-1/2 left-1 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded p-1 opacity-0 outline-hidden group-hover:opacity-100 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-0 data-[state=open]:opacity-100\"\n onMouseDown={(event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <EllipsisVerticalIcon className=\"h-3 w-3\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {menuContent}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {!hideCloseButton && (\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n className=\"hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-primary absolute top-1/2 right-1 flex h-5 w-5 -translate-y-1/2 items-center justify-center rounded p-1 opacity-0 outline-hidden group-hover:opacity-100 focus-visible:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-0\"\n onMouseDown={(event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n onClick={(event) => {\n event.stopPropagation();\n event.preventDefault();\n onClose(tab.id);\n }}\n >\n <XIcon className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab Menu Components (for use with renderTabMenu)\n// -----------------------------------------------------------------------------\n\ninterface TabStripMenuItemProps {\n children: React.ReactNode;\n onClick?: () => void;\n variant?: 'default' | 'destructive';\n className?: string;\n disabled?: boolean;\n}\n\n/**\n * A menu item for the tab's dropdown menu.\n */\nfunction TabStripMenuItem({\n children,\n onClick,\n variant = 'default',\n className,\n disabled,\n}: TabStripMenuItemProps) {\n return (\n <DropdownMenuItem\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.();\n }}\n className={cn(\n variant === 'destructive' && 'text-destructive focus:text-destructive',\n className,\n )}\n >\n {children}\n </DropdownMenuItem>\n );\n}\n\ninterface TabStripMenuSeparatorProps {\n className?: string;\n}\n\n/**\n * A separator for the tab's dropdown menu.\n */\nfunction TabStripMenuSeparator({className}: TabStripMenuSeparatorProps) {\n return <DropdownMenuSeparator className={className} />;\n}\n\ninterface TabStripSearchItemActionProps {\n icon: React.ReactNode;\n onClick?: () => void;\n 'aria-label': string;\n className?: string;\n}\n\n/**\n * An action button for search dropdown items.\n */\nfunction TabStripSearchItemAction({\n icon,\n onClick,\n 'aria-label': ariaLabel,\n className,\n}: TabStripSearchItemActionProps) {\n return (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label={ariaLabel}\n className={cn(\n 'text-muted-foreground hover:text-foreground flex h-4 w-4 cursor-pointer items-center justify-center rounded',\n className,\n )}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.();\n }}\n >\n {icon}\n </span>\n );\n}\n\n/**\n * Renders the scrollable row of open tabs with drag-to-reorder support.\n */\nfunction TabStripTabs({className, tabClassName}: TabStripTabsProps) {\n const {\n openTabItems,\n editingTabId,\n scrollContainerRef,\n onOpenTabsChange,\n renderTabMenu,\n renderTabLabel,\n preventCloseLastTab,\n handleStartEditing,\n handleStopEditing,\n handleInlineRename,\n handleClose,\n } = useTabStripContext();\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5, // 5px movement before drag starts (allows clicks)\n },\n }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const {active, over} = event;\n if (!over || active.id === over.id || !onOpenTabsChange) return;\n\n const oldIndex = openTabItems.findIndex((tab) => tab.id === active.id);\n const newIndex = openTabItems.findIndex((tab) => tab.id === over.id);\n\n if (oldIndex !== -1 && newIndex !== -1) {\n const newOrder = arrayMove(\n openTabItems.map((t) => t.id),\n oldIndex,\n newIndex,\n );\n onOpenTabsChange(newOrder);\n }\n };\n\n const tabIds = useMemo(() => openTabItems.map((t) => t.id), [openTabItems]);\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={DRAG_MODIFIERS}\n autoScroll={true}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={tabIds} strategy={horizontalListSortingStrategy}>\n <ScrollableRow\n className=\"h-full min-w-0 flex-1\"\n scrollRef={scrollContainerRef}\n scrollClassName={cn(\n 'flex h-full min-w-0 items-center gap-1 overflow-x-auto overflow-y-visible',\n 'py-1 pl-1 pr-1 scroll-pl-7 scroll-pr-7 [&::-webkit-scrollbar]:hidden',\n className,\n )}\n arrowVisibility=\"always\"\n arrowClassName=\"w-7\"\n arrowIconClassName=\"h-4 w-4 opacity-60\"\n >\n {openTabItems.map((tab) => (\n <SortableTab\n key={tab.id}\n tab={tab}\n tabClassName={tabClassName}\n editingTabId={editingTabId}\n hideCloseButton={preventCloseLastTab && openTabItems.length === 1}\n onClose={handleClose}\n onStartEditing={handleStartEditing}\n onStopEditing={handleStopEditing}\n onInlineRename={handleInlineRename}\n renderTabMenu={renderTabMenu}\n renderTabLabel={renderTabLabel}\n />\n ))}\n </ScrollableRow>\n </SortableContext>\n </DndContext>\n );\n}\n\ninterface TabStripSearchDropdownProps {\n className?: string;\n triggerClassName?: string;\n /** Whether to auto-focus the search input when dropdown opens. Defaults to true. */\n autoFocus?: boolean;\n /** Optional tooltip content for the trigger button. */\n tooltip?: React.ReactNode;\n /** Optional custom icon for the trigger button. */\n triggerIcon?: React.ReactNode;\n /** Message shown when there are no tabs at all. */\n emptyMessage?: React.ReactNode;\n /** Message shown when searching and there are no matching tabs. */\n searchEmptyMessage?: React.ReactNode;\n /** Label for the closed tabs group. */\n closedTabsLabel?: React.ReactNode;\n /** Sorting mode for search dropdown items. */\n sortSearchItems?: 'none' | 'recent';\n /** Optional accessor for tab recency timestamps. */\n getTabLastOpenedAt?: (tab: TabDescriptor) => number | undefined;\n}\n\n/**\n * Renders the dropdown with search for browsing tabs.\n * Shows open tabs first and closed tabs second (dimmed). When searching, shows all matching tabs.\n */\nfunction TabStripSearchDropdown({\n className,\n triggerClassName,\n autoFocus = true,\n tooltip,\n triggerIcon,\n emptyMessage = 'No tabs',\n searchEmptyMessage = 'No matching tabs',\n closedTabsLabel = 'Recently closed',\n sortSearchItems = 'recent',\n getTabLastOpenedAt,\n}: TabStripSearchDropdownProps) {\n const {\n openTabItems,\n search,\n setSearch,\n closedTabs,\n filteredTabs,\n closedTabIds,\n openTabs,\n preventCloseLastTab,\n onOpenTabsChange,\n onSelect,\n renderSearchItemActions,\n getLastOpenedAt,\n handleClose,\n } = useTabStripContext();\n\n const [isOpen, setIsOpen] = useState(false);\n\n const isSearching = search.trim().length > 0;\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n if (!open) {\n setSearch('');\n }\n };\n\n const handleTabClick = (tabId: string) => {\n if (closedTabIds.has(tabId)) {\n // Opening a closed tab: add to openTabs and select it\n onOpenTabsChange?.([...(openTabs ?? []), tabId]);\n onSelect?.(tabId);\n } else {\n // Already open: just select it\n onSelect?.(tabId);\n }\n setIsOpen(false);\n };\n\n const sortByRecency = (tabsToSort: TabDescriptor[]) => {\n if (sortSearchItems !== 'recent') {\n return tabsToSort;\n }\n\n const withIndex = tabsToSort.map((tab, index) => ({\n tab,\n index,\n ts: getTabLastOpenedAt?.(tab) ?? getLastOpenedAt(tab.id),\n }));\n\n return withIndex\n .slice()\n .sort((a, b) => {\n const aTs = a.ts ?? -1;\n const bTs = b.ts ?? -1;\n if (aTs === bTs) {\n return a.index - b.index;\n }\n return bTs - aTs;\n })\n .map((item) => item.tab);\n };\n\n const openTabsList = sortByRecency(openTabItems);\n const closedTabsList = sortByRecency(closedTabs);\n const hasAnyTabs = openTabsList.length + closedTabsList.length > 0;\n\n const filteredOpenTabs = sortByRecency(\n filteredTabs.filter((tab) => !closedTabIds.has(tab.id)),\n );\n const filteredClosedTabs = sortByRecency(\n filteredTabs.filter((tab) => closedTabIds.has(tab.id)),\n );\n\n const renderOpenTabActions = (tab: TabDescriptor) => {\n const disableClose = preventCloseLastTab && (openTabsList.length ?? 0) <= 1;\n return (\n <>\n {renderSearchItemActions?.(tab)}\n <TabStripSearchItemAction\n icon={<XIcon className=\"h-3 w-3\" />}\n aria-label={`Close ${tab.name}`}\n onClick={disableClose ? undefined : () => handleClose(tab.id)}\n className={cn(disableClose && 'pointer-events-none opacity-40')}\n />\n </>\n );\n };\n\n const triggerButton = (\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n aria-label=\"Browse tabs\"\n className={cn('hover:bg-primary/10 h-full shrink-0', triggerClassName)}\n >\n {triggerIcon ?? <ListCollapseIcon className=\"h-4 w-4\" />}\n </Button>\n </DropdownMenuTrigger>\n );\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOpenChange}>\n {tooltip ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{triggerButton}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n triggerButton\n )}\n\n <DropdownMenuContent\n align=\"start\"\n onCloseAutoFocus={(event) => event.preventDefault()}\n className={cn(\n 'flex max-h-[400px] max-w-[240px] flex-col overflow-x-hidden',\n className,\n )}\n >\n <div className=\"flex shrink-0 items-center gap-1 px-2\">\n <SearchIcon className=\"text-muted-foreground\" size={14} />\n <Input\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown' || event.key === 'Tab') {\n event.preventDefault();\n const firstItem = event.currentTarget\n .closest('[role=\"menu\"]')\n ?.querySelector<HTMLElement>(\n '[role=\"menuitem\"]:not([disabled])',\n );\n firstItem?.focus();\n } else {\n event.stopPropagation();\n }\n }}\n onKeyUp={(event) => event.stopPropagation()}\n className=\"border-none text-xs shadow-none focus-visible:ring-0\"\n placeholder=\"Search...\"\n aria-label=\"Search\"\n autoFocus={autoFocus}\n />\n </div>\n <DropdownMenuSeparator className=\"shrink-0\" />\n\n <div className=\"overflow-x-hidden overflow-y-auto\">\n {isSearching ? (\n filteredTabs.length === 0 ? (\n <DropdownTabItems\n tabs={filteredTabs}\n emptyMessage={searchEmptyMessage}\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n />\n ) : (\n <>\n <DropdownTabItems\n tabs={filteredOpenTabs}\n onTabClick={handleTabClick}\n renderActions={renderOpenTabActions}\n />\n {filteredClosedTabs.length > 0 && (\n <>\n {filteredOpenTabs.length > 0 && <DropdownMenuSeparator />}\n <DropdownMenuLabel className=\"text-muted-foreground py-1 text-xs font-medium\">\n {closedTabsLabel}\n </DropdownMenuLabel>\n <DropdownTabItems\n tabs={filteredClosedTabs}\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n getItemClassName={() => 'text-muted-foreground'}\n />\n </>\n )}\n </>\n )\n ) : (\n <>\n {hasAnyTabs ? (\n <>\n <DropdownTabItems\n tabs={openTabsList}\n onTabClick={handleTabClick}\n renderActions={renderOpenTabActions}\n />\n {closedTabsList.length > 0 && (\n <>\n {openTabsList.length > 0 && <DropdownMenuSeparator />}\n <DropdownMenuLabel className=\"text-muted-foreground py-1 text-xs font-medium\">\n {closedTabsLabel}\n </DropdownMenuLabel>\n <DropdownTabItems\n tabs={closedTabsList}\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n getItemClassName={() => 'text-muted-foreground'}\n />\n </>\n )}\n </>\n ) : (\n <DropdownTabItems\n tabs={[]}\n emptyMessage={emptyMessage}\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n />\n )}\n </>\n )}\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\ninterface DropdownTabItemsProps {\n tabs: TabDescriptor[];\n emptyMessage?: React.ReactNode;\n onTabClick?: (tabId: string) => void;\n renderActions?: (tab: TabDescriptor) => React.ReactNode;\n getItemClassName?: (tab: TabDescriptor) => string | undefined;\n}\n\nfunction DropdownTabItems({\n tabs,\n emptyMessage,\n onTabClick,\n renderActions,\n getItemClassName,\n}: DropdownTabItemsProps) {\n if (tabs.length === 0) {\n if (!emptyMessage) return null;\n return (\n <DropdownMenuLabel className=\"items-center justify-center text-xs\">\n {emptyMessage}\n </DropdownMenuLabel>\n );\n }\n\n return (\n <>\n {tabs.map((tab) => (\n <DropdownMenuItem\n key={tab.id}\n onClick={() => onTabClick?.(tab.id)}\n className={cn(\n 'flex h-7 cursor-pointer items-center justify-between truncate',\n getItemClassName?.(tab),\n )}\n >\n <span className=\"xs truncate pl-1\">{tab.name}</span>\n {renderActions && (\n <div className=\"flex items-center gap-2\">{renderActions(tab)}</div>\n )}\n </DropdownMenuItem>\n ))}\n </>\n );\n}\n\ninterface TabStripNewButtonProps {\n className?: string;\n /** Optional tooltip content for the button. */\n tooltip?: React.ReactNode;\n}\n\n/**\n * Renders a button to create a new tab.\n */\nfunction TabStripNewButton({className, tooltip}: TabStripNewButtonProps) {\n const {onCreate} = useTabStripContext();\n\n if (!onCreate) {\n return null;\n }\n\n const button = (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Create new tab\"\n onClick={() => onCreate()}\n className={cn('hover:bg-primary/10 h-full shrink-0', className)}\n >\n <PlusIcon className=\"h-4 w-4\" />\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n}\n\n// -----------------------------------------------------------------------------\n// Main Component\n// -----------------------------------------------------------------------------\n\nexport interface TabStripProps {\n className?: string;\n tabsListClassName?: string;\n children?: React.ReactNode;\n /** All available tabs. */\n tabs: TabDescriptor[];\n /** IDs of tabs that are currently open. */\n openTabs?: string[];\n /** ID of the currently selected tab. */\n selectedTabId?: string | null;\n /** If true, hides the close button when only one tab remains open. */\n preventCloseLastTab?: boolean;\n /** Called when a tab is closed (hidden, can be reopened). */\n onClose?: (tabId: string) => void;\n /** Called when the list of open tabs changes (open from dropdown or reorder). */\n onOpenTabsChange?: (tabIds: string[]) => void;\n /** Called when a tab is selected. */\n onSelect?: (tabId: string) => void;\n /** Called when a new tab should be created. */\n onCreate?: () => void;\n /** Called when a tab is renamed inline. */\n onRename?: (tabId: string, newName: string) => void;\n /** Render function for the tab's dropdown menu. Use TabStrip.MenuItem and TabStrip.MenuSeparator. */\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n /** Render function for search dropdown item actions. Use TabStrip.SearchItemAction. */\n renderSearchItemActions?: (tab: TabDescriptor) => React.ReactNode;\n /** Render function for custom tab content. Receives the tab and returns the content to display. */\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n}\n\n/**\n * A composable tab strip component with search dropdown and tab management.\n *\n * @example\n * // Default layout\n * <TabStrip\n * tabs={tabs}\n * openTabs={openTabs}\n * onClose={closeTab}\n * onOpen={openTab}\n * onCreate={createTab}\n * />\n *\n * @example\n * // Custom layout with subcomponents\n * <TabStrip tabs={tabs} openTabs={openTabs} onClose={closeTab}>\n * <TabStrip.Tabs className=\"flex-1\" />\n * <TabStrip.SearchDropdown />\n * <TabStrip.NewButton />\n * </TabStrip>\n */\nfunction TabStripRoot({\n className,\n tabsListClassName,\n children,\n tabs,\n openTabs,\n selectedTabId,\n preventCloseLastTab = false,\n onClose,\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabMenu,\n renderSearchItemActions,\n renderTabLabel,\n}: TabStripProps) {\n const [search, setSearch] = useState('');\n const [editingTabId, setEditingTabId] = useState<string | null>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null!);\n const prevSelectedIdRef = useRef<string | null>(null);\n const prevOpenTabIdsRef = useRef<Set<string>>(new Set());\n const lastOpenedAtRef = useRef<Map<string, number>>(new Map());\n\n const openTabsSet = useMemo(() => new Set(openTabs), [openTabs]);\n\n // Build openTabItems in the order of openTabs (for drag-to-reorder)\n const openTabItems = useMemo(() => {\n const tabsById = new Map(tabs.map((tab) => [tab.id, tab]));\n return (openTabs ?? [])\n .map((id) => tabsById.get(id))\n .filter((tab): tab is TabDescriptor => tab !== undefined);\n }, [tabs, openTabs]);\n\n const closedTabs = useMemo(\n () => tabs.filter((tab) => !openTabsSet.has(tab.id)),\n [tabs, openTabsSet],\n );\n\n const closedTabIds = useMemo(\n () => new Set(closedTabs.map((tab) => tab.id)),\n [closedTabs],\n );\n\n const trimmedSearch = search.trim().toLowerCase();\n\n const filteredTabs = useMemo(\n () =>\n trimmedSearch\n ? tabs.filter((tab) => tab.name.toLowerCase().includes(trimmedSearch))\n : [],\n [tabs, trimmedSearch],\n );\n\n useEffect(() => {\n if (!selectedTabId) return;\n lastOpenedAtRef.current.set(selectedTabId, Date.now());\n }, [selectedTabId]);\n\n useEffect(() => {\n const ids = new Set(tabs.map((tab) => tab.id));\n const next = new Map<string, number>();\n for (const [id, ts] of lastOpenedAtRef.current.entries()) {\n if (ids.has(id)) {\n next.set(id, ts);\n }\n }\n lastOpenedAtRef.current = next;\n }, [tabs]);\n\n // Auto-scroll to selected tab\n useLayoutEffect(() => {\n if (!selectedTabId) return;\n if (prevSelectedIdRef.current === selectedTabId) return;\n prevSelectedIdRef.current = selectedTabId;\n\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const isOpen = openTabItems.some((tab) => tab.id === selectedTabId);\n if (!isOpen) return;\n\n // Use queueMicrotask to defer scroll until after Radix UI updates the DOM\n queueMicrotask(() => {\n const activeTab = container.querySelector<HTMLElement>(\n '[data-state=\"active\"]',\n );\n if (!activeTab) return;\n\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest',\n });\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTabId]);\n\n // Auto-scroll to newly added tab\n useLayoutEffect(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n // Find newly added tabs (in openTabs but not in prevOpenTabIdsRef)\n const newTabIds = (openTabs ?? []).filter(\n (id) => !prevOpenTabIdsRef.current.has(id),\n );\n\n // Update ref for next comparison\n prevOpenTabIdsRef.current = new Set(openTabs);\n\n if (newTabIds.length > 0) {\n const now = Date.now();\n for (const id of newTabIds) {\n lastOpenedAtRef.current.set(id, now);\n }\n }\n\n // Skip scroll on initial render (when ref was empty, all tabs appear \"new\")\n if (newTabIds.length === (openTabs?.length ?? 0)) return;\n\n // If there are new tabs, scroll to the last one added\n if (newTabIds.length === 0) return;\n const newTabId = newTabIds[newTabIds.length - 1];\n\n queueMicrotask(() => {\n const newTabElement = container.querySelector<HTMLElement>(\n `[data-tab-id=\"${newTabId}\"]`,\n );\n if (!newTabElement) return;\n\n newTabElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest',\n });\n });\n }, [openTabs]);\n\n const handleInlineRename = (tabId: string, newName: string) => {\n if (!onRename) return;\n const tab = tabs.find((t) => t.id === tabId);\n const trimmed = newName.trim();\n if (!trimmed || trimmed === tab?.name) {\n setEditingTabId(null);\n return;\n }\n onRename(tabId, trimmed);\n setEditingTabId(null);\n };\n\n const handleStartEditing = (tabId: string) => {\n if (!onRename) return;\n setEditingTabId(tabId);\n };\n\n const handleStopEditing = () => {\n setEditingTabId(null);\n };\n\n const handleClose = (tabId: string) => {\n // If closing the selected tab, select the one to the left (or right if leftmost)\n if (selectedTabId === tabId && openTabItems.length > 1) {\n const closingIndex = openTabItems.findIndex((t) => t.id === tabId);\n // If closing the leftmost, select the next; otherwise select the previous\n const newIndex = closingIndex === 0 ? 1 : closingIndex - 1;\n const newSelectedId = openTabItems[newIndex]?.id;\n if (newSelectedId) {\n onSelect?.(newSelectedId);\n }\n }\n onClose?.(tabId);\n };\n\n const contextValue: TabStripContextValue = {\n openTabItems,\n closedTabs,\n closedTabIds,\n filteredTabs,\n editingTabId,\n search,\n scrollContainerRef,\n selectedTabId,\n openTabs,\n preventCloseLastTab,\n getLastOpenedAt: (tabId) => lastOpenedAtRef.current.get(tabId),\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabMenu,\n renderSearchItemActions,\n renderTabLabel,\n setSearch,\n handleStartEditing,\n handleStopEditing,\n handleInlineRename,\n handleClose,\n };\n\n const handleValueChange = (value: string) => {\n onSelect?.(value);\n };\n\n return (\n <Tabs\n value={selectedTabId ?? undefined}\n onValueChange={handleValueChange}\n activationMode=\"manual\"\n className={cn('bg-muted w-full min-w-0', className)}\n >\n <TabStripContext.Provider value={contextValue}>\n <TabsList\n className={cn(\n 'flex h-9 w-full min-w-0 items-center justify-start gap-2 overflow-visible bg-transparent p-0',\n tabsListClassName,\n )}\n >\n {children ?? (\n <>\n <TabStripSearchDropdown />\n <TabStripTabs />\n <TabStripNewButton />\n </>\n )}\n </TabsList>\n </TabStripContext.Provider>\n </Tabs>\n );\n}\n\n// Attach subcomponents\nexport const TabStrip = Object.assign(TabStripRoot, {\n Tabs: TabStripTabs,\n SearchDropdown: TabStripSearchDropdown,\n NewButton: TabStripNewButton,\n MenuItem: TabStripMenuItem,\n MenuSeparator: TabStripMenuSeparator,\n SearchItemAction: TabStripSearchItemAction,\n});\n\nexport type {\n TabStripMenuItemProps,\n TabStripMenuSeparatorProps,\n TabStripNewButtonProps,\n TabStripSearchDropdownProps,\n TabStripSearchItemActionProps,\n TabStripTabsProps,\n};\n"]}
|
|
@@ -16,5 +16,5 @@ declare const TableRow: React.ForwardRefExoticComponent<React.HTMLAttributes<HTM
|
|
|
16
16
|
declare const TableHead: React.ForwardRefExoticComponent<React.ThHTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement>>;
|
|
17
17
|
declare const TableCell: React.ForwardRefExoticComponent<React.TdHTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement>>;
|
|
18
18
|
declare const TableCaption: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableCaptionElement> & React.RefAttributes<HTMLTableCaptionElement>>;
|
|
19
|
-
export { Table,
|
|
19
|
+
export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, };
|
|
20
20
|
//# sourceMappingURL=table.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,UAAU,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC;IACjE;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,QAAA,MAAM,KAAK,qFAiBV,CAAC;AAGF,QAAA,MAAM,WAAW,+HAKf,CAAC;AAGH,QAAA,MAAM,SAAS,+HASb,CAAC;AAGH,QAAA,MAAM,WAAW,+HAYf,CAAC;AAGH,QAAA,MAAM,QAAQ,uHAYZ,CAAC;AAGH,QAAA,MAAM,SAAS,2HAYb,CAAC;AAGH,QAAA,MAAM,SAAS,2HASb,CAAC;AAGH,QAAA,MAAM,YAAY,+HAShB,CAAC;AAGH,OAAO,EACL,KAAK,EACL,
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,UAAU,UAAW,SAAQ,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC;IACjE;;;;;OAKG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,QAAA,MAAM,KAAK,qFAiBV,CAAC;AAGF,QAAA,MAAM,WAAW,+HAKf,CAAC;AAGH,QAAA,MAAM,SAAS,+HASb,CAAC;AAGH,QAAA,MAAM,WAAW,+HAYf,CAAC;AAGH,QAAA,MAAM,QAAQ,uHAYZ,CAAC;AAGH,QAAA,MAAM,SAAS,2HAYb,CAAC;AAGH,QAAA,MAAM,SAAS,2HASb,CAAC;AAGH,QAAA,MAAM,YAAY,+HAShB,CAAC;AAGH,OAAO,EACL,KAAK,EACL,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,GACT,CAAC"}
|
package/dist/components/table.js
CHANGED
|
@@ -13,9 +13,9 @@ const TableRow = React.forwardRef(({ className, ...props }, ref) => (_jsx("tr",
|
|
|
13
13
|
TableRow.displayName = 'TableRow';
|
|
14
14
|
const TableHead = React.forwardRef(({ className, ...props }, ref) => (_jsx("th", { ref: ref, className: cn('text-muted-foreground h-10 px-2 text-left align-middle font-medium [&:has(>[role=checkbox])]:pr-0', className), ...props })));
|
|
15
15
|
TableHead.displayName = 'TableHead';
|
|
16
|
-
const TableCell = React.forwardRef(({ className, ...props }, ref) => (_jsx("td", { ref: ref, className: cn('p-2 align-middle [&:has(
|
|
16
|
+
const TableCell = React.forwardRef(({ className, ...props }, ref) => (_jsx("td", { ref: ref, className: cn('p-2 align-middle [&:has([role=checkbox])]:pr-0', className), ...props })));
|
|
17
17
|
TableCell.displayName = 'TableCell';
|
|
18
18
|
const TableCaption = React.forwardRef(({ className, ...props }, ref) => (_jsx("caption", { ref: ref, className: cn('text-muted-foreground mt-4 text-sm', className), ...props })));
|
|
19
19
|
TableCaption.displayName = 'TableCaption';
|
|
20
|
-
export { Table,
|
|
20
|
+
export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, };
|
|
21
21
|
//# sourceMappingURL=table.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAYhC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAC5B,CAAC,EAAC,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAC7C,cAAc,CAAC,CAAC,CAAC,CACf,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,GACT,CACH,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,+BAA+B,YAC5C,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,GACT,GACE,CACP,CACJ,CAAC;AACF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;AAE5B,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,gBAAO,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAC5E,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGhC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,KAClD,KAAK,GACT,CACH,CAAC,CAAC;AACH,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,yDAAyD,EACzD,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAG/B,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,aACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,6EAA6E,EAC7E,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC;AAElC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGhC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,aACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,mGAAmG,EACnG,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGhC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,aACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/components/table.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAYhC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAC5B,CAAC,EAAC,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAC7C,cAAc,CAAC,CAAC,CAAC,CACf,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,GACT,CACH,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,+BAA+B,YAC5C,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,GACT,GACE,CACP,CACJ,CAAC;AACF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;AAE5B,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,gBAAO,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAC5E,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGhC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,KAClD,KAAK,GACT,CACH,CAAC,CAAC;AACH,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,yDAAyD,EACzD,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAG/B,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,aACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,6EAA6E,EAC7E,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC;AAElC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGhC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,aACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,mGAAmG,EACnG,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGhC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,aACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,gDAAgD,EAAE,SAAS,CAAC,KACtE,KAAK,GACT,CACH,CAAC,CAAC;AACH,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAGnC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,kBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,oCAAoC,EAAE,SAAS,CAAC,KAC1D,KAAK,GACT,CACH,CAAC,CAAC;AACH,YAAY,CAAC,WAAW,GAAG,cAAc,CAAC;AAE1C,OAAO,EACL,KAAK,EACL,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,GACT,CAAC","sourcesContent":["import * as React from 'react';\n\nimport {cn} from '../lib/utils';\n\ninterface TableProps extends React.HTMLAttributes<HTMLTableElement> {\n /**\n * The overflow-auto in shadcn's Table component is there to handle tables that might be wider\n * than their container - it's a common pattern to ensure wide tables can be scrolled horizontally\n * without breaking the layout. This prop allows you to disable this behavior, because it might\n * cause issues with sticky headers.\n */\n disableWrapper?: boolean;\n}\n\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({className, disableWrapper, ...props}, ref) =>\n disableWrapper ? (\n <table\n ref={ref}\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n ) : (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n ),\n);\nTable.displayName = 'Table';\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({className, ...props}, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n));\nTableHeader.displayName = 'TableHeader';\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({className, ...props}, ref) => (\n <tbody\n ref={ref}\n className={cn('[&_tr:last-child]:border-0', className)}\n {...props}\n />\n));\nTableBody.displayName = 'TableBody';\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({className, ...props}, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n 'bg-muted/50 border-t font-medium [&>tr]:last:border-b-0',\n className,\n )}\n {...props}\n />\n));\nTableFooter.displayName = 'TableFooter';\n\nconst TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.HTMLAttributes<HTMLTableRowElement>\n>(({className, ...props}, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors',\n className,\n )}\n {...props}\n />\n));\nTableRow.displayName = 'TableRow';\n\nconst TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ThHTMLAttributes<HTMLTableCellElement>\n>(({className, ...props}, ref) => (\n <th\n ref={ref}\n className={cn(\n 'text-muted-foreground h-10 px-2 text-left align-middle font-medium [&:has(>[role=checkbox])]:pr-0',\n className,\n )}\n {...props}\n />\n));\nTableHead.displayName = 'TableHead';\n\nconst TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.TdHTMLAttributes<HTMLTableCellElement>\n>(({className, ...props}, ref) => (\n <td\n ref={ref}\n className={cn('p-2 align-middle [&:has([role=checkbox])]:pr-0', className)}\n {...props}\n />\n));\nTableCell.displayName = 'TableCell';\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({className, ...props}, ref) => (\n <caption\n ref={ref}\n className={cn('text-muted-foreground mt-4 text-sm', className)}\n {...props}\n />\n));\nTableCaption.displayName = 'TableCaption';\n\nexport {\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableFooter,\n TableHead,\n TableHeader,\n TableRow,\n};\n"]}
|
package/dist/components/tabs.js
CHANGED
|
@@ -6,9 +6,9 @@ import { cn } from '../lib/utils';
|
|
|
6
6
|
const Tabs = TabsPrimitive.Root;
|
|
7
7
|
const TabsList = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.List, { ref: ref, className: cn('bg-muted text-muted-foreground inline-flex h-9 items-center justify-center rounded-lg p-1', className), ...props })));
|
|
8
8
|
TabsList.displayName = TabsPrimitive.List.displayName;
|
|
9
|
-
const TabsTrigger = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.Trigger, { ref: ref, className: cn('ring-offset-background focus-visible:ring-ring data-[state=active]:bg-background data-[state=active]:text-foreground inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium transition-all focus-visible:outline-
|
|
9
|
+
const TabsTrigger = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.Trigger, { ref: ref, className: cn('ring-offset-background focus-visible:ring-ring data-[state=active]:bg-background data-[state=active]:text-foreground inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium transition-all focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow', className), ...props })));
|
|
10
10
|
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
|
|
11
|
-
const TabsContent = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.Content, { ref: ref, className: cn('ring-offset-background focus-visible:ring-ring mt-2 focus-visible:outline-
|
|
11
|
+
const TabsContent = React.forwardRef(({ className, ...props }, ref) => (_jsx(TabsPrimitive.Content, { ref: ref, className: cn('ring-offset-background focus-visible:ring-ring mt-2 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2', className), ...props })));
|
|
12
12
|
TabsContent.displayName = TabsPrimitive.Content.displayName;
|
|
13
13
|
export { Tabs, TabsList, TabsTrigger, TabsContent };
|
|
14
14
|
//# sourceMappingURL=tabs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAEhC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;AAEhC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAG/B,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,KAAC,aAAa,CAAC,IAAI,IACjB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,2FAA2F,EAC3F,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,QAAQ,CAAC,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;AAEtD,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,KAAC,aAAa,CAAC,OAAO,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAEhC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;AAEhC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAG/B,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,KAAC,aAAa,CAAC,IAAI,IACjB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,2FAA2F,EAC3F,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,QAAQ,CAAC,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;AAEtD,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,KAAC,aAAa,CAAC,OAAO,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,kYAAkY,EAClY,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC;AAE5D,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,KAAC,aAAa,CAAC,OAAO,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,mIAAmI,EACnI,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC;AAE5D,OAAO,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAC,CAAC","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as TabsPrimitive from '@radix-ui/react-tabs';\n\nimport {cn} from '../lib/utils';\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({className, ...props}, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'bg-muted text-muted-foreground inline-flex h-9 items-center justify-center rounded-lg p-1',\n className,\n )}\n {...props}\n />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({className, ...props}, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'ring-offset-background focus-visible:ring-ring data-[state=active]:bg-background data-[state=active]:text-foreground inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium transition-all focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow',\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({className, ...props}, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'ring-offset-background focus-visible:ring-ring mt-2 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-offset-2',\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport {Tabs, TabsList, TabsTrigger, TabsContent};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,KAAK,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,QAAA,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,KAAK,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG;IACtD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,QAAA,MAAM,QAAQ,wGA4Db,CAAC;AAGF,OAAO,EAAC,QAAQ,EAAC,CAAC"}
|
|
@@ -32,7 +32,11 @@ const Textarea = React.forwardRef(({ className, autoResize = false, onInput, val
|
|
|
32
32
|
if (onInput)
|
|
33
33
|
onInput(e);
|
|
34
34
|
};
|
|
35
|
-
return (_jsx("textarea", { className: cn('border-input placeholder:text-muted-foreground focus-visible:ring-ring flex min-h-[60px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-sm focus-visible:
|
|
35
|
+
return (_jsx("textarea", { className: cn('border-input placeholder:text-muted-foreground focus-visible:ring-ring flex min-h-[60px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-sm focus-visible:ring-1 focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', autoResize
|
|
36
|
+
? hasOverflow
|
|
37
|
+
? 'overflow-y-auto'
|
|
38
|
+
: 'overflow-y-hidden'
|
|
39
|
+
: undefined, className), ref: localRef, onInput: handleInput, value: value, defaultValue: defaultValue, ...props }));
|
|
36
40
|
});
|
|
37
41
|
Textarea.displayName = 'Textarea';
|
|
38
42
|
export { Textarea };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAMhC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAC/B,CACE,EAAC,SAAS,EAAE,UAAU,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,KAAK,EAAC,EACvE,GAAG,EACH,EAAE;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAsB,IAAI,CAAC,CAAC;IAEzD,KAAK,CAAC,mBAAmB,CACvB,GAAG,EACH,GAAG,EAAE,CAAC,QAAQ,CAAC,OAA8B,CAC9C,CAAC;IAEF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU;YAAE,OAAO;QAC/B,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC;QAEzC,qDAAqD;QACrD,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;QAC1C,IAAI,SAAS,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACtC,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YAC7C,cAAc,CAAC,EAAE,CAAC,YAAY,GAAG,cAAc,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,6DAA6D;QAC7D,kBAAkB,EAAE,CAAC;IACvB,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG,CAAC,CAAuC,EAAE,EAAE;QAC9D,IAAI,UAAU;YAAE,kBAAkB,EAAE,CAAC;QACrC,IAAI,OAAO;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO,CACL,mBACE,SAAS,EAAE,EAAE,CACX,
|
|
1
|
+
{"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../src/components/textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAMhC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAC/B,CACE,EAAC,SAAS,EAAE,UAAU,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,KAAK,EAAC,EACvE,GAAG,EACH,EAAE;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAsB,IAAI,CAAC,CAAC;IAEzD,KAAK,CAAC,mBAAmB,CACvB,GAAG,EACH,GAAG,EAAE,CAAC,QAAQ,CAAC,OAA8B,CAC9C,CAAC;IAEF,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU;YAAE,OAAO;QAC/B,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,IAAI,CAAC;QAEzC,qDAAqD;QACrD,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;QAC1C,IAAI,SAAS,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;YACtC,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YAC7C,cAAc,CAAC,EAAE,CAAC,YAAY,GAAG,cAAc,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,6DAA6D;QAC7D,kBAAkB,EAAE,CAAC;IACvB,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG,CAAC,CAAuC,EAAE,EAAE;QAC9D,IAAI,UAAU;YAAE,kBAAkB,EAAE,CAAC;QACrC,IAAI,OAAO;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO,CACL,mBACE,SAAS,EAAE,EAAE,CACX,6QAA6Q,EAC7Q,UAAU;YACR,CAAC,CAAC,WAAW;gBACX,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,mBAAmB;YACvB,CAAC,CAAC,SAAS,EACb,SAAS,CACV,EACD,GAAG,EAAE,QAAQ,EACb,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,KACtB,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AACF,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAC;AAElC,OAAO,EAAC,QAAQ,EAAC,CAAC","sourcesContent":["import * as React from 'react';\nimport {cn} from '../lib/utils';\n\ntype TextareaProps = React.ComponentProps<'textarea'> & {\n autoResize?: boolean;\n};\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {className, autoResize = false, onInput, value, defaultValue, ...props},\n ref,\n ) => {\n const localRef = React.useRef<HTMLTextAreaElement>(null);\n\n React.useImperativeHandle(\n ref,\n () => localRef.current as HTMLTextAreaElement,\n );\n\n const [hasOverflow, setHasOverflow] = React.useState(false);\n\n const resizeToFitContent = React.useCallback(() => {\n const el = localRef.current;\n if (!el || !autoResize) return;\n el.style.height = 'auto';\n el.style.height = `${el.scrollHeight}px`;\n\n // Check if content exceeds the max-height constraint\n const computedStyle = window.getComputedStyle(el);\n const maxHeight = computedStyle.maxHeight;\n if (maxHeight && maxHeight !== 'none') {\n const maxHeightValue = parseFloat(maxHeight);\n setHasOverflow(el.scrollHeight > maxHeightValue);\n } else {\n setHasOverflow(false);\n }\n }, [autoResize]);\n\n React.useEffect(() => {\n // Trigger on mount and whenever the controlled value changes\n resizeToFitContent();\n }, [resizeToFitContent, value, defaultValue]);\n\n const handleInput = (e: React.FormEvent<HTMLTextAreaElement>) => {\n if (autoResize) resizeToFitContent();\n if (onInput) onInput(e);\n };\n\n return (\n <textarea\n className={cn(\n 'border-input placeholder:text-muted-foreground focus-visible:ring-ring flex min-h-[60px] w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-sm focus-visible:ring-1 focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n autoResize\n ? hasOverflow\n ? 'overflow-y-auto'\n : 'overflow-y-hidden'\n : undefined,\n className,\n )}\n ref={localRef}\n onInput={handleInput}\n value={value}\n defaultValue={defaultValue}\n {...props}\n />\n );\n },\n);\nTextarea.displayName = 'Textarea';\n\nexport {Textarea};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-switch.d.ts","sourceRoot":"","sources":["../../src/components/theme-switch.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"theme-switch.d.ts","sourceRoot":"","sources":["../../src/components/theme-switch.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,EAAE,EAAC,MAAM,OAAO,CAAC;AAIzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC;IAC3B,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAwBA,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useTheme } from '../theme/theme-provider';
|
|
4
3
|
import * as SwitchPrimitives from '@radix-ui/react-switch';
|
|
5
|
-
import {
|
|
4
|
+
import { MoonIcon, SunIcon } from 'lucide-react';
|
|
6
5
|
import { cn } from '../lib/utils';
|
|
6
|
+
import { useTheme } from '../theme/theme-provider';
|
|
7
7
|
/**
|
|
8
8
|
* A theme toggle switch component that allows users to switch between light and dark themes.
|
|
9
9
|
*
|
|
@@ -39,8 +39,8 @@ import { cn } from '../lib/utils';
|
|
|
39
39
|
*/
|
|
40
40
|
export const ThemeSwitch = ({ className }) => {
|
|
41
41
|
const { theme, setTheme } = useTheme();
|
|
42
|
-
return (_jsx(SwitchPrimitives.Root, { className: cn('focus-visible:ring-ring focus-visible:ring-offset-background data-[state=checked]:bg-primary/20 data-[state=unchecked]:bg-input peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:
|
|
42
|
+
return (_jsx(SwitchPrimitives.Root, { className: cn('focus-visible:ring-ring focus-visible:ring-offset-background data-[state=checked]:bg-primary/20 data-[state=unchecked]:bg-input peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50', className), checked: theme === 'dark', onCheckedChange: (checked) => {
|
|
43
43
|
setTheme(checked ? 'dark' : 'light');
|
|
44
|
-
}, children: _jsxs(SwitchPrimitives.Thumb, { className: cn('bg-background pointer-events-none flex h-4 w-4 items-center justify-center rounded-full shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0 dark:bg-zinc-900'), children: [_jsx(SunIcon, { className: "dark:text-primary h-2.5 w-2.5 rotate-0
|
|
44
|
+
}, children: _jsxs(SwitchPrimitives.Thumb, { className: cn('bg-background pointer-events-none flex h-4 w-4 items-center justify-center rounded-full shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0 dark:bg-zinc-900'), children: [_jsx(SunIcon, { className: "dark:text-primary h-2.5 w-2.5 scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90" }), _jsx(MoonIcon, { className: "dark:text-primary absolute h-2.5 w-2.5 scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0" })] }) }));
|
|
45
45
|
};
|
|
46
46
|
//# sourceMappingURL=theme-switch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-switch.js","sourceRoot":"","sources":["../../src/components/theme-switch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"theme-switch.js","sourceRoot":"","sources":["../../src/components/theme-switch.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAChC,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,MAAM,WAAW,GAGnB,CAAC,EAAC,SAAS,EAAC,EAAE,EAAE;IACnB,MAAM,EAAC,KAAK,EAAE,QAAQ,EAAC,GAAG,QAAQ,EAAE,CAAC;IAErC,OAAO,CACL,KAAC,gBAAgB,CAAC,IAAI,IACpB,SAAS,EAAE,EAAE,CACX,kYAAkY,EAClY,SAAS,CACV,EACD,OAAO,EAAE,KAAK,KAAK,MAAM,EACzB,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;YAC3B,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC,YAED,MAAC,gBAAgB,CAAC,KAAK,IACrB,SAAS,EAAE,EAAE,CACX,wNAAwN,CACzN,aAED,KAAC,OAAO,IAAC,SAAS,EAAC,8FAA8F,GAAG,EACpH,KAAC,QAAQ,IAAC,SAAS,EAAC,sGAAsG,GAAG,IACtG,GACH,CACzB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["'use client';\n\nimport * as SwitchPrimitives from '@radix-ui/react-switch';\nimport {MoonIcon, SunIcon} from 'lucide-react';\nimport {FC} from 'react';\nimport {cn} from '../lib/utils';\nimport {useTheme} from '../theme/theme-provider';\n\n/**\n * A theme toggle switch component that allows users to switch between light and dark themes.\n *\n * This component provides a visually appealing switch with sun/moon icons that animate smoothly\n * during theme transitions. It integrates with the theme context to manage theme state.\n *\n * Features:\n * - Smooth icon animations\n * - Accessible keyboard navigation\n * - Focus and hover states\n * - Customizable via className prop\n *\n * @component\n * @example\n * ```tsx\n * // Basic usage\n * <ThemeSwitch />\n *\n * // With custom styling\n * <ThemeSwitch className=\"my-custom-class\" />\n *\n * // Within a theme provider\n * import { ThemeProvider } from '../theme/theme-provider';\n *\n * function App() {\n * return (\n * <ThemeProvider>\n * <ThemeSwitch />\n * </ThemeProvider>\n * );\n * }\n * ```\n */\nexport const ThemeSwitch: FC<{\n /** Optional CSS class name for styling the switch container */\n className?: string;\n}> = ({className}) => {\n const {theme, setTheme} = useTheme();\n\n return (\n <SwitchPrimitives.Root\n className={cn(\n 'focus-visible:ring-ring focus-visible:ring-offset-background data-[state=checked]:bg-primary/20 data-[state=unchecked]:bg-input peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n checked={theme === 'dark'}\n onCheckedChange={(checked) => {\n setTheme(checked ? 'dark' : 'light');\n }}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'bg-background pointer-events-none flex h-4 w-4 items-center justify-center rounded-full shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0 dark:bg-zinc-900',\n )}\n >\n <SunIcon className=\"dark:text-primary h-2.5 w-2.5 scale-100 rotate-0 transition-all dark:scale-0 dark:-rotate-90\" />\n <MoonIcon className=\"dark:text-primary absolute h-2.5 w-2.5 scale-0 rotate-90 transition-all dark:scale-100 dark:rotate-0\" />\n </SwitchPrimitives.Thumb>\n </SwitchPrimitives.Root>\n );\n};\n"]}
|