@sqlrooms/ui 0.29.0-rc.3 → 0.29.0-rc.5
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/tab-strip.d.ts +15 -6
- package/dist/components/tab-strip.d.ts.map +1 -1
- package/dist/components/tab-strip.js +114 -14
- package/dist/components/tab-strip.js.map +1 -1
- package/dist/hooks/use-mobile.d.ts.map +1 -1
- package/dist/hooks/use-mobile.js +1 -0
- package/dist/hooks/use-mobile.js.map +1 -1
- package/dist/hooks/useDebouncedValue.d.ts.map +1 -1
- package/dist/hooks/useDebouncedValue.js +1 -0
- package/dist/hooks/useDebouncedValue.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +13 -13
|
@@ -5,6 +5,13 @@ export interface TabDescriptor {
|
|
|
5
5
|
name: string;
|
|
6
6
|
[key: string]: unknown;
|
|
7
7
|
}
|
|
8
|
+
export type TabStripDndMode = 'internal' | 'shared';
|
|
9
|
+
/**
|
|
10
|
+
* Extra payload attached to tab drags. `TabStrip` always preserves `tabId` and
|
|
11
|
+
* `tabStripId`; callers may intentionally override `kind` for cross-component
|
|
12
|
+
* drags such as artifact tabs.
|
|
13
|
+
*/
|
|
14
|
+
export type TabStripDragData = Record<string, unknown>;
|
|
8
15
|
interface TabStripTabsProps {
|
|
9
16
|
className?: string;
|
|
10
17
|
/** Custom className for individual tab triggers. */
|
|
@@ -67,10 +74,6 @@ interface TabStripSearchDropdownProps {
|
|
|
67
74
|
* Shows open tabs first and closed tabs second (dimmed). When searching, shows all matching tabs.
|
|
68
75
|
*/
|
|
69
76
|
declare function TabStripSearchDropdown({ className, triggerClassName, autoFocus, tooltip, triggerIcon, emptyMessage, searchEmptyMessage, closedTabsLabel, sortSearchItems, getTabLastOpenedAt, }: TabStripSearchDropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
70
|
-
/**
|
|
71
|
-
* A general-purpose button for the tab strip.
|
|
72
|
-
*/
|
|
73
|
-
declare function TabStripButton({ className, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
74
77
|
type TabStripNewButtonProps = ButtonProps & {
|
|
75
78
|
/** Optional tooltip content for the button. */
|
|
76
79
|
tooltip?: React.ReactNode;
|
|
@@ -111,6 +114,12 @@ export interface TabStripProps {
|
|
|
111
114
|
renderSearchItemActions?: (tab: TabDescriptor) => React.ReactNode;
|
|
112
115
|
/** Render function for custom tab content. Receives the tab and returns the content to display. */
|
|
113
116
|
renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;
|
|
117
|
+
/** Whether this tab strip owns its dnd context or participates in a shared parent context. */
|
|
118
|
+
dndMode?: TabStripDndMode;
|
|
119
|
+
/** Unique scope for shared dnd tab ids. Defaults to a generated component id. */
|
|
120
|
+
dndScopeId?: string;
|
|
121
|
+
/** Extra drag payload attached to tab drags; may intentionally override `kind`. */
|
|
122
|
+
getTabDragData?: (tab: TabDescriptor) => TabStripDragData | undefined;
|
|
114
123
|
}
|
|
115
124
|
/**
|
|
116
125
|
* A composable tab strip component with search dropdown and tab management.
|
|
@@ -133,11 +142,11 @@ export interface TabStripProps {
|
|
|
133
142
|
* <TabStrip.NewButton />
|
|
134
143
|
* </TabStrip>
|
|
135
144
|
*/
|
|
136
|
-
declare function TabStripRoot({ className, tabsListClassName, children, tabs, openTabs, selectedTabId, preventCloseLastTab, closeable, onClose, onOpenTabsChange, onSelect, onCreate, onRename, renderTabTitle, renderTabMenu, renderSearchItemActions, renderTabLabel, }: TabStripProps): import("react/jsx-runtime").JSX.Element;
|
|
145
|
+
declare function TabStripRoot({ className, tabsListClassName, children, tabs, openTabs, selectedTabId, preventCloseLastTab, closeable, onClose, onOpenTabsChange, onSelect, onCreate, onRename, renderTabTitle, renderTabMenu, renderSearchItemActions, renderTabLabel, dndMode, dndScopeId, getTabDragData, }: TabStripProps): import("react/jsx-runtime").JSX.Element;
|
|
137
146
|
export declare const TabStrip: typeof TabStripRoot & {
|
|
138
147
|
Tabs: typeof TabStripTabs;
|
|
139
148
|
SearchDropdown: typeof TabStripSearchDropdown;
|
|
140
|
-
Button:
|
|
149
|
+
Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
141
150
|
NewButton: typeof TabStripNewButton;
|
|
142
151
|
MenuItem: typeof TabStripMenuItem;
|
|
143
152
|
MenuSeparator: typeof TabStripMenuSeparator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-strip.d.ts","sourceRoot":"","sources":["../../src/components/tab-strip.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tab-strip.d.ts","sourceRoot":"","sources":["../../src/components/tab-strip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { DndContext, PointerSensor, closestCenter, useSensor, useSensors, } from '@dnd-kit/core';
|
|
2
|
+
import { DndContext, DragOverlay, PointerSensor, closestCenter, useDndMonitor, useSensor, useSensors, } from '@dnd-kit/core';
|
|
3
3
|
import { restrictToHorizontalAxis, restrictToParentElement, } from '@dnd-kit/modifiers';
|
|
4
4
|
import { SortableContext, arrayMove, horizontalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
|
|
5
5
|
import { EllipsisVerticalIcon, ListCollapseIcon, PlusIcon, SearchIcon, XIcon, } from 'lucide-react';
|
|
6
|
-
import { createContext, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, } from 'react';
|
|
6
|
+
import React, { createContext, useContext, useEffect, useLayoutEffect, useId, useMemo, useRef, useState, } from 'react';
|
|
7
7
|
const DRAG_MODIFIERS = [restrictToHorizontalAxis, restrictToParentElement];
|
|
8
8
|
import { cn } from '../lib/utils';
|
|
9
9
|
import { Button } from './button';
|
|
@@ -21,6 +21,7 @@ function useTabStripContext() {
|
|
|
21
21
|
}
|
|
22
22
|
return context;
|
|
23
23
|
}
|
|
24
|
+
const DEFAULT_TAB_DRAG_KIND = 'sqlrooms.tab';
|
|
24
25
|
const TAB_STRIP_BUTTON_CLASSNAMES = [
|
|
25
26
|
'flex h-full min-w-0 min-h-7 items-center',
|
|
26
27
|
'hover:bg-primary/10 overflow-hidden px-6 py-1 font-normal',
|
|
@@ -29,8 +30,19 @@ const TAB_STRIP_BUTTON_CLASSNAMES = [
|
|
|
29
30
|
/**
|
|
30
31
|
* A single sortable tab item.
|
|
31
32
|
*/
|
|
32
|
-
function SortableTab({ tab, tabClassName, editingTabId, closeable = true, onClose, onStartEditing, onStopEditing, onInlineRename, renderTabTitle, renderTabMenu, renderTabLabel, }) {
|
|
33
|
-
const
|
|
33
|
+
function SortableTab({ tab, sortableId, tabClassName, editingTabId, closeable = true, onClose, onStartEditing, onStopEditing, onInlineRename, renderTabTitle, renderTabMenu, renderTabLabel, dndScopeId, getTabDragData, }) {
|
|
34
|
+
const tabDragData = getTabDragData?.(tab);
|
|
35
|
+
const isEditing = editingTabId === tab.id;
|
|
36
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
|
|
37
|
+
id: sortableId,
|
|
38
|
+
disabled: isEditing,
|
|
39
|
+
data: {
|
|
40
|
+
kind: DEFAULT_TAB_DRAG_KIND,
|
|
41
|
+
...tabDragData,
|
|
42
|
+
tabId: tab.id,
|
|
43
|
+
tabStripId: dndScopeId,
|
|
44
|
+
},
|
|
45
|
+
});
|
|
34
46
|
const style = {
|
|
35
47
|
// Use Translate instead of Transform to avoid scale changes that squeeze the tab
|
|
36
48
|
transform: transform
|
|
@@ -40,7 +52,7 @@ function SortableTab({ tab, tabClassName, editingTabId, closeable = true, onClos
|
|
|
40
52
|
opacity: isDragging ? 0.5 : 1,
|
|
41
53
|
};
|
|
42
54
|
const menuContent = renderTabMenu?.(tab);
|
|
43
|
-
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":
|
|
55
|
+
return (_jsx("div", { ref: setNodeRef, className: "h-full shrink-0", style: style, "data-tab-id": tab.id, ...(isEditing ? {} : attributes), ...(isEditing ? {} : listeners), tabIndex: -1, children: _jsx("div", { "data-state": isEditing ? '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, isEditing && '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: isEditing ? -1 : undefined, "data-editing": isEditing ? '' : undefined, className: cn(...TAB_STRIP_BUTTON_CLASSNAMES, 'flex-1 justify-start gap-1', 'data-[state=active]:bg-primary/10 data-[state=active]:text-foreground data-[state=active]:shadow-none', isEditing && 'focus-visible:ring-0'), onDoubleClick: () => onStartEditing(tab.id), children: !isEditing ? (_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) => {
|
|
44
56
|
if (!isEditing) {
|
|
45
57
|
onStopEditing();
|
|
46
58
|
}
|
|
@@ -86,25 +98,107 @@ function TabStripSearchItemAction({ icon, onClick, 'aria-label': ariaLabel, clas
|
|
|
86
98
|
* Renders the scrollable row of open tabs with drag-to-reorder support.
|
|
87
99
|
*/
|
|
88
100
|
function TabStripTabs({ className, tabClassName }) {
|
|
89
|
-
const { openTabItems, editingTabId, scrollContainerRef, onOpenTabsChange, renderTabTitle, renderTabMenu, renderTabLabel, preventCloseLastTab, closeable, handleStartEditing, handleStopEditing, handleInlineRename, handleClose, } = useTabStripContext();
|
|
101
|
+
const { openTabItems, editingTabId, scrollContainerRef, onOpenTabsChange, dndMode, dndScopeId, getTabDragData, renderTabTitle, renderTabMenu, renderTabLabel, preventCloseLastTab, closeable, handleStartEditing, handleStopEditing, handleInlineRename, handleClose, } = useTabStripContext();
|
|
90
102
|
const sensors = useSensors(useSensor(PointerSensor, {
|
|
91
103
|
activationConstraint: {
|
|
92
104
|
distance: 5, // 5px movement before drag starts (allows clicks)
|
|
93
105
|
},
|
|
94
106
|
}));
|
|
107
|
+
const [activeDraggedTabId, setActiveDraggedTabId] = useState(null);
|
|
108
|
+
const [hideSharedDragOverlay, setHideSharedDragOverlay] = useState(false);
|
|
109
|
+
const isDragInsideTabStrip = (event) => {
|
|
110
|
+
const rect = event.active.rect.current.translated ?? event.active.rect.current.initial;
|
|
111
|
+
const tabStripRect = scrollContainerRef.current?.getBoundingClientRect();
|
|
112
|
+
if (!rect || !tabStripRect)
|
|
113
|
+
return false;
|
|
114
|
+
const centerX = rect.left + rect.width / 2;
|
|
115
|
+
const centerY = rect.top + rect.height / 2;
|
|
116
|
+
return (centerX >= tabStripRect.left &&
|
|
117
|
+
centerX <= tabStripRect.right &&
|
|
118
|
+
centerY >= tabStripRect.top &&
|
|
119
|
+
centerY <= tabStripRect.bottom);
|
|
120
|
+
};
|
|
121
|
+
const shouldHideSharedDragOverlay = (event) => {
|
|
122
|
+
if (isDragInsideTabStrip(event)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
if ('over' in event) {
|
|
126
|
+
return event.over?.data.current?.tabStripId === dndScopeId;
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
};
|
|
95
130
|
const handleDragEnd = (event) => {
|
|
96
131
|
const { active, over } = event;
|
|
97
132
|
if (!over || active.id === over.id || !onOpenTabsChange)
|
|
98
133
|
return;
|
|
99
|
-
const
|
|
100
|
-
const
|
|
134
|
+
const activeData = active.data.current;
|
|
135
|
+
const overData = over.data.current;
|
|
136
|
+
const activeTabId = typeof activeData?.tabId === 'string'
|
|
137
|
+
? activeData.tabId
|
|
138
|
+
: String(active.id);
|
|
139
|
+
const overTabId = typeof overData?.tabId === 'string' ? overData.tabId : String(over.id);
|
|
140
|
+
if (dndMode === 'shared' &&
|
|
141
|
+
(activeData?.tabStripId !== dndScopeId ||
|
|
142
|
+
overData?.tabStripId !== dndScopeId)) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const oldIndex = openTabItems.findIndex((tab) => tab.id === activeTabId);
|
|
146
|
+
const newIndex = openTabItems.findIndex((tab) => tab.id === overTabId);
|
|
101
147
|
if (oldIndex !== -1 && newIndex !== -1) {
|
|
102
148
|
const newOrder = arrayMove(openTabItems.map((t) => t.id), oldIndex, newIndex);
|
|
103
149
|
onOpenTabsChange(newOrder);
|
|
104
150
|
}
|
|
105
151
|
};
|
|
106
|
-
const
|
|
107
|
-
|
|
152
|
+
const getSortableId = (tabId) => dndMode === 'shared' ? `${dndScopeId}:${tabId}` : tabId;
|
|
153
|
+
const tabIds = useMemo(() => openTabItems.map((t) => getSortableId(t.id)),
|
|
154
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
155
|
+
[openTabItems, dndMode, dndScopeId]);
|
|
156
|
+
const content = (_jsx(SortableContext, { items: tabIds, strategy: horizontalListSortingStrategy, children: _jsx(ScrollableRow, { className: "h-full min-w-0 shrink overflow-hidden", scrollRef: scrollContainerRef, scrollClassName: cn('flex h-full min-w-0 items-center gap-1 overflow-x-auto overflow-y-visible', 'pl-1 pr-1 scroll-pl-7 scroll-pr-7 [&::-webkit-scrollbar]:hidden', className), arrowVisibility: "always", arrowClassName: "w-7", arrowIconClassName: "h-4 w-4 opacity-60", children: openTabItems.map((tab) => (_jsx(SortableTab, { tab: tab, sortableId: getSortableId(tab.id), tabClassName: tabClassName, editingTabId: editingTabId, closeable: closeable && !(preventCloseLastTab && openTabItems.length === 1), onClose: handleClose, onStartEditing: handleStartEditing, onStopEditing: handleStopEditing, onInlineRename: handleInlineRename, renderTabTitle: renderTabTitle, renderTabMenu: renderTabMenu, renderTabLabel: renderTabLabel, dndScopeId: dndScopeId, getTabDragData: getTabDragData }, tab.id))) }) }));
|
|
157
|
+
if (dndMode === 'shared') {
|
|
158
|
+
const activeDraggedTab = activeDraggedTabId
|
|
159
|
+
? openTabItems.find((tab) => tab.id === activeDraggedTabId)
|
|
160
|
+
: undefined;
|
|
161
|
+
return (_jsxs(_Fragment, { children: [_jsx(SharedTabStripDndMonitor, { dndScopeId: dndScopeId, handleDragEnd: handleDragEnd, setActiveDraggedTabId: setActiveDraggedTabId, setHideSharedDragOverlay: setHideSharedDragOverlay, shouldHideSharedDragOverlay: shouldHideSharedDragOverlay }), content, _jsx(DragOverlay, { dropAnimation: null, children: activeDraggedTab && !hideSharedDragOverlay ? (_jsx(TabDragOverlay, { tab: activeDraggedTab, renderTabLabel: renderTabLabel })) : null })] }));
|
|
162
|
+
}
|
|
163
|
+
return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, modifiers: DRAG_MODIFIERS, autoScroll: true, onDragEnd: handleDragEnd, children: content }));
|
|
164
|
+
}
|
|
165
|
+
function SharedTabStripDndMonitor({ dndScopeId, handleDragEnd, setActiveDraggedTabId, setHideSharedDragOverlay, shouldHideSharedDragOverlay, }) {
|
|
166
|
+
const isOwnTabDrag = (event) => event.active.data.current?.tabStripId === dndScopeId;
|
|
167
|
+
useDndMonitor({
|
|
168
|
+
onDragStart: (event) => {
|
|
169
|
+
const activeData = event.active.data.current;
|
|
170
|
+
if (!isOwnTabDrag(event)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
setActiveDraggedTabId(typeof activeData?.tabId === 'string' ? activeData.tabId : null);
|
|
174
|
+
setHideSharedDragOverlay(true);
|
|
175
|
+
},
|
|
176
|
+
onDragMove: (event) => {
|
|
177
|
+
if (!isOwnTabDrag(event))
|
|
178
|
+
return;
|
|
179
|
+
setHideSharedDragOverlay(shouldHideSharedDragOverlay(event));
|
|
180
|
+
},
|
|
181
|
+
onDragOver: (event) => {
|
|
182
|
+
if (!isOwnTabDrag(event))
|
|
183
|
+
return;
|
|
184
|
+
setHideSharedDragOverlay(shouldHideSharedDragOverlay(event));
|
|
185
|
+
},
|
|
186
|
+
onDragEnd: (event) => {
|
|
187
|
+
if (!isOwnTabDrag(event))
|
|
188
|
+
return;
|
|
189
|
+
handleDragEnd(event);
|
|
190
|
+
setActiveDraggedTabId(null);
|
|
191
|
+
setHideSharedDragOverlay(false);
|
|
192
|
+
},
|
|
193
|
+
onDragCancel: () => {
|
|
194
|
+
setActiveDraggedTabId(null);
|
|
195
|
+
setHideSharedDragOverlay(false);
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
function TabDragOverlay({ tab, renderTabLabel, }) {
|
|
201
|
+
return (_jsx("div", { className: cn('bg-primary/15 text-foreground border-primary/50 flex h-7 max-w-[200px] min-w-[100px]', 'cursor-grabbing items-center justify-center gap-1 overflow-hidden rounded-md border px-6 py-1', 'text-sm shadow-lg'), children: _jsx("div", { className: "truncate text-center", children: renderTabLabel ? renderTabLabel(tab) : tab.name }) }));
|
|
108
202
|
}
|
|
109
203
|
/**
|
|
110
204
|
* Renders the dropdown with search for browsing tabs.
|
|
@@ -187,9 +281,10 @@ function DropdownTabItems({ tabs, emptyMessage, onTabClick, renderActions, getIt
|
|
|
187
281
|
/**
|
|
188
282
|
* A general-purpose button for the tab strip.
|
|
189
283
|
*/
|
|
190
|
-
|
|
191
|
-
return (_jsx(Button, { size: "icon", variant: "ghost", className: cn(...TAB_STRIP_BUTTON_CLASSNAMES, 'h-full shrink-0', className), ...props }));
|
|
192
|
-
}
|
|
284
|
+
const TabStripButton = React.forwardRef(({ className, ...props }, ref) => {
|
|
285
|
+
return (_jsx(Button, { ref: ref, size: "icon", variant: "ghost", className: cn(...TAB_STRIP_BUTTON_CLASSNAMES, 'h-full shrink-0', className), ...props }));
|
|
286
|
+
});
|
|
287
|
+
TabStripButton.displayName = 'TabStripButton';
|
|
193
288
|
/**
|
|
194
289
|
* Renders a button to create a new tab.
|
|
195
290
|
*/
|
|
@@ -228,7 +323,9 @@ function TabStripNewButton({ tooltip, ...props }) {
|
|
|
228
323
|
* <TabStrip.NewButton />
|
|
229
324
|
* </TabStrip>
|
|
230
325
|
*/
|
|
231
|
-
function TabStripRoot({ className, tabsListClassName, children, tabs, openTabs, selectedTabId, preventCloseLastTab = false, closeable = true, onClose, onOpenTabsChange, onSelect, onCreate, onRename, renderTabTitle, renderTabMenu, renderSearchItemActions, renderTabLabel, }) {
|
|
326
|
+
function TabStripRoot({ className, tabsListClassName, children, tabs, openTabs, selectedTabId, preventCloseLastTab = false, closeable = true, onClose, onOpenTabsChange, onSelect, onCreate, onRename, renderTabTitle, renderTabMenu, renderSearchItemActions, renderTabLabel, dndMode = 'internal', dndScopeId, getTabDragData, }) {
|
|
327
|
+
const generatedDndScopeId = useId();
|
|
328
|
+
const actualDndScopeId = dndScopeId ?? generatedDndScopeId;
|
|
232
329
|
const [search, setSearch] = useState('');
|
|
233
330
|
const [editingTabId, setEditingTabId] = useState(null);
|
|
234
331
|
const scrollContainerRef = useRef(null);
|
|
@@ -371,6 +468,9 @@ function TabStripRoot({ className, tabsListClassName, children, tabs, openTabs,
|
|
|
371
468
|
preventCloseLastTab,
|
|
372
469
|
closeable,
|
|
373
470
|
getLastOpenedAt: (tabId) => lastOpenedAtRef.current.get(tabId),
|
|
471
|
+
dndMode,
|
|
472
|
+
dndScopeId: actualDndScopeId,
|
|
473
|
+
getTabDragData,
|
|
374
474
|
onOpenTabsChange,
|
|
375
475
|
onSelect,
|
|
376
476
|
onCreate,
|
|
@@ -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, ButtonProps} 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 closeable: 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 renderTabTitle?: (tab: TabDescriptor) => React.ReactNode;\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 closeable?: boolean;\n onClose: (tabId: string) => void;\n onStartEditing: (tabId: string) => void;\n onStopEditing: () => void;\n onInlineRename: (tabId: string, newName: string) => void;\n renderTabTitle?: (tab: TabDescriptor) => React.ReactNode;\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n}\n\nconst TAB_STRIP_BUTTON_CLASSNAMES = [\n 'flex h-full min-w-0 min-h-7 items-center',\n 'hover:bg-primary/10 overflow-hidden px-6 py-1 font-normal',\n 'focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-inset',\n];\n\n/**\n * A single sortable tab item.\n */\nfunction SortableTab({\n tab,\n tabClassName,\n editingTabId,\n closeable = true,\n onClose,\n onStartEditing,\n onStopEditing,\n onInlineRename,\n renderTabTitle,\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 ...TAB_STRIP_BUTTON_CLASSNAMES,\n 'flex-1 justify-start gap-1',\n 'data-[state=active]:bg-primary/10 data-[state=active]:text-foreground data-[state=active]:shadow-none',\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-ring 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 {closeable && (\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n className=\"hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-ring 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 renderTabTitle,\n renderTabMenu,\n renderTabLabel,\n preventCloseLastTab,\n closeable,\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 shrink overflow-hidden\"\n scrollRef={scrollContainerRef}\n scrollClassName={cn(\n 'flex h-full min-w-0 items-center gap-1 overflow-x-auto overflow-y-visible',\n '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 closeable={\n closeable && !(preventCloseLastTab && openTabItems.length === 1)\n }\n onClose={handleClose}\n onStartEditing={handleStartEditing}\n onStopEditing={handleStopEditing}\n onInlineRename={handleInlineRename}\n renderTabTitle={renderTabTitle}\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 size=\"icon\"\n className={cn(...TAB_STRIP_BUTTON_CLASSNAMES, 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\n/**\n * A general-purpose button for the tab strip.\n */\nfunction TabStripButton({className, ...props}: ButtonProps) {\n return (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className={cn(\n ...TAB_STRIP_BUTTON_CLASSNAMES,\n 'h-full shrink-0',\n className,\n )}\n {...props}\n />\n );\n}\ntype TabStripNewButtonProps = ButtonProps & {\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({tooltip, ...props}: TabStripNewButtonProps) {\n const {onCreate} = useTabStripContext();\n\n if (!onCreate) {\n return null;\n }\n\n const button = (\n <TabStripButton\n {...props}\n aria-label={props['aria-label'] || 'Create new tab'}\n onClick={(e) => {\n onCreate();\n props.onClick?.(e);\n }}\n >\n <PlusIcon className=\"h-4 w-4\" />\n </TabStripButton>\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 /** Whether tabs can be closed. Defaults to true. */\n closeable?: 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 title. */\n renderTabTitle?: (tab: TabDescriptor) => React.ReactNode;\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 closeable = true,\n onClose,\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabTitle,\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 // @ts-expect-error - scrollMode is not standardized yet\n scrollMode: 'if-needed',\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 closeable,\n getLastOpenedAt: (tabId) => lastOpenedAtRef.current.get(tabId),\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabTitle,\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-1',\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 Button: TabStripButton,\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 DragMoveEvent,\n DragOverEvent,\n DragStartEvent,\n DragOverlay,\n PointerSensor,\n closestCenter,\n useDndMonitor,\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 useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nconst DRAG_MODIFIERS = [restrictToHorizontalAxis, restrictToParentElement];\n\nimport {cn} from '../lib/utils';\nimport {Button, ButtonProps} 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\nexport type TabStripDndMode = 'internal' | 'shared';\n\n/**\n * Extra payload attached to tab drags. `TabStrip` always preserves `tabId` and\n * `tabStripId`; callers may intentionally override `kind` for cross-component\n * drags such as artifact tabs.\n */\nexport type TabStripDragData = Record<string, unknown>;\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 closeable: boolean;\n getLastOpenedAt: (tabId: string) => number | undefined;\n dndMode: TabStripDndMode;\n dndScopeId: string;\n getTabDragData?: (tab: TabDescriptor) => TabStripDragData | 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 renderTabTitle?: (tab: TabDescriptor) => React.ReactNode;\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 sortableId: string;\n tabClassName?: string;\n editingTabId: string | null;\n closeable?: boolean;\n onClose: (tabId: string) => void;\n onStartEditing: (tabId: string) => void;\n onStopEditing: () => void;\n onInlineRename: (tabId: string, newName: string) => void;\n renderTabTitle?: (tab: TabDescriptor) => React.ReactNode;\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n dndScopeId: string;\n getTabDragData?: (tab: TabDescriptor) => TabStripDragData | undefined;\n}\n\nconst DEFAULT_TAB_DRAG_KIND = 'sqlrooms.tab';\n\nconst TAB_STRIP_BUTTON_CLASSNAMES = [\n 'flex h-full min-w-0 min-h-7 items-center',\n 'hover:bg-primary/10 overflow-hidden px-6 py-1 font-normal',\n 'focus-visible:ring-2 focus-visible:ring-offset-0 focus-visible:ring-inset',\n];\n\n/**\n * A single sortable tab item.\n */\nfunction SortableTab({\n tab,\n sortableId,\n tabClassName,\n editingTabId,\n closeable = true,\n onClose,\n onStartEditing,\n onStopEditing,\n onInlineRename,\n renderTabTitle,\n renderTabMenu,\n renderTabLabel,\n dndScopeId,\n getTabDragData,\n}: SortableTabProps) {\n const tabDragData = getTabDragData?.(tab);\n const isEditing = editingTabId === tab.id;\n const {attributes, listeners, setNodeRef, transform, transition, isDragging} =\n useSortable({\n id: sortableId,\n disabled: isEditing,\n data: {\n kind: DEFAULT_TAB_DRAG_KIND,\n ...tabDragData,\n tabId: tab.id,\n tabStripId: dndScopeId,\n },\n });\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 {...(isEditing ? {} : attributes)}\n {...(isEditing ? {} : listeners)}\n tabIndex={-1}\n >\n <div\n data-state={isEditing ? '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 isEditing && '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={isEditing ? -1 : undefined}\n data-editing={isEditing ? '' : undefined}\n className={cn(\n ...TAB_STRIP_BUTTON_CLASSNAMES,\n 'flex-1 justify-start gap-1',\n 'data-[state=active]:bg-primary/10 data-[state=active]:text-foreground data-[state=active]:shadow-none',\n isEditing && 'focus-visible:ring-0',\n )}\n onDoubleClick={() => onStartEditing(tab.id)}\n >\n {!isEditing ? (\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-ring 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 {closeable && (\n <button\n type=\"button\"\n aria-label=\"Close tab\"\n className=\"hover:bg-primary/10 focus-visible:bg-primary/10 focus-visible:ring-ring 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 dndMode,\n dndScopeId,\n getTabDragData,\n renderTabTitle,\n renderTabMenu,\n renderTabLabel,\n preventCloseLastTab,\n closeable,\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 const [activeDraggedTabId, setActiveDraggedTabId] = useState<string | null>(\n null,\n );\n const [hideSharedDragOverlay, setHideSharedDragOverlay] = useState(false);\n\n const isDragInsideTabStrip = (\n event: DragMoveEvent | DragOverEvent | DragStartEvent,\n ) => {\n const rect =\n event.active.rect.current.translated ?? event.active.rect.current.initial;\n const tabStripRect = scrollContainerRef.current?.getBoundingClientRect();\n if (!rect || !tabStripRect) return false;\n\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n return (\n centerX >= tabStripRect.left &&\n centerX <= tabStripRect.right &&\n centerY >= tabStripRect.top &&\n centerY <= tabStripRect.bottom\n );\n };\n\n const shouldHideSharedDragOverlay = (\n event: DragMoveEvent | DragOverEvent | DragStartEvent,\n ) => {\n if (isDragInsideTabStrip(event)) {\n return true;\n }\n if ('over' in event) {\n return event.over?.data.current?.tabStripId === dndScopeId;\n }\n return false;\n };\n\n const handleDragEnd = (event: DragEndEvent) => {\n const {active, over} = event;\n if (!over || active.id === over.id || !onOpenTabsChange) return;\n\n const activeData = active.data.current;\n const overData = over.data.current;\n const activeTabId =\n typeof activeData?.tabId === 'string'\n ? activeData.tabId\n : String(active.id);\n const overTabId =\n typeof overData?.tabId === 'string' ? overData.tabId : String(over.id);\n\n if (\n dndMode === 'shared' &&\n (activeData?.tabStripId !== dndScopeId ||\n overData?.tabStripId !== dndScopeId)\n ) {\n return;\n }\n\n const oldIndex = openTabItems.findIndex((tab) => tab.id === activeTabId);\n const newIndex = openTabItems.findIndex((tab) => tab.id === overTabId);\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 getSortableId = (tabId: string) =>\n dndMode === 'shared' ? `${dndScopeId}:${tabId}` : tabId;\n\n const tabIds = useMemo(\n () => openTabItems.map((t) => getSortableId(t.id)),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [openTabItems, dndMode, dndScopeId],\n );\n\n const content = (\n <SortableContext items={tabIds} strategy={horizontalListSortingStrategy}>\n <ScrollableRow\n className=\"h-full min-w-0 shrink overflow-hidden\"\n scrollRef={scrollContainerRef}\n scrollClassName={cn(\n 'flex h-full min-w-0 items-center gap-1 overflow-x-auto overflow-y-visible',\n '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 sortableId={getSortableId(tab.id)}\n tabClassName={tabClassName}\n editingTabId={editingTabId}\n closeable={\n closeable && !(preventCloseLastTab && openTabItems.length === 1)\n }\n onClose={handleClose}\n onStartEditing={handleStartEditing}\n onStopEditing={handleStopEditing}\n onInlineRename={handleInlineRename}\n renderTabTitle={renderTabTitle}\n renderTabMenu={renderTabMenu}\n renderTabLabel={renderTabLabel}\n dndScopeId={dndScopeId}\n getTabDragData={getTabDragData}\n />\n ))}\n </ScrollableRow>\n </SortableContext>\n );\n\n if (dndMode === 'shared') {\n const activeDraggedTab = activeDraggedTabId\n ? openTabItems.find((tab) => tab.id === activeDraggedTabId)\n : undefined;\n\n return (\n <>\n <SharedTabStripDndMonitor\n dndScopeId={dndScopeId}\n handleDragEnd={handleDragEnd}\n setActiveDraggedTabId={setActiveDraggedTabId}\n setHideSharedDragOverlay={setHideSharedDragOverlay}\n shouldHideSharedDragOverlay={shouldHideSharedDragOverlay}\n />\n {content}\n <DragOverlay dropAnimation={null}>\n {activeDraggedTab && !hideSharedDragOverlay ? (\n <TabDragOverlay\n tab={activeDraggedTab}\n renderTabLabel={renderTabLabel}\n />\n ) : null}\n </DragOverlay>\n </>\n );\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={DRAG_MODIFIERS}\n autoScroll={true}\n onDragEnd={handleDragEnd}\n >\n {content}\n </DndContext>\n );\n}\n\nfunction SharedTabStripDndMonitor({\n dndScopeId,\n handleDragEnd,\n setActiveDraggedTabId,\n setHideSharedDragOverlay,\n shouldHideSharedDragOverlay,\n}: {\n dndScopeId: string;\n handleDragEnd: (event: DragEndEvent) => void;\n setActiveDraggedTabId: React.Dispatch<React.SetStateAction<string | null>>;\n setHideSharedDragOverlay: React.Dispatch<React.SetStateAction<boolean>>;\n shouldHideSharedDragOverlay: (\n event: DragMoveEvent | DragOverEvent | DragStartEvent,\n ) => boolean;\n}) {\n const isOwnTabDrag = (\n event: DragStartEvent | DragMoveEvent | DragOverEvent | DragEndEvent,\n ) => event.active.data.current?.tabStripId === dndScopeId;\n\n useDndMonitor({\n onDragStart: (event) => {\n const activeData = event.active.data.current;\n if (!isOwnTabDrag(event)) {\n return;\n }\n setActiveDraggedTabId(\n typeof activeData?.tabId === 'string' ? activeData.tabId : null,\n );\n setHideSharedDragOverlay(true);\n },\n onDragMove: (event) => {\n if (!isOwnTabDrag(event)) return;\n setHideSharedDragOverlay(shouldHideSharedDragOverlay(event));\n },\n onDragOver: (event) => {\n if (!isOwnTabDrag(event)) return;\n setHideSharedDragOverlay(shouldHideSharedDragOverlay(event));\n },\n onDragEnd: (event) => {\n if (!isOwnTabDrag(event)) return;\n handleDragEnd(event);\n setActiveDraggedTabId(null);\n setHideSharedDragOverlay(false);\n },\n onDragCancel: () => {\n setActiveDraggedTabId(null);\n setHideSharedDragOverlay(false);\n },\n });\n\n return null;\n}\n\nfunction TabDragOverlay({\n tab,\n renderTabLabel,\n}: {\n tab: TabDescriptor;\n renderTabLabel?: (tab: TabDescriptor) => React.ReactNode;\n}) {\n return (\n <div\n className={cn(\n 'bg-primary/15 text-foreground border-primary/50 flex h-7 max-w-[200px] min-w-[100px]',\n 'cursor-grabbing items-center justify-center gap-1 overflow-hidden rounded-md border px-6 py-1',\n 'text-sm shadow-lg',\n )}\n >\n <div className=\"truncate text-center\">\n {renderTabLabel ? renderTabLabel(tab) : tab.name}\n </div>\n </div>\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 size=\"icon\"\n className={cn(...TAB_STRIP_BUTTON_CLASSNAMES, 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\n/**\n * A general-purpose button for the tab strip.\n */\nconst TabStripButton = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({className, ...props}, ref) => {\n return (\n <Button\n ref={ref}\n size=\"icon\"\n variant=\"ghost\"\n className={cn(\n ...TAB_STRIP_BUTTON_CLASSNAMES,\n 'h-full shrink-0',\n className,\n )}\n {...props}\n />\n );\n },\n);\nTabStripButton.displayName = 'TabStripButton';\ntype TabStripNewButtonProps = ButtonProps & {\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({tooltip, ...props}: TabStripNewButtonProps) {\n const {onCreate} = useTabStripContext();\n\n if (!onCreate) {\n return null;\n }\n\n const button = (\n <TabStripButton\n {...props}\n aria-label={props['aria-label'] || 'Create new tab'}\n onClick={(e) => {\n onCreate();\n props.onClick?.(e);\n }}\n >\n <PlusIcon className=\"h-4 w-4\" />\n </TabStripButton>\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 /** Whether tabs can be closed. Defaults to true. */\n closeable?: 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 title. */\n renderTabTitle?: (tab: TabDescriptor) => React.ReactNode;\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 /** Whether this tab strip owns its dnd context or participates in a shared parent context. */\n dndMode?: TabStripDndMode;\n /** Unique scope for shared dnd tab ids. Defaults to a generated component id. */\n dndScopeId?: string;\n /** Extra drag payload attached to tab drags; may intentionally override `kind`. */\n getTabDragData?: (tab: TabDescriptor) => TabStripDragData | undefined;\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 closeable = true,\n onClose,\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabTitle,\n renderTabMenu,\n renderSearchItemActions,\n renderTabLabel,\n dndMode = 'internal',\n dndScopeId,\n getTabDragData,\n}: TabStripProps) {\n const generatedDndScopeId = useId();\n const actualDndScopeId = dndScopeId ?? generatedDndScopeId;\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 // @ts-expect-error - scrollMode is not standardized yet\n scrollMode: 'if-needed',\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 closeable,\n getLastOpenedAt: (tabId) => lastOpenedAtRef.current.get(tabId),\n dndMode,\n dndScopeId: actualDndScopeId,\n getTabDragData,\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabTitle,\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-1',\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 Button: TabStripButton,\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-mobile.d.ts","sourceRoot":"","sources":["../../src/hooks/use-mobile.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,
|
|
1
|
+
{"version":3,"file":"use-mobile.d.ts","sourceRoot":"","sources":["../../src/hooks/use-mobile.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,YAoB1B"}
|
package/dist/hooks/use-mobile.js
CHANGED
|
@@ -8,6 +8,7 @@ export function useIsMobile() {
|
|
|
8
8
|
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
9
9
|
};
|
|
10
10
|
mediaQueryList.addEventListener('change', onChange);
|
|
11
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
11
12
|
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
12
13
|
return () => mediaQueryList.removeEventListener('change', onChange);
|
|
13
14
|
}, []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-mobile.js","sourceRoot":"","sources":["../../src/hooks/use-mobile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAC5C,SAAS,CACV,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CACtC,eAAe,iBAAiB,GAAG,CAAC,KAAK,CAC1C,CAAC;QACF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,WAAW,CAAC,MAAM,CAAC,UAAU,GAAG,iBAAiB,CAAC,CAAC;QACrD,CAAC,CAAC;QAEF,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpD,WAAW,CAAC,MAAM,CAAC,UAAU,GAAG,iBAAiB,CAAC,CAAC;QACnD,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CAAC,CAAC,QAAQ,CAAC;AACpB,CAAC","sourcesContent":["import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(\n undefined,\n );\n\n React.useEffect(() => {\n const mediaQueryList = window.matchMedia(\n `(max-width: ${MOBILE_BREAKPOINT - 1}px)`,\n );\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n\n mediaQueryList.addEventListener('change', onChange);\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mediaQueryList.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"use-mobile.js","sourceRoot":"","sources":["../../src/hooks/use-mobile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,WAAW;IACzB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAC5C,SAAS,CACV,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CACtC,eAAe,iBAAiB,GAAG,CAAC,KAAK,CAC1C,CAAC;QACF,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,WAAW,CAAC,MAAM,CAAC,UAAU,GAAG,iBAAiB,CAAC,CAAC;QACrD,CAAC,CAAC;QAEF,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpD,2DAA2D;QAC3D,WAAW,CAAC,MAAM,CAAC,UAAU,GAAG,iBAAiB,CAAC,CAAC;QACnD,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACtE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CAAC,CAAC,QAAQ,CAAC;AACpB,CAAC","sourcesContent":["import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(\n undefined,\n );\n\n React.useEffect(() => {\n const mediaQueryList = window.matchMedia(\n `(max-width: ${MOBILE_BREAKPOINT - 1}px)`,\n );\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n\n mediaQueryList.addEventListener('change', onChange);\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n return () => mediaQueryList.removeEventListener('change', onChange);\n }, []);\n\n return !!isMobile;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebouncedValue.d.ts","sourceRoot":"","sources":["../../src/hooks/useDebouncedValue.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,aAAa,EAAE,CAAC,EAChB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EAC7B,UAAU,SAAM,GACf,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"useDebouncedValue.d.ts","sourceRoot":"","sources":["../../src/hooks/useDebouncedValue.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,aAAa,EAAE,CAAC,EAChB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,EAC7B,UAAU,SAAM,GACf,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,CAuBzB"}
|
|
@@ -26,6 +26,7 @@ export function useDebouncedValue(externalValue, onPersist, debounceMs = 300) {
|
|
|
26
26
|
const [localValue, setLocalValue] = useState(externalValue);
|
|
27
27
|
// Sync local state when external value changes
|
|
28
28
|
useEffect(() => {
|
|
29
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect
|
|
29
30
|
setLocalValue(externalValue);
|
|
30
31
|
}, [externalValue]);
|
|
31
32
|
// Debounced persistence
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebouncedValue.js","sourceRoot":"","sources":["../../src/hooks/useDebouncedValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AACvD,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,aAAgB,EAChB,SAA6B,EAC7B,UAAU,GAAG,GAAG;IAEhB,uCAAuC;IACvC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAI,aAAa,CAAC,CAAC;IAE/D,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,wBAAwB;IACxB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAErE,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,KAAQ,EAAE,EAAE;QACX,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,EACD,CAAC,gBAAgB,CAAC,CACnB,CAAC;IAEF,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import {useCallback, useEffect, useState} from 'react';\nimport {useDebouncedCallback} from './useDebouncedCallback';\n\n/**\n * Hook for managing local state with debounced persistence.\n *\n * Provides immediate local state updates for responsive UI while\n * debouncing expensive persistence operations (e.g., store updates, API calls).\n *\n * @param externalValue - Value from external source (store, props, etc.)\n * @param onPersist - Callback to persist value (will be debounced)\n * @param debounceMs - Debounce delay in milliseconds (default: 300)\n *\n * @returns [localValue, setValue] - Current local value and setter function\n *\n * @example\n * ```tsx\n * const [localSpec, setSpec] = useDebouncedValue(\n * cell.data.vegaSpec,\n * (spec) => updateCell(id, draft => { draft.data.vegaSpec = spec }),\n * 300\n * );\n * ```\n */\nexport function useDebouncedValue<T>(\n externalValue: T,\n onPersist: (value: T) => void,\n debounceMs = 300,\n): [T, (value: T) => void] {\n // Local state for immediate UI updates\n const [localValue, setLocalValue] = useState<T>(externalValue);\n\n // Sync local state when external value changes\n useEffect(() => {\n setLocalValue(externalValue);\n }, [externalValue]);\n\n // Debounced persistence\n const debouncedPersist = useDebouncedCallback(onPersist, debounceMs);\n\n // Combined setter: immediate local update + debounced persist\n const setValue = useCallback(\n (value: T) => {\n setLocalValue(value);\n debouncedPersist(value);\n },\n [debouncedPersist],\n );\n\n return [localValue, setValue];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useDebouncedValue.js","sourceRoot":"","sources":["../../src/hooks/useDebouncedValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AACvD,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,aAAgB,EAChB,SAA6B,EAC7B,UAAU,GAAG,GAAG;IAEhB,uCAAuC;IACvC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAI,aAAa,CAAC,CAAC;IAE/D,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,2DAA2D;QAC3D,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,wBAAwB;IACxB,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAErE,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,KAAQ,EAAE,EAAE;QACX,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,EACD,CAAC,gBAAgB,CAAC,CACnB,CAAC;IAEF,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC","sourcesContent":["import {useCallback, useEffect, useState} from 'react';\nimport {useDebouncedCallback} from './useDebouncedCallback';\n\n/**\n * Hook for managing local state with debounced persistence.\n *\n * Provides immediate local state updates for responsive UI while\n * debouncing expensive persistence operations (e.g., store updates, API calls).\n *\n * @param externalValue - Value from external source (store, props, etc.)\n * @param onPersist - Callback to persist value (will be debounced)\n * @param debounceMs - Debounce delay in milliseconds (default: 300)\n *\n * @returns [localValue, setValue] - Current local value and setter function\n *\n * @example\n * ```tsx\n * const [localSpec, setSpec] = useDebouncedValue(\n * cell.data.vegaSpec,\n * (spec) => updateCell(id, draft => { draft.data.vegaSpec = spec }),\n * 300\n * );\n * ```\n */\nexport function useDebouncedValue<T>(\n externalValue: T,\n onPersist: (value: T) => void,\n debounceMs = 300,\n): [T, (value: T) => void] {\n // Local state for immediate UI updates\n const [localValue, setLocalValue] = useState<T>(externalValue);\n\n // Sync local state when external value changes\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n setLocalValue(externalValue);\n }, [externalValue]);\n\n // Debounced persistence\n const debouncedPersist = useDebouncedCallback(onPersist, debounceMs);\n\n // Combined setter: immediate local update + debounced persist\n const setValue = useCallback(\n (value: T) => {\n setLocalValue(value);\n debouncedPersist(value);\n },\n [debouncedPersist],\n );\n\n return [localValue, setValue];\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export { RadioGroup, RadioGroupItem } from './components/radio-group';
|
|
|
33
33
|
export { ResizableHandle, ResizablePanel, ResizablePanelGroup, } from './components/resizable';
|
|
34
34
|
export type { ResizablePanelOrientation, ResizablePanelHandle, } from './components/resizable';
|
|
35
35
|
export { RunButton, type RunButtonProps } from './components/run-button';
|
|
36
|
-
export { TabStrip, type TabDescriptor, type TabStripProps, } from './components/tab-strip';
|
|
36
|
+
export { TabStrip, type TabDescriptor, type TabStripDndMode, type TabStripDragData, type TabStripProps, } from './components/tab-strip';
|
|
37
37
|
export { ScrollableRow } from './components/scrollable-row';
|
|
38
38
|
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, } from './components/select';
|
|
39
39
|
export { ScrollArea, ScrollBar } from './components/scroll-area';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,KAAK,EAAE,aAAa,EAAE,KAAK,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,KAAK,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EAAC,QAAQ,EAAE,KAAK,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,UAAU,EACV,UAAU,EACV,SAAS,GACV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAElD,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,OAAO,EACP,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,SAAS,EAAE,KAAK,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EACL,KAAK,EACL,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,GACX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,OAAO,EAAC,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EACL,KAAK,EACL,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAEvE,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAC,UAAU,EAAE,KAAK,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,IAAI,EAAE,KAAK,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAC,KAAK,EAAE,KAAK,aAAa,EAAC,MAAM,QAAQ,CAAC;AAEjD,OAAO,EACL,wBAAwB,EACxB,KAAK,UAAU,EACf,KAAK,6BAA6B,GACnC,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,aAAa,EACb,KAAK,wBAAwB,GAC9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAC;AAGtE,OAAO,EAAC,oBAAoB,EAAE,KAAK,aAAa,EAAC,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AAG/B,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,KAAK,GACX,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAC,IAAI,EAAC,MAAM,sBAAsB,CAAC;AAE1C,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,KAAK,EAAE,aAAa,EAAE,KAAK,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,KAAK,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EAAC,QAAQ,EAAE,KAAK,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,UAAU,EACV,UAAU,EACV,SAAS,GACV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAElD,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,OAAO,EACP,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,SAAS,EAAE,KAAK,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EACL,KAAK,EACL,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,GACX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,OAAO,EAAC,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EACL,KAAK,EACL,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAEvE,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAC,UAAU,EAAE,KAAK,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,IAAI,EAAE,KAAK,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAC,KAAK,EAAE,KAAK,aAAa,EAAC,MAAM,QAAQ,CAAC;AAEjD,OAAO,EACL,wBAAwB,EACxB,KAAK,UAAU,EACf,KAAK,6BAA6B,GACnC,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,aAAa,EACb,KAAK,wBAAwB,GAC9B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAC;AAGtE,OAAO,EAAC,oBAAoB,EAAE,KAAK,aAAa,EAAC,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AAG/B,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,KAAK,GACX,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAC,IAAI,EAAC,MAAM,sBAAsB,CAAC;AAE1C,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\n// Components\nexport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from './components/accordion';\n\nexport {Alert, AlertDescription, AlertTitle} from './components/alert';\n\nexport {AspectRatio} from './components/aspect-ratio';\n\nexport {Badge, badgeVariants, type BadgeProps} from './components/badge';\n\nexport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from './components/breadcrumb';\n\nexport {Button, buttonVariants, type ButtonProps} from './components/button';\n\nexport {Calendar, type CalendarProps} from './components/calendar';\n\nexport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from './components/card';\n\nexport {Checkbox} from './components/checkbox';\n\nexport {ComboboxDemo} from './components/combobox';\n\nexport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from './components/collapsible';\n\nexport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from './components/command';\n\nexport {\n ContextMenu,\n ContextMenuCheckboxItem,\n ContextMenuContent,\n ContextMenuGroup,\n ContextMenuItem,\n ContextMenuLabel,\n ContextMenuPortal,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuTrigger,\n} from './components/context-menu';\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n} from './components/dialog';\n\nexport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHandle,\n DrawerHeader,\n DrawerOverlay,\n DrawerPortal,\n DrawerTitle,\n DrawerTrigger,\n} from './components/drawer';\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from './components/dropdown-menu';\n\nexport {EditableText} from './components/editable-text';\n\nexport {ErrorBoundary} from './components/error-boundary';\n\nexport {ErrorPane} from './components/error-pane';\n\nexport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n useFormField,\n} from './components/form';\n\nexport {Input} from './components/input';\n\nexport {Label} from './components/label';\n\nexport {\n Menubar,\n MenubarCheckboxItem,\n MenubarContent,\n MenubarGroup,\n MenubarItem,\n MenubarLabel,\n MenubarMenu,\n MenubarPortal,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSeparator,\n MenubarShortcut,\n MenubarSub,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarTrigger,\n} from './components/menu-bar';\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from './components/pagination';\n\nexport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from './components/popover';\n\nexport {ProgressModal} from './components/progress-modal';\n\nexport {Progress} from './components/progress';\n\nexport {RadioGroup, RadioGroupItem} from './components/radio-group';\n\nexport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from './components/resizable';\nexport type {\n ResizablePanelOrientation,\n ResizablePanelHandle,\n} from './components/resizable';\n\nexport {RunButton, type RunButtonProps} from './components/run-button';\n\nexport {\n TabStrip,\n type TabDescriptor,\n type TabStripProps,\n} from './components/tab-strip';\n\nexport {ScrollableRow} from './components/scrollable-row';\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from './components/select';\n\nexport {ScrollArea, ScrollBar} from './components/scroll-area';\n\nexport {Separator} from './components/separator';\n\nexport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetOverlay,\n SheetPortal,\n SheetTitle,\n SheetTrigger,\n} from './components/sheet';\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n} from './components/sidebar';\n\nexport {SkeletonPane} from './components/skeleton-pane';\n\nexport {Skeleton} from './components/skeleton';\n\nexport {Slider} from './components/slider';\n\nexport {SpinnerPane} from './components/spinner-pane';\n\nexport {Spinner} from './components/spinner';\n\nexport {Switch} from './components/switch';\n\nexport {\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableFooter,\n TableHead,\n TableHeader,\n TableRow,\n} from './components/table';\n\nexport {Tabs, TabsContent, TabsList, TabsTrigger} from './components/tabs';\n\nexport {Textarea} from './components/textarea';\n\nexport {ThemeSwitch} from './components/theme-switch';\n\nexport {ToggleGroup, ToggleGroupItem} from './components/toggle-group';\n\nexport {Toggle, toggleVariants} from './components/toggle';\n\nexport {CopyButton, type CopyButtonProps} from './components/copy-button';\n\nexport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from './components/tooltip';\n\nexport {Tree, type TreeNodeData} from './components/tree';\n\n// Hooks\nexport {toast, type ExternalToast} from 'sonner';\n\nexport {\n useAspectRatioDimensions,\n type Dimensions,\n type UseAspectRatioDimensionsProps,\n} from './hooks/useAspectRatioDimensions';\n\nexport {\n useDisclosure,\n type UseDisclosureReturnValue,\n} from './hooks/useDisclosure';\n\nexport {useDebounce} from './hooks/useDebounce';\nexport {useDebouncedCallback} from './hooks/useDebouncedCallback';\nexport {useDebouncedValue} from './hooks/useDebouncedValue';\n\nexport {useIsMobile} from './hooks/use-mobile';\nexport {useRelativeCoordinates} from './hooks/useRelativeCoordinates';\n\n// Utilities\nexport {resolveFontSizeClass, type FontSizeToken} from './lib/fontSize';\nexport {cn} from './lib/utils';\n\n// Theme\nexport {\n DEFAULT_THEME,\n DEFAULT_THEME_STORAGE_KEY,\n getResolvedTheme,\n getTheme,\n getThemePreference,\n ThemeProvider,\n useTheme,\n type ResolvedTheme,\n type Theme,\n} from './theme/theme-provider';\n\n// Re-export from Radix\nexport {Slot} from '@radix-ui/react-slot';\n\nexport {Toaster} from './components/sonner';\n\nexport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from './components/hover-card';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,aAAa;AACb,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAC,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,KAAK,EAAE,aAAa,EAAkB,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAC,MAAM,EAAE,cAAc,EAAmB,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EAAC,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,UAAU,EACV,UAAU,EACV,SAAS,GACV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAC;AAElD,OAAO,EACL,IAAI,EACJ,WAAW,EACX,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EAAC,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,cAAc,EACd,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,OAAO,EACP,aAAa,EACb,cAAc,EACd,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAC,SAAS,EAAsB,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EACL,QAAQ,GAKT,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EACL,KAAK,EACL,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,UAAU,GACX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,OAAO,EAAC,MAAM,sBAAsB,CAAC;AAE7C,OAAO,EAAC,MAAM,EAAC,MAAM,qBAAqB,CAAC;AAE3C,OAAO,EACL,KAAK,EACL,SAAS,EACT,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,QAAQ,GACT,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAEvE,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAC,UAAU,EAAuB,MAAM,0BAA0B,CAAC;AAE1E,OAAO,EACL,OAAO,EACP,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,IAAI,EAAoB,MAAM,mBAAmB,CAAC;AAE1D,QAAQ;AACR,OAAO,EAAC,KAAK,EAAqB,MAAM,QAAQ,CAAC;AAEjD,OAAO,EACL,wBAAwB,GAGzB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,aAAa,GAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAC;AAEtE,YAAY;AACZ,OAAO,EAAC,oBAAoB,EAAqB,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AAE/B,QAAQ;AACR,OAAO,EACL,aAAa,EACb,yBAAyB,EACzB,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,QAAQ,GAGT,MAAM,wBAAwB,CAAC;AAEhC,uBAAuB;AACvB,OAAO,EAAC,IAAI,EAAC,MAAM,sBAAsB,CAAC;AAE1C,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAC;AAE5C,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\n// Components\nexport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from './components/accordion';\n\nexport {Alert, AlertDescription, AlertTitle} from './components/alert';\n\nexport {AspectRatio} from './components/aspect-ratio';\n\nexport {Badge, badgeVariants, type BadgeProps} from './components/badge';\n\nexport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from './components/breadcrumb';\n\nexport {Button, buttonVariants, type ButtonProps} from './components/button';\n\nexport {Calendar, type CalendarProps} from './components/calendar';\n\nexport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n} from './components/card';\n\nexport {Checkbox} from './components/checkbox';\n\nexport {ComboboxDemo} from './components/combobox';\n\nexport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from './components/collapsible';\n\nexport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from './components/command';\n\nexport {\n ContextMenu,\n ContextMenuCheckboxItem,\n ContextMenuContent,\n ContextMenuGroup,\n ContextMenuItem,\n ContextMenuLabel,\n ContextMenuPortal,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuTrigger,\n} from './components/context-menu';\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n} from './components/dialog';\n\nexport {\n Drawer,\n DrawerClose,\n DrawerContent,\n DrawerDescription,\n DrawerFooter,\n DrawerHandle,\n DrawerHeader,\n DrawerOverlay,\n DrawerPortal,\n DrawerTitle,\n DrawerTrigger,\n} from './components/drawer';\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from './components/dropdown-menu';\n\nexport {EditableText} from './components/editable-text';\n\nexport {ErrorBoundary} from './components/error-boundary';\n\nexport {ErrorPane} from './components/error-pane';\n\nexport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n useFormField,\n} from './components/form';\n\nexport {Input} from './components/input';\n\nexport {Label} from './components/label';\n\nexport {\n Menubar,\n MenubarCheckboxItem,\n MenubarContent,\n MenubarGroup,\n MenubarItem,\n MenubarLabel,\n MenubarMenu,\n MenubarPortal,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarSeparator,\n MenubarShortcut,\n MenubarSub,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarTrigger,\n} from './components/menu-bar';\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from './components/pagination';\n\nexport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from './components/popover';\n\nexport {ProgressModal} from './components/progress-modal';\n\nexport {Progress} from './components/progress';\n\nexport {RadioGroup, RadioGroupItem} from './components/radio-group';\n\nexport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from './components/resizable';\nexport type {\n ResizablePanelOrientation,\n ResizablePanelHandle,\n} from './components/resizable';\n\nexport {RunButton, type RunButtonProps} from './components/run-button';\n\nexport {\n TabStrip,\n type TabDescriptor,\n type TabStripDndMode,\n type TabStripDragData,\n type TabStripProps,\n} from './components/tab-strip';\n\nexport {ScrollableRow} from './components/scrollable-row';\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n} from './components/select';\n\nexport {ScrollArea, ScrollBar} from './components/scroll-area';\n\nexport {Separator} from './components/separator';\n\nexport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetOverlay,\n SheetPortal,\n SheetTitle,\n SheetTrigger,\n} from './components/sheet';\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n} from './components/sidebar';\n\nexport {SkeletonPane} from './components/skeleton-pane';\n\nexport {Skeleton} from './components/skeleton';\n\nexport {Slider} from './components/slider';\n\nexport {SpinnerPane} from './components/spinner-pane';\n\nexport {Spinner} from './components/spinner';\n\nexport {Switch} from './components/switch';\n\nexport {\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableFooter,\n TableHead,\n TableHeader,\n TableRow,\n} from './components/table';\n\nexport {Tabs, TabsContent, TabsList, TabsTrigger} from './components/tabs';\n\nexport {Textarea} from './components/textarea';\n\nexport {ThemeSwitch} from './components/theme-switch';\n\nexport {ToggleGroup, ToggleGroupItem} from './components/toggle-group';\n\nexport {Toggle, toggleVariants} from './components/toggle';\n\nexport {CopyButton, type CopyButtonProps} from './components/copy-button';\n\nexport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from './components/tooltip';\n\nexport {Tree, type TreeNodeData} from './components/tree';\n\n// Hooks\nexport {toast, type ExternalToast} from 'sonner';\n\nexport {\n useAspectRatioDimensions,\n type Dimensions,\n type UseAspectRatioDimensionsProps,\n} from './hooks/useAspectRatioDimensions';\n\nexport {\n useDisclosure,\n type UseDisclosureReturnValue,\n} from './hooks/useDisclosure';\n\nexport {useDebounce} from './hooks/useDebounce';\nexport {useDebouncedCallback} from './hooks/useDebouncedCallback';\nexport {useDebouncedValue} from './hooks/useDebouncedValue';\n\nexport {useIsMobile} from './hooks/use-mobile';\nexport {useRelativeCoordinates} from './hooks/useRelativeCoordinates';\n\n// Utilities\nexport {resolveFontSizeClass, type FontSizeToken} from './lib/fontSize';\nexport {cn} from './lib/utils';\n\n// Theme\nexport {\n DEFAULT_THEME,\n DEFAULT_THEME_STORAGE_KEY,\n getResolvedTheme,\n getTheme,\n getThemePreference,\n ThemeProvider,\n useTheme,\n type ResolvedTheme,\n type Theme,\n} from './theme/theme-provider';\n\n// Re-export from Radix\nexport {Slot} from '@radix-ui/react-slot';\n\nexport {Toaster} from './components/sonner';\n\nexport {\n HoverCard,\n HoverCardContent,\n HoverCardTrigger,\n} from './components/hover-card';\n"]}
|
package/package.json
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/ui",
|
|
3
|
-
"version": "0.29.0-rc.
|
|
4
|
-
"type": "module",
|
|
5
|
-
"sideEffects": false,
|
|
6
|
-
"author": "SQLRooms Contributors",
|
|
7
|
-
"license": "MIT",
|
|
3
|
+
"version": "0.29.0-rc.5",
|
|
8
4
|
"repository": {
|
|
9
5
|
"type": "git",
|
|
10
6
|
"url": "git+https://github.com/sqlrooms/sqlrooms.git"
|
|
11
7
|
},
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"author": "SQLRooms Contributors",
|
|
10
|
+
"sideEffects": false,
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"module": "dist/index.js",
|
|
14
|
+
"types": "dist/index.d.ts",
|
|
12
15
|
"files": [
|
|
13
16
|
"dist",
|
|
14
17
|
"tailwind-preset.css"
|
|
15
18
|
],
|
|
16
|
-
"publishConfig": {
|
|
17
|
-
"access": "public"
|
|
18
|
-
},
|
|
19
|
-
"main": "dist/index.js",
|
|
20
|
-
"types": "dist/index.d.ts",
|
|
21
|
-
"module": "dist/index.js",
|
|
22
19
|
"scripts": {
|
|
23
|
-
"dev": "tsc -w",
|
|
24
20
|
"build": "tsc",
|
|
21
|
+
"dev": "tsc -w",
|
|
25
22
|
"lint": "eslint .",
|
|
26
23
|
"typecheck": "tsc --noEmit",
|
|
27
24
|
"typedoc": "typedoc"
|
|
@@ -71,5 +68,8 @@
|
|
|
71
68
|
"peerDependencies": {
|
|
72
69
|
"tailwindcss": "^4.1.18"
|
|
73
70
|
},
|
|
74
|
-
"
|
|
71
|
+
"publishConfig": {
|
|
72
|
+
"access": "public"
|
|
73
|
+
},
|
|
74
|
+
"gitHead": "2763a4d37b79117916c988a8350f87dc926b33d5"
|
|
75
75
|
}
|