tembro 4.2.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/components/patterns/index.d.ts +0 -8
- package/dist/components/patterns/public.d.ts +0 -8
- package/dist/components/ui/hover-card/index.cjs +1 -0
- package/dist/components/ui/hover-card/index.d.ts +11 -0
- package/dist/components/ui/hover-card/index.js +1 -0
- package/dist/components/ui/menubar/index.cjs +1 -0
- package/dist/components/ui/menubar/index.d.ts +42 -0
- package/dist/components/ui/menubar/index.js +1 -0
- package/dist/components/ui/navigation-menu/index.cjs +1 -0
- package/dist/components/ui/navigation-menu/index.d.ts +20 -0
- package/dist/components/ui/navigation-menu/index.js +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/src/components/patterns/index.cjs +1 -1
- package/dist/src/components/patterns/index.js +2 -10
- package/dist/src/components/patterns/public.cjs +1 -1
- package/dist/src/components/patterns/public.js +2 -10
- package/dist/src/components/ui/hover-card/index.cjs +1 -0
- package/dist/src/components/ui/hover-card/index.js +50 -0
- package/dist/src/components/ui/menubar/index.cjs +1 -0
- package/dist/src/components/ui/menubar/index.js +132 -0
- package/dist/src/components/ui/navigation-menu/index.cjs +1 -0
- package/dist/src/components/ui/navigation-menu/index.js +73 -0
- package/dist/src/components/ui/popover/index.cjs +1 -1
- package/dist/src/components/ui/popover/index.js +1 -1
- package/dist/src/index.cjs +1 -1
- package/dist/src/index.js +25 -29
- package/dist/src/public-component-surface.cjs +1 -1
- package/dist/src/public-component-surface.js +16 -42
- package/package.json +1 -1
- package/packages/cli/dist/index.cjs +100 -100
- package/packages/cli/vendor/src/components/patterns/index.ts +0 -8
- package/packages/cli/vendor/src/components/patterns/public.ts +0 -8
- package/packages/cli/vendor/src/components/ui/hover-card/index.tsx +72 -0
- package/packages/cli/vendor/src/components/ui/menubar/index.tsx +140 -0
- package/packages/cli/vendor/src/components/ui/navigation-menu/index.tsx +100 -0
- package/packages/cli/vendor/src/components/ui/popover/index.tsx +1 -1
- package/packages/cli/vendor/src/index.ts +6 -2
- package/packages/cli/vendor/src/public-component-surface.ts +4 -10
- package/packages/cli/vendor/templates/showcase/src/showcase/data/registry.ts +10 -10
- package/packages/cli/vendor/templates/showcase/src/showcase/layout/HeroSection.tsx +2 -2
- package/packages/cli/vendor/templates/showcase/src/showcase/layout/WorkbenchSidebar.tsx +1 -1
- package/registry.json +2124 -258
- package/dist/components/patterns/bulk-action-bar.cjs +0 -1
- package/dist/components/patterns/bulk-action-bar.d.ts +0 -10
- package/dist/components/patterns/bulk-action-bar.js +0 -1
- package/dist/components/patterns/data-view.cjs +0 -1
- package/dist/components/patterns/data-view.d.ts +0 -17
- package/dist/components/patterns/data-view.js +0 -1
- package/dist/components/patterns/detail-layout.cjs +0 -1
- package/dist/components/patterns/detail-layout.d.ts +0 -16
- package/dist/components/patterns/detail-layout.js +0 -1
- package/dist/components/patterns/form-builder.cjs +0 -1
- package/dist/components/patterns/form-builder.d.ts +0 -110
- package/dist/components/patterns/form-builder.js +0 -1
- package/dist/components/patterns/page-toolbar.cjs +0 -1
- package/dist/components/patterns/page-toolbar.d.ts +0 -11
- package/dist/components/patterns/page-toolbar.js +0 -1
- package/dist/components/patterns/resource-detail-page.cjs +0 -1
- package/dist/components/patterns/resource-detail-page.d.ts +0 -39
- package/dist/components/patterns/resource-detail-page.js +0 -1
- package/dist/components/patterns/resource-page.cjs +0 -1
- package/dist/components/patterns/resource-page.d.ts +0 -30
- package/dist/components/patterns/resource-page.js +0 -1
- package/dist/components/patterns/settings-page.cjs +0 -1
- package/dist/components/patterns/settings-page.d.ts +0 -21
- package/dist/components/patterns/settings-page.js +0 -1
- package/dist/src/components/patterns/bulk-action-bar.cjs +0 -1
- package/dist/src/components/patterns/bulk-action-bar.js +0 -34
- package/dist/src/components/patterns/data-view.cjs +0 -1
- package/dist/src/components/patterns/data-view.js +0 -47
- package/dist/src/components/patterns/detail-layout.cjs +0 -1
- package/dist/src/components/patterns/detail-layout.js +0 -65
- package/dist/src/components/patterns/form-builder.cjs +0 -1
- package/dist/src/components/patterns/form-builder.js +0 -263
- package/dist/src/components/patterns/page-toolbar.cjs +0 -1
- package/dist/src/components/patterns/page-toolbar.js +0 -41
- package/dist/src/components/patterns/resource-detail-page.cjs +0 -1
- package/dist/src/components/patterns/resource-detail-page.js +0 -100
- package/dist/src/components/patterns/resource-page.cjs +0 -1
- package/dist/src/components/patterns/resource-page.js +0 -88
- package/dist/src/components/patterns/settings-page.cjs +0 -1
- package/dist/src/components/patterns/settings-page.js +0 -64
- package/packages/cli/vendor/src/components/patterns/bulk-action-bar.tsx +0 -53
- package/packages/cli/vendor/src/components/patterns/data-view.tsx +0 -64
- package/packages/cli/vendor/src/components/patterns/detail-layout.tsx +0 -75
- package/packages/cli/vendor/src/components/patterns/form-builder.tsx +0 -472
- package/packages/cli/vendor/src/components/patterns/page-toolbar.tsx +0 -61
- package/packages/cli/vendor/src/components/patterns/resource-detail-page.tsx +0 -164
- package/packages/cli/vendor/src/components/patterns/resource-page.tsx +0 -149
- package/packages/cli/vendor/src/components/patterns/settings-page.tsx +0 -84
|
@@ -1,9 +1 @@
|
|
|
1
|
-
export * from './form-builder'
|
|
2
|
-
export * from './resource-page'
|
|
3
|
-
export * from './resource-detail-page'
|
|
4
1
|
export * from "./empty-state"
|
|
5
|
-
export * from "./page-toolbar"
|
|
6
|
-
export * from "./bulk-action-bar"
|
|
7
|
-
export * from "./detail-layout"
|
|
8
|
-
export * from "./settings-page"
|
|
9
|
-
export * from "./data-view"
|
|
@@ -1,9 +1 @@
|
|
|
1
|
-
export * from "./form-builder"
|
|
2
|
-
export * from "./resource-page"
|
|
3
|
-
export * from "./resource-detail-page"
|
|
4
1
|
export * from "./empty-state"
|
|
5
|
-
export * from "./page-toolbar"
|
|
6
|
-
export * from "./bulk-action-bar"
|
|
7
|
-
export * from "./detail-layout"
|
|
8
|
-
export * from "./settings-page"
|
|
9
|
-
export * from "./data-view"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { PreviewCard as PreviewCardPrimitive } from "@base-ui/react/preview-card"
|
|
5
|
+
|
|
6
|
+
import { cn } from "@/lib/utils"
|
|
7
|
+
|
|
8
|
+
export type HoverCardProps = PreviewCardPrimitive.Root.Props
|
|
9
|
+
export type HoverCardTriggerProps = PreviewCardPrimitive.Trigger.Props
|
|
10
|
+
export type HoverCardContentProps = PreviewCardPrimitive.Popup.Props &
|
|
11
|
+
Pick<
|
|
12
|
+
PreviewCardPrimitive.Positioner.Props,
|
|
13
|
+
"align" | "alignOffset" | "collisionBoundary" | "collisionPadding" | "side" | "sideOffset"
|
|
14
|
+
>
|
|
15
|
+
export type HoverCardArrowProps = PreviewCardPrimitive.Arrow.Props
|
|
16
|
+
|
|
17
|
+
function HoverCard({ ...props }: HoverCardProps) {
|
|
18
|
+
return <PreviewCardPrimitive.Root data-slot="hover-card" {...props} />
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function HoverCardTrigger({ ...props }: HoverCardTriggerProps) {
|
|
22
|
+
if (!("render" in props) && React.isValidElement(props.children)) {
|
|
23
|
+
const { children, ...rest } = props
|
|
24
|
+
return <PreviewCardPrimitive.Trigger data-slot="hover-card-trigger" render={children} {...rest} />
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return <PreviewCardPrimitive.Trigger data-slot="hover-card-trigger" {...props} />
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function HoverCardContent({
|
|
31
|
+
className,
|
|
32
|
+
align = "center",
|
|
33
|
+
alignOffset = 0,
|
|
34
|
+
collisionPadding = 12,
|
|
35
|
+
side = "bottom",
|
|
36
|
+
sideOffset = 8,
|
|
37
|
+
...props
|
|
38
|
+
}: HoverCardContentProps) {
|
|
39
|
+
return (
|
|
40
|
+
<PreviewCardPrimitive.Portal>
|
|
41
|
+
<PreviewCardPrimitive.Positioner
|
|
42
|
+
align={align}
|
|
43
|
+
alignOffset={alignOffset}
|
|
44
|
+
collisionPadding={collisionPadding}
|
|
45
|
+
side={side}
|
|
46
|
+
sideOffset={sideOffset}
|
|
47
|
+
className="isolate z-50 outline-none"
|
|
48
|
+
>
|
|
49
|
+
<PreviewCardPrimitive.Popup
|
|
50
|
+
data-slot="hover-card-content"
|
|
51
|
+
className={cn(
|
|
52
|
+
"z-50 grid max-h-[min(var(--available-height),calc(100dvh-1rem))] w-80 max-w-[calc(100vw-1rem)] origin-(--transform-origin) gap-3 overflow-y-auto rounded-[var(--radius-lg)] border border-border bg-popover p-4 text-popover-foreground shadow-lg outline-none duration-100 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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
53
|
+
className
|
|
54
|
+
)}
|
|
55
|
+
{...props}
|
|
56
|
+
/>
|
|
57
|
+
</PreviewCardPrimitive.Positioner>
|
|
58
|
+
</PreviewCardPrimitive.Portal>
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function HoverCardArrow({ className, ...props }: HoverCardArrowProps) {
|
|
63
|
+
return (
|
|
64
|
+
<PreviewCardPrimitive.Arrow
|
|
65
|
+
data-slot="hover-card-arrow"
|
|
66
|
+
className={cn("z-50 flex size-3 rotate-45 border border-border bg-popover", className)}
|
|
67
|
+
{...props}
|
|
68
|
+
/>
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { HoverCard, HoverCardArrow, HoverCardContent, HoverCardTrigger }
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Menubar as MenubarPrimitive } from "@base-ui/react/menubar"
|
|
5
|
+
import { Menu as MenuPrimitive } from "@base-ui/react/menu"
|
|
6
|
+
import { CheckIcon, ChevronRightIcon } from "lucide-react"
|
|
7
|
+
|
|
8
|
+
import { cn } from "@/lib/utils"
|
|
9
|
+
|
|
10
|
+
export type MenubarProps = MenubarPrimitive.Props
|
|
11
|
+
export type MenubarMenuProps = MenuPrimitive.Root.Props
|
|
12
|
+
export type MenubarTriggerProps = MenuPrimitive.Trigger.Props
|
|
13
|
+
export type MenubarContentProps = MenuPrimitive.Popup.Props &
|
|
14
|
+
Pick<MenuPrimitive.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset">
|
|
15
|
+
export type MenubarItemProps = MenuPrimitive.Item.Props & { inset?: boolean; variant?: "default" | "destructive" }
|
|
16
|
+
export type MenubarCheckboxItemProps = MenuPrimitive.CheckboxItem.Props & { inset?: boolean }
|
|
17
|
+
export type MenubarRadioGroupProps = MenuPrimitive.RadioGroup.Props
|
|
18
|
+
export type MenubarRadioItemProps = MenuPrimitive.RadioItem.Props & { inset?: boolean }
|
|
19
|
+
export type MenubarSubProps = MenuPrimitive.SubmenuRoot.Props
|
|
20
|
+
export type MenubarSubTriggerProps = MenuPrimitive.SubmenuTrigger.Props & { inset?: boolean }
|
|
21
|
+
export type MenubarSeparatorProps = MenuPrimitive.Separator.Props
|
|
22
|
+
export type MenubarLabelProps = React.ComponentProps<"div"> & { inset?: boolean }
|
|
23
|
+
export type MenubarShortcutProps = React.ComponentProps<"span">
|
|
24
|
+
|
|
25
|
+
const itemClassName =
|
|
26
|
+
"relative flex min-h-8 cursor-default select-none items-center gap-2 rounded-[var(--radius-md)] px-2.5 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground data-[highlighted]:bg-accent data-[highlighted]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset=true]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus-visible:bg-destructive/10 data-[variant=destructive]:hover:bg-destructive/10"
|
|
27
|
+
|
|
28
|
+
function Menubar({ className, ...props }: MenubarProps) {
|
|
29
|
+
return (
|
|
30
|
+
<MenubarPrimitive
|
|
31
|
+
data-slot="menubar"
|
|
32
|
+
className={cn("flex h-10 items-center gap-1 rounded-[var(--radius-lg)] border border-border bg-card p-1 text-card-foreground shadow-sm", className)}
|
|
33
|
+
{...props}
|
|
34
|
+
/>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function MenubarMenu({ ...props }: MenubarMenuProps) {
|
|
39
|
+
return <MenuPrimitive.Root data-slot="menubar-menu" {...props} />
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function MenubarTrigger({ className, ...props }: MenubarTriggerProps) {
|
|
43
|
+
return (
|
|
44
|
+
<MenuPrimitive.Trigger
|
|
45
|
+
data-slot="menubar-trigger"
|
|
46
|
+
className={cn("inline-flex h-8 items-center justify-center rounded-[var(--radius-md)] px-3 text-sm font-medium outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground data-[popup-open]:bg-accent data-[popup-open]:text-accent-foreground disabled:pointer-events-none disabled:opacity-50", className)}
|
|
47
|
+
{...props}
|
|
48
|
+
/>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function MenubarContent({ className, align = "start", alignOffset = 0, side = "bottom", sideOffset = 6, ...props }: MenubarContentProps) {
|
|
53
|
+
return (
|
|
54
|
+
<MenuPrimitive.Portal>
|
|
55
|
+
<MenuPrimitive.Positioner align={align} alignOffset={alignOffset} side={side} sideOffset={sideOffset} className="isolate z-50 outline-none">
|
|
56
|
+
<MenuPrimitive.Popup
|
|
57
|
+
data-slot="menubar-content"
|
|
58
|
+
className={cn("z-50 min-w-48 origin-(--transform-origin) overflow-hidden rounded-[var(--radius-lg)] border border-border bg-popover p-1 text-popover-foreground shadow-lg outline-none duration-100 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className)}
|
|
59
|
+
{...props}
|
|
60
|
+
/>
|
|
61
|
+
</MenuPrimitive.Positioner>
|
|
62
|
+
</MenuPrimitive.Portal>
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function MenubarItem({ className, inset, variant = "default", ...props }: MenubarItemProps) {
|
|
67
|
+
return <MenuPrimitive.Item data-slot="menubar-item" data-inset={inset || undefined} data-variant={variant} className={cn(itemClassName, className)} {...props} />
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function MenubarCheckboxItem({ className, children, checked, inset, ...props }: MenubarCheckboxItemProps) {
|
|
71
|
+
return (
|
|
72
|
+
<MenuPrimitive.CheckboxItem data-slot="menubar-checkbox-item" data-inset={inset || undefined} className={cn(itemClassName, "pl-8", className)} checked={checked} {...props}>
|
|
73
|
+
<span className="absolute left-2 inline-flex size-4 items-center justify-center">
|
|
74
|
+
<MenuPrimitive.CheckboxItemIndicator><CheckIcon className="size-4" /></MenuPrimitive.CheckboxItemIndicator>
|
|
75
|
+
</span>
|
|
76
|
+
{children}
|
|
77
|
+
</MenuPrimitive.CheckboxItem>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function MenubarRadioGroup({ ...props }: MenubarRadioGroupProps) {
|
|
82
|
+
return <MenuPrimitive.RadioGroup data-slot="menubar-radio-group" {...props} />
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function MenubarRadioItem({ className, children, inset, ...props }: MenubarRadioItemProps) {
|
|
86
|
+
return (
|
|
87
|
+
<MenuPrimitive.RadioItem data-slot="menubar-radio-item" data-inset={inset || undefined} className={cn(itemClassName, "pl-8", className)} {...props}>
|
|
88
|
+
<span className="absolute left-2 inline-flex size-4 items-center justify-center">
|
|
89
|
+
<MenuPrimitive.RadioItemIndicator><CheckIcon className="size-4" /></MenuPrimitive.RadioItemIndicator>
|
|
90
|
+
</span>
|
|
91
|
+
{children}
|
|
92
|
+
</MenuPrimitive.RadioItem>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function MenubarSub({ ...props }: MenubarSubProps) {
|
|
97
|
+
return <MenuPrimitive.SubmenuRoot data-slot="menubar-sub" {...props} />
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function MenubarSubTrigger({ className, children, inset, ...props }: MenubarSubTriggerProps) {
|
|
101
|
+
return (
|
|
102
|
+
<MenuPrimitive.SubmenuTrigger data-slot="menubar-sub-trigger" data-inset={inset || undefined} className={cn(itemClassName, className)} {...props}>
|
|
103
|
+
{children}
|
|
104
|
+
<ChevronRightIcon className="ml-auto size-4" />
|
|
105
|
+
</MenuPrimitive.SubmenuTrigger>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function MenubarSubContent(props: MenubarContentProps) {
|
|
110
|
+
return <MenubarContent data-slot="menubar-sub-content" side="right" align="start" alignOffset={-4} sideOffset={0} {...props} />
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function MenubarSeparator({ className, ...props }: MenubarSeparatorProps) {
|
|
114
|
+
return <MenuPrimitive.Separator data-slot="menubar-separator" className={cn("-mx-1 my-1 h-px bg-border", className)} {...props} />
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function MenubarLabel({ className, inset, ...props }: MenubarLabelProps) {
|
|
118
|
+
return <div data-slot="menubar-label" data-inset={inset || undefined} className={cn("px-2.5 py-1.5 text-xs font-semibold text-muted-foreground data-[inset=true]:pl-8", className)} {...props} />
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function MenubarShortcut({ className, ...props }: MenubarShortcutProps) {
|
|
122
|
+
return <span data-slot="menubar-shortcut" className={cn("ml-auto text-xs tracking-widest text-muted-foreground", className)} {...props} />
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export {
|
|
126
|
+
Menubar,
|
|
127
|
+
MenubarCheckboxItem,
|
|
128
|
+
MenubarContent,
|
|
129
|
+
MenubarItem,
|
|
130
|
+
MenubarLabel,
|
|
131
|
+
MenubarMenu,
|
|
132
|
+
MenubarRadioGroup,
|
|
133
|
+
MenubarRadioItem,
|
|
134
|
+
MenubarSeparator,
|
|
135
|
+
MenubarShortcut,
|
|
136
|
+
MenubarSub,
|
|
137
|
+
MenubarSubContent,
|
|
138
|
+
MenubarSubTrigger,
|
|
139
|
+
MenubarTrigger,
|
|
140
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/navigation-menu"
|
|
4
|
+
import { ChevronDownIcon } from "lucide-react"
|
|
5
|
+
|
|
6
|
+
import { cn } from "@/lib/utils"
|
|
7
|
+
|
|
8
|
+
export type NavigationMenuProps = NavigationMenuPrimitive.Root.Props
|
|
9
|
+
export type NavigationMenuListProps = NavigationMenuPrimitive.List.Props
|
|
10
|
+
export type NavigationMenuItemProps = NavigationMenuPrimitive.Item.Props
|
|
11
|
+
export type NavigationMenuTriggerProps = NavigationMenuPrimitive.Trigger.Props
|
|
12
|
+
export type NavigationMenuContentProps = NavigationMenuPrimitive.Content.Props
|
|
13
|
+
export type NavigationMenuLinkProps = NavigationMenuPrimitive.Link.Props
|
|
14
|
+
export type NavigationMenuViewportProps = NavigationMenuPrimitive.Viewport.Props
|
|
15
|
+
export type NavigationMenuPositionerProps = NavigationMenuPrimitive.Positioner.Props
|
|
16
|
+
export type NavigationMenuArrowProps = NavigationMenuPrimitive.Arrow.Props
|
|
17
|
+
|
|
18
|
+
function NavigationMenu({ className, ...props }: NavigationMenuProps) {
|
|
19
|
+
return <NavigationMenuPrimitive.Root data-slot="navigation-menu" className={cn("relative z-10 flex max-w-max flex-1 items-center justify-center", className)} {...props} />
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function NavigationMenuList({ className, ...props }: NavigationMenuListProps) {
|
|
23
|
+
return <NavigationMenuPrimitive.List data-slot="navigation-menu-list" className={cn("flex flex-1 list-none items-center justify-center gap-1", className)} {...props} />
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function NavigationMenuItem({ className, ...props }: NavigationMenuItemProps) {
|
|
27
|
+
return <NavigationMenuPrimitive.Item data-slot="navigation-menu-item" className={cn("relative", className)} {...props} />
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function NavigationMenuTrigger({ className, children, ...props }: NavigationMenuTriggerProps) {
|
|
31
|
+
return (
|
|
32
|
+
<NavigationMenuPrimitive.Trigger
|
|
33
|
+
data-slot="navigation-menu-trigger"
|
|
34
|
+
className={cn("group inline-flex h-10 items-center justify-center gap-1 rounded-[var(--radius-md)] px-4 py-2 text-sm font-medium outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground data-[popup-open]:bg-accent data-[popup-open]:text-accent-foreground disabled:pointer-events-none disabled:opacity-50", className)}
|
|
35
|
+
{...props}
|
|
36
|
+
>
|
|
37
|
+
{children}
|
|
38
|
+
<ChevronDownIcon className="size-4 shrink-0 transition-transform duration-200 group-data-[popup-open]:rotate-180" />
|
|
39
|
+
</NavigationMenuPrimitive.Trigger>
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function NavigationMenuContent({ className, ...props }: NavigationMenuContentProps) {
|
|
44
|
+
return (
|
|
45
|
+
<NavigationMenuPrimitive.Content
|
|
46
|
+
data-slot="navigation-menu-content"
|
|
47
|
+
className={cn("left-0 top-0 w-full p-4 md:absolute md:w-auto", className)}
|
|
48
|
+
{...props}
|
|
49
|
+
/>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function NavigationMenuLink({ className, ...props }: NavigationMenuLinkProps) {
|
|
54
|
+
return (
|
|
55
|
+
<NavigationMenuPrimitive.Link
|
|
56
|
+
data-slot="navigation-menu-link"
|
|
57
|
+
className={cn("block select-none rounded-[var(--radius-md)] p-3 text-sm leading-none no-underline outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground data-[active]:bg-accent data-[active]:text-accent-foreground", className)}
|
|
58
|
+
{...props}
|
|
59
|
+
/>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function NavigationMenuPositioner({ className, sideOffset = 8, ...props }: NavigationMenuPositionerProps) {
|
|
64
|
+
return (
|
|
65
|
+
<NavigationMenuPrimitive.Portal>
|
|
66
|
+
<NavigationMenuPrimitive.Positioner
|
|
67
|
+
data-slot="navigation-menu-positioner"
|
|
68
|
+
sideOffset={sideOffset}
|
|
69
|
+
className={cn("isolate z-50 flex justify-center", className)}
|
|
70
|
+
{...props}
|
|
71
|
+
/>
|
|
72
|
+
</NavigationMenuPrimitive.Portal>
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function NavigationMenuViewport({ className, ...props }: NavigationMenuViewportProps) {
|
|
77
|
+
return (
|
|
78
|
+
<NavigationMenuPrimitive.Viewport
|
|
79
|
+
data-slot="navigation-menu-viewport"
|
|
80
|
+
className={cn("relative h-(--height) w-full min-w-80 origin-(--transform-origin) overflow-hidden rounded-[var(--radius-lg)] border border-border bg-popover text-popover-foreground shadow-lg duration-100 md:w-(--width) data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className)}
|
|
81
|
+
{...props}
|
|
82
|
+
/>
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function NavigationMenuArrow({ className, ...props }: NavigationMenuArrowProps) {
|
|
87
|
+
return <NavigationMenuPrimitive.Arrow data-slot="navigation-menu-arrow" className={cn("z-50 flex size-3 rotate-45 border border-border bg-popover", className)} {...props} />
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export {
|
|
91
|
+
NavigationMenu,
|
|
92
|
+
NavigationMenuArrow,
|
|
93
|
+
NavigationMenuContent,
|
|
94
|
+
NavigationMenuItem,
|
|
95
|
+
NavigationMenuLink,
|
|
96
|
+
NavigationMenuList,
|
|
97
|
+
NavigationMenuPositioner,
|
|
98
|
+
NavigationMenuTrigger,
|
|
99
|
+
NavigationMenuViewport,
|
|
100
|
+
}
|
|
@@ -46,7 +46,7 @@ function PopoverContent({
|
|
|
46
46
|
<PopoverPrimitive.Popup
|
|
47
47
|
data-slot="popover-content"
|
|
48
48
|
className={cn(
|
|
49
|
-
"z-50 flex max-h-[min(var(--available-height),calc(100dvh-1rem))] w-[min(var(--anchor-width),20rem)] min-w-60 max-w-[calc(100vw-1rem)] origin-(--transform-origin) flex-col gap-3 overflow-y-auto outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
49
|
+
"z-50 flex max-h-[min(var(--available-height),calc(100dvh-1rem))] w-[min(var(--anchor-width),20rem)] min-w-60 max-w-[calc(100vw-1rem)] origin-(--transform-origin) flex-col gap-3 overflow-y-auto rounded-[var(--radius-lg)] border border-border bg-popover text-popover-foreground shadow-lg outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
50
50
|
className
|
|
51
51
|
)}
|
|
52
52
|
{...props}
|
|
@@ -9,12 +9,16 @@ export * from './components/ui/badge'
|
|
|
9
9
|
export * from './components/ui/tabs'
|
|
10
10
|
export * from './components/ui/dialog'
|
|
11
11
|
export * from './components/ui/dropdown-menu'
|
|
12
|
-
export * from './components/ui/popover'
|
|
12
|
+
export * from './components/ui/popover'
|
|
13
|
+
export * from './components/ui/hover-card'
|
|
14
|
+
export * from './components/ui/menubar'
|
|
15
|
+
export * from './components/ui/navigation-menu'
|
|
13
16
|
export * from './components/ui/select'
|
|
14
17
|
export * from './components/ui/table'
|
|
15
18
|
export * from './components/ui/accordion'
|
|
16
19
|
export * from './components/ui/collapse'
|
|
17
|
-
export * from './components/ui/
|
|
20
|
+
export * from './components/ui/command'
|
|
21
|
+
export * from './components/ui/skeleton'
|
|
18
22
|
export * from './components/ui/divider'
|
|
19
23
|
export * from './components/ui/segmented-control'
|
|
20
24
|
export * from './components/ui/spinner'
|
|
@@ -19,6 +19,9 @@ export const documentedPublicComponentSurfaces: readonly PublicComponentSurfaceE
|
|
|
19
19
|
{ slug: "overlay", registryName: "dialog", surface: "documented" },
|
|
20
20
|
{ slug: "dropdown-menu", registryName: "dropdown-menu", surface: "documented" },
|
|
21
21
|
{ slug: "popover", registryName: "popover", surface: "documented" },
|
|
22
|
+
{ slug: "hover-card", registryName: "hover-card", surface: "documented" },
|
|
23
|
+
{ slug: "menubar", registryName: "menubar", surface: "documented" },
|
|
24
|
+
{ slug: "navigation-menu", registryName: "navigation-menu", surface: "documented" },
|
|
22
25
|
{ slug: "tooltip", registryName: "tooltip", surface: "documented" },
|
|
23
26
|
{ slug: "data-table", registryName: "data-table", surface: "documented" },
|
|
24
27
|
{ slug: "pagination", registryName: "pagination", surface: "documented" },
|
|
@@ -71,16 +74,7 @@ export const documentedPublicComponentSurfaces: readonly PublicComponentSurfaceE
|
|
|
71
74
|
{ slug: "image-cropper", registryName: "image-cropper", surface: "documented" },
|
|
72
75
|
] as const
|
|
73
76
|
|
|
74
|
-
export const standalonePublicComponentSurfaces: readonly PublicComponentSurfaceEntry[] = [
|
|
75
|
-
{ slug: "form-builder", registryName: "form-builder", surface: "standalone" },
|
|
76
|
-
{ slug: "page-toolbar", registryName: "page-toolbar", surface: "standalone" },
|
|
77
|
-
{ slug: "bulk-action-bar", registryName: "bulk-action-bar", surface: "standalone" },
|
|
78
|
-
{ slug: "detail-layout", registryName: "detail-layout", surface: "standalone" },
|
|
79
|
-
{ slug: "settings-page", registryName: "settings-page", surface: "standalone" },
|
|
80
|
-
{ slug: "data-view", registryName: "data-view", surface: "standalone" },
|
|
81
|
-
{ slug: "resource-page", registryName: "resource-page", surface: "standalone" },
|
|
82
|
-
{ slug: "resource-detail-page", registryName: "resource-detail-page", surface: "standalone" },
|
|
83
|
-
] as const
|
|
77
|
+
export const standalonePublicComponentSurfaces: readonly PublicComponentSurfaceEntry[] = [] as const
|
|
84
78
|
|
|
85
79
|
export const publicComponentSurfaceEntries = [
|
|
86
80
|
...documentedPublicComponentSurfaces,
|
|
@@ -42,6 +42,8 @@ export const registryGroups: RegistryGroup[] = [
|
|
|
42
42
|
component("dropdown-menu", "stable", "src/components/ui/dropdown-menu"),
|
|
43
43
|
component("popover", "stable", "src/components/ui/popover"),
|
|
44
44
|
component("tooltip", "preview", "src/components/ui/tooltip"),
|
|
45
|
+
component("hover-card", "stable", "src/components/ui/hover-card"),
|
|
46
|
+
component("menubar", "preview", "src/components/ui/menubar"),
|
|
45
47
|
component("select", "stable", "src/components/ui/select"),
|
|
46
48
|
component("table", "stable", "src/components/ui/table"),
|
|
47
49
|
component("segmented-control", "preview", "src/components/ui/segmented-control"),
|
|
@@ -153,15 +155,7 @@ export const registryGroups: RegistryGroup[] = [
|
|
|
153
155
|
{
|
|
154
156
|
name: "patterns",
|
|
155
157
|
components: [
|
|
156
|
-
component("bulk-action-bar", "preview", "src/components/patterns/bulk-action-bar.tsx"),
|
|
157
|
-
component("data-view", "preview", "src/components/patterns/data-view.tsx"),
|
|
158
|
-
component("detail-layout", "preview", "src/components/patterns/detail-layout.tsx"),
|
|
159
158
|
component("empty-state", "preview", "src/components/patterns/empty-state.tsx"),
|
|
160
|
-
component("form-builder", "preview", "src/components/patterns/form-builder.tsx"),
|
|
161
|
-
component("resource-detail-page", "preview", "src/components/patterns/resource-detail-page.tsx"),
|
|
162
|
-
component("resource-page", "preview", "src/components/patterns/resource-page.tsx"),
|
|
163
|
-
component("page-toolbar", "preview", "src/components/patterns/page-toolbar.tsx"),
|
|
164
|
-
component("settings-page", "preview", "src/components/patterns/settings-page.tsx"),
|
|
165
159
|
],
|
|
166
160
|
},
|
|
167
161
|
{
|
|
@@ -188,7 +182,13 @@ export const registryGroups: RegistryGroup[] = [
|
|
|
188
182
|
component("saved-filter-select", "preview", "src/components/filters/saved-filter-select.tsx"),
|
|
189
183
|
],
|
|
190
184
|
},
|
|
191
|
-
{
|
|
185
|
+
{
|
|
186
|
+
name: "navigation",
|
|
187
|
+
components: [
|
|
188
|
+
component("navigation-menu", "preview", "src/components/ui/navigation-menu"),
|
|
189
|
+
component("pagination", "stable", "src/components/navigation/pagination.tsx"),
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
192
|
{ name: "charts", components: [component("progress-circle", "stable", "src/components/charts/progress-circle.tsx")] },
|
|
193
193
|
{
|
|
194
194
|
name: "wizard",
|
|
@@ -221,7 +221,7 @@ export const componentRows: ComponentRow[] = [
|
|
|
221
221
|
|
|
222
222
|
export const wizardSteps = [
|
|
223
223
|
{ id: "setup", title: "Setup", description: "init + theme", completed: true },
|
|
224
|
-
{ id: "add", title: "Add", description: "
|
|
224
|
+
{ id: "add", title: "Add", description: "registry components", completed: true },
|
|
225
225
|
{ id: "test", title: "Test", description: "visible workbench" },
|
|
226
226
|
]
|
|
227
227
|
|
|
@@ -25,7 +25,7 @@ export function HeroSection() {
|
|
|
25
25
|
<div className="flex flex-wrap gap-2">
|
|
26
26
|
<Button leftIcon={<PlusIcon className="size-4" />}>Create</Button>
|
|
27
27
|
<Button variant="outline" leftIcon={<SettingsIcon className="size-4" />}>Settings</Button>
|
|
28
|
-
<CopyButton value="npx tembro@
|
|
28
|
+
<CopyButton value="npx tembro@5.0.0 list --json">Copy list command</CopyButton>
|
|
29
29
|
</div>
|
|
30
30
|
</div>
|
|
31
31
|
|
|
@@ -33,7 +33,7 @@ export function HeroSection() {
|
|
|
33
33
|
<StatisticCard label="Registry components" value={moduleCount} change="visible below" trend="up" description="tembro add <name>" />
|
|
34
34
|
<StatisticCard label="Local source files" value="152" change="with hooks/lib" trend="up" description="installed by CLI" />
|
|
35
35
|
<StatisticCard label="Categories" value={registryGroups.length} change="all shown" trend="up" description="actions to wizard" />
|
|
36
|
-
<StatisticCard label="Build" value="Pass" change="doctor pass" trend="up" description="tembro@
|
|
36
|
+
<StatisticCard label="Build" value="Pass" change="doctor pass" trend="up" description="tembro@5.0.0" />
|
|
37
37
|
</StatisticGrid>
|
|
38
38
|
</div>
|
|
39
39
|
</section>
|