@inui/design-system 0.0.0-stage → 1.22.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/README.md +360 -2
- package/dist/components/ui/accordion.d.ts +44 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/accordion.js +86 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/ai-avatar.d.ts +46 -0
- package/dist/components/ui/ai-avatar.d.ts.map +1 -0
- package/dist/components/ui/ai-avatar.js +43 -0
- package/dist/components/ui/ai-avatar.js.map +1 -0
- package/dist/components/ui/ai-label.d.ts +118 -0
- package/dist/components/ui/ai-label.d.ts.map +1 -0
- package/dist/components/ui/ai-label.js +184 -0
- package/dist/components/ui/ai-label.js.map +1 -0
- package/dist/components/ui/ai-sparkle.d.ts +91 -0
- package/dist/components/ui/ai-sparkle.d.ts.map +1 -0
- package/dist/components/ui/ai-sparkle.js +200 -0
- package/dist/components/ui/ai-sparkle.js.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +79 -0
- package/dist/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog.js +147 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/alert.d.ts +71 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/alert.js +108 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/aspect-ratio.d.ts +30 -0
- package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
- package/dist/components/ui/aspect-ratio.js +40 -0
- package/dist/components/ui/aspect-ratio.js.map +1 -0
- package/dist/components/ui/attachment.d.ts +74 -0
- package/dist/components/ui/attachment.d.ts.map +1 -0
- package/dist/components/ui/attachment.js +142 -0
- package/dist/components/ui/attachment.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +82 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +123 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +130 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +226 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +43 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.js +98 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/browser-tabs.d.ts +218 -0
- package/dist/components/ui/browser-tabs.d.ts.map +1 -0
- package/dist/components/ui/browser-tabs.js +528 -0
- package/dist/components/ui/browser-tabs.js.map +1 -0
- package/dist/components/ui/bubble.d.ts +80 -0
- package/dist/components/ui/bubble.d.ts.map +1 -0
- package/dist/components/ui/bubble.js +235 -0
- package/dist/components/ui/bubble.js.map +1 -0
- package/dist/components/ui/button-group.d.ts +60 -0
- package/dist/components/ui/button-group.d.ts.map +1 -0
- package/dist/components/ui/button-group.js +89 -0
- package/dist/components/ui/button-group.js.map +1 -0
- package/dist/components/ui/button.d.ts +157 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +144 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.d.ts +57 -0
- package/dist/components/ui/calendar.d.ts.map +1 -0
- package/dist/components/ui/calendar.js +163 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.d.ts +96 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +131 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/carousel.d.ts +86 -0
- package/dist/components/ui/carousel.d.ts.map +1 -0
- package/dist/components/ui/carousel.js +207 -0
- package/dist/components/ui/carousel.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +54 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +78 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +45 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +65 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/combobox.d.ts +111 -0
- package/dist/components/ui/combobox.d.ts.map +1 -0
- package/dist/components/ui/combobox.js +264 -0
- package/dist/components/ui/combobox.js.map +1 -0
- package/dist/components/ui/command.d.ts +71 -0
- package/dist/components/ui/command.d.ts.map +1 -0
- package/dist/components/ui/command.js +133 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +70 -0
- package/dist/components/ui/context-menu.d.ts.map +1 -0
- package/dist/components/ui/context-menu.js +163 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/count-badge.d.ts +40 -0
- package/dist/components/ui/count-badge.d.ts.map +1 -0
- package/dist/components/ui/count-badge.js +43 -0
- package/dist/components/ui/count-badge.js.map +1 -0
- package/dist/components/ui/data-table.d.ts +1026 -0
- package/dist/components/ui/data-table.d.ts.map +1 -0
- package/dist/components/ui/data-table.js +3423 -0
- package/dist/components/ui/data-table.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +73 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +145 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/direction.d.ts +35 -0
- package/dist/components/ui/direction.d.ts.map +1 -0
- package/dist/components/ui/direction.js +35 -0
- package/dist/components/ui/direction.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +53 -0
- package/dist/components/ui/drawer.d.ts.map +1 -0
- package/dist/components/ui/drawer.js +115 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +75 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +173 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/dropzone.d.ts +141 -0
- package/dist/components/ui/dropzone.d.ts.map +1 -0
- package/dist/components/ui/dropzone.js +257 -0
- package/dist/components/ui/dropzone.js.map +1 -0
- package/dist/components/ui/empty.d.ts +94 -0
- package/dist/components/ui/empty.d.ts.map +1 -0
- package/dist/components/ui/empty.js +149 -0
- package/dist/components/ui/empty.js.map +1 -0
- package/dist/components/ui/field.d.ts +122 -0
- package/dist/components/ui/field.d.ts.map +1 -0
- package/dist/components/ui/field.js +254 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/hover-card.d.ts +51 -0
- package/dist/components/ui/hover-card.d.ts.map +1 -0
- package/dist/components/ui/hover-card.js +101 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.d.ts +62 -0
- package/dist/components/ui/input-group.d.ts.map +1 -0
- package/dist/components/ui/input-group.js +115 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-otp.d.ts +52 -0
- package/dist/components/ui/input-otp.d.ts.map +1 -0
- package/dist/components/ui/input-otp.js +89 -0
- package/dist/components/ui/input-otp.js.map +1 -0
- package/dist/components/ui/input.d.ts +47 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +47 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/item.d.ts +74 -0
- package/dist/components/ui/item.d.ts.map +1 -0
- package/dist/components/ui/item.js +176 -0
- package/dist/components/ui/item.js.map +1 -0
- package/dist/components/ui/kbd.d.ts +41 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +58 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/key-value-pair.d.ts +56 -0
- package/dist/components/ui/key-value-pair.d.ts.map +1 -0
- package/dist/components/ui/key-value-pair.js +110 -0
- package/dist/components/ui/key-value-pair.js.map +1 -0
- package/dist/components/ui/label.d.ts +83 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/label.js +85 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/marker.d.ts +54 -0
- package/dist/components/ui/marker.d.ts.map +1 -0
- package/dist/components/ui/marker.js +79 -0
- package/dist/components/ui/marker.js.map +1 -0
- package/dist/components/ui/menubar.d.ts +72 -0
- package/dist/components/ui/menubar.d.ts.map +1 -0
- package/dist/components/ui/menubar.js +174 -0
- package/dist/components/ui/menubar.js.map +1 -0
- package/dist/components/ui/message-scroller.d.ts +53 -0
- package/dist/components/ui/message-scroller.d.ts.map +1 -0
- package/dist/components/ui/message-scroller.js +95 -0
- package/dist/components/ui/message-scroller.js.map +1 -0
- package/dist/components/ui/message.d.ts +63 -0
- package/dist/components/ui/message.d.ts.map +1 -0
- package/dist/components/ui/message.js +92 -0
- package/dist/components/ui/message.js.map +1 -0
- package/dist/components/ui/meta-list.d.ts +55 -0
- package/dist/components/ui/meta-list.d.ts.map +1 -0
- package/dist/components/ui/meta-list.js +75 -0
- package/dist/components/ui/meta-list.js.map +1 -0
- package/dist/components/ui/native-select.d.ts +51 -0
- package/dist/components/ui/native-select.d.ts.map +1 -0
- package/dist/components/ui/native-select.js +75 -0
- package/dist/components/ui/native-select.js.map +1 -0
- package/dist/components/ui/navigation-menu.d.ts +56 -0
- package/dist/components/ui/navigation-menu.d.ts.map +1 -0
- package/dist/components/ui/navigation-menu.js +116 -0
- package/dist/components/ui/navigation-menu.js.map +1 -0
- package/dist/components/ui/page-header.d.ts +223 -0
- package/dist/components/ui/page-header.d.ts.map +1 -0
- package/dist/components/ui/page-header.js +233 -0
- package/dist/components/ui/page-header.js.map +1 -0
- package/dist/components/ui/pagination.d.ts +68 -0
- package/dist/components/ui/pagination.d.ts.map +1 -0
- package/dist/components/ui/pagination.js +145 -0
- package/dist/components/ui/pagination.js.map +1 -0
- package/dist/components/ui/popover.d.ts +61 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +144 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/progress.d.ts +35 -0
- package/dist/components/ui/progress.d.ts.map +1 -0
- package/dist/components/ui/progress.js +46 -0
- package/dist/components/ui/progress.js.map +1 -0
- package/dist/components/ui/questionnaire.d.ts +92 -0
- package/dist/components/ui/questionnaire.d.ts.map +1 -0
- package/dist/components/ui/questionnaire.js +277 -0
- package/dist/components/ui/questionnaire.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +50 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -0
- package/dist/components/ui/radio-group.js +65 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.d.ts +44 -0
- package/dist/components/ui/resizable.d.ts.map +1 -0
- package/dist/components/ui/resizable.js +73 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +55 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.js +72 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.d.ts +274 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +609 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.d.ts +31 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +38 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +59 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sheet.js +128 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sidebar.d.ts +166 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sidebar.js +512 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +35 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +46 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.d.ts +39 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/slider.js +75 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.d.ts +56 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/sonner.js +96 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/spinner.d.ts +37 -0
- package/dist/components/ui/spinner.d.ts.map +1 -0
- package/dist/components/ui/spinner.js +51 -0
- package/dist/components/ui/spinner.js.map +1 -0
- package/dist/components/ui/stepper.d.ts +84 -0
- package/dist/components/ui/stepper.d.ts.map +1 -0
- package/dist/components/ui/stepper.js +145 -0
- package/dist/components/ui/stepper.js.map +1 -0
- package/dist/components/ui/switch.d.ts +36 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/switch.js +44 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.d.ts +80 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +130 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +87 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +128 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +35 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +38 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/time-picker.d.ts +58 -0
- package/dist/components/ui/time-picker.d.ts.map +1 -0
- package/dist/components/ui/time-picker.js +188 -0
- package/dist/components/ui/time-picker.js.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +52 -0
- package/dist/components/ui/toggle-group.d.ts.map +1 -0
- package/dist/components/ui/toggle-group.js +94 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle.d.ts +50 -0
- package/dist/components/ui/toggle.d.ts.map +1 -0
- package/dist/components/ui/toggle.js +70 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +51 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +78 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/hooks/use-dark-mode.d.ts +2 -0
- package/dist/hooks/use-dark-mode.d.ts.map +1 -0
- package/dist/hooks/use-dark-mode.js +36 -0
- package/dist/hooks/use-dark-mode.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +20 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/lib/scope.d.ts +64 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +74 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +11 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/theme-tokens.css +537 -0
- package/dist/theme.css +417 -0
- package/package.json +103 -3
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { cn } from "../../lib/utils.js";
|
|
2
|
+
import { getPortalContainer } from "../../lib/scope.js";
|
|
3
|
+
import "react";
|
|
4
|
+
import { ContextMenu as ContextMenu$1 } from "radix-ui";
|
|
5
|
+
import { CheckIcon, ChevronRightIcon } from "lucide-react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/ui/context-menu.tsx
|
|
8
|
+
function ContextMenu({ ...props }) {
|
|
9
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Root, {
|
|
10
|
+
"data-slot": "context-menu",
|
|
11
|
+
...props
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function ContextMenuTrigger({ className, tabIndex, ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Trigger, {
|
|
16
|
+
"data-slot": "context-menu-trigger",
|
|
17
|
+
tabIndex: tabIndex ?? 0,
|
|
18
|
+
className: cn("select-none", className),
|
|
19
|
+
...props
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function ContextMenuGroup({ ...props }) {
|
|
23
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Group, {
|
|
24
|
+
"data-slot": "context-menu-group",
|
|
25
|
+
...props
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
function ContextMenuPortal({ ...props }) {
|
|
29
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Portal, {
|
|
30
|
+
"data-slot": "context-menu-portal",
|
|
31
|
+
container: getPortalContainer(),
|
|
32
|
+
...props
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function ContextMenuSub({ ...props }) {
|
|
36
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Sub, {
|
|
37
|
+
"data-slot": "context-menu-sub",
|
|
38
|
+
...props
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function ContextMenuRadioGroup({ ...props }) {
|
|
42
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.RadioGroup, {
|
|
43
|
+
"data-slot": "context-menu-radio-group",
|
|
44
|
+
...props
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function ContextMenuContent({ className, ...props }) {
|
|
48
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Portal, {
|
|
49
|
+
container: getPortalContainer(),
|
|
50
|
+
children: /* @__PURE__ */ jsx(ContextMenu$1.Content, {
|
|
51
|
+
"data-slot": "context-menu-content",
|
|
52
|
+
className: cn("z-50 max-h-(--radix-context-menu-content-available-height) min-w-36 origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-popover ring-1 ring-foreground/10 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-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", className),
|
|
53
|
+
...props
|
|
54
|
+
})
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function ContextMenuItem({ className, inset, variant = "default", ...props }) {
|
|
58
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Item, {
|
|
59
|
+
"data-slot": "context-menu-item",
|
|
60
|
+
"data-inset": inset,
|
|
61
|
+
"data-variant": variant,
|
|
62
|
+
className: cn("group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive", className),
|
|
63
|
+
...props
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function ContextMenuSubTrigger({ className, inset, children, ...props }) {
|
|
67
|
+
return /* @__PURE__ */ jsxs(ContextMenu$1.SubTrigger, {
|
|
68
|
+
"data-slot": "context-menu-sub-trigger",
|
|
69
|
+
"data-inset": inset,
|
|
70
|
+
className: cn("flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
|
|
71
|
+
...props,
|
|
72
|
+
children: [children, /* @__PURE__ */ jsx(ChevronRightIcon, { className: "ml-auto" })]
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function ContextMenuSubContent({ className, ...props }) {
|
|
76
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.SubContent, {
|
|
77
|
+
"data-slot": "context-menu-sub-content",
|
|
78
|
+
className: cn("z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-popover 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-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", className),
|
|
79
|
+
...props
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function ContextMenuCheckboxItem({ className, children, checked, inset, ...props }) {
|
|
83
|
+
return /* @__PURE__ */ jsxs(ContextMenu$1.CheckboxItem, {
|
|
84
|
+
"data-slot": "context-menu-checkbox-item",
|
|
85
|
+
"data-inset": inset,
|
|
86
|
+
className: cn("relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
|
|
87
|
+
checked,
|
|
88
|
+
...props,
|
|
89
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
90
|
+
className: "pointer-events-none absolute right-2",
|
|
91
|
+
children: /* @__PURE__ */ jsx(ContextMenu$1.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, {}) })
|
|
92
|
+
}), children]
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function ContextMenuRadioItem({ className, children, inset, ...props }) {
|
|
96
|
+
return /* @__PURE__ */ jsxs(ContextMenu$1.RadioItem, {
|
|
97
|
+
"data-slot": "context-menu-radio-item",
|
|
98
|
+
"data-inset": inset,
|
|
99
|
+
className: cn("relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
|
|
100
|
+
...props,
|
|
101
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
102
|
+
className: "pointer-events-none absolute right-2",
|
|
103
|
+
children: /* @__PURE__ */ jsx(ContextMenu$1.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, {}) })
|
|
104
|
+
}), children]
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function ContextMenuLabel({ className, inset, ...props }) {
|
|
108
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Label, {
|
|
109
|
+
"data-slot": "context-menu-label",
|
|
110
|
+
"data-inset": inset,
|
|
111
|
+
className: cn("px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7", className),
|
|
112
|
+
...props
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
function ContextMenuSeparator({ className, ...props }) {
|
|
116
|
+
return /* @__PURE__ */ jsx(ContextMenu$1.Separator, {
|
|
117
|
+
"data-slot": "context-menu-separator",
|
|
118
|
+
className: cn("-mx-1 my-1 h-px bg-border", className),
|
|
119
|
+
...props
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
function ContextMenuShortcut({ className, ...props }) {
|
|
123
|
+
return /* @__PURE__ */ jsx("span", {
|
|
124
|
+
"data-slot": "context-menu-shortcut",
|
|
125
|
+
className: cn("ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground", className),
|
|
126
|
+
...props
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* WHEN TO USE
|
|
131
|
+
* - Right-click affordances on a canvas, tree, table row, or file item
|
|
132
|
+
*
|
|
133
|
+
* NOT WHEN
|
|
134
|
+
* - As the only way to reach an action — always provide a visible alternative (a button or DropdownMenu) alongside it
|
|
135
|
+
* - Touch-primary interfaces — there's no reliable right-click equivalent on touch; don't make it the sole path to an action there
|
|
136
|
+
*
|
|
137
|
+
* KEY RULES
|
|
138
|
+
* - ContextMenuTrigger wraps the exact region that should respond to right-click — size it to the target, not the whole page
|
|
139
|
+
* - ContextMenuItem accepts variant="default" | "destructive"; use "destructive" only for irreversible entries
|
|
140
|
+
* - Checkbox/radio items are controlled, same pattern as DropdownMenu — the caller owns checked/value state
|
|
141
|
+
* - Submenus use ContextMenuSub + ContextMenuSubTrigger + ContextMenuSubContent, same composition as DropdownMenu
|
|
142
|
+
*
|
|
143
|
+
* USAGE
|
|
144
|
+
* <ContextMenu>
|
|
145
|
+
* <ContextMenuTrigger className="flex h-36 w-72 items-center justify-center rounded-md border border-dashed text-sm">
|
|
146
|
+
* Right click here
|
|
147
|
+
* </ContextMenuTrigger>
|
|
148
|
+
* <ContextMenuContent className="w-52">
|
|
149
|
+
* <ContextMenuItem>Back<ContextMenuShortcut>⌘[</ContextMenuShortcut></ContextMenuItem>
|
|
150
|
+
* <ContextMenuSeparator />
|
|
151
|
+
* <ContextMenuItem variant="destructive">Delete</ContextMenuItem>
|
|
152
|
+
* </ContextMenuContent>
|
|
153
|
+
* </ContextMenu>
|
|
154
|
+
*
|
|
155
|
+
* <ContextMenuRadioGroup value={pane} onValueChange={setPane}>
|
|
156
|
+
* <ContextMenuRadioItem value="left">Left pane</ContextMenuRadioItem>
|
|
157
|
+
* <ContextMenuRadioItem value="right">Right pane</ContextMenuRadioItem>
|
|
158
|
+
* </ContextMenuRadioGroup>
|
|
159
|
+
*/
|
|
160
|
+
//#endregion
|
|
161
|
+
export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger };
|
|
162
|
+
|
|
163
|
+
//# sourceMappingURL=context-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-menu.js","names":[],"sources":["../../../src/components/ui/context-menu.tsx"],"sourcesContent":["/**\n * ContextMenu — menu of actions opened by right-clicking (or long-pressing) a target region\n *\n * Shares the same item vocabulary as DropdownMenu (groups, labels,\n * separators, submenus, checkbox/radio items) — the only difference from\n * DropdownMenu is the trigger: a wrapped region instead of a click target.\n */\n\nimport * as React from \"react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\nimport { getPortalContainer } from \"@/lib/scope\"\nimport { ChevronRightIcon, CheckIcon } from \"lucide-react\"\n\nfunction ContextMenu({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuTrigger({\n className,\n tabIndex,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger\n data-slot=\"context-menu-trigger\"\n // Radix's Trigger only wires onContextMenu/pointer handlers — it adds\n // no tabIndex of its own, so a wrapped region with no other reason to\n // be focusable (the common case: some plain text/content, not a\n // button) has no keyboard path to open the menu at all (no element\n // for Shift+F10/the Menu key to target). Defaulting to 0 here — never\n // overriding an explicit tabIndex the consumer set for their own\n // reasons — gives every ContextMenuTrigger a keyboard-reachable\n // baseline. This alone doesn't make the region announce as any\n // particular control; give it a `role` fitting what it represents\n // (e.g. `role=\"button\"` for an action-like region) if it doesn't\n // already have one from its own content.\n tabIndex={tabIndex ?? 0}\n className={cn(\"select-none\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return (\n <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n )\n}\n\nfunction ContextMenuPortal({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal\n data-slot=\"context-menu-portal\"\n container={getPortalContainer()}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSub({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\n}\n\nfunction ContextMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n}) {\n return (\n <ContextMenuPrimitive.Portal container={getPortalContainer()}>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 max-h-(--radix-context-menu-content-available-height) min-w-36 origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-popover ring-1 ring-foreground/10 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-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n className\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"group/context-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 focus:*:[svg]:text-accent-foreground data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n )\n}\n\nfunction ContextMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-lg border bg-popover p-1 text-popover-foreground shadow-popover 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-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground group-focus/context-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\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}\n\n/**\n * WHEN TO USE\n * - Right-click affordances on a canvas, tree, table row, or file item\n *\n * NOT WHEN\n * - As the only way to reach an action — always provide a visible alternative (a button or DropdownMenu) alongside it\n * - Touch-primary interfaces — there's no reliable right-click equivalent on touch; don't make it the sole path to an action there\n *\n * KEY RULES\n * - ContextMenuTrigger wraps the exact region that should respond to right-click — size it to the target, not the whole page\n * - ContextMenuItem accepts variant=\"default\" | \"destructive\"; use \"destructive\" only for irreversible entries\n * - Checkbox/radio items are controlled, same pattern as DropdownMenu — the caller owns checked/value state\n * - Submenus use ContextMenuSub + ContextMenuSubTrigger + ContextMenuSubContent, same composition as DropdownMenu\n *\n * USAGE\n * <ContextMenu>\n * <ContextMenuTrigger className=\"flex h-36 w-72 items-center justify-center rounded-md border border-dashed text-sm\">\n * Right click here\n * </ContextMenuTrigger>\n * <ContextMenuContent className=\"w-52\">\n * <ContextMenuItem>Back<ContextMenuShortcut>⌘[</ContextMenuShortcut></ContextMenuItem>\n * <ContextMenuSeparator />\n * <ContextMenuItem variant=\"destructive\">Delete</ContextMenuItem>\n * </ContextMenuContent>\n * </ContextMenu>\n *\n * <ContextMenuRadioGroup value={pane} onValueChange={setPane}>\n * <ContextMenuRadioItem value=\"left\">Left pane</ContextMenuRadioItem>\n * <ContextMenuRadioItem value=\"right\">Right pane</ContextMenuRadioItem>\n * </ContextMenuRadioGroup>\n */\n"],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CountBadge — small absolutely-positioned count pill for an icon corner.
|
|
3
|
+
*
|
|
4
|
+
* Plain `span`, no cva — a single fixed look (`bg-primary` pill), not a
|
|
5
|
+
* variant set.
|
|
6
|
+
*/
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
declare function CountBadge({ className, count, max, ...props }: React.ComponentProps<"span"> & {
|
|
9
|
+
count: number;
|
|
10
|
+
/** Counts above this render as "`max`+" instead of the exact number. */
|
|
11
|
+
max?: number;
|
|
12
|
+
}): React.JSX.Element | null;
|
|
13
|
+
export { CountBadge };
|
|
14
|
+
/**
|
|
15
|
+
* WHEN TO USE
|
|
16
|
+
* - A numeric badge overlaid on an icon or button corner — unread-message
|
|
17
|
+
* counts, notification counts on a bell glyph.
|
|
18
|
+
*
|
|
19
|
+
* NOT WHEN
|
|
20
|
+
* - An inline status/category label with no number — use Badge.
|
|
21
|
+
* - A presence dot with no number — use Avatar's `AvatarBadge`.
|
|
22
|
+
*
|
|
23
|
+
* KEY RULES
|
|
24
|
+
* - Renders nothing when `count <= 0` — no need to conditionally hide it
|
|
25
|
+
* yourself.
|
|
26
|
+
* - Counts above `max` (default 9) render as "`max`+", not the exact number.
|
|
27
|
+
* - `absolute` positioning with no top/right offset baked in — the parent
|
|
28
|
+
* must be `relative`, and you set the offset via `className` (e.g.
|
|
29
|
+
* `-top-1 -right-1.5`) because it varies with the icon it decorates.
|
|
30
|
+
*
|
|
31
|
+
* USAGE
|
|
32
|
+
* <div className="relative inline-flex">
|
|
33
|
+
* <BellIcon className="size-5" />
|
|
34
|
+
* <CountBadge count={6} className="-top-1 -right-1.5" />
|
|
35
|
+
* </div>
|
|
36
|
+
*
|
|
37
|
+
* <CountBadge count={42} className="-top-1 -right-1.5" /> // renders "9+"
|
|
38
|
+
* <CountBadge count={0} className="-top-1 -right-1.5" /> // renders null
|
|
39
|
+
*/
|
|
40
|
+
//# sourceMappingURL=count-badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count-badge.d.ts","sourceRoot":"","sources":["../../../src/components/ui/count-badge.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,KAAK,EACL,GAAO,EACP,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,4BAeA;AAED,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { cn } from "../../lib/utils.js";
|
|
2
|
+
import "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/ui/count-badge.tsx
|
|
5
|
+
function CountBadge({ className, count, max = 9, ...props }) {
|
|
6
|
+
if (count <= 0) return null;
|
|
7
|
+
return /* @__PURE__ */ jsx("span", {
|
|
8
|
+
"data-slot": "count-badge",
|
|
9
|
+
className: cn("absolute flex h-3.5 min-w-3.5 items-center justify-center rounded-full bg-primary px-0.5 text-xs leading-none font-semibold text-primary-foreground tabular-nums", className),
|
|
10
|
+
...props,
|
|
11
|
+
children: count > max ? `${max}+` : count
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* WHEN TO USE
|
|
16
|
+
* - A numeric badge overlaid on an icon or button corner — unread-message
|
|
17
|
+
* counts, notification counts on a bell glyph.
|
|
18
|
+
*
|
|
19
|
+
* NOT WHEN
|
|
20
|
+
* - An inline status/category label with no number — use Badge.
|
|
21
|
+
* - A presence dot with no number — use Avatar's `AvatarBadge`.
|
|
22
|
+
*
|
|
23
|
+
* KEY RULES
|
|
24
|
+
* - Renders nothing when `count <= 0` — no need to conditionally hide it
|
|
25
|
+
* yourself.
|
|
26
|
+
* - Counts above `max` (default 9) render as "`max`+", not the exact number.
|
|
27
|
+
* - `absolute` positioning with no top/right offset baked in — the parent
|
|
28
|
+
* must be `relative`, and you set the offset via `className` (e.g.
|
|
29
|
+
* `-top-1 -right-1.5`) because it varies with the icon it decorates.
|
|
30
|
+
*
|
|
31
|
+
* USAGE
|
|
32
|
+
* <div className="relative inline-flex">
|
|
33
|
+
* <BellIcon className="size-5" />
|
|
34
|
+
* <CountBadge count={6} className="-top-1 -right-1.5" />
|
|
35
|
+
* </div>
|
|
36
|
+
*
|
|
37
|
+
* <CountBadge count={42} className="-top-1 -right-1.5" /> // renders "9+"
|
|
38
|
+
* <CountBadge count={0} className="-top-1 -right-1.5" /> // renders null
|
|
39
|
+
*/
|
|
40
|
+
//#endregion
|
|
41
|
+
export { CountBadge };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=count-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"count-badge.js","names":[],"sources":["../../../src/components/ui/count-badge.tsx"],"sourcesContent":["/**\n * CountBadge — small absolutely-positioned count pill for an icon corner.\n *\n * Plain `span`, no cva — a single fixed look (`bg-primary` pill), not a\n * variant set.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction CountBadge({\n className,\n count,\n max = 9,\n ...props\n}: React.ComponentProps<\"span\"> & {\n count: number\n /** Counts above this render as \"`max`+\" instead of the exact number. */\n max?: number\n}) {\n if (count <= 0) return null\n\n return (\n <span\n data-slot=\"count-badge\"\n className={cn(\n \"absolute flex h-3.5 min-w-3.5 items-center justify-center rounded-full bg-primary px-0.5 text-xs leading-none font-semibold text-primary-foreground tabular-nums\",\n className\n )}\n {...props}\n >\n {count > max ? `${max}+` : count}\n </span>\n )\n}\n\nexport { CountBadge }\n\n/**\n * WHEN TO USE\n * - A numeric badge overlaid on an icon or button corner — unread-message\n * counts, notification counts on a bell glyph.\n *\n * NOT WHEN\n * - An inline status/category label with no number — use Badge.\n * - A presence dot with no number — use Avatar's `AvatarBadge`.\n *\n * KEY RULES\n * - Renders nothing when `count <= 0` — no need to conditionally hide it\n * yourself.\n * - Counts above `max` (default 9) render as \"`max`+\", not the exact number.\n * - `absolute` positioning with no top/right offset baked in — the parent\n * must be `relative`, and you set the offset via `className` (e.g.\n * `-top-1 -right-1.5`) because it varies with the icon it decorates.\n *\n * USAGE\n * <div className=\"relative inline-flex\">\n * <BellIcon className=\"size-5\" />\n * <CountBadge count={6} className=\"-top-1 -right-1.5\" />\n * </div>\n *\n * <CountBadge count={42} className=\"-top-1 -right-1.5\" /> // renders \"9+\"\n * <CountBadge count={0} className=\"-top-1 -right-1.5\" /> // renders null\n */\n"],"mappings":";;;;AAWA,SAAS,WAAW,EAClB,WACA,OACA,MAAM,GACN,GAAG,SAKF;CACD,IAAI,SAAS,GAAG,OAAO;CAEvB,OACE,oBAAC,QAAD;EACE,aAAU;EACV,WAAW,GACT,oKACA,SACF;EACA,GAAI;EAEH,UAAA,QAAQ,MAAM,GAAG,IAAI,KAAK;CACvB,CAAA;AAEV"}
|