@pactor-app/ui 0.1.0 → 1.1.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.
@@ -1,15 +1,18 @@
1
1
  import {
2
+ Button,
2
3
  Dialog,
3
4
  DialogClose,
4
5
  DialogContent,
5
6
  DialogDescription,
6
7
  DialogFooter,
7
8
  DialogHeader,
8
- DialogTitle
9
- } from "./chunk-QDTVOJ5P.js";
10
- import {
11
- Button
12
- } from "./chunk-QWZ23QLS.js";
9
+ DialogTitle,
10
+ Drawer,
11
+ DrawerClose,
12
+ DrawerContent,
13
+ DrawerHeader,
14
+ DrawerTitle
15
+ } from "./chunk-F3H23KYG.js";
13
16
  import {
14
17
  cn
15
18
  } from "./chunk-RQHJBTEU.js";
@@ -164,7 +167,7 @@ function registerInteractionActions(actions, manager, ui) {
164
167
  );
165
168
  }
166
169
  const params = action.params ?? {};
167
- const type = params["type"];
170
+ const type = params["messageType"] ?? params["type"];
168
171
  const text = params["text"];
169
172
  if (type === "success" || type === "error" || type === "warning") {
170
173
  message[type](text);
@@ -182,6 +185,7 @@ function isRecord(value) {
182
185
  }
183
186
 
184
187
  // src/interaction/provider.tsx
188
+ import { useI18n } from "@pactor-app/runtime";
185
189
  import { useEffect, useMemo, useState } from "react";
186
190
  import { createPortal } from "react-dom";
187
191
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -198,6 +202,7 @@ function ShadcnInteractionProvider({
198
202
  }) {
199
203
  const [confirmState, setConfirmState] = useState(null);
200
204
  const [toasts, setToasts] = useState([]);
205
+ const { t } = useI18n();
201
206
  const { modal, message } = useMemo(() => {
202
207
  const pushToast = (type, content) => {
203
208
  const id = Date.now() + Math.random();
@@ -261,8 +266,8 @@ function ShadcnInteractionProvider({
261
266
  )
262
267
  ] }),
263
268
  /* @__PURE__ */ jsxs(DialogFooter, { children: [
264
- /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: handleCancel, children: "\u53D6\u6D88" }),
265
- /* @__PURE__ */ jsx(Button, { type: "button", onClick: handleOk, children: "\u786E\u5B9A" })
269
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", onClick: handleCancel, children: t("pactor.alertDialog.cancel") }),
270
+ /* @__PURE__ */ jsx(Button, { type: "button", onClick: handleOk, children: t("pactor.alertDialog.confirm") })
266
271
  ] })
267
272
  ] })
268
273
  }
@@ -299,6 +304,7 @@ import { XIcon } from "lucide-react";
299
304
  import {
300
305
  createPageRuntime,
301
306
  PageRuntimeView,
307
+ useI18n as useI18n2,
302
308
  useRenderer
303
309
  } from "@pactor-app/runtime";
304
310
  import { useEffect as useEffect2, useState as useState2, useSyncExternalStore } from "react";
@@ -343,6 +349,7 @@ function OverlayEntryView({
343
349
  renderer,
344
350
  resolvePage
345
351
  }) {
352
+ const { t } = useI18n2();
346
353
  const handleCancel = () => manager.close(entry.id);
347
354
  let body = null;
348
355
  if (entry.content) {
@@ -390,7 +397,7 @@ function OverlayEntryView({
390
397
  {
391
398
  type: "button",
392
399
  "data-slot": "overlay-modal-close",
393
- "aria-label": "\u5173\u95ED",
400
+ "aria-label": t("pactor.overlay.close"),
394
401
  className: "absolute top-4 right-4 cursor-pointer rounded-xs opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none",
395
402
  children: /* @__PURE__ */ jsx2(XIcon, { className: "size-4" })
396
403
  }
@@ -410,64 +417,51 @@ function ShadcnDrawerView({
410
417
  onCancel,
411
418
  children
412
419
  }) {
413
- useEffect2(() => {
414
- const handleKeyDown = (event) => {
415
- if (event.key === "Escape") {
416
- onCancel();
417
- }
418
- };
419
- document.addEventListener("keydown", handleKeyDown);
420
- return () => {
421
- document.removeEventListener("keydown", handleKeyDown);
422
- };
423
- }, [onCancel]);
420
+ const { t } = useI18n2();
424
421
  const panelStyle = entry.width === void 0 ? void 0 : { width: toCssWidth(entry.width) };
425
- return /* @__PURE__ */ jsxs2("div", { "data-slot": "drawer-root", children: [
426
- /* @__PURE__ */ jsx2(
427
- "div",
428
- {
429
- "data-slot": "drawer-mask",
430
- "data-testid": "drawer-mask",
431
- className: "fixed inset-0 z-50 bg-black/50",
432
- onClick: onCancel
433
- }
434
- ),
435
- /* @__PURE__ */ jsxs2(
436
- "div",
437
- {
438
- "data-slot": "drawer-panel",
439
- role: "dialog",
440
- "aria-modal": "true",
441
- "aria-label": entry.title,
442
- style: panelStyle,
443
- className: "fixed inset-y-0 right-0 z-50 flex w-96 max-w-full flex-col border-l border-border bg-background shadow-lg",
444
- children: [
445
- /* @__PURE__ */ jsxs2(
446
- "div",
447
- {
448
- "data-slot": "drawer-header",
449
- className: "flex items-center justify-between border-b border-border px-6 py-4",
450
- children: [
451
- /* @__PURE__ */ jsx2("span", { className: "text-lg font-semibold", children: entry.title ?? "" }),
452
- /* @__PURE__ */ jsx2(
453
- "button",
454
- {
455
- type: "button",
456
- "data-slot": "drawer-close",
457
- "aria-label": "\u5173\u95ED",
458
- className: "cursor-pointer rounded-xs opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none",
459
- onClick: onCancel,
460
- children: /* @__PURE__ */ jsx2(XIcon, { className: "size-4" })
461
- }
462
- )
463
- ]
464
- }
465
- ),
466
- /* @__PURE__ */ jsx2("div", { "data-slot": "drawer-body", className: "flex-1 overflow-auto p-6", children })
467
- ]
468
- }
469
- )
470
- ] });
422
+ return /* @__PURE__ */ jsx2(
423
+ Drawer,
424
+ {
425
+ direction: "right",
426
+ open: true,
427
+ onOpenChange: (open) => {
428
+ if (!open) {
429
+ onCancel();
430
+ }
431
+ },
432
+ children: /* @__PURE__ */ jsxs2(
433
+ DrawerContent,
434
+ {
435
+ "data-slot": "drawer-panel",
436
+ className: cn(entry.width !== void 0 && "sm:max-w-none"),
437
+ style: panelStyle,
438
+ children: [
439
+ /* @__PURE__ */ jsxs2(
440
+ DrawerHeader,
441
+ {
442
+ "data-slot": "drawer-header",
443
+ className: "flex flex-row items-center justify-between border-b border-border px-6 py-4",
444
+ children: [
445
+ /* @__PURE__ */ jsx2(DrawerTitle, { className: "text-lg", children: entry.title ?? "" }),
446
+ /* @__PURE__ */ jsx2(DrawerClose, { asChild: true, children: /* @__PURE__ */ jsx2(
447
+ "button",
448
+ {
449
+ type: "button",
450
+ "data-slot": "drawer-close",
451
+ "aria-label": t("pactor.overlay.close"),
452
+ className: "cursor-pointer rounded-xs opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none",
453
+ children: /* @__PURE__ */ jsx2(XIcon, { className: "size-4" })
454
+ }
455
+ ) })
456
+ ]
457
+ }
458
+ ),
459
+ /* @__PURE__ */ jsx2("div", { "data-slot": "drawer-body", className: "flex-1 overflow-auto p-6", children })
460
+ ]
461
+ }
462
+ )
463
+ }
464
+ );
471
465
  }
472
466
  function PageOverlayBody({
473
467
  entry,
@@ -0,0 +1,330 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-RQHJBTEU.js";
4
+
5
+ // src/ui/button.tsx
6
+ import { Button as ButtonPrimitive } from "@base-ui/react/button";
7
+ import { cva } from "class-variance-authority";
8
+ import * as React from "react";
9
+ import { jsx } from "react/jsx-runtime";
10
+ var buttonVariants = cva(
11
+ "inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
12
+ {
13
+ variants: {
14
+ variant: {
15
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
16
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90 focus-visible:ring-destructive/20",
17
+ outline: "border border-border bg-background hover:bg-accent hover:text-accent-foreground",
18
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
19
+ ghost: "hover:bg-accent hover:text-accent-foreground",
20
+ link: "text-primary underline-offset-4 hover:underline"
21
+ },
22
+ size: {
23
+ default: "h-9 px-4 py-2",
24
+ sm: "h-8 gap-1.5 rounded-md px-3 text-xs",
25
+ lg: "h-10 rounded-md px-6",
26
+ icon: "size-9"
27
+ }
28
+ },
29
+ defaultVariants: {
30
+ variant: "default",
31
+ size: "default"
32
+ }
33
+ }
34
+ );
35
+ function Button({
36
+ className,
37
+ variant,
38
+ size,
39
+ asChild = false,
40
+ children,
41
+ ...props
42
+ }) {
43
+ if (asChild && React.isValidElement(children)) {
44
+ return /* @__PURE__ */ jsx(
45
+ ButtonPrimitive,
46
+ {
47
+ "data-slot": "button",
48
+ className: cn(buttonVariants({ variant, size, className })),
49
+ render: children,
50
+ ...props
51
+ }
52
+ );
53
+ }
54
+ return /* @__PURE__ */ jsx(
55
+ ButtonPrimitive,
56
+ {
57
+ "data-slot": "button",
58
+ className: cn(buttonVariants({ variant, size, className })),
59
+ ...props,
60
+ children
61
+ }
62
+ );
63
+ }
64
+
65
+ // src/ui/dialog.tsx
66
+ import { Dialog as DialogPrimitive } from "@base-ui/react/dialog";
67
+ import { XIcon } from "lucide-react";
68
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
69
+ function Dialog({
70
+ ...props
71
+ }) {
72
+ return /* @__PURE__ */ jsx2(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
73
+ }
74
+ function DialogTrigger({
75
+ ...props
76
+ }) {
77
+ return /* @__PURE__ */ jsx2(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props });
78
+ }
79
+ function DialogPortal({
80
+ ...props
81
+ }) {
82
+ return /* @__PURE__ */ jsx2(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
83
+ }
84
+ function DialogClose({
85
+ ...props
86
+ }) {
87
+ return /* @__PURE__ */ jsx2(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props });
88
+ }
89
+ function DialogOverlay({
90
+ className,
91
+ ...props
92
+ }) {
93
+ return /* @__PURE__ */ jsx2(
94
+ DialogPrimitive.Backdrop,
95
+ {
96
+ "data-slot": "dialog-overlay",
97
+ className: cn(
98
+ "fixed inset-0 z-50 bg-black/50 data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
99
+ className
100
+ ),
101
+ ...props
102
+ }
103
+ );
104
+ }
105
+ function DialogContent({
106
+ className,
107
+ children,
108
+ showCloseButton = true,
109
+ ...props
110
+ }) {
111
+ return /* @__PURE__ */ jsxs(DialogPortal, { "data-slot": "dialog-portal", children: [
112
+ /* @__PURE__ */ jsx2(DialogOverlay, {}),
113
+ /* @__PURE__ */ jsxs(
114
+ DialogPrimitive.Popup,
115
+ {
116
+ "data-slot": "dialog-content",
117
+ className: cn(
118
+ "fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border border-border bg-background p-6 shadow-lg duration-200 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 sm:max-w-lg",
119
+ className
120
+ ),
121
+ ...props,
122
+ children: [
123
+ children,
124
+ showCloseButton && /* @__PURE__ */ jsxs(
125
+ DialogPrimitive.Close,
126
+ {
127
+ "data-slot": "dialog-close",
128
+ render: /* @__PURE__ */ jsx2(
129
+ "button",
130
+ {
131
+ type: "button",
132
+ className: "absolute top-4 right-4 cursor-pointer rounded-xs opacity-70 transition-opacity hover:opacity-100 focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
133
+ }
134
+ ),
135
+ children: [
136
+ /* @__PURE__ */ jsx2(XIcon, {}),
137
+ /* @__PURE__ */ jsx2("span", { className: "sr-only", children: "Close" })
138
+ ]
139
+ }
140
+ )
141
+ ]
142
+ }
143
+ )
144
+ ] });
145
+ }
146
+ function DialogHeader({ className, ...props }) {
147
+ return /* @__PURE__ */ jsx2(
148
+ "div",
149
+ {
150
+ "data-slot": "dialog-header",
151
+ className: cn("flex flex-col gap-2 text-center sm:text-left", className),
152
+ ...props
153
+ }
154
+ );
155
+ }
156
+ function DialogFooter({ className, ...props }) {
157
+ return /* @__PURE__ */ jsx2(
158
+ "div",
159
+ {
160
+ "data-slot": "dialog-footer",
161
+ className: cn(
162
+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
163
+ className
164
+ ),
165
+ ...props
166
+ }
167
+ );
168
+ }
169
+ function DialogTitle({
170
+ className,
171
+ ...props
172
+ }) {
173
+ return /* @__PURE__ */ jsx2(
174
+ DialogPrimitive.Title,
175
+ {
176
+ "data-slot": "dialog-title",
177
+ className: cn("text-lg leading-none font-semibold", className),
178
+ ...props
179
+ }
180
+ );
181
+ }
182
+ function DialogDescription({
183
+ className,
184
+ ...props
185
+ }) {
186
+ return /* @__PURE__ */ jsx2(
187
+ DialogPrimitive.Description,
188
+ {
189
+ "data-slot": "dialog-description",
190
+ className: cn("text-sm text-muted-foreground", className),
191
+ ...props
192
+ }
193
+ );
194
+ }
195
+
196
+ // src/ui/drawer.tsx
197
+ import { Drawer as DrawerPrimitive } from "vaul";
198
+ import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
199
+ function Drawer({
200
+ ...props
201
+ }) {
202
+ return /* @__PURE__ */ jsx3(DrawerPrimitive.Root, { "data-slot": "drawer", ...props });
203
+ }
204
+ function DrawerTrigger({
205
+ ...props
206
+ }) {
207
+ return /* @__PURE__ */ jsx3(DrawerPrimitive.Trigger, { "data-slot": "drawer-trigger", ...props });
208
+ }
209
+ function DrawerPortal({
210
+ ...props
211
+ }) {
212
+ return /* @__PURE__ */ jsx3(DrawerPrimitive.Portal, { "data-slot": "drawer-portal", ...props });
213
+ }
214
+ function DrawerClose({
215
+ ...props
216
+ }) {
217
+ return /* @__PURE__ */ jsx3(DrawerPrimitive.Close, { "data-slot": "drawer-close", ...props });
218
+ }
219
+ function DrawerOverlay({
220
+ className,
221
+ ...props
222
+ }) {
223
+ return /* @__PURE__ */ jsx3(
224
+ DrawerPrimitive.Overlay,
225
+ {
226
+ "data-slot": "drawer-overlay",
227
+ className: cn("fixed inset-0 z-50 bg-black/50", className),
228
+ ...props
229
+ }
230
+ );
231
+ }
232
+ function DrawerContent({
233
+ className,
234
+ children,
235
+ ...props
236
+ }) {
237
+ return /* @__PURE__ */ jsxs2(DrawerPortal, { "data-slot": "drawer-portal", children: [
238
+ /* @__PURE__ */ jsx3(DrawerOverlay, {}),
239
+ /* @__PURE__ */ jsxs2(
240
+ DrawerPrimitive.Content,
241
+ {
242
+ "data-slot": "drawer-content",
243
+ className: cn(
244
+ "group/drawer-content fixed z-50 flex h-auto flex-col border-border bg-background",
245
+ "data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b",
246
+ "data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t",
247
+ "data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:border-l data-[vaul-drawer-direction=right]:sm:max-w-sm",
248
+ "data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:border-r data-[vaul-drawer-direction=left]:sm:max-w-sm",
249
+ className
250
+ ),
251
+ ...props,
252
+ children: [
253
+ /* @__PURE__ */ jsx3("div", { className: "mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full bg-muted group-data-[vaul-drawer-direction=bottom]/drawer-content:block" }),
254
+ children
255
+ ]
256
+ }
257
+ )
258
+ ] });
259
+ }
260
+ function DrawerHeader({ className, ...props }) {
261
+ return /* @__PURE__ */ jsx3(
262
+ "div",
263
+ {
264
+ "data-slot": "drawer-header",
265
+ className: cn("flex flex-col gap-1.5 p-4", className),
266
+ ...props
267
+ }
268
+ );
269
+ }
270
+ function DrawerFooter({ className, ...props }) {
271
+ return /* @__PURE__ */ jsx3(
272
+ "div",
273
+ {
274
+ "data-slot": "drawer-footer",
275
+ className: cn("mt-auto flex flex-col gap-2 p-4", className),
276
+ ...props
277
+ }
278
+ );
279
+ }
280
+ function DrawerTitle({
281
+ className,
282
+ ...props
283
+ }) {
284
+ return /* @__PURE__ */ jsx3(
285
+ DrawerPrimitive.Title,
286
+ {
287
+ "data-slot": "drawer-title",
288
+ className: cn("font-semibold text-foreground", className),
289
+ ...props
290
+ }
291
+ );
292
+ }
293
+ function DrawerDescription({
294
+ className,
295
+ ...props
296
+ }) {
297
+ return /* @__PURE__ */ jsx3(
298
+ DrawerPrimitive.Description,
299
+ {
300
+ "data-slot": "drawer-description",
301
+ className: cn("text-sm text-muted-foreground", className),
302
+ ...props
303
+ }
304
+ );
305
+ }
306
+
307
+ export {
308
+ buttonVariants,
309
+ Button,
310
+ Dialog,
311
+ DialogTrigger,
312
+ DialogPortal,
313
+ DialogClose,
314
+ DialogOverlay,
315
+ DialogContent,
316
+ DialogHeader,
317
+ DialogFooter,
318
+ DialogTitle,
319
+ DialogDescription,
320
+ Drawer,
321
+ DrawerTrigger,
322
+ DrawerPortal,
323
+ DrawerClose,
324
+ DrawerOverlay,
325
+ DrawerContent,
326
+ DrawerHeader,
327
+ DrawerFooter,
328
+ DrawerTitle,
329
+ DrawerDescription
330
+ };
@@ -81,18 +81,100 @@ function AccordionContent({
81
81
  );
82
82
  }
83
83
 
84
+ // src/ui/card.tsx
85
+ import { jsx as jsx2 } from "react/jsx-runtime";
86
+ function Card({ className, ...props }) {
87
+ return /* @__PURE__ */ jsx2(
88
+ "div",
89
+ {
90
+ "data-slot": "card",
91
+ className: cn(
92
+ "flex flex-col gap-6 rounded-xl border border-border bg-card py-6 text-card-foreground shadow-sm",
93
+ className
94
+ ),
95
+ ...props
96
+ }
97
+ );
98
+ }
99
+ function CardHeader({ className, ...props }) {
100
+ return /* @__PURE__ */ jsx2(
101
+ "div",
102
+ {
103
+ "data-slot": "card-header",
104
+ className: cn(
105
+ "grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
106
+ className
107
+ ),
108
+ ...props
109
+ }
110
+ );
111
+ }
112
+ function CardTitle({ className, ...props }) {
113
+ return /* @__PURE__ */ jsx2(
114
+ "div",
115
+ {
116
+ "data-slot": "card-title",
117
+ className: cn("leading-none font-semibold", className),
118
+ ...props
119
+ }
120
+ );
121
+ }
122
+ function CardDescription({ className, ...props }) {
123
+ return /* @__PURE__ */ jsx2(
124
+ "div",
125
+ {
126
+ "data-slot": "card-description",
127
+ className: cn("text-sm text-muted-foreground", className),
128
+ ...props
129
+ }
130
+ );
131
+ }
132
+ function CardAction({ className, ...props }) {
133
+ return /* @__PURE__ */ jsx2(
134
+ "div",
135
+ {
136
+ "data-slot": "card-action",
137
+ className: cn(
138
+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
139
+ className
140
+ ),
141
+ ...props
142
+ }
143
+ );
144
+ }
145
+ function CardContent({ className, ...props }) {
146
+ return /* @__PURE__ */ jsx2(
147
+ "div",
148
+ {
149
+ "data-slot": "card-content",
150
+ className: cn("px-6", className),
151
+ ...props
152
+ }
153
+ );
154
+ }
155
+ function CardFooter({ className, ...props }) {
156
+ return /* @__PURE__ */ jsx2(
157
+ "div",
158
+ {
159
+ "data-slot": "card-footer",
160
+ className: cn("flex items-center px-6 [.border-t]:pt-6", className),
161
+ ...props
162
+ }
163
+ );
164
+ }
165
+
84
166
  // src/ui/popover.tsx
85
167
  import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
86
- import { jsx as jsx2 } from "react/jsx-runtime";
168
+ import { jsx as jsx3 } from "react/jsx-runtime";
87
169
  function Popover({
88
170
  ...props
89
171
  }) {
90
- return /* @__PURE__ */ jsx2(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
172
+ return /* @__PURE__ */ jsx3(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
91
173
  }
92
174
  function PopoverTrigger({
93
175
  ...props
94
176
  }) {
95
- return /* @__PURE__ */ jsx2(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
177
+ return /* @__PURE__ */ jsx3(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
96
178
  }
97
179
  function PopoverContent({
98
180
  className,
@@ -102,7 +184,7 @@ function PopoverContent({
102
184
  anchor,
103
185
  ...props
104
186
  }) {
105
- return /* @__PURE__ */ jsx2(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx2(
187
+ return /* @__PURE__ */ jsx3(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx3(
106
188
  PopoverPrimitive.Positioner,
107
189
  {
108
190
  align,
@@ -110,7 +192,7 @@ function PopoverContent({
110
192
  sideOffset,
111
193
  anchor,
112
194
  className: "isolate z-50",
113
- children: /* @__PURE__ */ jsx2(
195
+ children: /* @__PURE__ */ jsx3(
114
196
  PopoverPrimitive.Popup,
115
197
  {
116
198
  "data-slot": "popover-content",
@@ -130,6 +212,13 @@ export {
130
212
  AccordionItem,
131
213
  AccordionTrigger,
132
214
  AccordionContent,
215
+ Card,
216
+ CardHeader,
217
+ CardTitle,
218
+ CardDescription,
219
+ CardAction,
220
+ CardContent,
221
+ CardFooter,
133
222
  Popover,
134
223
  PopoverTrigger,
135
224
  PopoverContent