@sqlrooms/ui 0.26.1-rc.0 → 0.26.1-rc.11
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/command.d.ts.map +1 -1
- package/dist/components/command.js.map +1 -1
- package/dist/components/editable-text.d.ts.map +1 -1
- package/dist/components/editable-text.js +28 -19
- package/dist/components/editable-text.js.map +1 -1
- package/dist/components/error-pane.js +1 -1
- package/dist/components/error-pane.js.map +1 -1
- package/dist/components/tab-strip.d.ts +126 -0
- package/dist/components/tab-strip.d.ts.map +1 -0
- package/dist/components/tab-strip.js +302 -0
- package/dist/components/tab-strip.js.map +1 -0
- package/dist/components/tree.js +1 -4
- package/dist/components/tree.js.map +1 -1
- package/dist/index.d.ts +58 -57
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +64 -57
- package/dist/index.js.map +1 -1
- package/package.json +8 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/components/command.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAC,KAAK,WAAW,EAAC,MAAM,wBAAwB,CAAC;AAOxD,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;sFAYX,CAAC;AAGH,QAAA,MAAM,aAAa,GAAI,wBAAsB,WAAW,4CAUvD,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/components/command.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAC,KAAK,WAAW,EAAC,MAAM,wBAAwB,CAAC;AAOxD,QAAA,MAAM,OAAO;;;;;;;;;;;;;;;;sFAYX,CAAC;AAGH,QAAA,MAAM,aAAa,GAAI,wBAAsB,WAAW,4CAUvD,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;0FAmBhB,CAAC;AAIH,QAAA,MAAM,WAAW;;;;;;;;sFASf,CAAC;AAIH,QAAA,MAAM,YAAY;;;;;;uJAShB,CAAC;AAIH,QAAA,MAAM,YAAY;;;;;;;;;;sFAYhB,CAAC;AAIH,QAAA,MAAM,gBAAgB;;;;;;sFASpB,CAAC;AAGH,QAAA,MAAM,WAAW;;;;;;;;;;;;sFAYf,CAAC;AAIH,QAAA,MAAM,eAAe;8BAGlB,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;;CAUvC,CAAC;AAGF,OAAO,EACL,OAAO,EACP,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/components/command.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAC,OAAO,IAAI,gBAAgB,EAAC,MAAM,MAAM,CAAC;AACjD,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAChC,OAAO,EAAC,MAAM,EAAE,aAAa,EAAC,MAAM,UAAU,CAAC;AAE/C,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAG9B,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,KAAC,gBAAgB,IACf,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,2FAA2F,EAC3F,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AACH,OAAO,CAAC,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC;AAEnD,MAAM,aAAa,GAAG,CAAC,EAAC,QAAQ,EAAE,GAAG,KAAK,EAAc,EAAE,EAAE;IAC1D,OAAO,CACL,KAAC,MAAM,OAAK,KAAK,YACf,KAAC,aAAa,IAAC,SAAS,EAAC,qBAAqB,YAC5C,KAAC,OAAO,IAAC,SAAS,EAAC,6WAA6W,YAC7X,QAAQ,GACD,GACI,GACT,CACV,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAGnC,CAAC,EAAC,SAAS,EAAE,GAAG,KAAK,EAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/components/command.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport {type DialogProps} from '@radix-ui/react-dialog';\nimport {Command as CommandPrimitive} from 'cmdk';\nimport {Search} from 'lucide-react';\n\nimport {cn} from '../lib/utils';\nimport {Dialog, DialogContent} from './dialog';\n\nconst Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({className, ...props}, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',\n className,\n )}\n {...props}\n />\n));\nCommand.displayName = CommandPrimitive.displayName;\n\nconst CommandDialog = ({children, ...props}: DialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n};\n\nconst CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({className, ...props}, ref) => (\n <div\n className=\"flex items-center border-b px-3\"\n // eslint-disable-next-line react/no-unknown-property\n cmdk-input-wrapper=\"\"\n >\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n 'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n));\n\nCommandInput.displayName = CommandPrimitive.Input.displayName;\n\nconst CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({className, ...props}, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n));\n\nCommandList.displayName = CommandPrimitive.List.displayName;\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty\n ref={ref}\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n));\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName;\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({className, ...props}, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n className,\n )}\n {...props}\n />\n));\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName;\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({className, ...props}, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn('bg-border -mx-1 h-px', className)}\n {...props}\n />\n));\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName;\n\nconst CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({className, ...props}, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n));\n\nCommandItem.displayName = CommandPrimitive.Item.displayName;\n\nconst CommandShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\n 'text-muted-foreground ml-auto text-xs tracking-widest',\n className,\n )}\n {...props}\n />\n );\n};\nCommandShortcut.displayName = 'CommandShortcut';\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable-text.d.ts","sourceRoot":"","sources":["../../src/components/editable-text.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,EAAE,EAA2C,MAAM,OAAO,CAAC;AAKhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEjC;;;QAGI;IACJ,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;QAEI;IACJ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD,
|
|
1
|
+
{"version":3,"file":"editable-text.d.ts","sourceRoot":"","sources":["../../src/components/editable-text.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,EAAE,EAA2C,MAAM,OAAO,CAAC;AAKhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAEjC;;;QAGI;IACJ,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;QAEI;IACJ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD,CAgIA,CAAC"}
|
|
@@ -38,7 +38,34 @@ export const EditableText = ({ className, isReadOnly = false, defaultEditing = f
|
|
|
38
38
|
const inputRef = useRef(null);
|
|
39
39
|
const [internalValue, setInternalValue] = useState(value);
|
|
40
40
|
const internalValueRef = useRef(internalValue);
|
|
41
|
-
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
internalValueRef.current = internalValue;
|
|
43
|
+
}, [internalValue]);
|
|
44
|
+
// Keep internalValue in sync with value prop
|
|
45
|
+
/* eslint-disable react-hooks/set-state-in-effect */
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (value !== internalValueRef.current) {
|
|
48
|
+
setInternalValue(value);
|
|
49
|
+
}
|
|
50
|
+
}, [value]);
|
|
51
|
+
// Keep internal editing state in sync with controlled isEditing prop
|
|
52
|
+
// and focus the input when editing is enabled
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (isEditing !== undefined && isEditing !== isInternalEditing) {
|
|
55
|
+
setInternalIsEditing(Boolean(isEditing));
|
|
56
|
+
if (isEditing) {
|
|
57
|
+
// When enabling editing from a dropdown menu, there will be a blur event when the dropdown closes,
|
|
58
|
+
// so we need to wait a bit before making sure the input is focused and selected
|
|
59
|
+
const timeoutId = setTimeout(() => {
|
|
60
|
+
inputRef.current?.select();
|
|
61
|
+
inputRef.current?.focus();
|
|
62
|
+
}, 200);
|
|
63
|
+
return () => clearTimeout(timeoutId);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}, [isEditing, isInternalEditing]);
|
|
68
|
+
/* eslint-enable react-hooks/set-state-in-effect */
|
|
42
69
|
const handleSetValue = useCallback((e) => {
|
|
43
70
|
if (isReadOnly || !isInternalEditing) {
|
|
44
71
|
return;
|
|
@@ -61,24 +88,6 @@ export const EditableText = ({ className, isReadOnly = false, defaultEditing = f
|
|
|
61
88
|
handleSetEditing(true);
|
|
62
89
|
}
|
|
63
90
|
}, [isInternalEditing, handleSetEditing]);
|
|
64
|
-
useEffect(() => {
|
|
65
|
-
if (value !== internalValueRef.current) {
|
|
66
|
-
setInternalValue(value);
|
|
67
|
-
}
|
|
68
|
-
}, [value]);
|
|
69
|
-
useEffect(() => {
|
|
70
|
-
if (isEditing !== undefined && isEditing !== isInternalEditing) {
|
|
71
|
-
setInternalIsEditing(Boolean(isEditing));
|
|
72
|
-
if (isEditing) {
|
|
73
|
-
setTimeout(() => {
|
|
74
|
-
// When enabling editing from a dropdown menu, there will be a blur event when the dropdown closes,
|
|
75
|
-
// so we need to wait a bit before making sure the input is focused and selected
|
|
76
|
-
inputRef.current?.select();
|
|
77
|
-
inputRef.current?.focus();
|
|
78
|
-
}, 200);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}, [isInternalEditing, handleSetEditing, isEditing]);
|
|
82
91
|
// Add keydown event listener to handle enter key
|
|
83
92
|
useEffect(() => {
|
|
84
93
|
const handleKeyDown = (e) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editable-text.js","sourceRoot":"","sources":["../../src/components/editable-text.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAkB,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAEhF,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,CAAC,MAAM,YAAY,GAkBpB,CAAC,EACJ,SAAS,EACT,UAAU,GAAG,KAAK,EAClB,cAAc,GAAG,KAAK,EACtB,SAAS,EACT,WAAW,EACX,KAAK,EACL,QAAQ,EACR,eAAe,GAChB,EAAE,EAAE;IACH,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"editable-text.js","sourceRoot":"","sources":["../../src/components/editable-text.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAkB,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAEhF,OAAO,EAAC,KAAK,EAAC,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,MAAM,CAAC,MAAM,YAAY,GAkBpB,CAAC,EACJ,SAAS,EACT,UAAU,GAAG,KAAK,EAClB,cAAc,GAAG,KAAK,EACtB,SAAS,EACT,WAAW,EACX,KAAK,EACL,QAAQ,EACR,eAAe,GAChB,EAAE,EAAE;IACH,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;IAC3C,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,6CAA6C;IAC7C,oDAAoD;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC;YACvC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,qEAAqE;IACrE,8CAA8C;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YAC/D,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACzC,IAAI,SAAS,EAAE,CAAC;gBACd,mGAAmG;gBACnG,gFAAgF;gBAChF,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;oBAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBAC3B,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC5B,CAAC,EAAE,GAAG,CAAC,CAAC;gBACR,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACnC,mDAAmD;IAEnD,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,CAAgC,EAAE,EAAE;QACnC,IAAI,UAAU,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,OAAO,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,EACD,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAChC,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,aAAsB,EAAE,EAAE;QACzB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QACD,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACpC,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC,EACD,CAAC,UAAU,EAAE,eAAe,CAAC,CAC9B,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAE1C,iDAAiD;IACjD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAE,EAAE;YACzC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;gBACd,KAAK,QAAQ;oBACX,iDAAiD;oBACjD,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACxB,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;oBACjC,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACxB,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;oBACzB,MAAM;gBACR,KAAK,OAAO;oBACV,gBAAgB,CAAC,KAAK,CAAC,CAAC;oBACxB,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC1C,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;oBACzB,MAAM;YACV,CAAC;QACH,CAAC,CAAC;QACF,IAAI,iBAAiB,EAAE,CAAC;YACtB,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACzD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,iBAAiB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3D,OAAO,CACL,KAAC,KAAK,IACJ,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,EAAE,CACX,qJAAqJ,EACrJ;YACE,4BAA4B,EAAE,CAAC,iBAAiB;YAChD,QAAQ,EAAE,CAAC,iBAAiB;SAC7B,EACD,SAAS,CACV,EACD,KAAK,EAAE;YACL,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;SAC1D,EACD,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,WAAW,EACpB,WAAW,EACT,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,GAEnE,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["'use client';\n\nimport {ChangeEvent, FC, useCallback, useEffect, useRef, useState} from 'react';\n\nimport {Input} from './input';\nimport {cn} from '../lib/utils';\n\n/**\n * Component that allows the user to edit a string.\n *\n * The editing mode can be controlled (the mode is managed by the parent component)\n * or uncontrolled (managed by the component itself).\n *\n * Controlled mode example:\n * ```\n * const [text, setText] = useState('');\n * const [isEditing, setEditing] = useState(false);\n * ...\n * <EditableText\n * value={text}\n * onChange={setText}\n * isEditing={isEditing}\n * onEditingChange={setEditing}\n * />\n * ```\n *\n * Uncontrolled mode example:\n * ```\n * const [text, setText] = useState('');\n * ...\n * <EditableText\n * value={text}\n * onChange={setText}\n * defaultEditing={false}\n * />\n * ```\n */\n\nexport const EditableText: FC<{\n className?: string;\n isReadOnly?: boolean;\n value: string;\n placeholder?: string;\n onChange: (text: string) => void;\n\n /**\n * The editing state when it is initially rendered. Use when you do not need to control its editing state\n * in the parent component.\n **/\n defaultEditing?: boolean;\n\n /**\n * The controlled editing state of the component. Must be used in conjunction with onEditingChange.\n **/\n isEditing?: boolean;\n onEditingChange?: (isEditing: boolean) => void;\n}> = ({\n className,\n isReadOnly = false,\n defaultEditing = false,\n isEditing,\n placeholder,\n value,\n onChange,\n onEditingChange,\n}) => {\n const [isInternalEditing, setInternalIsEditing] = useState(defaultEditing);\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalValue, setInternalValue] = useState(value);\n const internalValueRef = useRef(internalValue);\n\n useEffect(() => {\n internalValueRef.current = internalValue;\n }, [internalValue]);\n\n // Keep internalValue in sync with value prop\n /* eslint-disable react-hooks/set-state-in-effect */\n useEffect(() => {\n if (value !== internalValueRef.current) {\n setInternalValue(value);\n }\n }, [value]);\n\n // Keep internal editing state in sync with controlled isEditing prop\n // and focus the input when editing is enabled\n useEffect(() => {\n if (isEditing !== undefined && isEditing !== isInternalEditing) {\n setInternalIsEditing(Boolean(isEditing));\n if (isEditing) {\n // When enabling editing from a dropdown menu, there will be a blur event when the dropdown closes,\n // so we need to wait a bit before making sure the input is focused and selected\n const timeoutId = setTimeout(() => {\n inputRef.current?.select();\n inputRef.current?.focus();\n }, 200);\n return () => clearTimeout(timeoutId);\n }\n }\n return undefined;\n }, [isEditing, isInternalEditing]);\n /* eslint-enable react-hooks/set-state-in-effect */\n\n const handleSetValue = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (isReadOnly || !isInternalEditing) {\n return;\n }\n return setInternalValue(e.target.value);\n },\n [isInternalEditing, isReadOnly],\n );\n\n const handleSetEditing = useCallback(\n (nextIsEditing: boolean) => {\n if (isReadOnly) {\n return;\n }\n setInternalIsEditing(nextIsEditing);\n onEditingChange?.(nextIsEditing);\n },\n [isReadOnly, onEditingChange],\n );\n\n const handleBlur = useCallback(() => {\n handleSetEditing(false);\n onChange(internalValueRef.current?.trim());\n }, [handleSetEditing, onChange]);\n\n const handleClick = useCallback(() => {\n if (!isInternalEditing) {\n handleSetEditing(true);\n }\n }, [isInternalEditing, handleSetEditing]);\n\n // Add keydown event listener to handle enter key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n // Reset the internal value to the original value\n setInternalValue(value);\n internalValueRef.current = value;\n handleSetEditing(false);\n inputRef.current?.blur();\n break;\n case 'Enter':\n handleSetEditing(false);\n onChange(internalValueRef.current.trim());\n inputRef.current?.blur();\n break;\n }\n };\n if (isInternalEditing) {\n document.addEventListener('keydown', handleKeyDown);\n }\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [isInternalEditing, onChange, handleSetEditing, value]);\n\n return (\n <Input\n ref={inputRef}\n className={cn(\n 'disabled:opacity-1 w-full rounded-sm border-transparent px-1 py-0 focus:border-blue-500 focus:outline-none focus:ring-blue-500 disabled:cursor-text',\n {\n 'select-none bg-transparent': !isInternalEditing,\n truncate: !isInternalEditing,\n },\n className,\n )}\n style={{\n caretColor: isInternalEditing ? undefined : 'transparent',\n }}\n value={internalValue}\n onChange={handleSetValue}\n onBlur={handleBlur}\n disabled={isReadOnly}\n onClick={handleClick}\n placeholder={\n !isInternalEditing ? (placeholder ?? 'Click to edit') : undefined\n }\n />\n );\n};\n"]}
|
|
@@ -5,7 +5,7 @@ import * as React from 'react';
|
|
|
5
5
|
import { cn } from '../lib/utils';
|
|
6
6
|
import { Button } from './button';
|
|
7
7
|
const ErrorPane = React.forwardRef(({ className, embed, title = 'Something went wrong', text = `We are sorry, but something unexpected happened.`, onRetry, actions = false, onGoToStart, ...props }, ref) => {
|
|
8
|
-
return (_jsx("div", { ref: ref, className: cn('flex justify-center', className), ...props, children: _jsxs(Alert, { variant: "destructive", className: cn('flex min-h-[200px] max-w-[450px] flex-col items-center justify-center rounded-lg px-6 py-6 text-center', !embed && 'min-w-[350px]'), children: [_jsx("div", { className: "mb-4", children: _jsx(TriangleAlertIcon, { className: "text-destructive h-8 w-8" }) }), _jsx(AlertTitle, { className: "text-foreground mb-1 text-xl", children: title }), _jsxs(AlertDescription, { className: "text-foreground mt-3 max-w-sm px-2", children: [_jsx("p", { className: "mb-5 text-left", children: text }), actions && (_jsx("div", { className: "mb-3 mt-6", children: _jsxs("div", { className: "flex justify-center gap-2", children: [onRetry && (_jsxs(Button, { size: "sm", onClick: onRetry, className: "inline-flex items-center", children: [_jsx(RotateCcwIcon, { className: "mr-2 h-4 w-4" }), "Retry"] })), !embed && onGoToStart && (_jsx(Button, { size: "sm", onClick: onGoToStart, children: "Go to start page" }))] }) }))] })] }) }));
|
|
8
|
+
return (_jsx("div", { ref: ref, className: cn('flex justify-center', className), ...props, children: _jsxs(Alert, { variant: "destructive", className: cn('flex min-h-[200px] max-w-[450px] flex-col items-center justify-center rounded-lg border-none px-6 py-6 text-center', !embed && 'min-w-[350px]'), children: [_jsx("div", { className: "mb-4", children: _jsx(TriangleAlertIcon, { className: "text-destructive h-8 w-8" }) }), _jsx(AlertTitle, { className: "text-foreground mb-1 text-xl", children: title }), _jsxs(AlertDescription, { className: "text-foreground mt-3 max-w-sm px-2", children: [_jsx("p", { className: "mb-5 text-left", children: text }), actions && (_jsx("div", { className: "mb-3 mt-6", children: _jsxs("div", { className: "flex justify-center gap-2", children: [onRetry && (_jsxs(Button, { size: "sm", onClick: onRetry, className: "inline-flex items-center", children: [_jsx(RotateCcwIcon, { className: "mr-2 h-4 w-4" }), "Retry"] })), !embed && onGoToStart && (_jsx(Button, { size: "sm", onClick: onGoToStart, children: "Go to start page" }))] }) }))] })] }) }));
|
|
9
9
|
});
|
|
10
10
|
ErrorPane.displayName = 'ErrorPane';
|
|
11
11
|
export { ErrorPane };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-pane.js","sourceRoot":"","sources":["../../src/components/error-pane.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAC,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAChC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAYhC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAChC,CACE,EACE,SAAS,EACT,KAAK,EACL,KAAK,GAAG,sBAAsB,EAC9B,IAAI,GAAG,kDAAkD,EACzD,OAAO,EACP,OAAO,GAAG,KAAK,EACf,WAAW,EACX,GAAG,KAAK,EACT,EACD,GAAG,EACH,EAAE;IACF,OAAO,CACL,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,KAC3C,KAAK,YAET,MAAC,KAAK,IACJ,OAAO,EAAC,aAAa,EACrB,SAAS,EAAE,EAAE,CACX,
|
|
1
|
+
{"version":3,"file":"error-pane.js","sourceRoot":"","sources":["../../src/components/error-pane.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAC,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAChC,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAC;AAYhC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAChC,CACE,EACE,SAAS,EACT,KAAK,EACL,KAAK,GAAG,sBAAsB,EAC9B,IAAI,GAAG,kDAAkD,EACzD,OAAO,EACP,OAAO,GAAG,KAAK,EACf,WAAW,EACX,GAAG,KAAK,EACT,EACD,GAAG,EACH,EAAE;IACF,OAAO,CACL,cACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,KAC3C,KAAK,YAET,MAAC,KAAK,IACJ,OAAO,EAAC,aAAa,EACrB,SAAS,EAAE,EAAE,CACX,oHAAoH,EACpH,CAAC,KAAK,IAAI,eAAe,CAC1B,aAED,cAAK,SAAS,EAAC,MAAM,YACnB,KAAC,iBAAiB,IAAC,SAAS,EAAC,0BAA0B,GAAG,GACtD,EACN,KAAC,UAAU,IAAC,SAAS,EAAC,8BAA8B,YACjD,KAAK,GACK,EACb,MAAC,gBAAgB,IAAC,SAAS,EAAC,oCAAoC,aAC9D,YAAG,SAAS,EAAC,gBAAgB,YAAE,IAAI,GAAK,EACvC,OAAO,IAAI,CACV,cAAK,SAAS,EAAC,WAAW,YACxB,eAAK,SAAS,EAAC,2BAA2B,aACvC,OAAO,IAAI,CACV,MAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,0BAA0B,aAEpC,KAAC,aAAa,IAAC,SAAS,EAAC,cAAc,GAAG,aAEnC,CACV,EACA,CAAC,KAAK,IAAI,WAAW,IAAI,CACxB,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,WAAW,iCAE7B,CACV,IACG,GACF,CACP,IACgB,IACb,GACJ,CACP,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC;AAEpC,OAAO,EAAC,SAAS,EAAC,CAAC","sourcesContent":["import {Alert, AlertDescription, AlertTitle} from './alert';\nimport {RotateCcwIcon, TriangleAlertIcon} from 'lucide-react';\nimport * as React from 'react';\nimport {cn} from '../lib/utils';\nimport {Button} from './button';\n\ninterface ErrorPaneProps extends React.HTMLAttributes<HTMLDivElement> {\n embed?: boolean;\n error?: string | Error | unknown;\n title?: string;\n text?: string;\n onRetry?: () => void;\n onGoToStart?: () => void;\n actions?: boolean;\n}\n\nconst ErrorPane = React.forwardRef<HTMLDivElement, ErrorPaneProps>(\n (\n {\n className,\n embed,\n title = 'Something went wrong',\n text = `We are sorry, but something unexpected happened.`,\n onRetry,\n actions = false,\n onGoToStart,\n ...props\n },\n ref,\n ) => {\n return (\n <div\n ref={ref}\n className={cn('flex justify-center', className)}\n {...props}\n >\n <Alert\n variant=\"destructive\"\n className={cn(\n 'flex min-h-[200px] max-w-[450px] flex-col items-center justify-center rounded-lg border-none px-6 py-6 text-center',\n !embed && 'min-w-[350px]',\n )}\n >\n <div className=\"mb-4\">\n <TriangleAlertIcon className=\"text-destructive h-8 w-8\" />\n </div>\n <AlertTitle className=\"text-foreground mb-1 text-xl\">\n {title}\n </AlertTitle>\n <AlertDescription className=\"text-foreground mt-3 max-w-sm px-2\">\n <p className=\"mb-5 text-left\">{text}</p>\n {actions && (\n <div className=\"mb-3 mt-6\">\n <div className=\"flex justify-center gap-2\">\n {onRetry && (\n <Button\n size=\"sm\"\n onClick={onRetry}\n className=\"inline-flex items-center\"\n >\n <RotateCcwIcon className=\"mr-2 h-4 w-4\" />\n Retry\n </Button>\n )}\n {!embed && onGoToStart && (\n <Button size=\"sm\" onClick={onGoToStart}>\n Go to start page\n </Button>\n )}\n </div>\n </div>\n )}\n </AlertDescription>\n </Alert>\n </div>\n );\n },\n);\n\nErrorPane.displayName = 'ErrorPane';\n\nexport {ErrorPane};\n"]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface TabDescriptor {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
interface TabStripTabsProps {
|
|
8
|
+
className?: string;
|
|
9
|
+
/** Custom className for individual tab triggers. */
|
|
10
|
+
tabClassName?: string;
|
|
11
|
+
}
|
|
12
|
+
interface TabStripMenuItemProps {
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
onClick?: () => void;
|
|
15
|
+
variant?: 'default' | 'destructive';
|
|
16
|
+
className?: string;
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A menu item for the tab's dropdown menu.
|
|
21
|
+
*/
|
|
22
|
+
declare function TabStripMenuItem({ children, onClick, variant, className, disabled, }: TabStripMenuItemProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
interface TabStripMenuSeparatorProps {
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A separator for the tab's dropdown menu.
|
|
28
|
+
*/
|
|
29
|
+
declare function TabStripMenuSeparator({ className }: TabStripMenuSeparatorProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
interface TabStripSearchItemActionProps {
|
|
31
|
+
icon: React.ReactNode;
|
|
32
|
+
onClick?: () => void;
|
|
33
|
+
'aria-label': string;
|
|
34
|
+
className?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* An action button for search dropdown items.
|
|
38
|
+
*/
|
|
39
|
+
declare function TabStripSearchItemAction({ icon, onClick, 'aria-label': ariaLabel, className, }: TabStripSearchItemActionProps): import("react/jsx-runtime").JSX.Element;
|
|
40
|
+
/**
|
|
41
|
+
* Renders the scrollable row of open tabs with drag-to-reorder support.
|
|
42
|
+
*/
|
|
43
|
+
declare function TabStripTabs({ className, tabClassName }: TabStripTabsProps): import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
interface TabStripSearchDropdownProps {
|
|
45
|
+
className?: string;
|
|
46
|
+
triggerClassName?: string;
|
|
47
|
+
/** Whether to auto-focus the search input when dropdown opens. Defaults to true. */
|
|
48
|
+
autoFocus?: boolean;
|
|
49
|
+
/** Optional tooltip content for the trigger button. */
|
|
50
|
+
tooltip?: React.ReactNode;
|
|
51
|
+
/** Optional custom icon for the trigger button. */
|
|
52
|
+
triggerIcon?: React.ReactNode;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Renders the dropdown with search for browsing tabs.
|
|
56
|
+
* By default shows only closed tabs. When searching, shows all matching tabs.
|
|
57
|
+
*/
|
|
58
|
+
declare function TabStripSearchDropdown({ className, triggerClassName, autoFocus, tooltip, triggerIcon, }: TabStripSearchDropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
59
|
+
interface TabStripNewButtonProps {
|
|
60
|
+
className?: string;
|
|
61
|
+
/** Optional tooltip content for the button. */
|
|
62
|
+
tooltip?: React.ReactNode;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Renders a button to create a new tab.
|
|
66
|
+
*/
|
|
67
|
+
declare function TabStripNewButton({ className, tooltip }: TabStripNewButtonProps): import("react/jsx-runtime").JSX.Element | null;
|
|
68
|
+
export interface TabStripProps {
|
|
69
|
+
className?: string;
|
|
70
|
+
tabsListClassName?: string;
|
|
71
|
+
children?: React.ReactNode;
|
|
72
|
+
/** All available tabs. */
|
|
73
|
+
tabs: TabDescriptor[];
|
|
74
|
+
/** IDs of tabs that are currently open. */
|
|
75
|
+
openTabs: string[];
|
|
76
|
+
/** ID of the currently selected tab. */
|
|
77
|
+
selectedTabId?: string | null;
|
|
78
|
+
/** If true, hides the close button when only one tab remains open. */
|
|
79
|
+
preventCloseLastTab?: boolean;
|
|
80
|
+
/** Called when a tab is closed (hidden, can be reopened). */
|
|
81
|
+
onClose?: (tabId: string) => void;
|
|
82
|
+
/** Called when the list of open tabs changes (open from dropdown or reorder). */
|
|
83
|
+
onOpenTabsChange?: (tabIds: string[]) => void;
|
|
84
|
+
/** Called when a tab is selected. */
|
|
85
|
+
onSelect?: (tabId: string) => void;
|
|
86
|
+
/** Called when a new tab should be created. */
|
|
87
|
+
onCreate?: () => void;
|
|
88
|
+
/** Called when a tab is renamed inline. */
|
|
89
|
+
onRename?: (tabId: string, newName: string) => void;
|
|
90
|
+
/** Render function for the tab's dropdown menu. Use TabStrip.MenuItem and TabStrip.MenuSeparator. */
|
|
91
|
+
renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;
|
|
92
|
+
/** Render function for search dropdown item actions. Use TabStrip.SearchItemAction. */
|
|
93
|
+
renderSearchItemActions?: (tab: TabDescriptor) => React.ReactNode;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* A composable tab strip component with search dropdown and tab management.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* // Default layout
|
|
100
|
+
* <TabStrip
|
|
101
|
+
* tabs={tabs}
|
|
102
|
+
* openTabs={openTabs}
|
|
103
|
+
* onClose={closeTab}
|
|
104
|
+
* onOpen={openTab}
|
|
105
|
+
* onCreate={createTab}
|
|
106
|
+
* />
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* // Custom layout with subcomponents
|
|
110
|
+
* <TabStrip tabs={tabs} openTabs={openTabs} onClose={closeTab}>
|
|
111
|
+
* <TabStrip.Tabs className="flex-1" />
|
|
112
|
+
* <TabStrip.SearchDropdown />
|
|
113
|
+
* <TabStrip.NewButton />
|
|
114
|
+
* </TabStrip>
|
|
115
|
+
*/
|
|
116
|
+
declare function TabStripRoot({ className, tabsListClassName, children, tabs, openTabs, selectedTabId, preventCloseLastTab, onClose, onOpenTabsChange, onSelect, onCreate, onRename, renderTabMenu, renderSearchItemActions, }: TabStripProps): import("react/jsx-runtime").JSX.Element;
|
|
117
|
+
export declare const TabStrip: typeof TabStripRoot & {
|
|
118
|
+
Tabs: typeof TabStripTabs;
|
|
119
|
+
SearchDropdown: typeof TabStripSearchDropdown;
|
|
120
|
+
NewButton: typeof TabStripNewButton;
|
|
121
|
+
MenuItem: typeof TabStripMenuItem;
|
|
122
|
+
MenuSeparator: typeof TabStripMenuSeparator;
|
|
123
|
+
SearchItemAction: typeof TabStripSearchItemAction;
|
|
124
|
+
};
|
|
125
|
+
export type { TabStripMenuItemProps, TabStripMenuSeparatorProps, TabStripNewButtonProps, TabStripSearchDropdownProps, TabStripSearchItemActionProps, TabStripTabsProps, };
|
|
126
|
+
//# sourceMappingURL=tab-strip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-strip.d.ts","sourceRoot":"","sources":["../../src/components/tab-strip.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,302 @@
|
|
|
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';
|
|
3
|
+
import { restrictToHorizontalAxis, restrictToParentElement, } from '@dnd-kit/modifiers';
|
|
4
|
+
import { SortableContext, arrayMove, horizontalListSortingStrategy, useSortable, } from '@dnd-kit/sortable';
|
|
5
|
+
import { EllipsisVerticalIcon, ListCollapseIcon, PlusIcon, SearchIcon, XIcon, } from 'lucide-react';
|
|
6
|
+
import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
|
|
7
|
+
const DRAG_MODIFIERS = [restrictToHorizontalAxis, restrictToParentElement];
|
|
8
|
+
import { cn } from '../lib/utils';
|
|
9
|
+
import { Button } from './button';
|
|
10
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from './dropdown-menu';
|
|
11
|
+
import { EditableText } from './editable-text';
|
|
12
|
+
import { Input } from './input';
|
|
13
|
+
import { Tabs, TabsList, TabsTrigger } from './tabs';
|
|
14
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from './tooltip';
|
|
15
|
+
const TabStripContext = createContext(null);
|
|
16
|
+
function useTabStripContext() {
|
|
17
|
+
const context = useContext(TabStripContext);
|
|
18
|
+
if (!context) {
|
|
19
|
+
throw new Error('TabStrip subcomponents must be used within a TabStrip');
|
|
20
|
+
}
|
|
21
|
+
return context;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A single sortable tab item.
|
|
25
|
+
*/
|
|
26
|
+
function SortableTab({ tab, tabClassName, editingTabId, hideCloseButton, onClose, onStartEditing, onStopEditing, onInlineRename, renderTabMenu, }) {
|
|
27
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: tab.id });
|
|
28
|
+
const style = {
|
|
29
|
+
// Use Translate instead of Transform to avoid scale changes that squeeze the tab
|
|
30
|
+
transform: transform
|
|
31
|
+
? `translate3d(${transform.x}px, ${transform.y}px, 0)`
|
|
32
|
+
: undefined,
|
|
33
|
+
transition,
|
|
34
|
+
opacity: isDragging ? 0.5 : 1,
|
|
35
|
+
};
|
|
36
|
+
const menuContent = renderTabMenu?.(tab);
|
|
37
|
+
return (_jsx("div", { ref: setNodeRef, className: "h-full flex-shrink-0", style: style, ...attributes, ...listeners, children: _jsxs(TabsTrigger, { value: tab.id, className: cn('data-[state=inactive]:hover:bg-primary/5', 'group flex h-full min-w-[100px] max-w-[200px] flex-shrink-0 cursor-grab', 'items-center justify-between gap-1 overflow-hidden rounded-b-none', 'py-0 pl-4 pr-1 font-normal data-[state=active]:shadow-none', tabClassName), children: [_jsx("div", { className: "flex min-w-0 items-center", onDoubleClick: () => onStartEditing(tab.id), children: editingTabId !== tab.id ? (_jsx("div", { className: "truncate text-sm", children: 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, onEditingChange: (isEditing) => {
|
|
38
|
+
if (!isEditing) {
|
|
39
|
+
onStopEditing();
|
|
40
|
+
}
|
|
41
|
+
} })) }), _jsxs("div", { className: "flex flex-shrink-0 items-center", children: [menuContent && (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("span", { role: "button", tabIndex: -1, "aria-label": "Tab options", className: "hover:bg-primary/10 flex h-5 w-5 cursor-pointer items-center justify-center rounded p-1 opacity-0 group-hover:opacity-100 data-[state=open]:opacity-100", onMouseDown: (event) => {
|
|
42
|
+
event.stopPropagation();
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
}, onClick: (event) => {
|
|
45
|
+
event.stopPropagation();
|
|
46
|
+
}, children: _jsx(EllipsisVerticalIcon, { className: "h-3 w-3" }) }) }), _jsx(DropdownMenuContent, { align: "start", children: menuContent })] })), !hideCloseButton && (_jsx("span", { role: "button", tabIndex: -1, "aria-label": "Close tab", className: "hover:bg-primary/10 flex h-5 w-5 cursor-pointer items-center justify-center rounded p-1", onMouseDown: (event) => {
|
|
47
|
+
event.stopPropagation();
|
|
48
|
+
event.preventDefault();
|
|
49
|
+
}, onClick: (event) => {
|
|
50
|
+
event.stopPropagation();
|
|
51
|
+
event.preventDefault();
|
|
52
|
+
onClose(tab.id);
|
|
53
|
+
}, children: _jsx(XIcon, { className: "h-4 w-4" }) }))] })] }) }));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A menu item for the tab's dropdown menu.
|
|
57
|
+
*/
|
|
58
|
+
function TabStripMenuItem({ children, onClick, variant = 'default', className, disabled, }) {
|
|
59
|
+
return (_jsx(DropdownMenuItem, { disabled: disabled, onClick: (event) => {
|
|
60
|
+
event.stopPropagation();
|
|
61
|
+
onClick?.();
|
|
62
|
+
}, className: cn(variant === 'destructive' && 'text-destructive focus:text-destructive', className), children: children }));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A separator for the tab's dropdown menu.
|
|
66
|
+
*/
|
|
67
|
+
function TabStripMenuSeparator({ className }) {
|
|
68
|
+
return _jsx(DropdownMenuSeparator, { className: className });
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* An action button for search dropdown items.
|
|
72
|
+
*/
|
|
73
|
+
function TabStripSearchItemAction({ icon, onClick, 'aria-label': ariaLabel, className, }) {
|
|
74
|
+
return (_jsx("span", { role: "button", tabIndex: -1, "aria-label": ariaLabel, className: cn('text-muted-foreground hover:text-foreground flex h-4 w-4 cursor-pointer items-center justify-center rounded', className), onClick: (event) => {
|
|
75
|
+
event.stopPropagation();
|
|
76
|
+
onClick?.();
|
|
77
|
+
}, children: icon }));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Renders the scrollable row of open tabs with drag-to-reorder support.
|
|
81
|
+
*/
|
|
82
|
+
function TabStripTabs({ className, tabClassName }) {
|
|
83
|
+
const { openTabItems, editingTabId, scrollContainerRef, onOpenTabsChange, renderTabMenu, preventCloseLastTab, handleStartEditing, handleStopEditing, handleInlineRename, handleClose, } = useTabStripContext();
|
|
84
|
+
const sensors = useSensors(useSensor(PointerSensor, {
|
|
85
|
+
activationConstraint: {
|
|
86
|
+
distance: 5, // 5px movement before drag starts (allows clicks)
|
|
87
|
+
},
|
|
88
|
+
}));
|
|
89
|
+
const handleDragEnd = (event) => {
|
|
90
|
+
const { active, over } = event;
|
|
91
|
+
if (!over || active.id === over.id || !onOpenTabsChange)
|
|
92
|
+
return;
|
|
93
|
+
const oldIndex = openTabItems.findIndex((tab) => tab.id === active.id);
|
|
94
|
+
const newIndex = openTabItems.findIndex((tab) => tab.id === over.id);
|
|
95
|
+
if (oldIndex !== -1 && newIndex !== -1) {
|
|
96
|
+
const newOrder = arrayMove(openTabItems.map((t) => t.id), oldIndex, newIndex);
|
|
97
|
+
onOpenTabsChange(newOrder);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const tabIds = useMemo(() => openTabItems.map((t) => t.id), [openTabItems]);
|
|
101
|
+
return (_jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, modifiers: DRAG_MODIFIERS, autoScroll: true, onDragEnd: handleDragEnd, children: _jsx(SortableContext, { items: tabIds, strategy: horizontalListSortingStrategy, children: _jsx("div", { ref: scrollContainerRef, className: cn('flex h-full min-w-0 items-center gap-1 overflow-x-auto overflow-y-hidden pr-1 [&::-webkit-scrollbar]:hidden', className), children: openTabItems.map((tab) => (_jsx(SortableTab, { tab: tab, tabClassName: tabClassName, editingTabId: editingTabId, hideCloseButton: preventCloseLastTab && openTabItems.length === 1, onClose: handleClose, onStartEditing: handleStartEditing, onStopEditing: handleStopEditing, onInlineRename: handleInlineRename, renderTabMenu: renderTabMenu }, tab.id))) }) }) }));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Renders the dropdown with search for browsing tabs.
|
|
105
|
+
* By default shows only closed tabs. When searching, shows all matching tabs.
|
|
106
|
+
*/
|
|
107
|
+
function TabStripSearchDropdown({ className, triggerClassName, autoFocus = true, tooltip, triggerIcon, }) {
|
|
108
|
+
const { search, setSearch, closedTabs, filteredTabs, closedTabIds, openTabs, onOpenTabsChange, onSelect, renderSearchItemActions, } = useTabStripContext();
|
|
109
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
110
|
+
const isSearching = search.trim().length > 0;
|
|
111
|
+
const handleOpenChange = (open) => {
|
|
112
|
+
setIsOpen(open);
|
|
113
|
+
if (!open) {
|
|
114
|
+
setSearch('');
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const handleTabClick = (tabId) => {
|
|
118
|
+
if (closedTabIds.has(tabId)) {
|
|
119
|
+
// Opening a closed tab: add to openTabs and select it
|
|
120
|
+
onOpenTabsChange?.([...openTabs, tabId]);
|
|
121
|
+
onSelect?.(tabId);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// Already open: just select it
|
|
125
|
+
onSelect?.(tabId);
|
|
126
|
+
}
|
|
127
|
+
setIsOpen(false);
|
|
128
|
+
};
|
|
129
|
+
const triggerButton = (_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", "aria-label": "Browse tabs", className: cn('hover:bg-primary/10 h-full flex-shrink-0', triggerClassName), children: triggerIcon ?? _jsx(ListCollapseIcon, { className: "h-4 w-4" }) }) }));
|
|
130
|
+
return (_jsxs(DropdownMenu, { open: isOpen, onOpenChange: handleOpenChange, children: [tooltip ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: triggerButton }), _jsx(TooltipContent, { children: tooltip })] }) })) : (triggerButton), _jsxs(DropdownMenuContent, { align: "start", onCloseAutoFocus: (event) => event.preventDefault(), className: cn('flex max-h-[400px] max-w-[240px] flex-col', className), children: [_jsxs("div", { className: "flex flex-shrink-0 items-center gap-1 px-2", children: [_jsx(SearchIcon, { className: "text-muted-foreground", size: 14 }), _jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), onKeyDown: (event) => {
|
|
131
|
+
if (event.key === 'ArrowDown' || event.key === 'Tab') {
|
|
132
|
+
event.preventDefault();
|
|
133
|
+
const firstItem = event.currentTarget
|
|
134
|
+
.closest('[role="menu"]')
|
|
135
|
+
?.querySelector('[role="menuitem"]:not([disabled])');
|
|
136
|
+
firstItem?.focus();
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
event.stopPropagation();
|
|
140
|
+
}
|
|
141
|
+
}, onKeyUp: (event) => event.stopPropagation(), className: "border-none text-xs shadow-none focus-visible:ring-0", placeholder: "Search...", "aria-label": "Search", autoFocus: autoFocus })] }), _jsx(DropdownMenuSeparator, { className: "flex-shrink-0" }), _jsx("div", { className: "overflow-y-auto", children: isSearching ? (_jsx(DropdownTabItems, { tabs: filteredTabs, emptyMessage: "No matching tabs", onTabClick: handleTabClick, renderActions: renderSearchItemActions })) : (_jsx(DropdownTabItems, { tabs: closedTabs, emptyMessage: "No closed tabs", onTabClick: handleTabClick, renderActions: renderSearchItemActions })) })] })] }));
|
|
142
|
+
}
|
|
143
|
+
function DropdownTabItems({ tabs, emptyMessage, onTabClick, renderActions, }) {
|
|
144
|
+
if (tabs.length === 0) {
|
|
145
|
+
if (!emptyMessage)
|
|
146
|
+
return null;
|
|
147
|
+
return (_jsx(DropdownMenuLabel, { className: "items-center justify-center text-xs", children: emptyMessage }));
|
|
148
|
+
}
|
|
149
|
+
return (_jsx(_Fragment, { children: tabs.map((tab) => (_jsxs(DropdownMenuItem, { onClick: () => onTabClick?.(tab.id), className: "flex h-7 cursor-pointer items-center justify-between truncate", children: [_jsx("span", { className: "xs truncate pl-1", children: tab.name }), renderActions && (_jsx("div", { className: "flex items-center gap-2", children: renderActions(tab) }))] }, tab.id))) }));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Renders a button to create a new tab.
|
|
153
|
+
*/
|
|
154
|
+
function TabStripNewButton({ className, tooltip }) {
|
|
155
|
+
const { onCreate } = useTabStripContext();
|
|
156
|
+
if (!onCreate) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
const button = (_jsx(Button, { size: "icon", variant: "ghost", "aria-label": "Create new tab", onClick: () => onCreate(), className: cn('hover:bg-primary/10 h-full flex-shrink-0', className), children: _jsx(PlusIcon, { className: "h-4 w-4" }) }));
|
|
160
|
+
if (tooltip) {
|
|
161
|
+
return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: button }), _jsx(TooltipContent, { children: tooltip })] }) }));
|
|
162
|
+
}
|
|
163
|
+
return button;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* A composable tab strip component with search dropdown and tab management.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* // Default layout
|
|
170
|
+
* <TabStrip
|
|
171
|
+
* tabs={tabs}
|
|
172
|
+
* openTabs={openTabs}
|
|
173
|
+
* onClose={closeTab}
|
|
174
|
+
* onOpen={openTab}
|
|
175
|
+
* onCreate={createTab}
|
|
176
|
+
* />
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* // Custom layout with subcomponents
|
|
180
|
+
* <TabStrip tabs={tabs} openTabs={openTabs} onClose={closeTab}>
|
|
181
|
+
* <TabStrip.Tabs className="flex-1" />
|
|
182
|
+
* <TabStrip.SearchDropdown />
|
|
183
|
+
* <TabStrip.NewButton />
|
|
184
|
+
* </TabStrip>
|
|
185
|
+
*/
|
|
186
|
+
function TabStripRoot({ className, tabsListClassName, children, tabs, openTabs, selectedTabId, preventCloseLastTab = false, onClose, onOpenTabsChange, onSelect, onCreate, onRename, renderTabMenu, renderSearchItemActions, }) {
|
|
187
|
+
const [search, setSearch] = useState('');
|
|
188
|
+
const [editingTabId, setEditingTabId] = useState(null);
|
|
189
|
+
const scrollContainerRef = useRef(null);
|
|
190
|
+
const prevSelectedIdRef = useRef(null);
|
|
191
|
+
const openTabsSet = useMemo(() => new Set(openTabs), [openTabs]);
|
|
192
|
+
// Build openTabItems in the order of openTabs (for drag-to-reorder)
|
|
193
|
+
const openTabItems = useMemo(() => {
|
|
194
|
+
const tabsById = new Map(tabs.map((tab) => [tab.id, tab]));
|
|
195
|
+
return openTabs
|
|
196
|
+
.map((id) => tabsById.get(id))
|
|
197
|
+
.filter((tab) => tab !== undefined);
|
|
198
|
+
}, [tabs, openTabs]);
|
|
199
|
+
const closedTabs = useMemo(() => tabs.filter((tab) => !openTabsSet.has(tab.id)), [tabs, openTabsSet]);
|
|
200
|
+
const closedTabIds = useMemo(() => new Set(closedTabs.map((tab) => tab.id)), [closedTabs]);
|
|
201
|
+
const trimmedSearch = search.trim().toLowerCase();
|
|
202
|
+
const filteredTabs = useMemo(() => trimmedSearch
|
|
203
|
+
? tabs.filter((tab) => tab.name.toLowerCase().includes(trimmedSearch))
|
|
204
|
+
: [], [tabs, trimmedSearch]);
|
|
205
|
+
// Auto-scroll to selected tab
|
|
206
|
+
useEffect(() => {
|
|
207
|
+
if (!selectedTabId)
|
|
208
|
+
return;
|
|
209
|
+
if (prevSelectedIdRef.current === selectedTabId)
|
|
210
|
+
return;
|
|
211
|
+
prevSelectedIdRef.current = selectedTabId;
|
|
212
|
+
const container = scrollContainerRef.current;
|
|
213
|
+
if (!container)
|
|
214
|
+
return;
|
|
215
|
+
const isOpen = openTabItems.some((tab) => tab.id === selectedTabId);
|
|
216
|
+
if (!isOpen)
|
|
217
|
+
return;
|
|
218
|
+
const frameId = requestAnimationFrame(() => {
|
|
219
|
+
const activeTab = container.querySelector('[data-state="active"]');
|
|
220
|
+
if (!activeTab)
|
|
221
|
+
return;
|
|
222
|
+
activeTab.scrollIntoView({
|
|
223
|
+
behavior: 'smooth',
|
|
224
|
+
block: 'nearest',
|
|
225
|
+
inline: 'nearest',
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
return () => {
|
|
229
|
+
cancelAnimationFrame(frameId);
|
|
230
|
+
};
|
|
231
|
+
}, [selectedTabId, openTabItems]);
|
|
232
|
+
const handleInlineRename = (tabId, newName) => {
|
|
233
|
+
if (!onRename)
|
|
234
|
+
return;
|
|
235
|
+
const tab = tabs.find((t) => t.id === tabId);
|
|
236
|
+
const trimmed = newName.trim();
|
|
237
|
+
if (!trimmed || trimmed === tab?.name) {
|
|
238
|
+
setEditingTabId(null);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
onRename(tabId, trimmed);
|
|
242
|
+
setEditingTabId(null);
|
|
243
|
+
};
|
|
244
|
+
const handleStartEditing = (tabId) => {
|
|
245
|
+
if (!onRename)
|
|
246
|
+
return;
|
|
247
|
+
setEditingTabId(tabId);
|
|
248
|
+
};
|
|
249
|
+
const handleStopEditing = () => {
|
|
250
|
+
setEditingTabId(null);
|
|
251
|
+
};
|
|
252
|
+
const handleClose = (tabId) => {
|
|
253
|
+
// If closing the selected tab, select the one to the left (or right if leftmost)
|
|
254
|
+
if (selectedTabId === tabId && openTabItems.length > 1) {
|
|
255
|
+
const closingIndex = openTabItems.findIndex((t) => t.id === tabId);
|
|
256
|
+
// If closing the leftmost, select the next; otherwise select the previous
|
|
257
|
+
const newIndex = closingIndex === 0 ? 1 : closingIndex - 1;
|
|
258
|
+
const newSelectedId = openTabItems[newIndex]?.id;
|
|
259
|
+
if (newSelectedId) {
|
|
260
|
+
onSelect?.(newSelectedId);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
onClose?.(tabId);
|
|
264
|
+
};
|
|
265
|
+
const contextValue = {
|
|
266
|
+
openTabItems,
|
|
267
|
+
closedTabs,
|
|
268
|
+
closedTabIds,
|
|
269
|
+
filteredTabs,
|
|
270
|
+
editingTabId,
|
|
271
|
+
search,
|
|
272
|
+
scrollContainerRef,
|
|
273
|
+
selectedTabId,
|
|
274
|
+
openTabs,
|
|
275
|
+
preventCloseLastTab,
|
|
276
|
+
onOpenTabsChange,
|
|
277
|
+
onSelect,
|
|
278
|
+
onCreate,
|
|
279
|
+
onRename,
|
|
280
|
+
renderTabMenu,
|
|
281
|
+
renderSearchItemActions,
|
|
282
|
+
setSearch,
|
|
283
|
+
handleStartEditing,
|
|
284
|
+
handleStopEditing,
|
|
285
|
+
handleInlineRename,
|
|
286
|
+
handleClose,
|
|
287
|
+
};
|
|
288
|
+
const handleValueChange = (value) => {
|
|
289
|
+
onSelect?.(value);
|
|
290
|
+
};
|
|
291
|
+
return (_jsx(Tabs, { value: selectedTabId ?? undefined, onValueChange: handleValueChange, className: cn('bg-muted w-full min-w-0', className), children: _jsx(TabStripContext.Provider, { value: contextValue, children: _jsx(TabsList, { className: cn('flex w-full min-w-0 justify-start gap-2 bg-transparent p-0', tabsListClassName), children: children ?? (_jsxs(_Fragment, { children: [_jsx(TabStripSearchDropdown, {}), _jsx(TabStripTabs, {}), _jsx(TabStripNewButton, {})] })) }) }) }));
|
|
292
|
+
}
|
|
293
|
+
// Attach subcomponents
|
|
294
|
+
export const TabStrip = Object.assign(TabStripRoot, {
|
|
295
|
+
Tabs: TabStripTabs,
|
|
296
|
+
SearchDropdown: TabStripSearchDropdown,
|
|
297
|
+
NewButton: TabStripNewButton,
|
|
298
|
+
MenuItem: TabStripMenuItem,
|
|
299
|
+
MenuSeparator: TabStripMenuSeparator,
|
|
300
|
+
SearchItemAction: TabStripSearchItemAction,
|
|
301
|
+
});
|
|
302
|
+
//# sourceMappingURL=tab-strip.js.map
|
|
@@ -0,0 +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 useMemo,\n useRef,\n useState,\n} from 'react';\n\nconst DRAG_MODIFIERS = [restrictToHorizontalAxis, restrictToParentElement];\n\nimport {cn} from '../lib/utils';\nimport {Button} from './button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from './dropdown-menu';\nimport {EditableText} from './editable-text';\nimport {Input} from './input';\nimport {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\n // Callbacks\n onOpenTabsChange?: (tabIds: string[]) => void;\n onSelect?: (tabId: string) => void;\n onCreate?: () => void;\n onRename?: (tabId: string, newName: string) => void;\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n renderSearchItemActions?: (tab: TabDescriptor) => React.ReactNode;\n\n // Internal handlers\n setSearch: (value: string) => void;\n handleStartEditing: (tabId: string) => void;\n handleStopEditing: () => void;\n handleInlineRename: (tabId: string, newName: string) => void;\n handleClose: (tabId: string) => void;\n}\n\nconst TabStripContext = createContext<TabStripContextValue | null>(null);\n\nfunction useTabStripContext() {\n const context = useContext(TabStripContext);\n if (!context) {\n throw new Error('TabStrip subcomponents must be used within a TabStrip');\n }\n return context;\n}\n\n// -----------------------------------------------------------------------------\n// Subcomponents\n// -----------------------------------------------------------------------------\n\ninterface TabStripTabsProps {\n className?: string;\n /** Custom className for individual tab triggers. */\n tabClassName?: string;\n}\n\ninterface SortableTabProps {\n tab: TabDescriptor;\n tabClassName?: string;\n editingTabId: string | null;\n hideCloseButton?: boolean;\n onClose: (tabId: string) => void;\n onStartEditing: (tabId: string) => void;\n onStopEditing: () => void;\n onInlineRename: (tabId: string, newName: string) => void;\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n}\n\n/**\n * A single sortable tab item.\n */\nfunction SortableTab({\n tab,\n tabClassName,\n editingTabId,\n hideCloseButton,\n onClose,\n onStartEditing,\n onStopEditing,\n onInlineRename,\n renderTabMenu,\n}: SortableTabProps) {\n const {attributes, listeners, setNodeRef, transform, transition, isDragging} =\n useSortable({id: tab.id});\n\n const style: React.CSSProperties = {\n // Use Translate instead of Transform to avoid scale changes that squeeze the tab\n transform: transform\n ? `translate3d(${transform.x}px, ${transform.y}px, 0)`\n : undefined,\n transition,\n opacity: isDragging ? 0.5 : 1,\n };\n\n const menuContent = renderTabMenu?.(tab);\n\n return (\n <div\n ref={setNodeRef}\n className=\"h-full flex-shrink-0\"\n style={style}\n {...attributes}\n {...listeners}\n >\n <TabsTrigger\n value={tab.id}\n className={cn(\n 'data-[state=inactive]:hover:bg-primary/5',\n 'group flex h-full min-w-[100px] max-w-[200px] flex-shrink-0 cursor-grab',\n 'items-center justify-between gap-1 overflow-hidden rounded-b-none',\n 'py-0 pl-4 pr-1 font-normal data-[state=active]:shadow-none',\n tabClassName,\n )}\n >\n <div\n className=\"flex min-w-0 items-center\"\n onDoubleClick={() => onStartEditing(tab.id)}\n >\n {editingTabId !== tab.id ? (\n <div className=\"truncate text-sm\">{tab.name}</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 onEditingChange={(isEditing) => {\n if (!isEditing) {\n onStopEditing();\n }\n }}\n />\n )}\n </div>\n\n <div className=\"flex flex-shrink-0 items-center\">\n {menuContent && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Tab options\"\n className=\"hover:bg-primary/10 flex h-5 w-5 cursor-pointer items-center justify-center rounded p-1 opacity-0 group-hover:opacity-100 data-[state=open]:opacity-100\"\n onMouseDown={(event) => {\n event.stopPropagation();\n event.preventDefault();\n }}\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <EllipsisVerticalIcon className=\"h-3 w-3\" />\n </span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {menuContent}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {!hideCloseButton && (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Close tab\"\n className=\"hover:bg-primary/10 flex h-5 w-5 cursor-pointer items-center justify-center rounded p-1\"\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 </span>\n )}\n </div>\n </TabsTrigger>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab Menu Components (for use with renderTabMenu)\n// -----------------------------------------------------------------------------\n\ninterface TabStripMenuItemProps {\n children: React.ReactNode;\n onClick?: () => void;\n variant?: 'default' | 'destructive';\n className?: string;\n disabled?: boolean;\n}\n\n/**\n * A menu item for the tab's dropdown menu.\n */\nfunction TabStripMenuItem({\n children,\n onClick,\n variant = 'default',\n className,\n disabled,\n}: TabStripMenuItemProps) {\n return (\n <DropdownMenuItem\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.();\n }}\n className={cn(\n variant === 'destructive' && 'text-destructive focus:text-destructive',\n className,\n )}\n >\n {children}\n </DropdownMenuItem>\n );\n}\n\ninterface TabStripMenuSeparatorProps {\n className?: string;\n}\n\n/**\n * A separator for the tab's dropdown menu.\n */\nfunction TabStripMenuSeparator({className}: TabStripMenuSeparatorProps) {\n return <DropdownMenuSeparator className={className} />;\n}\n\ninterface TabStripSearchItemActionProps {\n icon: React.ReactNode;\n onClick?: () => void;\n 'aria-label': string;\n className?: string;\n}\n\n/**\n * An action button for search dropdown items.\n */\nfunction TabStripSearchItemAction({\n icon,\n onClick,\n 'aria-label': ariaLabel,\n className,\n}: TabStripSearchItemActionProps) {\n return (\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label={ariaLabel}\n className={cn(\n 'text-muted-foreground hover:text-foreground flex h-4 w-4 cursor-pointer items-center justify-center rounded',\n className,\n )}\n onClick={(event) => {\n event.stopPropagation();\n onClick?.();\n }}\n >\n {icon}\n </span>\n );\n}\n\n/**\n * Renders the scrollable row of open tabs with drag-to-reorder support.\n */\nfunction TabStripTabs({className, tabClassName}: TabStripTabsProps) {\n const {\n openTabItems,\n editingTabId,\n scrollContainerRef,\n onOpenTabsChange,\n renderTabMenu,\n preventCloseLastTab,\n handleStartEditing,\n handleStopEditing,\n handleInlineRename,\n handleClose,\n } = useTabStripContext();\n\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5, // 5px movement before drag starts (allows clicks)\n },\n }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const {active, over} = event;\n if (!over || active.id === over.id || !onOpenTabsChange) return;\n\n const oldIndex = openTabItems.findIndex((tab) => tab.id === active.id);\n const newIndex = openTabItems.findIndex((tab) => tab.id === over.id);\n\n if (oldIndex !== -1 && newIndex !== -1) {\n const newOrder = arrayMove(\n openTabItems.map((t) => t.id),\n oldIndex,\n newIndex,\n );\n onOpenTabsChange(newOrder);\n }\n };\n\n const tabIds = useMemo(() => openTabItems.map((t) => t.id), [openTabItems]);\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={DRAG_MODIFIERS}\n autoScroll={true}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={tabIds} strategy={horizontalListSortingStrategy}>\n <div\n ref={scrollContainerRef}\n className={cn(\n 'flex h-full min-w-0 items-center gap-1 overflow-x-auto overflow-y-hidden pr-1 [&::-webkit-scrollbar]:hidden',\n className,\n )}\n >\n {openTabItems.map((tab) => (\n <SortableTab\n key={tab.id}\n tab={tab}\n tabClassName={tabClassName}\n editingTabId={editingTabId}\n hideCloseButton={\n preventCloseLastTab && openTabItems.length === 1\n }\n onClose={handleClose}\n onStartEditing={handleStartEditing}\n onStopEditing={handleStopEditing}\n onInlineRename={handleInlineRename}\n renderTabMenu={renderTabMenu}\n />\n ))}\n </div>\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}\n\n/**\n * Renders the dropdown with search for browsing tabs.\n * By default shows only closed tabs. When searching, shows all matching tabs.\n */\nfunction TabStripSearchDropdown({\n className,\n triggerClassName,\n autoFocus = true,\n tooltip,\n triggerIcon,\n}: TabStripSearchDropdownProps) {\n const {\n search,\n setSearch,\n closedTabs,\n filteredTabs,\n closedTabIds,\n openTabs,\n onOpenTabsChange,\n onSelect,\n renderSearchItemActions,\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 triggerButton = (\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n aria-label=\"Browse tabs\"\n className={cn(\n 'hover:bg-primary/10 h-full flex-shrink-0',\n triggerClassName,\n )}\n >\n {triggerIcon ?? <ListCollapseIcon className=\"h-4 w-4\" />}\n </Button>\n </DropdownMenuTrigger>\n );\n\n return (\n <DropdownMenu open={isOpen} onOpenChange={handleOpenChange}>\n {tooltip ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{triggerButton}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n triggerButton\n )}\n\n <DropdownMenuContent\n align=\"start\"\n onCloseAutoFocus={(event) => event.preventDefault()}\n className={cn('flex max-h-[400px] max-w-[240px] flex-col', className)}\n >\n <div className=\"flex flex-shrink-0 items-center gap-1 px-2\">\n <SearchIcon className=\"text-muted-foreground\" size={14} />\n <Input\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown' || event.key === 'Tab') {\n event.preventDefault();\n const firstItem = event.currentTarget\n .closest('[role=\"menu\"]')\n ?.querySelector<HTMLElement>(\n '[role=\"menuitem\"]:not([disabled])',\n );\n firstItem?.focus();\n } else {\n event.stopPropagation();\n }\n }}\n onKeyUp={(event) => event.stopPropagation()}\n className=\"border-none text-xs shadow-none focus-visible:ring-0\"\n placeholder=\"Search...\"\n aria-label=\"Search\"\n autoFocus={autoFocus}\n />\n </div>\n <DropdownMenuSeparator className=\"flex-shrink-0\" />\n\n <div className=\"overflow-y-auto\">\n {isSearching ? (\n <DropdownTabItems\n tabs={filteredTabs}\n emptyMessage=\"No matching tabs\"\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n />\n ) : (\n <DropdownTabItems\n tabs={closedTabs}\n emptyMessage=\"No closed tabs\"\n onTabClick={handleTabClick}\n renderActions={renderSearchItemActions}\n />\n )}\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\ninterface DropdownTabItemsProps {\n tabs: TabDescriptor[];\n emptyMessage?: string;\n onTabClick?: (tabId: string) => void;\n renderActions?: (tab: TabDescriptor) => React.ReactNode;\n}\n\nfunction DropdownTabItems({\n tabs,\n emptyMessage,\n onTabClick,\n renderActions,\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=\"flex h-7 cursor-pointer items-center justify-between truncate\"\n >\n <span className=\"xs truncate pl-1\">{tab.name}</span>\n {renderActions && (\n <div className=\"flex items-center gap-2\">{renderActions(tab)}</div>\n )}\n </DropdownMenuItem>\n ))}\n </>\n );\n}\n\ninterface TabStripNewButtonProps {\n className?: string;\n /** Optional tooltip content for the button. */\n tooltip?: React.ReactNode;\n}\n\n/**\n * Renders a button to create a new tab.\n */\nfunction TabStripNewButton({className, tooltip}: TabStripNewButtonProps) {\n const {onCreate} = useTabStripContext();\n\n if (!onCreate) {\n return null;\n }\n\n const button = (\n <Button\n size=\"icon\"\n variant=\"ghost\"\n aria-label=\"Create new tab\"\n onClick={() => onCreate()}\n className={cn('hover:bg-primary/10 h-full flex-shrink-0', className)}\n >\n <PlusIcon className=\"h-4 w-4\" />\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n}\n\n// -----------------------------------------------------------------------------\n// Main Component\n// -----------------------------------------------------------------------------\n\nexport interface TabStripProps {\n className?: string;\n tabsListClassName?: string;\n children?: React.ReactNode;\n /** All available tabs. */\n tabs: TabDescriptor[];\n /** IDs of tabs that are currently open. */\n openTabs: string[];\n /** ID of the currently selected tab. */\n selectedTabId?: string | null;\n /** If true, hides the close button when only one tab remains open. */\n preventCloseLastTab?: boolean;\n /** Called when a tab is closed (hidden, can be reopened). */\n onClose?: (tabId: string) => void;\n /** Called when the list of open tabs changes (open from dropdown or reorder). */\n onOpenTabsChange?: (tabIds: string[]) => void;\n /** Called when a tab is selected. */\n onSelect?: (tabId: string) => void;\n /** Called when a new tab should be created. */\n onCreate?: () => void;\n /** Called when a tab is renamed inline. */\n onRename?: (tabId: string, newName: string) => void;\n /** Render function for the tab's dropdown menu. Use TabStrip.MenuItem and TabStrip.MenuSeparator. */\n renderTabMenu?: (tab: TabDescriptor) => React.ReactNode;\n /** Render function for search dropdown item actions. Use TabStrip.SearchItemAction. */\n renderSearchItemActions?: (tab: TabDescriptor) => React.ReactNode;\n}\n\n/**\n * A composable tab strip component with search dropdown and tab management.\n *\n * @example\n * // Default layout\n * <TabStrip\n * tabs={tabs}\n * openTabs={openTabs}\n * onClose={closeTab}\n * onOpen={openTab}\n * onCreate={createTab}\n * />\n *\n * @example\n * // Custom layout with subcomponents\n * <TabStrip tabs={tabs} openTabs={openTabs} onClose={closeTab}>\n * <TabStrip.Tabs className=\"flex-1\" />\n * <TabStrip.SearchDropdown />\n * <TabStrip.NewButton />\n * </TabStrip>\n */\nfunction TabStripRoot({\n className,\n tabsListClassName,\n children,\n tabs,\n openTabs,\n selectedTabId,\n preventCloseLastTab = false,\n onClose,\n onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabMenu,\n renderSearchItemActions,\n}: 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\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 // Auto-scroll to selected tab\n useEffect(() => {\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 const frameId = requestAnimationFrame(() => {\n const activeTab = container.querySelector<HTMLElement>(\n '[data-state=\"active\"]',\n );\n if (!activeTab) return;\n\n activeTab.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest',\n });\n });\n\n return () => {\n cancelAnimationFrame(frameId);\n };\n }, [selectedTabId, openTabItems]);\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 onOpenTabsChange,\n onSelect,\n onCreate,\n onRename,\n renderTabMenu,\n renderSearchItemActions,\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 className={cn('bg-muted w-full min-w-0', className)}\n >\n <TabStripContext.Provider value={contextValue}>\n <TabsList\n className={cn(\n 'flex w-full min-w-0 justify-start gap-2 bg-transparent p-0',\n tabsListClassName,\n )}\n >\n {children ?? (\n <>\n <TabStripSearchDropdown />\n <TabStripTabs />\n <TabStripNewButton />\n </>\n )}\n </TabsList>\n </TabStripContext.Provider>\n </Tabs>\n );\n}\n\n// Attach subcomponents\nexport const TabStrip = Object.assign(TabStripRoot, {\n Tabs: TabStripTabs,\n SearchDropdown: TabStripSearchDropdown,\n NewButton: TabStripNewButton,\n MenuItem: TabStripMenuItem,\n MenuSeparator: TabStripMenuSeparator,\n SearchItemAction: TabStripSearchItemAction,\n});\n\nexport type {\n TabStripMenuItemProps,\n TabStripMenuSeparatorProps,\n TabStripNewButtonProps,\n TabStripSearchDropdownProps,\n TabStripSearchItemActionProps,\n TabStripTabsProps,\n};\n"]}
|
package/dist/components/tree.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Collapsible, CollapsibleContent } from '@radix-ui/react-collapsible';
|
|
4
|
-
import {
|
|
4
|
+
import { useState } from 'react';
|
|
5
5
|
import { CollapsibleTrigger } from './collapsible';
|
|
6
6
|
import { cn } from '../lib/utils';
|
|
7
7
|
import { ChevronRightIcon } from 'lucide-react';
|
|
@@ -21,9 +21,6 @@ function TreeNode(props) {
|
|
|
21
21
|
const { treeData, renderNode } = props;
|
|
22
22
|
const { children } = treeData;
|
|
23
23
|
const [isOpen, setIsOpen] = useState(Boolean(treeData.isInitialOpen));
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
setIsOpen(Boolean(treeData.isInitialOpen));
|
|
26
|
-
}, [treeData.isInitialOpen]);
|
|
27
24
|
if (!children) {
|
|
28
25
|
return _jsx(_Fragment, { children: renderNode(treeData, isOpen) });
|
|
29
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/components/tree.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAC,WAAW,EAAE,kBAAkB,EAAC,MAAM,6BAA6B,CAAC;AAC5E,OAAc,
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/components/tree.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAC,WAAW,EAAE,kBAAkB,EAAC,MAAM,6BAA6B,CAAC;AAC5E,OAAc,EAAY,QAAQ,EAAC,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AACjD,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAChC,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAe9C;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAI,KAAmB;IACzC,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAC,GAAG,KAAK,CAAC;IAChD,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,YAC5C,KAAC,QAAQ,IAAI,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,GAAI,GACvD,CACP,CAAC;AACJ,CAAC;AAOD;;GAEG;AACH,SAAS,QAAQ,CAAI,KAAuB;IAC1C,MAAM,EAAC,QAAQ,EAAE,UAAU,EAAC,GAAG,KAAK,CAAC;IACrC,MAAM,EAAC,QAAQ,EAAC,GAAG,QAAQ,CAAC;IAC5B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,4BAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAI,CAAC;IAC7C,CAAC;IACD,OAAO,CACL,MAAC,WAAW,IAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,aAChD,KAAC,kBAAkB,IAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,kBAC5C,eAAK,SAAS,EAAC,mDAAmD,aAChE,KAAC,gBAAgB,IACf,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE;gCAC3C,qBAAqB,EAAE,MAAM;6BAC9B,CAAC,EACF,IAAI,EAAC,MAAM,GACX,EACD,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IACzB,GACa,EACrB,KAAC,kBAAkB,IAAC,SAAS,EAAC,MAAM,YACjC,MAAM;oBACL,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACtB,KAAC,QAAQ,IAEP,QAAQ,EAAE,KAAK,EACf,UAAU,EAAE,UAAU,IAFjB,KAAK,CAAC,GAAG,CAGd,CACH,CAAC;oBACJ,CAAC,CAAC,IAAI,GACW,IACT,CACf,CAAC;AACJ,CAAC","sourcesContent":["'use client';\n\nimport {Collapsible, CollapsibleContent} from '@radix-ui/react-collapsible';\nimport React, {useEffect, useState} from 'react';\n\nimport {CollapsibleTrigger} from './collapsible';\nimport {cn} from '../lib/utils';\nimport {ChevronRightIcon} from 'lucide-react';\n\nexport type TreeNodeData<T> = {\n key: string;\n object: T;\n children?: TreeNodeData<T>[];\n isInitialOpen?: boolean;\n};\n\ntype TreeProps<T> = {\n className?: string;\n treeData: TreeNodeData<T>;\n renderNode: TreeNodeProps<T>['renderNode'];\n};\n\n/**\n * Component that renders a generic tree.\n * @param treeData - The tree data.\n * @param renderNode - A function that renders a tree node.\n */\nexport function Tree<T>(props: TreeProps<T>): React.ReactElement {\n const {className, treeData, renderNode} = props;\n return (\n <div className={cn('flex flex-col', className)}>\n <TreeNode<T> treeData={treeData} renderNode={renderNode} />\n </div>\n );\n}\n\ntype TreeNodeProps<T> = {\n treeData: TreeNodeData<T>;\n renderNode: (node: TreeNodeData<T>, isOpen: boolean) => React.ReactNode;\n};\n\n/**\n * Component that renders a tree node.\n */\nfunction TreeNode<T>(props: TreeNodeProps<T>): React.ReactElement | null {\n const {treeData, renderNode} = props;\n const {children} = treeData;\n const [isOpen, setIsOpen] = useState(Boolean(treeData.isInitialOpen));\n if (!children) {\n return <>{renderNode(treeData, isOpen)}</>;\n }\n return (\n <Collapsible open={isOpen} onOpenChange={setIsOpen}>\n <CollapsibleTrigger className=\"w-full\" asChild>\n <div className=\"flex w-full cursor-pointer items-center space-x-1\">\n <ChevronRightIcon\n className={cn('flex-shrink-0 text-gray-500', {\n 'rotate-90 transform': isOpen,\n })}\n size=\"18px\"\n />\n {renderNode(treeData, isOpen)}\n </div>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pl-4\">\n {isOpen\n ? children.map((child) => (\n <TreeNode<T>\n key={child.key}\n treeData={child}\n renderNode={renderNode}\n />\n ))\n : null}\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,62 +2,63 @@
|
|
|
2
2
|
* {@include ../README.md}
|
|
3
3
|
* @packageDocumentation
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
15
|
-
export
|
|
16
|
-
export
|
|
17
|
-
export
|
|
18
|
-
export
|
|
19
|
-
export
|
|
20
|
-
export
|
|
21
|
-
export
|
|
22
|
-
export
|
|
23
|
-
export
|
|
24
|
-
export
|
|
25
|
-
export
|
|
26
|
-
export
|
|
27
|
-
export
|
|
28
|
-
export
|
|
29
|
-
export
|
|
30
|
-
export
|
|
31
|
-
export
|
|
32
|
-
export
|
|
33
|
-
export
|
|
34
|
-
export
|
|
35
|
-
export
|
|
36
|
-
export
|
|
37
|
-
export
|
|
38
|
-
export
|
|
39
|
-
export
|
|
40
|
-
export
|
|
41
|
-
export
|
|
42
|
-
export
|
|
43
|
-
export
|
|
44
|
-
export
|
|
45
|
-
export
|
|
46
|
-
export
|
|
47
|
-
export
|
|
48
|
-
export
|
|
49
|
-
export
|
|
50
|
-
export
|
|
51
|
-
export
|
|
52
|
-
export
|
|
53
|
-
export
|
|
54
|
-
export
|
|
55
|
-
export
|
|
56
|
-
export
|
|
57
|
-
export
|
|
58
|
-
export
|
|
59
|
-
export
|
|
60
|
-
export
|
|
61
|
-
export
|
|
5
|
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent, } from './components/accordion';
|
|
6
|
+
export { Alert, AlertTitle, AlertDescription } from './components/alert';
|
|
7
|
+
export { AspectRatio } from './components/aspect-ratio';
|
|
8
|
+
export { Badge, badgeVariants, type BadgeProps } from './components/badge';
|
|
9
|
+
export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, } from './components/breadcrumb';
|
|
10
|
+
export { Button, buttonVariants, type ButtonProps } from './components/button';
|
|
11
|
+
export { Calendar, type CalendarProps } from './components/calendar';
|
|
12
|
+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent, } from './components/card';
|
|
13
|
+
export { Checkbox } from './components/checkbox';
|
|
14
|
+
export { ComboboxDemo } from './components/combobox';
|
|
15
|
+
export { Collapsible, CollapsibleTrigger, CollapsibleContent, } from './components/collapsible';
|
|
16
|
+
export { Command, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator, } from './components/command';
|
|
17
|
+
export { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuCheckboxItem, ContextMenuRadioItem, ContextMenuLabel, ContextMenuSeparator, ContextMenuShortcut, ContextMenuGroup, ContextMenuPortal, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuRadioGroup, } from './components/context-menu';
|
|
18
|
+
export { Dialog, DialogPortal, DialogOverlay, DialogTrigger, DialogClose, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, } from './components/dialog';
|
|
19
|
+
export { Drawer, DrawerPortal, DrawerOverlay, DrawerTrigger, DrawerClose, DrawerContent, DrawerHeader, DrawerFooter, DrawerTitle, DrawerDescription, DrawerHandle, } from './components/drawer';
|
|
20
|
+
export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, } from './components/dropdown-menu';
|
|
21
|
+
export { EditableText } from './components/editable-text';
|
|
22
|
+
export { ErrorBoundary } from './components/error-boundary';
|
|
23
|
+
export { ErrorPane } from './components/error-pane';
|
|
24
|
+
export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, } from './components/form';
|
|
25
|
+
export { Input } from './components/input';
|
|
26
|
+
export { Label } from './components/label';
|
|
27
|
+
export { Menubar, MenubarMenu, MenubarTrigger, MenubarContent, MenubarItem, MenubarSeparator, MenubarLabel, MenubarCheckboxItem, MenubarRadioGroup, MenubarRadioItem, MenubarPortal, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarGroup, MenubarShortcut, } from './components/menu-bar';
|
|
28
|
+
export { Pagination, PaginationContent, PaginationLink, PaginationItem, PaginationPrevious, PaginationNext, PaginationEllipsis, } from './components/pagination';
|
|
29
|
+
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, } from './components/popover';
|
|
30
|
+
export { ProgressModal } from './components/progress-modal';
|
|
31
|
+
export { Progress } from './components/progress';
|
|
32
|
+
export { RadioGroup, RadioGroupItem } from './components/radio-group';
|
|
33
|
+
export { ResizablePanelGroup, ResizablePanel, ResizableHandle, } from './components/resizable';
|
|
34
|
+
export { TabStrip, type TabDescriptor, type TabStripProps, } from './components/tab-strip';
|
|
35
|
+
export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, } from './components/select';
|
|
36
|
+
export { ScrollArea, ScrollBar } from './components/scroll-area';
|
|
37
|
+
export { Separator } from './components/separator';
|
|
38
|
+
export { Sheet, SheetPortal, SheetOverlay, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, } from './components/sheet';
|
|
39
|
+
export { SkeletonPane } from './components/skeleton-pane';
|
|
40
|
+
export { Skeleton } from './components/skeleton';
|
|
41
|
+
export { Slider } from './components/slider';
|
|
42
|
+
export { SpinnerPane } from './components/spinner-pane';
|
|
43
|
+
export { Spinner } from './components/spinner';
|
|
44
|
+
export { Switch } from './components/switch';
|
|
45
|
+
export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, } from './components/table';
|
|
46
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent } from './components/tabs';
|
|
47
|
+
export { Textarea } from './components/textarea';
|
|
48
|
+
export { ThemeSwitch } from './components/theme-switch';
|
|
49
|
+
export { type ToastProps, type ToastActionElement, ToastProvider, ToastViewport, Toast, ToastTitle, ToastDescription, ToastClose, ToastAction, } from './components/toast';
|
|
50
|
+
export { Toaster } from './components/toaster';
|
|
51
|
+
export { ToggleGroup, ToggleGroupItem } from './components/toggle-group';
|
|
52
|
+
export { Toggle, toggleVariants } from './components/toggle';
|
|
53
|
+
export { CopyButton, type CopyButtonProps } from './components/copy-button';
|
|
54
|
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, } from './components/tooltip';
|
|
55
|
+
export { Tree, type TreeNodeData } from './components/tree';
|
|
56
|
+
export { useToast, toast, reducer } from './hooks/use-toast';
|
|
57
|
+
export { useAspectRatioDimensions, type Dimensions, type UseAspectRatioDimensionsProps, } from './hooks/useAspectRatioDimensions';
|
|
58
|
+
export { useDisclosure, type UseDisclosureReturnValue, } from './hooks/useDisclosure';
|
|
59
|
+
export { useRelativeCoordinates } from './hooks/useRelativeCoordinates';
|
|
60
|
+
export { cn } from './lib/utils';
|
|
61
|
+
export { sqlroomsTailwindPreset } from './tailwind-preset';
|
|
62
|
+
export { ThemeProvider, useTheme } from './theme/theme-provider';
|
|
62
63
|
export { Slot } from '@radix-ui/react-slot';
|
|
63
64
|
//# sourceMappingURL=index.d.ts.map
|
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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,62 +2,69 @@
|
|
|
2
2
|
* {@include ../README.md}
|
|
3
3
|
* @packageDocumentation
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
13
|
-
export
|
|
14
|
-
export
|
|
15
|
-
export
|
|
16
|
-
export
|
|
17
|
-
export
|
|
18
|
-
export
|
|
19
|
-
export
|
|
20
|
-
export
|
|
21
|
-
export
|
|
22
|
-
export
|
|
23
|
-
export
|
|
24
|
-
export
|
|
25
|
-
export
|
|
26
|
-
export
|
|
27
|
-
export
|
|
28
|
-
export
|
|
29
|
-
export
|
|
30
|
-
export
|
|
31
|
-
export
|
|
32
|
-
export
|
|
33
|
-
export
|
|
34
|
-
export
|
|
35
|
-
export
|
|
36
|
-
export
|
|
37
|
-
export
|
|
38
|
-
export
|
|
39
|
-
export
|
|
40
|
-
export
|
|
41
|
-
export
|
|
42
|
-
export
|
|
43
|
-
export
|
|
44
|
-
export
|
|
45
|
-
export
|
|
46
|
-
export
|
|
47
|
-
export
|
|
48
|
-
export
|
|
49
|
-
export
|
|
50
|
-
export
|
|
51
|
-
export
|
|
52
|
-
export
|
|
53
|
-
export
|
|
54
|
-
export
|
|
55
|
-
export
|
|
56
|
-
export
|
|
57
|
-
|
|
58
|
-
export
|
|
59
|
-
export
|
|
60
|
-
export
|
|
61
|
-
export
|
|
5
|
+
// Components
|
|
6
|
+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent, } from './components/accordion';
|
|
7
|
+
export { Alert, AlertTitle, AlertDescription } from './components/alert';
|
|
8
|
+
export { AspectRatio } from './components/aspect-ratio';
|
|
9
|
+
export { Badge, badgeVariants } from './components/badge';
|
|
10
|
+
export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, } from './components/breadcrumb';
|
|
11
|
+
export { Button, buttonVariants } from './components/button';
|
|
12
|
+
export { Calendar } from './components/calendar';
|
|
13
|
+
export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent, } from './components/card';
|
|
14
|
+
export { Checkbox } from './components/checkbox';
|
|
15
|
+
export { ComboboxDemo } from './components/combobox';
|
|
16
|
+
export { Collapsible, CollapsibleTrigger, CollapsibleContent, } from './components/collapsible';
|
|
17
|
+
export { Command, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator, } from './components/command';
|
|
18
|
+
export { ContextMenu, ContextMenuTrigger, ContextMenuContent, ContextMenuItem, ContextMenuCheckboxItem, ContextMenuRadioItem, ContextMenuLabel, ContextMenuSeparator, ContextMenuShortcut, ContextMenuGroup, ContextMenuPortal, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuRadioGroup, } from './components/context-menu';
|
|
19
|
+
export { Dialog, DialogPortal, DialogOverlay, DialogTrigger, DialogClose, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, } from './components/dialog';
|
|
20
|
+
export { Drawer, DrawerPortal, DrawerOverlay, DrawerTrigger, DrawerClose, DrawerContent, DrawerHeader, DrawerFooter, DrawerTitle, DrawerDescription, DrawerHandle, } from './components/drawer';
|
|
21
|
+
export { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuRadioGroup, } from './components/dropdown-menu';
|
|
22
|
+
export { EditableText } from './components/editable-text';
|
|
23
|
+
export { ErrorBoundary } from './components/error-boundary';
|
|
24
|
+
export { ErrorPane } from './components/error-pane';
|
|
25
|
+
export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, } from './components/form';
|
|
26
|
+
export { Input } from './components/input';
|
|
27
|
+
export { Label } from './components/label';
|
|
28
|
+
export { Menubar, MenubarMenu, MenubarTrigger, MenubarContent, MenubarItem, MenubarSeparator, MenubarLabel, MenubarCheckboxItem, MenubarRadioGroup, MenubarRadioItem, MenubarPortal, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarGroup, MenubarShortcut, } from './components/menu-bar';
|
|
29
|
+
export { Pagination, PaginationContent, PaginationLink, PaginationItem, PaginationPrevious, PaginationNext, PaginationEllipsis, } from './components/pagination';
|
|
30
|
+
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, } from './components/popover';
|
|
31
|
+
export { ProgressModal } from './components/progress-modal';
|
|
32
|
+
export { Progress } from './components/progress';
|
|
33
|
+
export { RadioGroup, RadioGroupItem } from './components/radio-group';
|
|
34
|
+
export { ResizablePanelGroup, ResizablePanel, ResizableHandle, } from './components/resizable';
|
|
35
|
+
export { TabStrip, } from './components/tab-strip';
|
|
36
|
+
export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, } from './components/select';
|
|
37
|
+
export { ScrollArea, ScrollBar } from './components/scroll-area';
|
|
38
|
+
export { Separator } from './components/separator';
|
|
39
|
+
export { Sheet, SheetPortal, SheetOverlay, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, } from './components/sheet';
|
|
40
|
+
export { SkeletonPane } from './components/skeleton-pane';
|
|
41
|
+
export { Skeleton } from './components/skeleton';
|
|
42
|
+
export { Slider } from './components/slider';
|
|
43
|
+
export { SpinnerPane } from './components/spinner-pane';
|
|
44
|
+
export { Spinner } from './components/spinner';
|
|
45
|
+
export { Switch } from './components/switch';
|
|
46
|
+
export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, } from './components/table';
|
|
47
|
+
export { Tabs, TabsList, TabsTrigger, TabsContent } from './components/tabs';
|
|
48
|
+
export { Textarea } from './components/textarea';
|
|
49
|
+
export { ThemeSwitch } from './components/theme-switch';
|
|
50
|
+
export { ToastProvider, ToastViewport, Toast, ToastTitle, ToastDescription, ToastClose, ToastAction, } from './components/toast';
|
|
51
|
+
export { Toaster } from './components/toaster';
|
|
52
|
+
export { ToggleGroup, ToggleGroupItem } from './components/toggle-group';
|
|
53
|
+
export { Toggle, toggleVariants } from './components/toggle';
|
|
54
|
+
export { CopyButton } from './components/copy-button';
|
|
55
|
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, } from './components/tooltip';
|
|
56
|
+
export { Tree } from './components/tree';
|
|
57
|
+
// Hooks
|
|
58
|
+
export { useToast, toast, reducer } from './hooks/use-toast';
|
|
59
|
+
export { useAspectRatioDimensions, } from './hooks/useAspectRatioDimensions';
|
|
60
|
+
export { useDisclosure, } from './hooks/useDisclosure';
|
|
61
|
+
export { useRelativeCoordinates } from './hooks/useRelativeCoordinates';
|
|
62
|
+
// Utilities
|
|
63
|
+
export { cn } from './lib/utils';
|
|
64
|
+
// Tailwind preset
|
|
65
|
+
export { sqlroomsTailwindPreset } from './tailwind-preset';
|
|
66
|
+
// Theme
|
|
67
|
+
export { ThemeProvider, useTheme } from './theme/theme-provider';
|
|
68
|
+
// Re-export from Radix
|
|
62
69
|
export { Slot } from '@radix-ui/react-slot';
|
|
63
70
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AAEvC,OAAO,EAAC,IAAI,EAAC,MAAM,sBAAsB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport * from './components/accordion';\nexport * from './components/alert';\nexport * from './components/aspect-ratio';\nexport * from './components/badge';\nexport * from './components/breadcrumb';\nexport * from './components/button';\nexport * from './components/calendar';\nexport * from './components/card';\nexport * from './components/checkbox';\nexport * from './components/combobox';\nexport * from './components/collapsible';\nexport * from './components/command';\nexport * from './components/context-menu';\nexport * from './components/dialog';\nexport * from './components/drawer';\nexport * from './components/dropdown-menu';\nexport * from './components/editable-text';\nexport * from './components/error-boundary';\nexport * from './components/error-pane';\nexport * from './components/form';\nexport * from './components/input';\nexport * from './components/label';\nexport * from './components/menu-bar';\nexport * from './components/pagination';\nexport * from './components/popover';\nexport * from './components/progress-modal';\nexport * from './components/progress';\nexport * from './components/radio-group';\nexport * from './components/resizable';\nexport * from './components/select';\nexport * from './components/scroll-area';\nexport * from './components/separator';\nexport * from './components/sheet';\nexport * from './components/skeleton-pane';\nexport * from './components/skeleton';\nexport * from './components/slider';\nexport * from './components/spinner-pane';\nexport * from './components/spinner';\nexport * from './components/switch';\nexport * from './components/table';\nexport * from './components/tabs';\nexport * from './components/textarea';\nexport * from './components/theme-switch';\nexport * from './components/toast';\nexport * from './components/toaster';\nexport * from './components/toggle-group';\nexport * from './components/toggle';\nexport * from './components/copy-button';\nexport * from './components/tooltip';\nexport * from './components/tree';\nexport * from './hooks/use-toast';\nexport * from './hooks/useAspectRatioDimensions';\nexport * from './hooks/useDisclosure';\nexport * from './hooks/useRelativeCoordinates';\nexport * from './lib/utils';\nexport * from './tailwind-preset';\nexport * from './theme/theme-provider';\n\nexport {Slot} from '@radix-ui/react-slot';\n"]}
|
|
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 AccordionItem,\n AccordionTrigger,\n AccordionContent,\n} from './components/accordion';\n\nexport {Alert, AlertTitle, AlertDescription} from './components/alert';\n\nexport {AspectRatio} from './components/aspect-ratio';\n\nexport {Badge, badgeVariants, type BadgeProps} from './components/badge';\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\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 CardHeader,\n CardFooter,\n CardTitle,\n CardDescription,\n CardContent,\n} from './components/card';\n\nexport {Checkbox} from './components/checkbox';\n\nexport {ComboboxDemo} from './components/combobox';\n\nexport {\n Collapsible,\n CollapsibleTrigger,\n CollapsibleContent,\n} from './components/collapsible';\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n} from './components/command';\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n} from './components/context-menu';\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n} from './components/dialog';\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n DrawerHandle,\n} from './components/drawer';\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\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 useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n} from './components/form';\n\nexport {Input} from './components/input';\n\nexport {Label} from './components/label';\n\nexport {\n Menubar,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarItem,\n MenubarSeparator,\n MenubarLabel,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarPortal,\n MenubarSub,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarGroup,\n MenubarShortcut,\n} from './components/menu-bar';\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n} from './components/pagination';\n\nexport {\n Popover,\n PopoverTrigger,\n PopoverContent,\n PopoverAnchor,\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 ResizablePanelGroup,\n ResizablePanel,\n ResizableHandle,\n} from './components/resizable';\n\nexport {\n TabStrip,\n type TabDescriptor,\n type TabStripProps,\n} from './components/tab-strip';\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n} from './components/select';\n\nexport {ScrollArea, ScrollBar} from './components/scroll-area';\n\nexport {Separator} from './components/separator';\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n} from './components/sheet';\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 TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n} from './components/table';\n\nexport {Tabs, TabsList, TabsTrigger, TabsContent} from './components/tabs';\n\nexport {Textarea} from './components/textarea';\n\nexport {ThemeSwitch} from './components/theme-switch';\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n} from './components/toast';\n\nexport {Toaster} from './components/toaster';\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 TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n} from './components/tooltip';\n\nexport {Tree, type TreeNodeData} from './components/tree';\n\n// Hooks\nexport {useToast, toast, reducer} from './hooks/use-toast';\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 {useRelativeCoordinates} from './hooks/useRelativeCoordinates';\n\n// Utilities\nexport {cn} from './lib/utils';\n\n// Tailwind preset\nexport {sqlroomsTailwindPreset} from './tailwind-preset';\n\n// Theme\nexport {ThemeProvider, useTheme} from './theme/theme-provider';\n\n// Re-export from Radix\nexport {Slot} from '@radix-ui/react-slot';\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/ui",
|
|
3
|
-
"version": "0.26.1-rc.
|
|
3
|
+
"version": "0.26.1-rc.11",
|
|
4
4
|
"type": "module",
|
|
5
|
+
"sideEffects": false,
|
|
5
6
|
"author": "Ilya Boyandin <ilya@boyandin.me>",
|
|
6
7
|
"license": "MIT",
|
|
7
8
|
"repository": {
|
|
@@ -26,7 +27,9 @@
|
|
|
26
27
|
"typedoc": "typedoc"
|
|
27
28
|
},
|
|
28
29
|
"dependencies": {
|
|
29
|
-
"@
|
|
30
|
+
"@dnd-kit/core": "^6.3.1",
|
|
31
|
+
"@dnd-kit/modifiers": "^9.0.0",
|
|
32
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
30
33
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
31
34
|
"@radix-ui/react-aspect-ratio": "^1.1.7",
|
|
32
35
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
@@ -55,19 +58,18 @@
|
|
|
55
58
|
"clsx": "^2.1.1",
|
|
56
59
|
"cmdk": "^1.1.1",
|
|
57
60
|
"date-fns": "^4.1.0",
|
|
58
|
-
"lucide-react": "^0.
|
|
61
|
+
"lucide-react": "^0.556.0",
|
|
59
62
|
"react-day-picker": "^8.10.1",
|
|
60
63
|
"react-hook-form": "^7.63.0",
|
|
61
64
|
"react-resizable-panels": "^3.0.6",
|
|
62
65
|
"tailwind-merge": "^2.6.0",
|
|
63
66
|
"tailwindcss-animate": "^1.0.7",
|
|
64
67
|
"usehooks-ts": "^3.1.1",
|
|
65
|
-
"vaul": "^1.1.2"
|
|
66
|
-
"zod": "^4.1.8"
|
|
68
|
+
"vaul": "^1.1.2"
|
|
67
69
|
},
|
|
68
70
|
"peerDependencies": {
|
|
69
71
|
"autoprefixer": "^10.4.20",
|
|
70
72
|
"tailwindcss": "^3.4.17"
|
|
71
73
|
},
|
|
72
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "2675a4e65108dbbe67baac8a7dce471d5a688df7"
|
|
73
75
|
}
|