@orsetra/shared-ui 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/components/layout/index.ts +31 -0
  2. package/components/layout/layout-container.tsx +85 -0
  3. package/components/layout/root-layout-wrapper.tsx +33 -0
  4. package/components/layout/sidebar/data.tsx +88 -0
  5. package/components/layout/sidebar/main-sidebar.tsx +177 -0
  6. package/components/layout/sidebar/sidebar.tsx +750 -0
  7. package/components/layout/skeleton.tsx +15 -0
  8. package/components/ui/accordion.tsx +58 -0
  9. package/components/ui/alert-dialog.tsx +133 -0
  10. package/components/ui/alert.tsx +59 -0
  11. package/components/ui/aspect-ratio.tsx +7 -0
  12. package/components/ui/assets-header.tsx +50 -0
  13. package/components/ui/avatar.tsx +50 -0
  14. package/components/ui/badge.tsx +54 -0
  15. package/components/ui/breadcrumb.tsx +115 -0
  16. package/components/ui/button.tsx +83 -0
  17. package/components/ui/calendar.tsx +66 -0
  18. package/components/ui/card.tsx +79 -0
  19. package/components/ui/carousel.tsx +262 -0
  20. package/components/ui/certificate-editor.tsx +445 -0
  21. package/components/ui/chart.tsx +365 -0
  22. package/components/ui/checkbox.tsx +30 -0
  23. package/components/ui/collapsible.tsx +11 -0
  24. package/components/ui/command.tsx +153 -0
  25. package/components/ui/context-menu.tsx +200 -0
  26. package/components/ui/dialog.tsx +122 -0
  27. package/components/ui/drawer.tsx +118 -0
  28. package/components/ui/dropdown-menu.tsx +200 -0
  29. package/components/ui/environment-settings.tsx +173 -0
  30. package/components/ui/environment-variables-config.tsx +175 -0
  31. package/components/ui/file-import.tsx +177 -0
  32. package/components/ui/form.tsx +178 -0
  33. package/components/ui/hover-card.tsx +29 -0
  34. package/components/ui/index.ts +54 -0
  35. package/components/ui/input-otp.tsx +71 -0
  36. package/components/ui/input.tsx +23 -0
  37. package/components/ui/label.tsx +26 -0
  38. package/components/ui/logo.tsx +17 -0
  39. package/components/ui/menubar.tsx +236 -0
  40. package/components/ui/navigation-menu.tsx +128 -0
  41. package/components/ui/page-header.tsx +35 -0
  42. package/components/ui/pagination.tsx +112 -0
  43. package/components/ui/popover.tsx +31 -0
  44. package/components/ui/process-status.tsx +98 -0
  45. package/components/ui/progress.tsx +31 -0
  46. package/components/ui/radio-group.tsx +44 -0
  47. package/components/ui/resizable.tsx +45 -0
  48. package/components/ui/resource-settings.tsx +227 -0
  49. package/components/ui/scroll-area.tsx +48 -0
  50. package/components/ui/search-input.tsx +26 -0
  51. package/components/ui/secret-explorer.tsx +274 -0
  52. package/components/ui/secret-properties-editor.tsx +642 -0
  53. package/components/ui/select.tsx +162 -0
  54. package/components/ui/selected-asset.tsx +120 -0
  55. package/components/ui/separator.tsx +31 -0
  56. package/components/ui/sheet.tsx +140 -0
  57. package/components/ui/skeleton.tsx +15 -0
  58. package/components/ui/slider.tsx +28 -0
  59. package/components/ui/sonner.tsx +31 -0
  60. package/components/ui/switch.tsx +29 -0
  61. package/components/ui/table.tsx +117 -0
  62. package/components/ui/tabs.tsx +55 -0
  63. package/components/ui/textarea.tsx +22 -0
  64. package/components/ui/toast.tsx +131 -0
  65. package/components/ui/toaster.tsx +35 -0
  66. package/components/ui/toggle-group.tsx +61 -0
  67. package/components/ui/toggle.tsx +45 -0
  68. package/components/ui/tooltip.tsx +30 -0
  69. package/components/ui/user-menu.tsx +86 -0
  70. package/hooks/index.ts +5 -0
  71. package/hooks/use-auth.ts +10 -0
  72. package/hooks/use-mobile.ts +19 -0
  73. package/hooks/use-toast.ts +8 -0
  74. package/hooks/use-websocket.tsx +76 -0
  75. package/index.ts +11 -1
  76. package/lib/menu-utils.ts +48 -0
  77. package/package.json +36 -8
@@ -0,0 +1,162 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as SelectPrimitive from "@radix-ui/react-select"
5
+ import { Check, ChevronDown, ChevronUp } from "lucide-react"
6
+
7
+ import { cn } from "../../lib/utils"
8
+
9
+ const Select = SelectPrimitive.Root
10
+
11
+ const SelectGroup = SelectPrimitive.Group
12
+
13
+ const SelectValue = SelectPrimitive.Value
14
+
15
+ const SelectTrigger = React.forwardRef<
16
+ React.ElementRef<typeof SelectPrimitive.Trigger>,
17
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
18
+ >(({ className, children, ...props }, ref) => (
19
+ <SelectPrimitive.Trigger
20
+ ref={ref}
21
+ className={cn(
22
+ "flex h-8 w-full items-center justify-between border border-ibm-gray-30 bg-white px-3 py-2 text-sm text-ibm-gray-100 placeholder:text-gray-500 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
23
+ className
24
+ )}
25
+ style={{ borderRadius: 0 }}
26
+ {...props}
27
+ >
28
+ {children}
29
+ <SelectPrimitive.Icon asChild>
30
+ <ChevronDown className="h-4 w-4 opacity-50" />
31
+ </SelectPrimitive.Icon>
32
+ </SelectPrimitive.Trigger>
33
+ ))
34
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName
35
+
36
+ const SelectScrollUpButton = React.forwardRef<
37
+ React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
38
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
39
+ >(({ className, ...props }, ref) => (
40
+ <SelectPrimitive.ScrollUpButton
41
+ ref={ref}
42
+ className={cn(
43
+ "flex cursor-default items-center justify-center py-1",
44
+ className
45
+ )}
46
+ {...props}
47
+ >
48
+ <ChevronUp className="h-4 w-4" />
49
+ </SelectPrimitive.ScrollUpButton>
50
+ ))
51
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName
52
+
53
+ const SelectScrollDownButton = React.forwardRef<
54
+ React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
55
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
56
+ >(({ className, ...props }, ref) => (
57
+ <SelectPrimitive.ScrollDownButton
58
+ ref={ref}
59
+ className={cn(
60
+ "flex cursor-default items-center justify-center py-1",
61
+ className
62
+ )}
63
+ {...props}
64
+ >
65
+ <ChevronDown className="h-4 w-4" />
66
+ </SelectPrimitive.ScrollDownButton>
67
+ ))
68
+ SelectScrollDownButton.displayName =
69
+ SelectPrimitive.ScrollDownButton.displayName
70
+
71
+ const SelectContent = React.forwardRef<
72
+ React.ElementRef<typeof SelectPrimitive.Content>,
73
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
74
+ >(({ className, children, position = "popper", ...props }, ref) => (
75
+ <SelectPrimitive.Portal>
76
+ <SelectPrimitive.Content
77
+ ref={ref}
78
+ className={cn(
79
+ "relative z-50 max-h-96 min-w-[8rem] overflow-hidden border border-ibm-gray-20 bg-white text-ibm-gray-100 shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
80
+ position === "popper" &&
81
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
82
+ className
83
+ )}
84
+ style={{ borderRadius: 0 }}
85
+ position={position}
86
+ {...props}
87
+ >
88
+ <SelectScrollUpButton />
89
+ <SelectPrimitive.Viewport
90
+ className={cn(
91
+ "p-1",
92
+ position === "popper" &&
93
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"
94
+ )}
95
+ >
96
+ {children}
97
+ </SelectPrimitive.Viewport>
98
+ <SelectScrollDownButton />
99
+ </SelectPrimitive.Content>
100
+ </SelectPrimitive.Portal>
101
+ ))
102
+ SelectContent.displayName = SelectPrimitive.Content.displayName
103
+
104
+ const SelectLabel = React.forwardRef<
105
+ React.ElementRef<typeof SelectPrimitive.Label>,
106
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
107
+ >(({ className, ...props }, ref) => (
108
+ <SelectPrimitive.Label
109
+ ref={ref}
110
+ className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)}
111
+ {...props}
112
+ />
113
+ ))
114
+ SelectLabel.displayName = SelectPrimitive.Label.displayName
115
+
116
+ const SelectItem = React.forwardRef<
117
+ React.ElementRef<typeof SelectPrimitive.Item>,
118
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
119
+ >(({ className, children, ...props }, ref) => (
120
+ <SelectPrimitive.Item
121
+ ref={ref}
122
+ className={cn(
123
+ "relative flex w-full cursor-default select-none items-center py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-ibm-gray-20 focus:text-ibm-gray-100 data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
124
+ className
125
+ )}
126
+ {...props}
127
+ >
128
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
129
+ <SelectPrimitive.ItemIndicator>
130
+ <Check className="h-4 w-4" />
131
+ </SelectPrimitive.ItemIndicator>
132
+ </span>
133
+
134
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
135
+ </SelectPrimitive.Item>
136
+ ))
137
+ SelectItem.displayName = SelectPrimitive.Item.displayName
138
+
139
+ const SelectSeparator = React.forwardRef<
140
+ React.ElementRef<typeof SelectPrimitive.Separator>,
141
+ React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
142
+ >(({ className, ...props }, ref) => (
143
+ <SelectPrimitive.Separator
144
+ ref={ref}
145
+ className={cn("-mx-1 my-1 h-px bg-ibm-gray-30", className)}
146
+ {...props}
147
+ />
148
+ ))
149
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName
150
+
151
+ export {
152
+ Select,
153
+ SelectGroup,
154
+ SelectValue,
155
+ SelectTrigger,
156
+ SelectContent,
157
+ SelectLabel,
158
+ SelectItem,
159
+ SelectSeparator,
160
+ SelectScrollUpButton,
161
+ SelectScrollDownButton,
162
+ }
@@ -0,0 +1,120 @@
1
+ "use client"
2
+
3
+ import { Card, CardContent} from "./card"
4
+ import { FileText, Globe, Database, Server, Code, Zap } from "lucide-react"
5
+ import { useState, useEffect } from "react"
6
+ import { getAsset, getAssetVersions } from "@/app/assets/service"
7
+ import { Asset, ApiAssetVersion, AssetType } from "@/app/assets/models"
8
+ import { Select, SelectValue, SelectContent, SelectItem, SelectTrigger } from "./select"
9
+
10
+
11
+
12
+ interface SelectedAssetProps {
13
+ templateId: string
14
+ version: string | null
15
+ onVersionChange: (asset: Asset) => void
16
+ }
17
+
18
+ export function SelectedAsset({
19
+ templateId,
20
+ version ,
21
+ onVersionChange
22
+ }: SelectedAssetProps) {
23
+ const [template, setTemplate] = useState<Asset | null>(null)
24
+ const [versions, setVersions] = useState<ApiAssetVersion[]>([])
25
+ const [selectedVersion, setSelectedVersion] = useState<string | null>(null)
26
+ const [loading, setLoading] = useState(true)
27
+ useEffect(() => {
28
+ async function loadData() {
29
+ setLoading(true)
30
+ try {
31
+ const [details, versionsData] = await Promise.all([
32
+ getAsset(templateId),
33
+ getAssetVersions(templateId)
34
+ ])
35
+ setTemplate(details)
36
+ setVersions(versionsData.versions)
37
+ setSelectedVersion(version)
38
+ onVersionChange(details as Asset)
39
+ } catch (error) {
40
+ console.error("Error loading asset data:", error)
41
+ } finally {
42
+ setLoading(false)
43
+ }
44
+ }
45
+ loadData()
46
+ }, [templateId])
47
+ const getTemplateIcon = (type: string) => {
48
+ switch (type) {
49
+ case "API":
50
+ return <Globe className="h-5 w-5" />
51
+ case "Integration":
52
+ return <Server className="h-5 w-5" />
53
+ case "Processing":
54
+ return <Code className="h-5 w-5" />
55
+ case "Messaging":
56
+ return <Zap className="h-5 w-5" />
57
+ case "Database":
58
+ return <Database className="h-5 w-5" />
59
+ case "File":
60
+ return <FileText className="h-5 w-5" />
61
+ default:
62
+ return <Code className="h-5 w-5" />
63
+ }
64
+ }
65
+
66
+ return (
67
+ <Card className="border border-ibm-gray-20" style={{ borderRadius: 0 }}>
68
+
69
+ <CardContent className="p-6">
70
+ {loading ? (
71
+ <div className="text-center py-8">
72
+ <p className="text-ibm-gray-70 font-normal">Loading...</p>
73
+ </div>
74
+ ) : template ? (
75
+ <div className="space-y-4">
76
+ <div className="flex items-center space-x-3">
77
+ <div
78
+ className="h-10 w-10 bg-blue-100 flex items-center justify-center text-blue-600 border border-blue-300"
79
+ style={{ borderRadius: 0 }}
80
+ >
81
+ {getTemplateIcon(template.type)}
82
+ </div>
83
+ <div>
84
+ <h3 className="font-medium text-ibm-gray-100">{template.name}</h3>
85
+ </div>
86
+ </div>
87
+ <p className="text-ibm-gray-70 text-sm font-normal" style={{
88
+ display: '-webkit-box',
89
+ WebkitLineClamp: 2,
90
+ WebkitBoxOrient: 'vertical',
91
+ lineHeight: '1.4',
92
+ overflow: 'hidden'
93
+ }}>{template.description}</p>
94
+ <div className="space-y-2 text-sm">
95
+ <div className="flex justify-between">
96
+ <span className="text-ibm-gray-70 font-normal">Version:</span>
97
+ <Select value={selectedVersion || ""} onValueChange={setSelectedVersion}>
98
+ <SelectTrigger className="w-30 h-6" style={{ borderRadius: 0 }}>
99
+ <SelectValue placeholder="Select" />
100
+ </SelectTrigger>
101
+ <SelectContent>
102
+ {versions.length > 0 && versions.map((version) => (
103
+ <SelectItem key={version.version} value={version.version}>
104
+ {version.version}
105
+ </SelectItem>
106
+ ))}
107
+ </SelectContent>
108
+ </Select>
109
+ </div>
110
+ </div>
111
+ </div>
112
+ ) : (
113
+ <div className="text-center py-8">
114
+ <p className="text-ibm-gray-70 font-normal">No template selected</p>
115
+ </div>
116
+ )}
117
+ </CardContent>
118
+ </Card>
119
+ )
120
+ }
@@ -0,0 +1,31 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as SeparatorPrimitive from "@radix-ui/react-separator"
5
+
6
+ import { cn } from "../../lib/utils"
7
+
8
+ const Separator = React.forwardRef<
9
+ React.ElementRef<typeof SeparatorPrimitive.Root>,
10
+ React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>
11
+ >(
12
+ (
13
+ { className, orientation = "horizontal", decorative = true, ...props },
14
+ ref
15
+ ) => (
16
+ <SeparatorPrimitive.Root
17
+ ref={ref}
18
+ decorative={decorative}
19
+ orientation={orientation}
20
+ className={cn(
21
+ "shrink-0 bg-border",
22
+ orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
23
+ className
24
+ )}
25
+ {...props}
26
+ />
27
+ )
28
+ )
29
+ Separator.displayName = SeparatorPrimitive.Root.displayName
30
+
31
+ export { Separator }
@@ -0,0 +1,140 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as SheetPrimitive from "@radix-ui/react-dialog"
5
+ import { cva, type VariantProps } from "class-variance-authority"
6
+ import { X } from "lucide-react"
7
+
8
+ import { cn } from "../../lib/utils"
9
+
10
+ const Sheet = SheetPrimitive.Root
11
+
12
+ const SheetTrigger = SheetPrimitive.Trigger
13
+
14
+ const SheetClose = SheetPrimitive.Close
15
+
16
+ const SheetPortal = SheetPrimitive.Portal
17
+
18
+ const SheetOverlay = React.forwardRef<
19
+ React.ElementRef<typeof SheetPrimitive.Overlay>,
20
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
21
+ >(({ className, ...props }, ref) => (
22
+ <SheetPrimitive.Overlay
23
+ className={cn(
24
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
25
+ className
26
+ )}
27
+ {...props}
28
+ ref={ref}
29
+ />
30
+ ))
31
+ SheetOverlay.displayName = SheetPrimitive.Overlay.displayName
32
+
33
+ const sheetVariants = cva(
34
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
35
+ {
36
+ variants: {
37
+ side: {
38
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
39
+ bottom:
40
+ "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
41
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
42
+ right:
43
+ "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
44
+ },
45
+ },
46
+ defaultVariants: {
47
+ side: "right",
48
+ },
49
+ }
50
+ )
51
+
52
+ interface SheetContentProps
53
+ extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
54
+ VariantProps<typeof sheetVariants> {}
55
+
56
+ const SheetContent = React.forwardRef<
57
+ React.ElementRef<typeof SheetPrimitive.Content>,
58
+ SheetContentProps
59
+ >(({ side = "right", className, children, ...props }, ref) => (
60
+ <SheetPortal>
61
+ <SheetOverlay />
62
+ <SheetPrimitive.Content
63
+ ref={ref}
64
+ className={cn(sheetVariants({ side }), className)}
65
+ {...props}
66
+ >
67
+ {children}
68
+ <SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
69
+ <X className="h-4 w-4" />
70
+ <span className="sr-only">Close</span>
71
+ </SheetPrimitive.Close>
72
+ </SheetPrimitive.Content>
73
+ </SheetPortal>
74
+ ))
75
+ SheetContent.displayName = SheetPrimitive.Content.displayName
76
+
77
+ const SheetHeader = ({
78
+ className,
79
+ ...props
80
+ }: React.HTMLAttributes<HTMLDivElement>) => (
81
+ <div
82
+ className={cn(
83
+ "flex flex-col space-y-2 text-center sm:text-left",
84
+ className
85
+ )}
86
+ {...props}
87
+ />
88
+ )
89
+ SheetHeader.displayName = "SheetHeader"
90
+
91
+ const SheetFooter = ({
92
+ className,
93
+ ...props
94
+ }: React.HTMLAttributes<HTMLDivElement>) => (
95
+ <div
96
+ className={cn(
97
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
98
+ className
99
+ )}
100
+ {...props}
101
+ />
102
+ )
103
+ SheetFooter.displayName = "SheetFooter"
104
+
105
+ const SheetTitle = React.forwardRef<
106
+ React.ElementRef<typeof SheetPrimitive.Title>,
107
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
108
+ >(({ className, ...props }, ref) => (
109
+ <SheetPrimitive.Title
110
+ ref={ref}
111
+ className={cn("text-lg font-semibold text-ibm-gray-100", className)}
112
+ {...props}
113
+ />
114
+ ))
115
+ SheetTitle.displayName = SheetPrimitive.Title.displayName
116
+
117
+ const SheetDescription = React.forwardRef<
118
+ React.ElementRef<typeof SheetPrimitive.Description>,
119
+ React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
120
+ >(({ className, ...props }, ref) => (
121
+ <SheetPrimitive.Description
122
+ ref={ref}
123
+ className={cn("text-sm text-muted-foreground", className)}
124
+ {...props}
125
+ />
126
+ ))
127
+ SheetDescription.displayName = SheetPrimitive.Description.displayName
128
+
129
+ export {
130
+ Sheet,
131
+ SheetPortal,
132
+ SheetOverlay,
133
+ SheetTrigger,
134
+ SheetClose,
135
+ SheetContent,
136
+ SheetHeader,
137
+ SheetFooter,
138
+ SheetTitle,
139
+ SheetDescription,
140
+ }
@@ -0,0 +1,15 @@
1
+ import { cn } from "../../lib/utils"
2
+
3
+ function Skeleton({
4
+ className,
5
+ ...props
6
+ }: React.HTMLAttributes<HTMLDivElement>) {
7
+ return (
8
+ <div
9
+ className={cn("animate-pulse rounded-md bg-muted", className)}
10
+ {...props}
11
+ />
12
+ )
13
+ }
14
+
15
+ export { Skeleton }
@@ -0,0 +1,28 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as SliderPrimitive from "@radix-ui/react-slider"
5
+
6
+ import { cn } from "../../lib/utils"
7
+
8
+ const Slider = React.forwardRef<
9
+ React.ElementRef<typeof SliderPrimitive.Root>,
10
+ React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>
11
+ >(({ className, ...props }, ref) => (
12
+ <SliderPrimitive.Root
13
+ ref={ref}
14
+ className={cn(
15
+ "relative flex w-full touch-none select-none items-center",
16
+ className
17
+ )}
18
+ {...props}
19
+ >
20
+ <SliderPrimitive.Track className="relative h-2 w-full grow overflow-hidden rounded-full bg-secondary">
21
+ <SliderPrimitive.Range className="absolute h-full bg-primary" />
22
+ </SliderPrimitive.Track>
23
+ <SliderPrimitive.Thumb className="block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" />
24
+ </SliderPrimitive.Root>
25
+ ))
26
+ Slider.displayName = SliderPrimitive.Root.displayName
27
+
28
+ export { Slider }
@@ -0,0 +1,31 @@
1
+ "use client"
2
+
3
+ import { useTheme } from "next-themes"
4
+ import { Toaster as Sonner } from "sonner"
5
+
6
+ type ToasterProps = React.ComponentProps<typeof Sonner>
7
+
8
+ const Toaster = ({ ...props }: ToasterProps) => {
9
+ const { theme = "system" } = useTheme()
10
+
11
+ return (
12
+ <Sonner
13
+ theme={theme as ToasterProps["theme"]}
14
+ className="toaster group"
15
+ toastOptions={{
16
+ classNames: {
17
+ toast:
18
+ "group toast group-[.toaster]:bg-white group-[.toaster]:text-ibm-gray-100 group-[.toaster]:border-gray-20 group-[.toaster]:shadow-lg",
19
+ description: "group-[.toast]:text-muted-foreground",
20
+ actionButton:
21
+ "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
22
+ cancelButton:
23
+ "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
24
+ },
25
+ }}
26
+ {...props}
27
+ />
28
+ )
29
+ }
30
+
31
+ export { Toaster }
@@ -0,0 +1,29 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as SwitchPrimitives from "@radix-ui/react-switch"
5
+
6
+ import { cn } from "../../lib/utils"
7
+
8
+ const Switch = React.forwardRef<
9
+ React.ElementRef<typeof SwitchPrimitives.Root>,
10
+ React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
11
+ >(({ className, ...props }, ref) => (
12
+ <SwitchPrimitives.Root
13
+ className={cn(
14
+ "peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
15
+ className
16
+ )}
17
+ {...props}
18
+ ref={ref}
19
+ >
20
+ <SwitchPrimitives.Thumb
21
+ className={cn(
22
+ "pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0"
23
+ )}
24
+ />
25
+ </SwitchPrimitives.Root>
26
+ ))
27
+ Switch.displayName = SwitchPrimitives.Root.displayName
28
+
29
+ export { Switch }
@@ -0,0 +1,117 @@
1
+ import * as React from "react"
2
+
3
+ import { cn } from "../../lib/utils"
4
+
5
+ const Table = React.forwardRef<
6
+ HTMLTableElement,
7
+ React.HTMLAttributes<HTMLTableElement>
8
+ >(({ className, ...props }, ref) => (
9
+ <div className="relative w-full overflow-auto">
10
+ <table
11
+ ref={ref}
12
+ className={cn("w-full caption-bottom text-sm", className)}
13
+ {...props}
14
+ />
15
+ </div>
16
+ ))
17
+ Table.displayName = "Table"
18
+
19
+ const TableHeader = React.forwardRef<
20
+ HTMLTableSectionElement,
21
+ React.HTMLAttributes<HTMLTableSectionElement>
22
+ >(({ className, ...props }, ref) => (
23
+ <thead ref={ref} className={cn("[&_tr]:border-b [&_tr]:border-ibm-gray-20", className)} {...props} />
24
+ ))
25
+ TableHeader.displayName = "TableHeader"
26
+
27
+ const TableBody = React.forwardRef<
28
+ HTMLTableSectionElement,
29
+ React.HTMLAttributes<HTMLTableSectionElement>
30
+ >(({ className, ...props }, ref) => (
31
+ <tbody
32
+ ref={ref}
33
+ className={cn("[&_tr:last-child]:border-0", className)}
34
+ {...props}
35
+ />
36
+ ))
37
+ TableBody.displayName = "TableBody"
38
+
39
+ const TableFooter = React.forwardRef<
40
+ HTMLTableSectionElement,
41
+ React.HTMLAttributes<HTMLTableSectionElement>
42
+ >(({ className, ...props }, ref) => (
43
+ <tfoot
44
+ ref={ref}
45
+ className={cn(
46
+ "border-t border-ibm-gray-20 bg-ibm-gray-10 font-medium [&>tr]:last:border-b-0",
47
+ className
48
+ )}
49
+ {...props}
50
+ />
51
+ ))
52
+ TableFooter.displayName = "TableFooter"
53
+
54
+ const TableRow = React.forwardRef<
55
+ HTMLTableRowElement,
56
+ React.HTMLAttributes<HTMLTableRowElement>
57
+ >(({ className, ...props }, ref) => (
58
+ <tr
59
+ ref={ref}
60
+ className={cn(
61
+ "border-b border-ibm-gray-20 transition-colors hover:bg-ibm-gray-10 data-[state=selected]:bg-gray-50",
62
+ className
63
+ )}
64
+ {...props}
65
+ />
66
+ ))
67
+ TableRow.displayName = "TableRow"
68
+
69
+ const TableHead = React.forwardRef<
70
+ HTMLTableCellElement,
71
+ React.ThHTMLAttributes<HTMLTableCellElement>
72
+ >(({ className, ...props }, ref) => (
73
+ <th
74
+ ref={ref}
75
+ className={cn(
76
+ "h-12 px-4 text-left align-middle font-medium text-ibm-gray-70 [&:has([role=checkbox])]:pr-0",
77
+ className
78
+ )}
79
+ {...props}
80
+ />
81
+ ))
82
+ TableHead.displayName = "TableHead"
83
+
84
+ const TableCell = React.forwardRef<
85
+ HTMLTableCellElement,
86
+ React.TdHTMLAttributes<HTMLTableCellElement>
87
+ >(({ className, ...props }, ref) => (
88
+ <td
89
+ ref={ref}
90
+ className={cn("p-4 align-middle text-ibm-gray-100 [&:has([role=checkbox])]:pr-0", className)}
91
+ {...props}
92
+ />
93
+ ))
94
+ TableCell.displayName = "TableCell"
95
+
96
+ const TableCaption = React.forwardRef<
97
+ HTMLTableCaptionElement,
98
+ React.HTMLAttributes<HTMLTableCaptionElement>
99
+ >(({ className, ...props }, ref) => (
100
+ <caption
101
+ ref={ref}
102
+ className={cn("mt-4 text-sm text-ibm-gray-70", className)}
103
+ {...props}
104
+ />
105
+ ))
106
+ TableCaption.displayName = "TableCaption"
107
+
108
+ export {
109
+ Table,
110
+ TableHeader,
111
+ TableBody,
112
+ TableFooter,
113
+ TableHead,
114
+ TableRow,
115
+ TableCell,
116
+ TableCaption,
117
+ }