@7onic-ui/react 0.3.9 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +2 -2
  2. package/dist/chart.mjs +3 -9
  3. package/dist/chart.mjs.map +1 -1
  4. package/dist/chunk-2WIIXHOV.mjs +148 -0
  5. package/dist/chunk-2WIIXHOV.mjs.map +1 -0
  6. package/dist/chunk-53MIUPSY.mjs +13 -0
  7. package/dist/chunk-53MIUPSY.mjs.map +1 -0
  8. package/dist/chunk-BN5BEA3V.mjs +195 -0
  9. package/dist/chunk-BN5BEA3V.mjs.map +1 -0
  10. package/dist/chunk-C5D3VRNJ.mjs +504 -0
  11. package/dist/chunk-C5D3VRNJ.mjs.map +1 -0
  12. package/dist/chunk-COW3B62M.mjs +214 -0
  13. package/dist/chunk-COW3B62M.mjs.map +1 -0
  14. package/dist/chunk-CTH6SN5Y.mjs +114 -0
  15. package/dist/chunk-CTH6SN5Y.mjs.map +1 -0
  16. package/dist/chunk-D3NTQNDW.mjs +440 -0
  17. package/dist/chunk-D3NTQNDW.mjs.map +1 -0
  18. package/dist/chunk-DDRYEJBJ.mjs +164 -0
  19. package/dist/chunk-DDRYEJBJ.mjs.map +1 -0
  20. package/dist/chunk-DJAEXCRU.mjs +190 -0
  21. package/dist/chunk-DJAEXCRU.mjs.map +1 -0
  22. package/dist/chunk-DYYQOHQR.mjs +214 -0
  23. package/dist/chunk-DYYQOHQR.mjs.map +1 -0
  24. package/dist/chunk-EG2GTK65.mjs +443 -0
  25. package/dist/chunk-EG2GTK65.mjs.map +1 -0
  26. package/dist/chunk-FHUAH6AJ.mjs +93 -0
  27. package/dist/chunk-FHUAH6AJ.mjs.map +1 -0
  28. package/dist/chunk-GD4YE5AE.mjs +209 -0
  29. package/dist/chunk-GD4YE5AE.mjs.map +1 -0
  30. package/dist/chunk-HHX4GABH.mjs +129 -0
  31. package/dist/chunk-HHX4GABH.mjs.map +1 -0
  32. package/dist/chunk-HS2VRYSX.mjs +148 -0
  33. package/dist/chunk-HS2VRYSX.mjs.map +1 -0
  34. package/dist/chunk-IHHI3LIN.mjs +155 -0
  35. package/dist/chunk-IHHI3LIN.mjs.map +1 -0
  36. package/dist/chunk-IJ2FZ3L5.mjs +159 -0
  37. package/dist/chunk-IJ2FZ3L5.mjs.map +1 -0
  38. package/dist/chunk-IPCIC2BI.mjs +148 -0
  39. package/dist/chunk-IPCIC2BI.mjs.map +1 -0
  40. package/dist/chunk-JCJEVXER.mjs +170 -0
  41. package/dist/chunk-JCJEVXER.mjs.map +1 -0
  42. package/dist/chunk-KBPYAMGS.mjs +157 -0
  43. package/dist/chunk-KBPYAMGS.mjs.map +1 -0
  44. package/dist/chunk-L55ABE4H.mjs +283 -0
  45. package/dist/chunk-L55ABE4H.mjs.map +1 -0
  46. package/dist/chunk-LJJ6K4IU.mjs +318 -0
  47. package/dist/chunk-LJJ6K4IU.mjs.map +1 -0
  48. package/dist/chunk-ND6TUVP2.mjs +148 -0
  49. package/dist/chunk-ND6TUVP2.mjs.map +1 -0
  50. package/dist/chunk-NWFMJWGX.mjs +165 -0
  51. package/dist/chunk-NWFMJWGX.mjs.map +1 -0
  52. package/dist/chunk-PTAPPOKU.mjs +117 -0
  53. package/dist/chunk-PTAPPOKU.mjs.map +1 -0
  54. package/dist/chunk-PVTBM7V7.mjs +316 -0
  55. package/dist/chunk-PVTBM7V7.mjs.map +1 -0
  56. package/dist/chunk-Q5WVLK2L.mjs +77 -0
  57. package/dist/chunk-Q5WVLK2L.mjs.map +1 -0
  58. package/dist/chunk-R7FJEO4K.mjs +252 -0
  59. package/dist/chunk-R7FJEO4K.mjs.map +1 -0
  60. package/dist/chunk-RKSB2N5L.mjs +206 -0
  61. package/dist/chunk-RKSB2N5L.mjs.map +1 -0
  62. package/dist/chunk-S4DGVKBK.mjs +151 -0
  63. package/dist/chunk-S4DGVKBK.mjs.map +1 -0
  64. package/dist/chunk-S4T4PU7F.mjs +114 -0
  65. package/dist/chunk-S4T4PU7F.mjs.map +1 -0
  66. package/dist/chunk-SDDAGZWA.mjs +224 -0
  67. package/dist/chunk-SDDAGZWA.mjs.map +1 -0
  68. package/dist/chunk-SZPZOGPC.mjs +394 -0
  69. package/dist/chunk-SZPZOGPC.mjs.map +1 -0
  70. package/dist/chunk-T5A4APEL.mjs +140 -0
  71. package/dist/chunk-T5A4APEL.mjs.map +1 -0
  72. package/dist/chunk-V5UFWYFI.mjs +255 -0
  73. package/dist/chunk-V5UFWYFI.mjs.map +1 -0
  74. package/dist/chunk-W6YNEU53.mjs +175 -0
  75. package/dist/chunk-W6YNEU53.mjs.map +1 -0
  76. package/dist/chunk-XK52LYR4.mjs +182 -0
  77. package/dist/chunk-XK52LYR4.mjs.map +1 -0
  78. package/dist/chunk-YIAH6KHV.mjs +164 -0
  79. package/dist/chunk-YIAH6KHV.mjs.map +1 -0
  80. package/dist/chunk-YZ7HHFKA.mjs +375 -0
  81. package/dist/chunk-YZ7HHFKA.mjs.map +1 -0
  82. package/dist/chunk-ZDRUTJ4T.mjs +119 -0
  83. package/dist/chunk-ZDRUTJ4T.mjs.map +1 -0
  84. package/dist/components/accordion.mjs +19 -0
  85. package/dist/components/accordion.mjs.map +1 -0
  86. package/dist/components/alert.mjs +15 -0
  87. package/dist/components/alert.mjs.map +1 -0
  88. package/dist/components/avatar.mjs +23 -0
  89. package/dist/components/avatar.mjs.map +1 -0
  90. package/dist/components/badge.mjs +11 -0
  91. package/dist/components/badge.mjs.map +1 -0
  92. package/dist/components/breadcrumb.mjs +23 -0
  93. package/dist/components/breadcrumb.mjs.map +1 -0
  94. package/dist/components/button-group.mjs +11 -0
  95. package/dist/components/button-group.mjs.map +1 -0
  96. package/dist/components/button.mjs +12 -0
  97. package/dist/components/button.mjs.map +1 -0
  98. package/dist/components/card.mjs +25 -0
  99. package/dist/components/card.mjs.map +1 -0
  100. package/dist/components/chat-input.mjs +15 -0
  101. package/dist/components/chat-input.mjs.map +1 -0
  102. package/dist/components/chat-message.mjs +17 -0
  103. package/dist/components/chat-message.mjs.map +1 -0
  104. package/dist/components/checkbox.mjs +12 -0
  105. package/dist/components/checkbox.mjs.map +1 -0
  106. package/dist/components/divider.mjs +11 -0
  107. package/dist/components/divider.mjs.map +1 -0
  108. package/dist/components/drawer.mjs +33 -0
  109. package/dist/components/drawer.mjs.map +1 -0
  110. package/dist/components/dropdown.mjs +35 -0
  111. package/dist/components/dropdown.mjs.map +1 -0
  112. package/dist/components/field.mjs +19 -0
  113. package/dist/components/field.mjs.map +1 -0
  114. package/dist/components/icon-button.mjs +12 -0
  115. package/dist/components/icon-button.mjs.map +1 -0
  116. package/dist/components/input.mjs +12 -0
  117. package/dist/components/input.mjs.map +1 -0
  118. package/dist/components/metric-card.mjs +23 -0
  119. package/dist/components/metric-card.mjs.map +1 -0
  120. package/dist/components/modal.mjs +57 -0
  121. package/dist/components/modal.mjs.map +1 -0
  122. package/dist/components/navigation-menu.mjs +27 -0
  123. package/dist/components/navigation-menu.mjs.map +1 -0
  124. package/dist/components/pagination.mjs +33 -0
  125. package/dist/components/pagination.mjs.map +1 -0
  126. package/dist/components/popover.mjs +23 -0
  127. package/dist/components/popover.mjs.map +1 -0
  128. package/dist/components/progress.mjs +11 -0
  129. package/dist/components/progress.mjs.map +1 -0
  130. package/dist/components/quick-reply.mjs +15 -0
  131. package/dist/components/quick-reply.mjs.map +1 -0
  132. package/dist/components/radio-group.mjs +16 -0
  133. package/dist/components/radio-group.mjs.map +1 -0
  134. package/dist/components/segmented.mjs +15 -0
  135. package/dist/components/segmented.mjs.map +1 -0
  136. package/dist/components/select.mjs +24 -0
  137. package/dist/components/select.mjs.map +1 -0
  138. package/dist/components/skeleton.mjs +11 -0
  139. package/dist/components/skeleton.mjs.map +1 -0
  140. package/dist/components/slider.mjs +12 -0
  141. package/dist/components/slider.mjs.map +1 -0
  142. package/dist/components/spinner.mjs +11 -0
  143. package/dist/components/spinner.mjs.map +1 -0
  144. package/dist/components/switch.mjs +12 -0
  145. package/dist/components/switch.mjs.map +1 -0
  146. package/dist/components/table.mjs +23 -0
  147. package/dist/components/table.mjs.map +1 -0
  148. package/dist/components/tabs.mjs +19 -0
  149. package/dist/components/tabs.mjs.map +1 -0
  150. package/dist/components/textarea.mjs +12 -0
  151. package/dist/components/textarea.mjs.map +1 -0
  152. package/dist/components/toast.mjs +13 -0
  153. package/dist/components/toast.mjs.map +1 -0
  154. package/dist/components/toggle-group.mjs +15 -0
  155. package/dist/components/toggle-group.mjs.map +1 -0
  156. package/dist/components/toggle.mjs +11 -0
  157. package/dist/components/toggle.mjs.map +1 -0
  158. package/dist/components/tooltip.mjs +21 -0
  159. package/dist/components/tooltip.mjs.map +1 -0
  160. package/dist/components/typing-indicator.mjs +11 -0
  161. package/dist/components/typing-indicator.mjs.map +1 -0
  162. package/dist/index.d.ts +11 -2
  163. package/dist/index.js +95 -21
  164. package/dist/index.js.map +1 -1
  165. package/dist/index.mjs +296 -7536
  166. package/dist/index.mjs.map +1 -1
  167. package/llms.txt +50 -32
  168. package/package.json +14 -14
  169. package/dist/chart.d.mts +0 -147
  170. package/dist/index.d.mts +0 -1535
@@ -0,0 +1,170 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-53MIUPSY.mjs";
5
+
6
+ // src/components/ui/drawer.tsx
7
+ import * as React from "react";
8
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
9
+ import { cva } from "class-variance-authority";
10
+ var DefaultCloseIcon = ({ className }) => /* @__PURE__ */ React.createElement(
11
+ "svg",
12
+ {
13
+ className,
14
+ fill: "none",
15
+ viewBox: "0 0 24 24",
16
+ stroke: "currentColor",
17
+ strokeWidth: 2,
18
+ "aria-hidden": "true"
19
+ },
20
+ /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" })
21
+ );
22
+ var ANIMATION_CLASSES = {
23
+ right: "data-[state=open]:animate-drawer-right-enter data-[state=closed]:animate-drawer-right-exit",
24
+ left: "data-[state=open]:animate-drawer-left-enter data-[state=closed]:animate-drawer-left-exit",
25
+ top: "data-[state=open]:animate-drawer-top-enter data-[state=closed]:animate-drawer-top-exit",
26
+ bottom: "data-[state=open]:animate-drawer-bottom-enter data-[state=closed]:animate-drawer-bottom-exit"
27
+ };
28
+ var drawerSizeHorizontal = cva("", {
29
+ variants: {
30
+ size: {
31
+ sm: "w-[320px]",
32
+ md: "w-[400px]",
33
+ lg: "w-[480px]",
34
+ xl: "w-[640px]",
35
+ full: "w-full"
36
+ }
37
+ },
38
+ defaultVariants: { size: "md" }
39
+ });
40
+ var drawerSizeVertical = cva("", {
41
+ variants: {
42
+ size: {
43
+ sm: "h-[320px]",
44
+ md: "h-[400px]",
45
+ lg: "h-[480px]",
46
+ xl: "h-[640px]",
47
+ full: "h-full"
48
+ }
49
+ },
50
+ defaultVariants: { size: "md" }
51
+ });
52
+ function Drawer(props) {
53
+ return /* @__PURE__ */ React.createElement(DialogPrimitive.Root, { ...props });
54
+ }
55
+ var DrawerTrigger = DialogPrimitive.Trigger;
56
+ var DrawerPortal = DialogPrimitive.Portal;
57
+ var DrawerClose = DialogPrimitive.Close;
58
+ var DrawerOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
59
+ DialogPrimitive.Overlay,
60
+ {
61
+ ref,
62
+ className: cn(
63
+ "fixed inset-0 z-overlay bg-black/50",
64
+ "data-[state=open]:animate-modal-overlay-enter data-[state=closed]:animate-modal-overlay-exit",
65
+ className
66
+ ),
67
+ ...props
68
+ }
69
+ ));
70
+ DrawerOverlay.displayName = "DrawerOverlay";
71
+ var SIDE_POSITION = {
72
+ right: "inset-y-0 right-0",
73
+ left: "inset-y-0 left-0",
74
+ top: "inset-x-0 top-0",
75
+ bottom: "inset-x-0 bottom-0"
76
+ };
77
+ var DrawerContent = React.forwardRef(({ className, children, side = "right", size = "md", showCloseButton = true, closeIcon, ...props }, ref) => {
78
+ const isHorizontal = side === "left" || side === "right";
79
+ const sizeClass = isHorizontal ? drawerSizeHorizontal({ size }) : drawerSizeVertical({ size });
80
+ return /* @__PURE__ */ React.createElement(DrawerPortal, null, /* @__PURE__ */ React.createElement(DrawerOverlay, null), /* @__PURE__ */ React.createElement(
81
+ DialogPrimitive.Content,
82
+ {
83
+ ref,
84
+ className: cn(
85
+ "fixed z-modal flex flex-col bg-background text-foreground shadow-xl",
86
+ "focus:outline-none",
87
+ SIDE_POSITION[side],
88
+ isHorizontal ? "max-w-full h-full" : "max-h-full w-full",
89
+ sizeClass,
90
+ ANIMATION_CLASSES[side],
91
+ className
92
+ ),
93
+ ...props
94
+ },
95
+ children,
96
+ showCloseButton && /* @__PURE__ */ React.createElement(DialogPrimitive.Close, { className: cn(
97
+ "absolute right-4 top-4 rounded-md p-1",
98
+ "text-text-muted hover:text-foreground",
99
+ "transition-colors duration-fast",
100
+ "focus-visible:focus-ring focus-visible:outline-none",
101
+ "disabled:pointer-events-none"
102
+ ) }, closeIcon || /* @__PURE__ */ React.createElement(DefaultCloseIcon, { className: "icon-sm" }), /* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Close"))
103
+ ));
104
+ });
105
+ DrawerContent.displayName = "DrawerContent";
106
+ var DrawerHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
107
+ "div",
108
+ {
109
+ ref,
110
+ className: cn("flex flex-col gap-1.5 p-6 pb-0", className),
111
+ ...props
112
+ }
113
+ ));
114
+ DrawerHeader.displayName = "DrawerHeader";
115
+ var DrawerTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
116
+ DialogPrimitive.Title,
117
+ {
118
+ ref,
119
+ className: cn("text-lg font-semibold text-foreground", className),
120
+ ...props
121
+ }
122
+ ));
123
+ DrawerTitle.displayName = "DrawerTitle";
124
+ var DrawerDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
125
+ DialogPrimitive.Description,
126
+ {
127
+ ref,
128
+ className: cn("text-md text-text-muted", className),
129
+ ...props
130
+ }
131
+ ));
132
+ DrawerDescription.displayName = "DrawerDescription";
133
+ var DrawerBody = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
134
+ "div",
135
+ {
136
+ ref,
137
+ className: cn("flex-1 overflow-y-auto p-6", className),
138
+ ...props
139
+ }
140
+ ));
141
+ DrawerBody.displayName = "DrawerBody";
142
+ var DrawerFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
143
+ "div",
144
+ {
145
+ ref,
146
+ className: cn(
147
+ "flex items-center justify-end gap-3 p-6 pt-0",
148
+ className
149
+ ),
150
+ ...props
151
+ }
152
+ ));
153
+ DrawerFooter.displayName = "DrawerFooter";
154
+
155
+ export {
156
+ drawerSizeHorizontal,
157
+ drawerSizeVertical,
158
+ Drawer,
159
+ DrawerTrigger,
160
+ DrawerPortal,
161
+ DrawerClose,
162
+ DrawerOverlay,
163
+ DrawerContent,
164
+ DrawerHeader,
165
+ DrawerTitle,
166
+ DrawerDescription,
167
+ DrawerBody,
168
+ DrawerFooter
169
+ };
170
+ //# sourceMappingURL=chunk-JCJEVXER.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/drawer.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { cva } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// ─── Default Close Icon (built-in, no external dependency) ──\nconst DefaultCloseIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\n// ─── Types ──────────────────────────────────────────────────\nexport type DrawerSide = 'left' | 'right' | 'top' | 'bottom'\nexport type DrawerSize = 'sm' | 'md' | 'lg' | 'xl' | 'full'\n\n// ─── Animation class mapping (static strings for Tailwind scanner) ──\nconst ANIMATION_CLASSES: Record<DrawerSide, string> = {\n right: 'data-[state=open]:animate-drawer-right-enter data-[state=closed]:animate-drawer-right-exit',\n left: 'data-[state=open]:animate-drawer-left-enter data-[state=closed]:animate-drawer-left-exit',\n top: 'data-[state=open]:animate-drawer-top-enter data-[state=closed]:animate-drawer-top-exit',\n bottom: 'data-[state=open]:animate-drawer-bottom-enter data-[state=closed]:animate-drawer-bottom-exit',\n}\n\n// ─── Size variants ──────────────────────────────────────────\nconst drawerSizeHorizontal = cva('', {\n variants: {\n size: {\n sm: 'w-[320px]',\n md: 'w-[400px]',\n lg: 'w-[480px]',\n xl: 'w-[640px]',\n full: 'w-full',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nconst drawerSizeVertical = cva('', {\n variants: {\n size: {\n sm: 'h-[320px]',\n md: 'h-[400px]',\n lg: 'h-[480px]',\n xl: 'h-[640px]',\n full: 'h-full',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\n// ═══════════════════════════════════════════════════════════════\n// Drawer\n// ═══════════════════════════════════════════════════════════════\n\n// ─── Drawer (Root) — thin wrapper to expose as named export ──\nfunction Drawer(props: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root {...props} />\n}\n\n// ─── DrawerTrigger ──────────────────────────────────────────\nconst DrawerTrigger = DialogPrimitive.Trigger\n\n// ─── DrawerPortal ───────────────────────────────────────────\nconst DrawerPortal = DialogPrimitive.Portal\n\n// ─── DrawerClose ────────────────────────────────────────────\nconst DrawerClose = DialogPrimitive.Close\n\n// ─── DrawerOverlay ──────────────────────────────────────────\nconst DrawerOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-overlay bg-black/50',\n 'data-[state=open]:animate-modal-overlay-enter data-[state=closed]:animate-modal-overlay-exit',\n className\n )}\n {...props}\n />\n))\nDrawerOverlay.displayName = 'DrawerOverlay'\n\n// ─── DrawerContent ──────────────────────────────────────────\nexport interface DrawerContentProps\n extends Omit<React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, 'children'> {\n /** Side from which the drawer slides in */\n side?: DrawerSide\n /** Panel size (width for left/right, height for top/bottom) */\n size?: DrawerSize\n /** Show built-in close button */\n showCloseButton?: boolean\n /** Custom close icon (replaces default X) */\n closeIcon?: React.ReactNode\n children?: React.ReactNode\n}\n\nconst SIDE_POSITION: Record<DrawerSide, string> = {\n right: 'inset-y-0 right-0',\n left: 'inset-y-0 left-0',\n top: 'inset-x-0 top-0',\n bottom: 'inset-x-0 bottom-0',\n}\n\nconst DrawerContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n DrawerContentProps\n>(({ className, children, side = 'right', size = 'md', showCloseButton = true, closeIcon, ...props }, ref) => {\n const isHorizontal = side === 'left' || side === 'right'\n const sizeClass = isHorizontal\n ? drawerSizeHorizontal({ size })\n : drawerSizeVertical({ size })\n\n return (\n <DrawerPortal>\n <DrawerOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed z-modal flex flex-col bg-background text-foreground shadow-xl',\n 'focus:outline-none',\n SIDE_POSITION[side],\n isHorizontal ? 'max-w-full h-full' : 'max-h-full w-full',\n sizeClass,\n ANIMATION_CLASSES[side],\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close className={cn(\n 'absolute right-4 top-4 rounded-md p-1',\n 'text-text-muted hover:text-foreground',\n 'transition-colors duration-fast',\n 'focus-visible:focus-ring focus-visible:outline-none',\n 'disabled:pointer-events-none'\n )}>\n {closeIcon || <DefaultCloseIcon className=\"icon-sm\" />}\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DrawerPortal>\n )\n})\nDrawerContent.displayName = 'DrawerContent'\n\n// ─── DrawerHeader ───────────────────────────────────────────\nconst DrawerHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col gap-1.5 p-6 pb-0', className)}\n {...props}\n />\n))\nDrawerHeader.displayName = 'DrawerHeader'\n\n// ─── DrawerTitle ────────────────────────────────────────────\nconst DrawerTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold text-foreground', className)}\n {...props}\n />\n))\nDrawerTitle.displayName = 'DrawerTitle'\n\n// ─── DrawerDescription ─────────────────────────────────────\nconst DrawerDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-md text-text-muted', className)}\n {...props}\n />\n))\nDrawerDescription.displayName = 'DrawerDescription'\n\n// ─── DrawerBody ─────────────────────────────────────────────\nconst DrawerBody = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex-1 overflow-y-auto p-6', className)}\n {...props}\n />\n))\nDrawerBody.displayName = 'DrawerBody'\n\n// ─── DrawerFooter ───────────────────────────────────────────\nconst DrawerFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex items-center justify-end gap-3 p-6 pt-0',\n className\n )}\n {...props}\n />\n))\nDrawerFooter.displayName = 'DrawerFooter'\n\n// ─── Exports ────────────────────────────────────────────────\nexport {\n Drawer,\n DrawerTrigger,\n DrawerPortal,\n DrawerOverlay,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerDescription,\n DrawerBody,\n DrawerFooter,\n DrawerClose,\n drawerSizeHorizontal,\n drawerSizeVertical,\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,157 @@
1
+ "use client";
2
+ import {
3
+ cn
4
+ } from "./chunk-53MIUPSY.mjs";
5
+
6
+ // src/components/ui/quick-reply.tsx
7
+ import * as React from "react";
8
+ import { Slot } from "@radix-ui/react-slot";
9
+ import { cva } from "class-variance-authority";
10
+ var colorMap = {
11
+ default: {
12
+ outline: "border border-border text-foreground bg-background hover:bg-background-muted",
13
+ filled: "bg-background-muted text-foreground hover:bg-background-elevated",
14
+ ghost: "text-foreground hover:bg-background-muted"
15
+ },
16
+ primary: {
17
+ outline: "border border-primary text-text-primary bg-background hover:bg-primary-tint",
18
+ filled: "bg-primary-tint text-text-primary hover:bg-primary/20",
19
+ ghost: "text-text-primary hover:bg-primary-tint"
20
+ }
21
+ };
22
+ var QuickReplyContext = React.createContext({
23
+ size: "default",
24
+ variant: "outline",
25
+ color: "default",
26
+ radius: "full"
27
+ });
28
+ var quickReplyRootVariants = cva(
29
+ "flex items-center",
30
+ {
31
+ variants: {
32
+ layout: {
33
+ scroll: "overflow-x-auto",
34
+ wrap: "flex-wrap"
35
+ },
36
+ gap: {
37
+ sm: "gap-1.5",
38
+ default: "gap-2",
39
+ lg: "gap-2.5"
40
+ }
41
+ },
42
+ defaultVariants: {
43
+ layout: "scroll",
44
+ gap: "default"
45
+ }
46
+ }
47
+ );
48
+ var quickReplyItemVariants = cva(
49
+ [
50
+ "inline-flex items-center justify-center",
51
+ "whitespace-nowrap font-semibold shrink-0",
52
+ "transition-colors duration-fast cursor-pointer",
53
+ "focus-visible:outline-none focus-visible:focus-ring",
54
+ "disabled:pointer-events-none disabled:opacity-50",
55
+ "select-none"
56
+ ].join(" "),
57
+ {
58
+ variants: {
59
+ size: {
60
+ sm: "h-7 px-2.5 text-xs gap-1.5",
61
+ // 28px
62
+ default: "h-8 px-3 text-sm gap-1.5",
63
+ // 32px
64
+ lg: "h-9 px-3.5 text-md gap-1.5"
65
+ // 36px
66
+ },
67
+ radius: {
68
+ md: "rounded-md",
69
+ // 6px
70
+ lg: "rounded-lg",
71
+ // 8px
72
+ full: "rounded-full"
73
+ // 9999px
74
+ }
75
+ },
76
+ defaultVariants: {
77
+ size: "default",
78
+ radius: "full"
79
+ }
80
+ }
81
+ );
82
+ var iconSizeMap = {
83
+ sm: "icon-xs",
84
+ // 14px
85
+ default: "icon-xs",
86
+ // 14px
87
+ lg: "icon-sm"
88
+ // 16px
89
+ };
90
+ var QuickReply = React.forwardRef(
91
+ ({
92
+ className,
93
+ layout = "scroll",
94
+ gap = "default",
95
+ variant = "outline",
96
+ color = "default",
97
+ size = "default",
98
+ radius = "full",
99
+ role = "group",
100
+ children,
101
+ ...props
102
+ }, ref) => {
103
+ const contextValue = React.useMemo(
104
+ () => ({ size, variant, color, radius }),
105
+ [size, variant, color, radius]
106
+ );
107
+ return /* @__PURE__ */ React.createElement(QuickReplyContext.Provider, { value: contextValue }, /* @__PURE__ */ React.createElement(
108
+ "div",
109
+ {
110
+ ref,
111
+ role,
112
+ className: cn(quickReplyRootVariants({ layout, gap }), className),
113
+ ...props
114
+ },
115
+ children
116
+ ));
117
+ }
118
+ );
119
+ QuickReply.displayName = "QuickReply";
120
+ var QuickReplyItem = React.forwardRef(
121
+ ({ className, icon, asChild = false, children, ...props }, ref) => {
122
+ const { size, variant, color, radius } = React.useContext(QuickReplyContext);
123
+ const Comp = asChild ? Slot : "button";
124
+ const colorClasses = colorMap[color][variant];
125
+ return /* @__PURE__ */ React.createElement(
126
+ Comp,
127
+ {
128
+ ref,
129
+ type: !asChild ? "button" : void 0,
130
+ ...props,
131
+ className: cn(
132
+ quickReplyItemVariants({ size, radius }),
133
+ colorClasses,
134
+ className
135
+ )
136
+ },
137
+ icon && /* @__PURE__ */ React.createElement(
138
+ "span",
139
+ {
140
+ className: cn("shrink-0 [&>svg]:w-full [&>svg]:h-full", iconSizeMap[size]),
141
+ "aria-hidden": "true"
142
+ },
143
+ icon
144
+ ),
145
+ children
146
+ );
147
+ }
148
+ );
149
+ QuickReplyItem.displayName = "QuickReplyItem";
150
+
151
+ export {
152
+ quickReplyRootVariants,
153
+ quickReplyItemVariants,
154
+ QuickReply,
155
+ QuickReplyItem
156
+ };
157
+ //# sourceMappingURL=chunk-KBPYAMGS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/quick-reply.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// ============================================================================\n// Color mapping per variant × color\n// ============================================================================\n\nconst colorMap = {\n default: {\n outline: 'border border-border text-foreground bg-background hover:bg-background-muted',\n filled: 'bg-background-muted text-foreground hover:bg-background-elevated',\n ghost: 'text-foreground hover:bg-background-muted',\n },\n primary: {\n outline: 'border border-primary text-text-primary bg-background hover:bg-primary-tint',\n filled: 'bg-primary-tint text-text-primary hover:bg-primary/20',\n ghost: 'text-text-primary hover:bg-primary-tint',\n },\n} as const\n\n// ============================================================================\n// Context — propagates variant/color/size/radius from Root to Items\n// ============================================================================\n\ntype QuickReplyContextValue = {\n size: QuickReplySize\n variant: QuickReplyVariant\n color: QuickReplyColor\n radius: QuickReplyRadius\n}\n\nconst QuickReplyContext = React.createContext<QuickReplyContextValue>({\n size: 'default',\n variant: 'outline',\n color: 'default',\n radius: 'full',\n})\n\n// ============================================================================\n// Variants (CVA)\n// ============================================================================\n\nconst quickReplyRootVariants = cva(\n 'flex items-center',\n {\n variants: {\n layout: {\n scroll: 'overflow-x-auto',\n wrap: 'flex-wrap',\n },\n gap: {\n sm: 'gap-1.5',\n default: 'gap-2',\n lg: 'gap-2.5',\n },\n },\n defaultVariants: {\n layout: 'scroll',\n gap: 'default',\n },\n }\n)\n\nconst quickReplyItemVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'whitespace-nowrap font-semibold shrink-0',\n 'transition-colors duration-fast cursor-pointer',\n 'focus-visible:outline-none focus-visible:focus-ring',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'select-none',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'h-7 px-2.5 text-xs gap-1.5', // 28px\n default: 'h-8 px-3 text-sm gap-1.5', // 32px\n lg: 'h-9 px-3.5 text-md gap-1.5', // 36px\n },\n radius: {\n md: 'rounded-md', // 6px\n lg: 'rounded-lg', // 8px\n full: 'rounded-full', // 9999px\n },\n },\n defaultVariants: {\n size: 'default',\n radius: 'full',\n },\n }\n)\n\n// ============================================================================\n// Icon sizes per item size\n// ============================================================================\n\nconst iconSizeMap = {\n sm: 'icon-xs', // 14px\n default: 'icon-xs', // 14px\n lg: 'icon-sm', // 16px\n} as const\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type QuickReplyLayout = 'scroll' | 'wrap'\nexport type QuickReplyVariant = 'outline' | 'filled' | 'ghost'\nexport type QuickReplyColor = 'default' | 'primary'\nexport type QuickReplySize = 'sm' | 'default' | 'lg'\nexport type QuickReplyRadius = 'md' | 'lg' | 'full'\nexport type QuickReplyGap = 'sm' | 'default' | 'lg'\n\nexport interface QuickReplyRootProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof quickReplyRootVariants> {\n /** Layout mode: horizontal scroll or wrap to multiple rows */\n layout?: QuickReplyLayout\n /** Visual style applied to all child Items */\n variant?: QuickReplyVariant\n /** Color theme applied to all child Items */\n color?: QuickReplyColor\n /** Chip size applied to all child Items */\n size?: QuickReplySize\n /** Border radius applied to all child Items */\n radius?: QuickReplyRadius\n /** Gap between Items */\n gap?: QuickReplyGap\n}\n\nexport interface QuickReplyItemProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Leading icon (SVG or ReactNode) */\n icon?: React.ReactNode\n /** Render as child element (Slot pattern) */\n asChild?: boolean\n}\n\n// ============================================================================\n// QuickReply Root — group container that propagates style via Context\n// ============================================================================\n\nconst QuickReply = React.forwardRef<HTMLDivElement, QuickReplyRootProps>(\n (\n {\n className,\n layout = 'scroll',\n gap = 'default',\n variant = 'outline',\n color = 'default',\n size = 'default',\n radius = 'full',\n role = 'group',\n children,\n ...props\n },\n ref\n ) => {\n const contextValue = React.useMemo<QuickReplyContextValue>(\n () => ({ size, variant, color, radius }),\n [size, variant, color, radius]\n )\n\n return (\n <QuickReplyContext.Provider value={contextValue}>\n <div\n ref={ref}\n role={role}\n className={cn(quickReplyRootVariants({ layout, gap }), className)}\n {...props}\n >\n {children}\n </div>\n </QuickReplyContext.Provider>\n )\n }\n)\nQuickReply.displayName = 'QuickReply'\n\n// ============================================================================\n// QuickReply Item — individual chip button\n// ============================================================================\n\nconst QuickReplyItem = React.forwardRef<HTMLButtonElement, QuickReplyItemProps>(\n ({ className, icon, asChild = false, children, ...props }, ref) => {\n const { size, variant, color, radius } = React.useContext(QuickReplyContext)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const Comp = asChild ? (Slot as any) : 'button'\n const colorClasses = colorMap[color][variant]\n\n return (\n <Comp\n ref={ref}\n type={!asChild ? 'button' : undefined}\n {...props}\n className={cn(\n quickReplyItemVariants({ size, radius }),\n colorClasses,\n className\n )}\n >\n {icon && (\n <span\n className={cn('shrink-0 [&>svg]:w-full [&>svg]:h-full', iconSizeMap[size])}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n {children}\n </Comp>\n )\n }\n)\nQuickReplyItem.displayName = 'QuickReplyItem'\n\nexport {\n QuickReply,\n QuickReplyItem,\n quickReplyRootVariants,\n quickReplyItemVariants,\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,283 @@
1
+ "use client";
2
+ import {
3
+ useFieldContext,
4
+ useFieldControl
5
+ } from "./chunk-T5A4APEL.mjs";
6
+ import {
7
+ cn
8
+ } from "./chunk-53MIUPSY.mjs";
9
+
10
+ // src/components/ui/select.tsx
11
+ import * as React from "react";
12
+ import * as SelectPrimitive from "@radix-ui/react-select";
13
+ var triggerRadiusMap = {
14
+ none: "rounded-none",
15
+ sm: "rounded-sm",
16
+ base: "rounded",
17
+ default: "rounded-md",
18
+ lg: "rounded-lg",
19
+ xl: "rounded-xl",
20
+ "2xl": "rounded-2xl",
21
+ "3xl": "rounded-3xl",
22
+ full: "rounded-full"
23
+ };
24
+ var contentRadiusFromRoot = {
25
+ none: "md",
26
+ sm: "md",
27
+ base: "md",
28
+ default: "md",
29
+ lg: "lg",
30
+ xl: "xl",
31
+ "2xl": "xl",
32
+ "3xl": "xl",
33
+ full: "xl"
34
+ };
35
+ var contentRadiusMap = {
36
+ md: "rounded-md",
37
+ // 6px
38
+ lg: "rounded-lg",
39
+ // 8px
40
+ xl: "rounded-xl"
41
+ // 12px
42
+ };
43
+ var itemRadiusMap = {
44
+ md: "rounded",
45
+ // 4px — perceptual balance (67%)
46
+ lg: "rounded-md",
47
+ // 6px — perceptual balance (75%)
48
+ xl: "rounded-lg"
49
+ // 8px — perceptual balance (67%)
50
+ };
51
+ var triggerSizeMap = {
52
+ xs: "h-9 px-3 text-sm",
53
+ // 36px
54
+ sm: "h-10 px-3 text-md",
55
+ // 40px
56
+ default: "h-11 px-4 text-base",
57
+ // 44px
58
+ lg: "h-12 px-4 text-base",
59
+ // 48px
60
+ xl: "h-14 px-4 text-base"
61
+ // 56px
62
+ };
63
+ var triggerIconSizeMap = {
64
+ xs: "icon-xs",
65
+ // 14px
66
+ sm: "icon-xs",
67
+ // 14px
68
+ default: "icon-sm",
69
+ // 16px
70
+ lg: "icon-sm",
71
+ // 16px
72
+ xl: "icon-sm"
73
+ // 16px
74
+ };
75
+ var itemSizeFromTrigger = {
76
+ xs: "sm",
77
+ sm: "sm",
78
+ default: "md",
79
+ lg: "md",
80
+ xl: "lg"
81
+ };
82
+ var itemSizeMap = {
83
+ sm: "pl-2 pr-6 py-1.5 text-sm",
84
+ md: "pl-3 pr-8 py-1.5 text-base",
85
+ lg: "pl-3 pr-10 py-2.5 text-base"
86
+ };
87
+ var indicatorSizeMap = {
88
+ sm: "right-2 h-3 w-3",
89
+ md: "right-2 h-3.5 w-3.5",
90
+ lg: "right-3 h-4 w-4"
91
+ };
92
+ var labelSizeMap = {
93
+ sm: "px-2 py-1.5 text-xs",
94
+ md: "px-2 py-1.5 text-xs",
95
+ lg: "px-3 py-2.5 text-xs"
96
+ };
97
+ var flushItemPaddingMap = {
98
+ sm: "pl-3 pr-7",
99
+ md: "pl-4 pr-9",
100
+ lg: "pl-4 pr-11"
101
+ };
102
+ var flushIndicatorSizeMap = {
103
+ sm: "right-3 h-3 w-3",
104
+ md: "right-3 h-3.5 w-3.5",
105
+ lg: "right-4 h-4 w-4"
106
+ };
107
+ var flushLabelPaddingMap = {
108
+ sm: "px-3",
109
+ md: "px-3",
110
+ lg: "px-4"
111
+ };
112
+ var SelectRootContext = React.createContext({ size: "default", radius: "default" });
113
+ var SelectStyleContext = React.createContext({ contentRadius: "xl", itemSize: "md", flush: false });
114
+ var Select = ({
115
+ size = "default",
116
+ radius = "default",
117
+ disabled,
118
+ ...props
119
+ }) => {
120
+ const fieldContext = useFieldContext();
121
+ return /* @__PURE__ */ React.createElement(SelectRootContext.Provider, { value: { size, radius } }, /* @__PURE__ */ React.createElement(SelectPrimitive.Root, { disabled: disabled ?? fieldContext?.disabled, ...props }));
122
+ };
123
+ var SelectValue = SelectPrimitive.Value;
124
+ var SelectGroup = SelectPrimitive.Group;
125
+ var SelectTrigger = React.forwardRef(({ className, children, id, ...props }, ref) => {
126
+ const { size, radius } = React.useContext(SelectRootContext);
127
+ const fieldContext = useFieldContext();
128
+ useFieldControl("single", Boolean(fieldContext) && !id);
129
+ return /* @__PURE__ */ React.createElement(
130
+ SelectPrimitive.Trigger,
131
+ {
132
+ ref,
133
+ id: id ?? fieldContext?.id,
134
+ className: cn(
135
+ "flex w-full items-center justify-between bg-background text-foreground hover:bg-background-muted",
136
+ "border border-border",
137
+ triggerRadiusMap[radius],
138
+ "transition-colors duration-micro outline-transparent",
139
+ "focus-visible:shadow-[0_0_0_2px_var(--color-focus-ring)] focus:[outline:2px_solid_transparent]",
140
+ "disabled:cursor-not-allowed disabled:opacity-50",
141
+ "data-[placeholder]:text-foreground/30",
142
+ triggerSizeMap[size],
143
+ className
144
+ ),
145
+ ...props
146
+ },
147
+ children,
148
+ /* @__PURE__ */ React.createElement(SelectPrimitive.Icon, { asChild: true }, /* @__PURE__ */ React.createElement(
149
+ "svg",
150
+ {
151
+ className: cn("ml-2 shrink-0 text-text-muted", triggerIconSizeMap[size]),
152
+ fill: "none",
153
+ viewBox: "0 0 24 24",
154
+ stroke: "currentColor",
155
+ strokeWidth: 2,
156
+ "aria-hidden": "true"
157
+ },
158
+ /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
159
+ ))
160
+ );
161
+ });
162
+ SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
163
+ var SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
164
+ SelectPrimitive.ScrollUpButton,
165
+ {
166
+ ref,
167
+ className: cn("flex items-center justify-center py-1 cursor-default", className),
168
+ ...props
169
+ },
170
+ /* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 15l7-7 7 7" }))
171
+ ));
172
+ SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
173
+ var SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
174
+ SelectPrimitive.ScrollDownButton,
175
+ {
176
+ ref,
177
+ className: cn("flex items-center justify-center py-1 cursor-default", className),
178
+ ...props
179
+ },
180
+ /* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }))
181
+ ));
182
+ SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
183
+ var SelectContent = React.forwardRef(({ className, children, position = "popper", sideOffset = 1, flush = false, onCloseAutoFocus, ...props }, ref) => {
184
+ const { size, radius } = React.useContext(SelectRootContext);
185
+ const itemSize = itemSizeFromTrigger[size];
186
+ const contentRadius = contentRadiusFromRoot[radius];
187
+ return /* @__PURE__ */ React.createElement(SelectPrimitive.Portal, null, /* @__PURE__ */ React.createElement(SelectStyleContext.Provider, { value: { contentRadius, itemSize, flush } }, /* @__PURE__ */ React.createElement(
188
+ SelectPrimitive.Content,
189
+ {
190
+ ref,
191
+ onCloseAutoFocus: (e) => {
192
+ e.preventDefault();
193
+ onCloseAutoFocus?.(e);
194
+ },
195
+ className: cn(
196
+ "relative z-popover min-w-[var(--radix-select-trigger-width)] overflow-hidden border border-border bg-background text-foreground shadow-lg",
197
+ flush ? "py-1" : "p-1",
198
+ contentRadiusMap[contentRadius],
199
+ position === "popper" && "max-h-[var(--radix-select-content-available-height)]",
200
+ className
201
+ ),
202
+ position,
203
+ sideOffset,
204
+ ...props
205
+ },
206
+ /* @__PURE__ */ React.createElement(SelectScrollUpButton, null),
207
+ /* @__PURE__ */ React.createElement(
208
+ SelectPrimitive.Viewport,
209
+ {
210
+ className: cn(
211
+ position === "popper" && "h-[var(--radix-select-content-available-height)] w-full"
212
+ )
213
+ },
214
+ children
215
+ ),
216
+ /* @__PURE__ */ React.createElement(SelectScrollDownButton, null)
217
+ )));
218
+ });
219
+ SelectContent.displayName = SelectPrimitive.Content.displayName;
220
+ var SelectItem = React.forwardRef(({ className, children, ...props }, ref) => {
221
+ const { contentRadius, itemSize, flush } = React.useContext(SelectStyleContext);
222
+ return /* @__PURE__ */ React.createElement(
223
+ SelectPrimitive.Item,
224
+ {
225
+ ref,
226
+ className: cn(
227
+ "relative flex w-full cursor-default select-none items-center outline-none",
228
+ itemSizeMap[itemSize],
229
+ !flush && itemRadiusMap[contentRadius],
230
+ flush && flushItemPaddingMap[itemSize],
231
+ "transition-colors duration-fast",
232
+ "focus:bg-background-muted",
233
+ "data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
234
+ className
235
+ ),
236
+ ...props
237
+ },
238
+ /* @__PURE__ */ React.createElement(SelectPrimitive.ItemText, { className: "truncate" }, children),
239
+ /* @__PURE__ */ React.createElement("span", { className: cn("absolute flex items-center justify-center", flush ? flushIndicatorSizeMap[itemSize] : indicatorSizeMap[itemSize]) }, /* @__PURE__ */ React.createElement(SelectPrimitive.ItemIndicator, null, /* @__PURE__ */ React.createElement("svg", { className: "icon-xs", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 3, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M5 13l4 4L19 7" }))))
240
+ );
241
+ });
242
+ SelectItem.displayName = SelectPrimitive.Item.displayName;
243
+ var SelectLabel = React.forwardRef(({ className, ...props }, ref) => {
244
+ const { itemSize, flush } = React.useContext(SelectStyleContext);
245
+ return /* @__PURE__ */ React.createElement(
246
+ SelectPrimitive.Label,
247
+ {
248
+ ref,
249
+ className: cn(
250
+ "font-semibold text-text-muted",
251
+ labelSizeMap[itemSize],
252
+ flush && flushLabelPaddingMap[itemSize],
253
+ className
254
+ ),
255
+ ...props
256
+ }
257
+ );
258
+ });
259
+ SelectLabel.displayName = SelectPrimitive.Label.displayName;
260
+ var SelectSeparator = React.forwardRef(({ className, ...props }, ref) => {
261
+ const { flush } = React.useContext(SelectStyleContext);
262
+ return /* @__PURE__ */ React.createElement(
263
+ SelectPrimitive.Separator,
264
+ {
265
+ ref,
266
+ className: cn("h-px bg-border my-1", !flush && "-mx-1", className),
267
+ ...props
268
+ }
269
+ );
270
+ });
271
+ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
272
+
273
+ export {
274
+ Select,
275
+ SelectValue,
276
+ SelectGroup,
277
+ SelectTrigger,
278
+ SelectContent,
279
+ SelectItem,
280
+ SelectLabel,
281
+ SelectSeparator
282
+ };
283
+ //# sourceMappingURL=chunk-L55ABE4H.mjs.map